diff options
author | ghi <dokuwiki@imz.re> | 2015-02-17 11:08:15 +0100 |
---|---|---|
committer | ghi <dokuwiki@imz.re> | 2015-02-17 11:08:15 +0100 |
commit | 7d0b7e5ed7aa0f9c56def8f6c9866aa4fc8315b8 (patch) | |
tree | 08330b0a548a402caeb02ee7a185e745386ad45d /inc | |
parent | d6dc28be40fb3202a3df69458db164e20999ac2b (diff) | |
parent | f8803275a58a05b29e4029cc539a6f8c60ad2ea5 (diff) | |
download | rpg-7d0b7e5ed7aa0f9c56def8f6c9866aa4fc8315b8.tar.gz rpg-7d0b7e5ed7aa0f9c56def8f6c9866aa4fc8315b8.tar.bz2 |
Merge https://github.com/splitbrain/dokuwiki into html_showrev_output
Diffstat (limited to 'inc')
414 files changed, 13578 insertions, 4078 deletions
diff --git a/inc/DifferenceEngine.php b/inc/DifferenceEngine.php index 3c955cf88..210d1c0eb 100644 --- a/inc/DifferenceEngine.php +++ b/inc/DifferenceEngine.php @@ -14,6 +14,9 @@ class _DiffOp { var $orig; var $closing; + /** + * @return _DiffOp + */ function reverse() { trigger_error("pure virtual", E_USER_ERROR); } @@ -104,6 +107,21 @@ class _DiffOp_Change extends _DiffOp { */ class _DiffEngine { + var $xchanged = array(); + var $ychanged = array(); + var $xv = array(); + var $yv = array(); + var $xind = array(); + var $yind = array(); + var $seq; + var $in_seq; + var $lcs; + + /** + * @param array $from_lines + * @param array $to_lines + * @return _DiffOp[] + */ function diff($from_lines, $to_lines) { $n_from = count($from_lines); $n_to = count($to_lines); @@ -495,9 +513,9 @@ class Diff { * Constructor. * Computes diff between sequences of strings. * - * @param $from_lines array An array of strings. - * (Typically these are lines from a file.) - * @param $to_lines array An array of strings. + * @param array $from_lines An array of strings. + * (Typically these are lines from a file.) + * @param array $to_lines An array of strings. */ function __construct($from_lines, $to_lines) { $eng = new _DiffEngine; @@ -512,8 +530,9 @@ class Diff { * * $diff = new Diff($lines1, $lines2); * $rev = $diff->reverse(); - * @return object A Diff object representing the inverse of the - * original diff. + * + * @return Diff A Diff object representing the inverse of the + * original diff. */ function reverse() { $rev = $this; @@ -631,19 +650,19 @@ class MappedDiff extends Diff { * case-insensitve diffs, or diffs which ignore * changes in white-space. * - * @param $from_lines array An array of strings. - * (Typically these are lines from a file.) + * @param string[] $from_lines An array of strings. + * (Typically these are lines from a file.) * - * @param $to_lines array An array of strings. + * @param string[] $to_lines An array of strings. * - * @param $mapped_from_lines array This array should - * have the same size number of elements as $from_lines. - * The elements in $mapped_from_lines and - * $mapped_to_lines are what is actually compared - * when computing the diff. + * @param string[] $mapped_from_lines This array should + * have the same size number of elements as $from_lines. + * The elements in $mapped_from_lines and + * $mapped_to_lines are what is actually compared + * when computing the diff. * - * @param $mapped_to_lines array This array should - * have the same number of elements as $to_lines. + * @param string[] $mapped_to_lines This array should + * have the same number of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { @@ -697,12 +716,13 @@ class DiffFormatter { /** * Format a diff. * - * @param $diff object A Diff object. + * @param Diff $diff A Diff object. * @return string The formatted output. */ function format($diff) { $xi = $yi = 1; + $x0 = $y0 = 0; $block = false; $context = array(); @@ -752,6 +772,13 @@ class DiffFormatter { return $this->_end_diff(); } + /** + * @param int $xbeg + * @param int $xlen + * @param int $ybeg + * @param int $ylen + * @param array $edits + */ function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) { $this->_start_block($this->_block_header($xbeg, $xlen, $ybeg, $ylen)); foreach ($edits as $edit) { @@ -779,6 +806,13 @@ class DiffFormatter { return $val; } + /** + * @param int $xbeg + * @param int $xlen + * @param int $ybeg + * @param int $ylen + * @return string + */ function _block_header($xbeg, $xlen, $ybeg, $ylen) { if ($xlen > 1) $xbeg .= "," . ($xbeg + $xlen - 1); @@ -788,6 +822,9 @@ class DiffFormatter { return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg; } + /** + * @param string $header + */ function _start_block($header) { echo $header; } @@ -896,6 +933,9 @@ class _HWLDF_WordAccumulator { $this->_tag = $new_tag; } + /** + * @param string $new_tag + */ function _flushLine($new_tag) { $this->_flushGroup($new_tag); if ($this->_line != '') @@ -1055,6 +1095,10 @@ class TableDiffFormatter extends DiffFormatter { $this->trailing_context_lines = 2; } + /** + * @param Diff $diff + * @return string + */ function format($diff) { // Preserve whitespaces by converting some to non-breaking spaces. // Do not convert all of them to allow word-wrap. @@ -1165,6 +1209,10 @@ class InlineDiffFormatter extends DiffFormatter { $this->trailing_context_lines = 2; } + /** + * @param Diff $diff + * @return string + */ function format($diff) { // Preserve whitespaces by converting some to non-breaking spaces. // Do not convert all of them to allow word-wrap. diff --git a/inc/EmailAddressValidator.php b/inc/EmailAddressValidator.php index bb4ef0ca9..fd6f3275b 100644 --- a/inc/EmailAddressValidator.php +++ b/inc/EmailAddressValidator.php @@ -15,8 +15,8 @@ class EmailAddressValidator { /** * Check email address validity - * @param strEmailAddress Email address to be checked - * @return True if email is valid, false if not + * @param string $strEmailAddress Email address to be checked + * @return bool True if email is valid, false if not */ public function check_email_address($strEmailAddress) { @@ -82,8 +82,8 @@ class EmailAddressValidator { /** * Checks email section before "@" symbol for validity - * @param strLocalPortion Text to be checked - * @return True if local portion is valid, false if not + * @param string $strLocalPortion Text to be checked + * @return bool True if local portion is valid, false if not */ protected function check_local_portion($strLocalPortion) { // Local portion can only be from 1 to 64 characters, inclusive. @@ -113,8 +113,8 @@ class EmailAddressValidator { /** * Checks email section after "@" symbol for validity - * @param strDomainPortion Text to be checked - * @return True if domain portion is valid, false if not + * @param string $strDomainPortion Text to be checked + * @return bool True if domain portion is valid, false if not */ protected function check_domain_portion($strDomainPortion) { // Total domain can only be from 1 to 255 characters, inclusive @@ -172,10 +172,10 @@ class EmailAddressValidator { /** * Check given text length is between defined bounds - * @param strText Text to be checked - * @param intMinimum Minimum acceptable length - * @param intMaximum Maximum acceptable length - * @return True if string is within bounds (inclusive), false if not + * @param string $strText Text to be checked + * @param int $intMinimum Minimum acceptable length + * @param int $intMaximum Maximum acceptable length + * @return bool True if string is within bounds (inclusive), false if not */ protected function check_text_length($strText, $intMinimum, $intMaximum) { // Minimum and maximum are both inclusive diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php index 96954fb47..76d973c38 100644 --- a/inc/HTTPClient.php +++ b/inc/HTTPClient.php @@ -35,6 +35,19 @@ class DokuHTTPClient extends HTTPClient { $this->proxy_pass = conf_decodeString($conf['proxy']['pass']); $this->proxy_ssl = $conf['proxy']['ssl']; $this->proxy_except = $conf['proxy']['except']; + + // allow enabling debugging via URL parameter (if debugging allowed) + if($conf['allowdebug']) { + if( + isset($_REQUEST['httpdebug']) || + ( + isset($_SERVER['HTTP_REFERER']) && + strpos($_SERVER['HTTP_REFERER'], 'httpdebug') !== false + ) + ) { + $this->debug = true; + } + } } @@ -44,6 +57,12 @@ class DokuHTTPClient extends HTTPClient { * @triggers HTTPCLIENT_REQUEST_SEND * @author Andreas Gohr <andi@splitbrain.org> */ + /** + * @param string $url + * @param string|array $data the post data either as array or raw data + * @param string $method + * @return bool + */ function sendRequest($url,$data='',$method='GET'){ $httpdata = array('url' => $url, 'data' => $data, @@ -61,6 +80,9 @@ class DokuHTTPClient extends HTTPClient { } +/** + * Class HTTPClientException + */ class HTTPClientException extends Exception { } /** @@ -88,7 +110,7 @@ class HTTPClient { var $header_regexp; // if set this RE must match against the headers, else abort var $headers; var $debug; - var $start = 0; // for timings + var $start = 0.0; // for timings var $keep_alive = true; // keep alive rocks // don't set these, read on error @@ -150,7 +172,8 @@ class HTTPClient { * * @param string $url The URL to fetch * @param bool $sloppy304 Return body on 304 not modified - * @return bool|string response body, false on error + * @return false|string response body, false on error + * * @author Andreas Gohr <andi@splitbrain.org> */ function get($url,$sloppy304=false){ @@ -171,7 +194,8 @@ class HTTPClient { * @param string $url The URL to fetch * @param array $data Associative array of parameters * @param bool $sloppy304 Return body on 304 not modified - * @return bool|string response body, false on error + * @return false|string response body, false on error + * * @author Andreas Gohr <andi@splitbrain.org> */ function dget($url,$data,$sloppy304=false){ @@ -191,7 +215,7 @@ class HTTPClient { * * @param string $url The URL to fetch * @param array $data Associative array of parameters - * @return bool|string response body, false on error + * @return false|string response body, false on error * @author Andreas Gohr <andi@splitbrain.org> */ function post($url,$data){ @@ -213,6 +237,7 @@ class HTTPClient { * @param mixed $data - the post data either as array or raw data * @param string $method - HTTP Method usually GET or POST. * @return bool - true on success + * * @author Andreas Goetz <cpuidle@gmx.de> * @author Andreas Gohr <andi@splitbrain.org> */ @@ -249,12 +274,17 @@ class HTTPClient { if (empty($port)) $port = 8080; }else{ $request_url = $path; - $server = $server; if (!isset($port)) $port = ($uri['scheme'] == 'https') ? 443 : 80; } // add SSL stream prefix if needed - needs SSL support in PHP - if($port == 443 || $this->proxy_ssl) $server = 'ssl://'.$server; + if($port == 443 || $this->proxy_ssl) { + if(!in_array('ssl', stream_get_transports())) { + $this->status = -200; + $this->error = 'This PHP version does not support SSL - cannot connect to server'; + } + $server = 'ssl://'.$server; + } // prepare headers $headers = $this->headers; @@ -274,7 +304,6 @@ class HTTPClient { } } $headers['Content-Length'] = strlen($data); - $rmethod = 'POST'; }elseif($method == 'GET'){ $data = ''; //no data allowed on GET requests } @@ -304,11 +333,18 @@ class HTTPClient { } // 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']); + try { + if($this->_ssltunnel($socket, $request_url)){ + // no keep alive for tunnels + $this->keep_alive = false; + // tunnel is authed already + if(isset($headers['Proxy-Authentication'])) unset($headers['Proxy-Authentication']); + } + } catch (HTTPClientException $e) { + $this->status = $e->getCode(); + $this->error = $e->getMessage(); + fclose($socket); + return false; } // keep alive? @@ -330,7 +366,7 @@ class HTTPClient { try { //set non-blocking - stream_set_blocking($socket, false); + stream_set_blocking($socket, 0); // build request $request = "$method $request_url HTTP/".$this->http.HTTP_NL; @@ -363,7 +399,7 @@ class HTTPClient { // get Status if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m)) - throw new HTTPClientException('Server returned bad answer'); + throw new HTTPClientException('Server returned bad answer '.$r_headers); $this->status = $m[2]; @@ -445,7 +481,7 @@ class HTTPClient { if ($chunk_size > 0) { $r_body .= $this->_readData($socket, $chunk_size, 'chunk'); - $byte = $this->_readData($socket, 2, 'chunk'); // read trailing \r\n + $this->_readData($socket, 2, 'chunk'); // read trailing \r\n } } while ($chunk_size && !$abort); }elseif(isset($this->resp_headers['content-length']) && !isset($this->resp_headers['transfer-encoding'])){ @@ -467,7 +503,6 @@ class HTTPClient { $r_body = $this->_readData($socket, $this->max_bodysize, 'response (content-length limited)', true); }else{ // read entire socket - $r_size = 0; while (!feof($socket)) { $r_body .= $this->_readData($socket, 4096, 'response (unlimited)', true); } @@ -496,7 +531,6 @@ class HTTPClient { if (!$this->keep_alive || (isset($this->resp_headers['connection']) && $this->resp_headers['connection'] == 'Close')) { // close socket - $status = socket_get_status($socket); fclose($socket); unset(self::$connections[$connectionId]); } @@ -526,6 +560,7 @@ class HTTPClient { * * @param resource &$socket * @param string &$requesturl + * @throws HTTPClientException when a tunnel is needed but could not be established * @return bool true if a tunnel was established */ function _ssltunnel(&$socket, &$requesturl){ @@ -538,7 +573,7 @@ class HTTPClient { $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 .= 'Proxy-Authorization: Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass).HTTP_NL; } $request .= HTTP_NL; @@ -554,12 +589,24 @@ class HTTPClient { $this->_debug('SSL Tunnel Response',$r_headers); if(preg_match('/^HTTP\/1\.[01] 200/i',$r_headers)){ - if (stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv3_CLIENT)) { + // set correct peer name for verification (enabled since PHP 5.6) + stream_context_set_option($socket, 'ssl', 'peer_name', $requestinfo['host']); + + // Because of older PHP versions having trouble with TLS (enable_crypto returns true, but + // the conection still borks) we try SSLv3 first + if (@stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv3_CLIENT)) { + $requesturl = $requestinfo['path']; + return true; + } + + // If the proxy does not support SSLv3 we try TLS + if (@stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { $requesturl = $requestinfo['path']; return true; } } - return false; + + throw new HTTPClientException('Failed to establish secure proxy connection', -150); } /** @@ -569,6 +616,7 @@ class HTTPClient { * @param string $data The data to write * @param string $message Description of what is being read * @throws HTTPClientException + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function _sendData($socket, $data, $message) { @@ -613,6 +661,7 @@ class HTTPClient { * @param bool $ignore_eof End-of-file is not an error if this is set * @throws HTTPClientException * @return string + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function _readData($socket, $nbytes, $message, $ignore_eof = false) { @@ -662,6 +711,7 @@ class HTTPClient { * @param string $message Description of what is being read * @throws HTTPClientException * @return string + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function _readLine($socket, $message) { @@ -696,6 +746,9 @@ class HTTPClient { * Uses _debug_text or _debug_html depending on the SAPI name * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $info + * @param mixed $var */ function _debug($info,$var=null){ if(!$this->debug) return; @@ -709,8 +762,8 @@ class HTTPClient { /** * print debug info as HTML * - * @param $info - * @param null $var + * @param string $info + * @param mixed $var */ function _debug_html($info, $var=null){ print '<b>'.$info.'</b> '.($this->_time() - $this->start).'s<br />'; @@ -726,8 +779,8 @@ class HTTPClient { /** * prints debug info as plain text * - * @param $info - * @param null $var + * @param string $info + * @param mixed $var */ function _debug_text($info, $var=null){ print '*'.$info.'* '.($this->_time() - $this->start)."s\n"; @@ -737,6 +790,8 @@ class HTTPClient { /** * Return current timestamp in microsecond resolution + * + * @return float */ static function _time(){ list($usec, $sec) = explode(" ", microtime()); @@ -749,6 +804,9 @@ class HTTPClient { * All Keys are lowercased. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $string + * @return array */ function _parseHeaders($string){ $headers = array(); @@ -777,11 +835,14 @@ class HTTPClient { * convert given header array to header string * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $headers + * @return string */ function _buildHeaders($headers){ $string = ''; foreach($headers as $key => $value){ - if(empty($value)) continue; + if($value === '') continue; $string .= $key.': '.$value.HTTP_NL; } return $string; @@ -791,6 +852,8 @@ class HTTPClient { * get cookies as http header string * * @author Andreas Goetz <cpuidle@gmx.de> + * + * @return string */ function _getCookies(){ $headers = ''; @@ -806,6 +869,9 @@ class HTTPClient { * Encode data for posting * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $data + * @return string */ function _postEncode($data){ return http_build_query($data,'','&'); @@ -816,6 +882,9 @@ class HTTPClient { * * @fixme use of urlencode might be wrong here * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $data + * @return string */ function _postMultipartEncode($data){ $boundary = '--'.$this->boundary; diff --git a/inc/IXR_Library.php b/inc/IXR_Library.php index 979dc4d16..839298680 100644 --- a/inc/IXR_Library.php +++ b/inc/IXR_Library.php @@ -1,101 +1,146 @@ <?php + /** - * IXR - The Inutio XML-RPC Library - (c) Incutio Ltd 2002 + * IXR - The Incutio XML-RPC Library + * + * Copyright (c) 2010, Incutio Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of Incutio Ltd. nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. * - * @version 1.61 - * @author Simon Willison - * @date 11th July 2003 - * @link http://scripts.incutio.com/xmlrpc/ - * @link http://scripts.incutio.com/xmlrpc/manual.php - * @license Artistic License http://www.opensource.org/licenses/artistic-license.php + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @package IXR + * @since 1.5 + * + * @copyright Incutio Ltd 2010 (http://www.incutio.com) + * @version 1.7.4 7th September 2010 + * @author Simon Willison + * @link http://scripts.incutio.com/xmlrpc/ Site/manual * * Modified for DokuWiki * @author Andreas Gohr <andi@splitbrain.org> */ - - class IXR_Value { + + /** @var IXR_Value[]|IXR_Date|IXR_Base64|int|bool|double|string */ var $data; + /** @var string */ var $type; - function IXR_Value ($data, $type = false) { + + /** + * @param mixed $data + * @param bool $type + */ + function IXR_Value($data, $type = false) { $this->data = $data; - if (!$type) { + if(!$type) { $type = $this->calculateType(); } $this->type = $type; - if ($type == 'struct') { - /* Turn all the values in the array in to new IXR_Value objects */ - foreach ($this->data as $key => $value) { + if($type == 'struct') { + // Turn all the values in the array in to new IXR_Value objects + foreach($this->data as $key => $value) { $this->data[$key] = new IXR_Value($value); } } - if ($type == 'array') { - for ($i = 0, $j = count($this->data); $i < $j; $i++) { + if($type == 'array') { + for($i = 0, $j = count($this->data); $i < $j; $i++) { $this->data[$i] = new IXR_Value($this->data[$i]); } } } + + /** + * @return string + */ function calculateType() { - if ($this->data === true || $this->data === false) { + if($this->data === true || $this->data === false) { return 'boolean'; } - if (is_integer($this->data)) { + if(is_integer($this->data)) { return 'int'; } - if (is_double($this->data)) { + if(is_double($this->data)) { return 'double'; } + // Deal with IXR object types base64 and date - if (is_object($this->data) && is_a($this->data, 'IXR_Date')) { + if(is_object($this->data) && is_a($this->data, 'IXR_Date')) { return 'date'; } - if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) { + if(is_object($this->data) && is_a($this->data, 'IXR_Base64')) { return 'base64'; } - // If it is a normal PHP object convert it in to a struct - if (is_object($this->data)) { + // If it is a normal PHP object convert it in to a struct + if(is_object($this->data)) { $this->data = get_object_vars($this->data); return 'struct'; } - if (!is_array($this->data)) { + if(!is_array($this->data)) { return 'string'; } - /* We have an array - is it an array or a struct ? */ - if ($this->isStruct($this->data)) { + + // We have an array - is it an array or a struct? + if($this->isStruct($this->data)) { return 'struct'; } else { return 'array'; } } + + /** + * @return bool|string + */ function getXml() { - /* Return XML for this value */ - switch ($this->type) { + // Return XML for this value + switch($this->type) { case 'boolean': - return '<boolean>'.(($this->data) ? '1' : '0').'</boolean>'; + return '<boolean>' . (($this->data) ? '1' : '0') . '</boolean>'; break; case 'int': - return '<int>'.$this->data.'</int>'; + return '<int>' . $this->data . '</int>'; break; case 'double': - return '<double>'.$this->data.'</double>'; + return '<double>' . $this->data . '</double>'; break; case 'string': - return '<string>'.htmlspecialchars($this->data).'</string>'; + return '<string>' . htmlspecialchars($this->data) . '</string>'; break; case 'array': - $return = '<array><data>'."\n"; - foreach ($this->data as $item) { - $return .= ' <value>'.$item->getXml()."</value>\n"; + $return = '<array><data>' . "\n"; + foreach($this->data as $item) { + $return .= ' <value>' . $item->getXml() . "</value>\n"; } $return .= '</data></array>'; return $return; break; case 'struct': - $return = '<struct>'."\n"; - foreach ($this->data as $name => $value) { + $return = '<struct>' . "\n"; + foreach($this->data as $name => $value) { $return .= " <member><name>$name</name><value>"; - $return .= $value->getXml()."</value></member>\n"; + $return .= $value->getXml() . "</value></member>\n"; } $return .= '</struct>'; return $return; @@ -107,11 +152,17 @@ class IXR_Value { } return false; } + + /** + * Checks whether or not the supplied array is a struct or not + * + * @param array $array + * @return boolean + */ function isStruct($array) { - /* Nasty function to check if an array is a struct or not */ $expected = 0; - foreach ($array as $key => $value) { - if ((string)$key != (string)$expected) { + foreach($array as $key => $value) { + if((string) $key != (string) $expected) { return true; } $expected++; @@ -120,18 +171,25 @@ class IXR_Value { } } - +/** + * IXR_MESSAGE + * + * @package IXR + * @since 1.5 + * + */ class IXR_Message { var $message; - var $messageType; // methodCall / methodResponse / fault + var $messageType; // methodCall / methodResponse / fault var $faultCode; var $faultString; var $methodName; var $params; + // Current variable stacks - var $_arraystructs = array(); // The stack used to keep track of the current array/struct + var $_arraystructs = array(); // The stack used to keep track of the current array/struct var $_arraystructstypes = array(); // Stack keeping track of if things are structs or array - var $_currentStructName = array(); // A stack as well + var $_currentStructName = array(); // A stack as well var $_param; var $_value; var $_currentTag; @@ -139,12 +197,23 @@ class IXR_Message { var $_lastseen; // The XML parser var $_parser; - function IXR_Message ($message) { - $this->message = $message; + + /** + * @param string $message + */ + function IXR_Message($message) { + $this->message =& $message; } + + /** + * @return bool + */ function parse() { // first remove the XML declaration - $this->message = preg_replace('/<\?xml(.*)?\?'.'>/', '', $this->message); + // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages + $header = preg_replace('/<\?xml.*?\?' . '>/', '', substr($this->message, 0, 100), 1); + $this->message = substr_replace($this->message, $header, 0, 100); + // workaround for a bug in PHP/libxml2, see http://bugs.php.net/bug.php?id=45996 $this->message = str_replace('<', '<', $this->message); $this->message = str_replace('>', '>', $this->message); @@ -152,7 +221,7 @@ class IXR_Message { $this->message = str_replace(''', ''', $this->message); $this->message = str_replace('"', '"', $this->message); $this->message = str_replace("\x0b", ' ', $this->message); //vertical tab - if (trim($this->message) == '') { + if(trim($this->message) == '') { return false; } $this->_parser = xml_parser_create(); @@ -162,23 +231,40 @@ class IXR_Message { xml_set_object($this->_parser, $this); xml_set_element_handler($this->_parser, 'tag_open', 'tag_close'); xml_set_character_data_handler($this->_parser, 'cdata'); - if (!xml_parse($this->_parser, $this->message)) { - /* die(sprintf('XML error: %s at line %d', - xml_error_string(xml_get_error_code($this->_parser)), - xml_get_current_line_number($this->_parser))); */ - return false; - } + $chunk_size = 262144; // 256Kb, parse in chunks to avoid the RAM usage on very large messages + $final = false; + do { + if(strlen($this->message) <= $chunk_size) { + $final = true; + } + $part = substr($this->message, 0, $chunk_size); + $this->message = substr($this->message, $chunk_size); + if(!xml_parse($this->_parser, $part, $final)) { + return false; + } + if($final) { + break; + } + } while(true); xml_parser_free($this->_parser); + // Grab the error messages, if any - if ($this->messageType == 'fault') { + if($this->messageType == 'fault') { $this->faultCode = $this->params[0]['faultCode']; $this->faultString = $this->params[0]['faultString']; } return true; } + + /** + * @param $parser + * @param string $tag + * @param $attr + */ function tag_open($parser, $tag, $attr) { - $this->currentTag = $tag; $this->_currentTagContents = ''; + $this->_currentTag = $tag; + switch($tag) { case 'methodCall': case 'methodResponse': @@ -186,7 +272,7 @@ class IXR_Message { $this->messageType = $tag; break; /* Deal with stacks of arrays and structs */ - case 'data': // data is to all intents and puposes more interesting than array + case 'data': // data is to all intents and purposes more interesting than array $this->_arraystructstypes[] = 'array'; $this->_arraystructs[] = array(); break; @@ -197,50 +283,52 @@ class IXR_Message { } $this->_lastseen = $tag; } + + /** + * @param $parser + * @param string $cdata + */ function cdata($parser, $cdata) { $this->_currentTagContents .= $cdata; } + + /** + * @param $parser + * @param $tag + */ function tag_close($parser, $tag) { $valueFlag = false; switch($tag) { case 'int': case 'i4': - $value = (int)trim($this->_currentTagContents); - $this->_currentTagContents = ''; + $value = (int) trim($this->_currentTagContents); $valueFlag = true; break; case 'double': - $value = (double)trim($this->_currentTagContents); - $this->_currentTagContents = ''; + $value = (double) trim($this->_currentTagContents); $valueFlag = true; break; case 'string': - $value = (string)$this->_currentTagContents; - $this->_currentTagContents = ''; + $value = (string) $this->_currentTagContents; $valueFlag = true; break; case 'dateTime.iso8601': $value = new IXR_Date(trim($this->_currentTagContents)); - // $value = $iso->getTimestamp(); - $this->_currentTagContents = ''; $valueFlag = true; break; case 'value': // "If no type is indicated, the type is string." - if($this->_lastseen == 'value'){ - $value = (string)$this->_currentTagContents; - $this->_currentTagContents = ''; + if($this->_lastseen == 'value') { + $value = (string) $this->_currentTagContents; $valueFlag = true; } break; case 'boolean': - $value = (boolean)trim($this->_currentTagContents); - $this->_currentTagContents = ''; + $value = (boolean) trim($this->_currentTagContents); $valueFlag = true; break; case 'base64': $value = base64_decode($this->_currentTagContents); - $this->_currentTagContents = ''; $valueFlag = true; break; /* Deal with stacks of arrays and structs */ @@ -255,75 +343,94 @@ class IXR_Message { break; case 'name': $this->_currentStructName[] = trim($this->_currentTagContents); - $this->_currentTagContents = ''; break; case 'methodName': $this->methodName = trim($this->_currentTagContents); - $this->_currentTagContents = ''; break; } - if ($valueFlag) { - /* - if (!is_array($value) && !is_object($value)) { - $value = trim($value); - } - */ - if (count($this->_arraystructs) > 0) { + + if($valueFlag) { + if(count($this->_arraystructs) > 0) { // Add value to struct or array - if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') { + if($this->_arraystructstypes[count($this->_arraystructstypes) - 1] == 'struct') { // Add to struct - $this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value; + $this->_arraystructs[count($this->_arraystructs) - 1][$this->_currentStructName[count($this->_currentStructName) - 1]] = $value; } else { // Add to array - $this->_arraystructs[count($this->_arraystructs)-1][] = $value; + $this->_arraystructs[count($this->_arraystructs) - 1][] = $value; } } else { - // Just add as a paramater + // Just add as a parameter $this->params[] = $value; } } + $this->_currentTagContents = ''; $this->_lastseen = $tag; } } - +/** + * IXR_Server + * + * @package IXR + * @since 1.5 + */ class IXR_Server { var $data; + /** @var array */ var $callbacks = array(); var $message; + /** @var array */ var $capabilities; - function IXR_Server($callbacks = false, $data = false) { + + /** + * @param array|bool $callbacks + * @param bool $data + * @param bool $wait + */ + function IXR_Server($callbacks = false, $data = false, $wait = false) { $this->setCapabilities(); - if ($callbacks) { + if($callbacks) { $this->callbacks = $callbacks; } $this->setCallbacks(); - $this->serve($data); + + if(!$wait) { + $this->serve($data); + } } + + /** + * @param bool|string $data + */ function serve($data = false) { - if (!$data) { + if(!$data) { $postData = trim(http_get_raw_post_data()); - if (!$postData) { + if(!$postData) { + header('Content-Type: text/plain'); // merged from WP #9093 die('XML-RPC server accepts POST requests only.'); } $data = $postData; } $this->message = new IXR_Message($data); - if (!$this->message->parse()) { + if(!$this->message->parse()) { $this->error(-32700, 'parse error. not well formed'); } - if ($this->message->messageType != 'methodCall') { + if($this->message->messageType != 'methodCall') { $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall'); } $result = $this->call($this->message->methodName, $this->message->params); + // Is the result an error? - if (is_a($result, 'IXR_Error')) { + if(is_a($result, 'IXR_Error')) { $this->error($result); } + // Encode the result $r = new IXR_Value($result); $resultxml = $r->getXml(); + // Create the XML $xml = <<<EOD <methodResponse> @@ -340,16 +447,23 @@ EOD; // Send it $this->output($xml); } + + /** + * @param string $methodname + * @param array $args + * @return IXR_Error|mixed + */ function call($methodname, $args) { - if (!$this->hasMethod($methodname)) { - return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.'); + if(!$this->hasMethod($methodname)) { + return new IXR_Error(-32601, 'server error. requested method ' . $methodname . ' does not exist.'); } $method = $this->callbacks[$methodname]; + // Perform the callback and send the response # Removed for DokuWiki to have a more consistent interface # if (count($args) == 1) { - # // If only one paramater just send that instead of the whole array + # // If only one parameter just send that instead of the whole array # $args = $args[0]; # } @@ -359,16 +473,16 @@ EOD; $args = (array) $args; // Are we dealing with a function or a method? - if (substr($method, 0, 5) == 'this:') { + if(is_string($method) && substr($method, 0, 5) == 'this:') { // It's a class method - check it exists $method = substr($method, 5); - if (!method_exists($this, $method)) { - return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.'); + if(!method_exists($this, $method)) { + return new IXR_Error(-32601, 'server error. requested class method "' . $method . '" does not exist.'); } // Call the method #$result = $this->$method($args); - $result = call_user_func_array(array(&$this,$method),$args); - } elseif (substr($method, 0, 7) == 'plugin:') { + $result = call_user_func_array(array(&$this, $method), $args); + } elseif(substr($method, 0, 7) == 'plugin:') { list($pluginname, $callback) = explode(':', substr($method, 7), 2); if(!plugin_isdisabled($pluginname)) { $plugin = plugin_load('action', $pluginname); @@ -378,31 +492,49 @@ EOD; } } else { // It's a function - does it exist? - if (!function_exists($method)) { - return new IXR_Error(-32601, 'server error. requested function "'.$method.'" does not exist.'); + if(is_array($method)) { + if(!is_callable(array($method[0], $method[1]))) { + return new IXR_Error(-32601, 'server error. requested object method "' . $method[1] . '" does not exist.'); + } + } else if(!function_exists($method)) { + return new IXR_Error(-32601, 'server error. requested function "' . $method . '" does not exist.'); } + // Call the function - #$result = $method($args); - $result = call_user_func_array($method,$args); + $result = call_user_func($method, $args); } return $result; } + /** + * @param int $error + * @param string|bool $message + */ function error($error, $message = false) { // Accepts either an error object or an error code and message - if ($message && !is_object($error)) { + if($message && !is_object($error)) { $error = new IXR_Error($error, $message); } $this->output($error->getXml()); } + + /** + * @param string $xml + */ function output($xml) { header('Content-Type: text/xml; charset=utf-8'); echo '<?xml version="1.0"?>', "\n", $xml; exit; } + + /** + * @param string $method + * @return bool + */ function hasMethod($method) { return in_array($method, array_keys($this->callbacks)); } + function setCapabilities() { // Initialises capabilities array $this->capabilities = array( @@ -420,31 +552,45 @@ EOD; ), ); } + + /** + * @return mixed + */ function getCapabilities() { return $this->capabilities; } + function setCallbacks() { $this->callbacks['system.getCapabilities'] = 'this:getCapabilities'; $this->callbacks['system.listMethods'] = 'this:listMethods'; $this->callbacks['system.multicall'] = 'this:multiCall'; } + + /** + * @return array + */ function listMethods() { // Returns a list of methods - uses array_reverse to ensure user defined // methods are listed before server defined methods return array_reverse(array_keys($this->callbacks)); } + + /** + * @param array $methodcalls + * @return array + */ function multiCall($methodcalls) { // See http://www.xmlrpc.com/discuss/msgReader$1208 $return = array(); - foreach ($methodcalls as $call) { + foreach($methodcalls as $call) { $method = $call['methodName']; $params = $call['params']; - if ($method == 'system.multicall') { + if($method == 'system.multicall') { $result = new IXR_Error(-32800, 'Recursive calls to system.multicall are forbidden'); } else { $result = $this->call($method, $params); } - if (is_a($result, 'IXR_Error')) { + if(is_a($result, 'IXR_Error')) { $return[] = array( 'faultCode' => $result->code, 'faultString' => $result->message @@ -457,10 +603,24 @@ EOD; } } +/** + * IXR_Request + * + * @package IXR + * @since 1.5 + */ class IXR_Request { + /** @var string */ var $method; + /** @var array */ var $args; + /** @var string */ var $xml; + + /** + * @param string $method + * @param array $args + */ function IXR_Request($method, $args) { $this->method = $method; $this->args = $args; @@ -471,7 +631,7 @@ class IXR_Request { <params> EOD; - foreach ($this->args as $arg) { + foreach($this->args as $arg) { $this->xml .= '<param><value>'; $v = new IXR_Value($arg); $this->xml .= $v->getXml(); @@ -479,15 +639,28 @@ EOD; } $this->xml .= '</params></methodCall>'; } + + /** + * @return int + */ function getLength() { return strlen($this->xml); } + + /** + * @return string + */ function getXml() { return $this->xml; } } /** + * IXR_Client + * + * @package IXR + * @since 1.5 + * * Changed for DokuWiki to use DokuHTTPClient * * This should be compatible to the original class, but uses DokuWiki's @@ -498,19 +671,34 @@ EOD; */ class IXR_Client extends DokuHTTPClient { var $posturl = ''; + /** @var IXR_Message|bool */ var $message = false; + + // Storage place for an error message + /** @var IXR_Error|bool */ var $xmlerror = false; - function IXR_Client($server, $path = false, $port = 80) { + /** + * @param string $server + * @param string|bool $path + * @param int $port + * @param int $timeout + */ + function IXR_Client($server, $path = false, $port = 80, $timeout = 15) { parent::__construct(); - if (!$path) { + if(!$path) { // Assume we have been given a URL instead $this->posturl = $server; - }else{ - $this->posturl = 'http://'.$server.':'.$port.$path; + } else { + $this->posturl = 'http://' . $server . ':' . $port . $path; } + $this->timeout = $timeout; } + /** + * parameters: method and arguments + * @return bool success or error + */ function query() { $args = func_get_args(); $method = array_shift($args); @@ -518,55 +706,87 @@ class IXR_Client extends DokuHTTPClient { $xml = $request->getXml(); $this->headers['Content-Type'] = 'text/xml'; - if(!$this->sendRequest($this->posturl,$xml,'POST')){ - $this->xmlerror = new IXR_Error(-32300, 'transport error - '.$this->error); + if(!$this->sendRequest($this->posturl, $xml, 'POST')) { + $this->xmlerror = new IXR_Error(-32300, 'transport error - ' . $this->error); return false; } // Check HTTP Response code - if($this->status < 200 || $this->status > 206){ - $this->xmlerror = new IXR_Error(-32300, 'transport error - HTTP status '.$this->status); + if($this->status < 200 || $this->status > 206) { + $this->xmlerror = new IXR_Error(-32300, 'transport error - HTTP status ' . $this->status); return false; } // Now parse what we've got back $this->message = new IXR_Message($this->resp_body); - if (!$this->message->parse()) { + if(!$this->message->parse()) { // XML error $this->xmlerror = new IXR_Error(-32700, 'parse error. not well formed'); return false; } + // Is the message a fault? - if ($this->message->messageType == 'fault') { + if($this->message->messageType == 'fault') { $this->xmlerror = new IXR_Error($this->message->faultCode, $this->message->faultString); return false; } + // Message must be OK return true; } + + /** + * @return mixed + */ function getResponse() { // methodResponses can only have one param - return that return $this->message->params[0]; } + + /** + * @return bool + */ function isError() { return (is_object($this->xmlerror)); } + + /** + * @return int + */ function getErrorCode() { return $this->xmlerror->code; } + + /** + * @return string + */ function getErrorMessage() { return $this->xmlerror->message; } } - +/** + * IXR_Error + * + * @package IXR + * @since 1.5 + */ class IXR_Error { var $code; var $message; + + /** + * @param int $code + * @param string $message + */ function IXR_Error($code, $message) { $this->code = $code; - $this->message = $message; + $this->message = htmlspecialchars($message); } + + /** + * @return string + */ function getXml() { $xml = <<<EOD <methodResponse> @@ -591,7 +811,12 @@ EOD; } } - +/** + * IXR_Date + * + * @package IXR + * @since 1.5 + */ class IXR_Date { var $year; var $month; @@ -599,14 +824,23 @@ class IXR_Date { var $hour; var $minute; var $second; + var $timezone; + + /** + * @param int|string $time + */ function IXR_Date($time) { // $time can be a PHP timestamp or an ISO one - if (is_numeric($time)) { + if(is_numeric($time)) { $this->parseTimestamp($time); } else { $this->parseIso($time); } } + + /** + * @param int $timestamp + */ function parseTimestamp($timestamp) { $this->year = gmdate('Y', $timestamp); $this->month = gmdate('m', $timestamp); @@ -614,43 +848,81 @@ class IXR_Date { $this->hour = gmdate('H', $timestamp); $this->minute = gmdate('i', $timestamp); $this->second = gmdate('s', $timestamp); + $this->timezone = ''; } + + /** + * @param string $iso + */ function parseIso($iso) { - if(preg_match('/^(\d\d\d\d)-?(\d\d)-?(\d\d)([T ](\d\d):(\d\d)(:(\d\d))?)?/',$iso,$match)){ - $this->year = (int) $match[1]; - $this->month = (int) $match[2]; - $this->day = (int) $match[3]; - $this->hour = (int) $match[5]; + if(preg_match('/^(\d\d\d\d)-?(\d\d)-?(\d\d)([T ](\d\d):(\d\d)(:(\d\d))?)?/', $iso, $match)) { + $this->year = (int) $match[1]; + $this->month = (int) $match[2]; + $this->day = (int) $match[3]; + $this->hour = (int) $match[5]; $this->minute = (int) $match[6]; $this->second = (int) $match[8]; } } + + /** + * @return string + */ function getIso() { - return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second; + return $this->year . $this->month . $this->day . 'T' . $this->hour . ':' . $this->minute . ':' . $this->second . $this->timezone; } + + /** + * @return string + */ function getXml() { - return '<dateTime.iso8601>'.$this->getIso().'</dateTime.iso8601>'; + return '<dateTime.iso8601>' . $this->getIso() . '</dateTime.iso8601>'; } + + /** + * @return int + */ function getTimestamp() { return gmmktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year); } } - +/** + * IXR_Base64 + * + * @package IXR + * @since 1.5 + */ class IXR_Base64 { var $data; + + /** + * @param string $data + */ function IXR_Base64($data) { $this->data = $data; } + + /** + * @return string + */ function getXml() { - return '<base64>'.base64_encode($this->data).'</base64>'; + return '<base64>' . base64_encode($this->data) . '</base64>'; } } - +/** + * IXR_IntrospectionServer + * + * @package IXR + * @since 1.5 + */ class IXR_IntrospectionServer extends IXR_Server { + /** @var array[] */ var $signatures; + /** @var string[] */ var $help; + function IXR_IntrospectionServer() { $this->setCallbacks(); $this->setCapabilities(); @@ -683,82 +955,102 @@ class IXR_IntrospectionServer extends IXR_Server { 'Returns a documentation string for the specified method' ); } + + /** + * @param string $method + * @param string $callback + * @param string[] $args + * @param string $help + */ function addCallback($method, $callback, $args, $help) { $this->callbacks[$method] = $callback; $this->signatures[$method] = $args; $this->help[$method] = $help; } + + /** + * @param string $methodname + * @param array $args + * @return IXR_Error|mixed + */ function call($methodname, $args) { // Make sure it's in an array - if ($args && !is_array($args)) { + if($args && !is_array($args)) { $args = array($args); } + // Over-rides default call method, adds signature check - if (!$this->hasMethod($methodname)) { - return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.'); + if(!$this->hasMethod($methodname)) { + return new IXR_Error(-32601, 'server error. requested method "' . $this->message->methodName . '" not specified.'); } $method = $this->callbacks[$methodname]; $signature = $this->signatures[$methodname]; $returnType = array_shift($signature); // Check the number of arguments. Check only, if the minimum count of parameters is specified. More parameters are possible. // This is a hack to allow optional parameters... - if (count($args) < count($signature)) { + if(count($args) < count($signature)) { // print 'Num of args: '.count($args).' Num in signature: '.count($signature); return new IXR_Error(-32602, 'server error. wrong number of method parameters'); } + // Check the argument types $ok = true; $argsbackup = $args; - for ($i = 0, $j = count($args); $i < $j; $i++) { + for($i = 0, $j = count($args); $i < $j; $i++) { $arg = array_shift($args); $type = array_shift($signature); - switch ($type) { + switch($type) { case 'int': case 'i4': - if (is_array($arg) || !is_int($arg)) { + if(is_array($arg) || !is_int($arg)) { $ok = false; } break; case 'base64': case 'string': - if (!is_string($arg)) { + if(!is_string($arg)) { $ok = false; } break; case 'boolean': - if ($arg !== false && $arg !== true) { + if($arg !== false && $arg !== true) { $ok = false; } break; case 'float': case 'double': - if (!is_float($arg)) { + if(!is_float($arg)) { $ok = false; } break; case 'date': case 'dateTime.iso8601': - if (!is_a($arg, 'IXR_Date')) { + if(!is_a($arg, 'IXR_Date')) { $ok = false; } break; } - if (!$ok) { + if(!$ok) { return new IXR_Error(-32602, 'server error. invalid method parameters'); } } // It passed the test - run the "real" method call return parent::call($methodname, $argsbackup); } + + /** + * @param string $method + * @return array|IXR_Error + */ function methodSignature($method) { - if (!$this->hasMethod($method)) { - return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.'); + if(!$this->hasMethod($method)) { + return new IXR_Error(-32601, 'server error. requested method "' . $method . '" not specified.'); } // We should be returning an array of types $types = $this->signatures[$method]; $return = array(); - foreach ($types as $type) { - switch ($type) { + foreach($types as $type) { + switch($type) { case 'string': $return[] = 'string'; break; @@ -788,18 +1080,40 @@ class IXR_IntrospectionServer extends IXR_Server { } return $return; } + + /** + * @param string $method + * @return mixed + */ function methodHelp($method) { return $this->help[$method]; } } - +/** + * IXR_ClientMulticall + * + * @package IXR + * @since 1.5 + */ class IXR_ClientMulticall extends IXR_Client { + + /** @var array[] */ var $calls = array(); + + /** + * @param string $server + * @param string|bool $path + * @param int $port + */ function IXR_ClientMulticall($server, $path = false, $port = 80) { parent::IXR_Client($server, $path, $port); //$this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)'; } + + /** + * Add a call + */ function addCall() { $args = func_get_args(); $methodName = array_shift($args); @@ -809,6 +1123,10 @@ class IXR_ClientMulticall extends IXR_Client { ); $this->calls[] = $struct; } + + /** + * @return bool + */ function query() { // Prepare multicall, then call the parent::query() method return parent::query('system.multicall', $this->calls); diff --git a/inc/Input.class.php b/inc/Input.class.php index 7434d2b2c..199994d8d 100644 --- a/inc/Input.class.php +++ b/inc/Input.class.php @@ -15,16 +15,50 @@ class Input { public $post; /** @var GetInput Access $_GET parameters */ public $get; + /** @var ServerInput Access $_SERVER parameters */ + public $server; protected $access; /** + * @var Callable + */ + protected $filter; + + /** * Intilizes the Input class and it subcomponents */ function __construct() { $this->access = &$_REQUEST; $this->post = new PostInput(); $this->get = new GetInput(); + $this->server = new ServerInput(); + } + + /** + * Apply the set filter to the given value + * + * @param string $data + * @return string + */ + protected function applyfilter($data){ + if(!$this->filter) return $data; + return call_user_func($this->filter, $data); + } + + /** + * Return a filtered copy of the input object + * + * Expects a callable that accepts one string parameter and returns a filtered string + * + * @param Callable|string $filter + * @return Input + */ + public function filter($filter='stripctl'){ + $this->filter = $filter; + $clone = clone $this; + $this->filter = ''; + return $clone; } /** @@ -49,7 +83,6 @@ class Input { * * @see isset * @param string $name Parameter name - * @return bool */ public function remove($name) { if(isset($this->access[$name])) { @@ -74,8 +107,9 @@ class Input { */ public function param($name, $default = null, $nonempty = false) { if(!isset($this->access[$name])) return $default; - if($nonempty && empty($this->access[$name])) return $default; - return $this->access[$name]; + $value = $this->applyfilter($this->access[$name]); + if($nonempty && empty($value)) return $default; + return $value; } /** @@ -97,7 +131,7 @@ class Input { * @param string $name Parameter name * @param mixed $default If parameter is not set, initialize with this value * @param bool $nonempty Init with $default if parameter is set but empty() - * @return &mixed + * @return mixed (reference) */ public function &ref($name, $default = '', $nonempty = false) { if(!isset($this->access[$name]) || ($nonempty && empty($this->access[$name]))) { @@ -111,33 +145,56 @@ class Input { * Access a request parameter as int * * @param string $name Parameter name - * @param mixed $default Default to return if parameter isn't set or is an array + * @param int $default Default to return if parameter isn't set or is an array * @param bool $nonempty Return $default if parameter is set but empty() * @return int */ public function int($name, $default = 0, $nonempty = false) { if(!isset($this->access[$name])) return $default; if(is_array($this->access[$name])) return $default; - if($this->access[$name] === '') return $default; - if($nonempty && empty($this->access[$name])) return $default; + $value = $this->applyfilter($this->access[$name]); + if($value === '') return $default; + if($nonempty && empty($value)) return $default; - return (int) $this->access[$name]; + return (int) $value; } /** * Access a request parameter as string * * @param string $name Parameter name - * @param mixed $default Default to return if parameter isn't set or is an array + * @param string $default Default to return if parameter isn't set or is an array * @param bool $nonempty Return $default if parameter is set but empty() * @return string */ public function str($name, $default = '', $nonempty = false) { if(!isset($this->access[$name])) return $default; if(is_array($this->access[$name])) return $default; - if($nonempty && empty($this->access[$name])) return $default; + $value = $this->applyfilter($this->access[$name]); + if($nonempty && empty($value)) return $default; - return (string) $this->access[$name]; + return (string) $value; + } + + /** + * Access a request parameter and make sure it is has a valid value + * + * Please note that comparisons to the valid values are not done typesafe (request vars + * are always strings) however the function will return the correct type from the $valids + * array when an match was found. + * + * @param string $name Parameter name + * @param array $valids Array of valid values + * @param mixed $default Default to return if parameter isn't set or not valid + * @return null|mixed + */ + public function valid($name, $valids, $default = null) { + if(!isset($this->access[$name])) return $default; + if(is_array($this->access[$name])) return $default; // we don't allow arrays + $value = $this->applyfilter($this->access[$name]); + $found = array_search($value, $valids); + if($found !== false) return $valids[$found]; // return the valid value for type safety + return $default; } /** @@ -153,10 +210,11 @@ class Input { public function bool($name, $default = false, $nonempty = false) { if(!isset($this->access[$name])) return $default; if(is_array($this->access[$name])) return $default; - if($this->access[$name] === '') return $default; - if($nonempty && empty($this->access[$name])) return $default; + $value = $this->applyfilter($this->access[$name]); + if($value === '') return $default; + if($nonempty && empty($value)) return $default; - return (bool) $this->access[$name]; + return (bool) $value; } /** @@ -187,7 +245,7 @@ class Input { * * This function returns the $INPUT object itself for easy chaining * - * @param $name + * @param string $name * @return Input */ public function extract($name){ @@ -260,3 +318,18 @@ class GetInput extends Input { $_REQUEST[$name] = $value; } } + +/** + * Internal class used for $_SERVER access in Input class + */ +class ServerInput extends Input { + protected $access; + + /** + * Initialize the $access array, remove subclass members + */ + function __construct() { + $this->access = &$_SERVER; + } + +} diff --git a/inc/JpegMeta.php b/inc/JpegMeta.php index cb1772736..cd082cbba 100644 --- a/inc/JpegMeta.php +++ b/inc/JpegMeta.php @@ -42,6 +42,7 @@ class JpegMeta { var $_fileName; var $_fp = null; + var $_fpout = null; var $_type = 'unknown'; var $_markers; @@ -132,6 +133,9 @@ class JpegMeta { * through one function * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array|string $fields field name or array with field names + * @return bool|string */ function getField($fields) { if(!is_array($fields)) $fields = array($fields); @@ -177,6 +181,10 @@ class JpegMeta { * through one function * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $field field name + * @param string $value + * @return bool success or fail */ function setField($field, $value) { if(strtolower(substr($field,0,5)) == 'iptc.'){ @@ -193,6 +201,9 @@ class JpegMeta { * through one function * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $field field name + * @return bool */ function deleteField($field) { if(strtolower(substr($field,0,5)) == 'iptc.'){ @@ -208,6 +219,9 @@ class JpegMeta { * Return a date field * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $field + * @return false|string */ function getDateField($field) { if (!isset($this->_info['dates'])) { @@ -225,6 +239,9 @@ class JpegMeta { * Return a file info field * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $field field name + * @return false|string */ function getFileField($field) { if (!isset($this->_info['file'])) { @@ -243,6 +260,8 @@ class JpegMeta { * * @author Andreas Gohr <andi@splitbrain.org> * @todo handle makernotes + * + * @return false|string */ function getCamera(){ $make = $this->getField(array('Exif.Make','Exif.TIFFMake')); @@ -256,6 +275,8 @@ class JpegMeta { * Return shutter speed as a ratio * * @author Joe Lapp <joe.lapp@pobox.com> + * + * @return string */ function getShutterSpeed() { if (!isset($this->_info['exif'])) { @@ -274,6 +295,9 @@ class JpegMeta { * Return an EXIF field * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @param string $field field name + * @return false|string */ function getExifField($field) { if (!isset($this->_info['exif'])) { @@ -295,6 +319,9 @@ class JpegMeta { * Return an XMP field * * @author Hakan Sandell <hakan.sandell@mydata.se> + * + * @param string $field field name + * @return false|string */ function getXmpField($field) { if (!isset($this->_info['xmp'])) { @@ -316,6 +343,9 @@ class JpegMeta { * Return an Adobe Field * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @param string $field field name + * @return false|string */ function getAdobeField($field) { if (!isset($this->_info['adobe'])) { @@ -337,6 +367,9 @@ class JpegMeta { * Return an IPTC field * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @param string $field field name + * @return false|string */ function getIPTCField($field) { if (!isset($this->_info['iptc'])) { @@ -359,6 +392,10 @@ class JpegMeta { * * @author Sebastian Delmont <sdelmont@zonageek.com> * @author Joe Lapp <joe.lapp@pobox.com> + * + * @param string $field field name + * @param string $value + * @return bool */ function setExifField($field, $value) { if (!isset($this->_info['exif'])) { @@ -389,6 +426,10 @@ class JpegMeta { * Set an Adobe Field * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @param string $field field name + * @param string $value + * @return bool */ function setAdobeField($field, $value) { if (!isset($this->_info['adobe'])) { @@ -413,6 +454,10 @@ class JpegMeta { * dimensions * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param int $maxwidth + * @param int $maxheight + * @return float|int */ function getResizeRatio($maxwidth,$maxheight=0){ if(!$maxheight) $maxheight = $maxwidth; @@ -442,6 +487,10 @@ class JpegMeta { * Set an IPTC field * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @param string $field field name + * @param string $value + * @return bool */ function setIPTCField($field, $value) { if (!isset($this->_info['iptc'])) { @@ -465,6 +514,9 @@ class JpegMeta { * Delete an EXIF field * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @param string $field field name + * @return bool */ function deleteExifField($field) { if (!isset($this->_info['exif'])) { @@ -486,6 +538,9 @@ class JpegMeta { * Delete an Adobe field * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @param string $field field name + * @return bool */ function deleteAdobeField($field) { if (!isset($this->_info['adobe'])) { @@ -507,6 +562,9 @@ class JpegMeta { * Delete an IPTC field * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @param string $field field name + * @return bool */ function deleteIPTCField($field) { if (!isset($this->_info['iptc'])) { @@ -527,12 +585,12 @@ class JpegMeta { /** * Get the image's title, tries various fields * - * @param int $max maximum number chars (keeps words) + * @param int $max maximum number chars (keeps words) + * @return false|string + * * @author Andreas Gohr <andi@splitbrain.org> */ function getTitle($max=80){ - $cap = ''; - // try various fields $cap = $this->getField(array('Iptc.Headline', 'Iptc.Caption', @@ -555,11 +613,14 @@ class JpegMeta { * Gather various date fields * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @return array|bool */ function getDates() { $this->_parseAll(); if ($this->_markers == null) { if (@isset($this->_info['file']['UnixTime'])) { + $dates = array(); $dates['FileModified'] = $this->_info['file']['UnixTime']; $dates['Time'] = $this->_info['file']['UnixTime']; $dates['TimeSource'] = 'FileModified'; @@ -690,6 +751,8 @@ class JpegMeta { * Get the image width, tries various fields * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @return false|string */ function getWidth() { if (!isset($this->_info['sof'])) { @@ -719,6 +782,8 @@ class JpegMeta { * Get the image height, tries various fields * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @return false|string */ function getHeight() { if (!isset($this->_info['sof'])) { @@ -748,6 +813,8 @@ class JpegMeta { * Get an dimension string for use in img tag * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @return false|string */ function getDimStr() { if ($this->_markers == null) { @@ -764,6 +831,9 @@ class JpegMeta { * Checks for an embedded thumbnail * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @param string $which possible values: 'any', 'exif' or 'adobe' + * @return false|string */ function hasThumbnail($which = 'any') { if (($which == 'any') || ($which == 'exif')) { @@ -805,6 +875,9 @@ class JpegMeta { * Send embedded thumbnail to browser * * @author Sebastian Delmont <sdelmont@zonageek.com> + * + * @param string $which possible values: 'any', 'exif' or 'adobe' + * @return bool */ function sendThumbnail($which = 'any') { $data = null; @@ -855,12 +928,15 @@ class JpegMeta { * * @author Sebastian Delmont <sdelmont@zonageek.com> * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $fileName file name or empty string for a random name + * @return bool */ function save($fileName = "") { if ($fileName == "") { $tmpName = tempnam(dirname($this->_fileName),'_metatemp_'); $this->_writeJPEG($tmpName); - if (@file_exists($tmpName)) { + if (file_exists($tmpName)) { return io_rename($tmpName, $this->_fileName); } } else { @@ -1030,6 +1106,10 @@ class JpegMeta { } /*************************************************************/ + + /** + * @param string $outputName + */ function _writeJPEG($outputName) { $this->_parseAll(); @@ -1162,6 +1242,12 @@ class JpegMeta { } /*************************************************************/ + + /** + * @param integer $marker + * @param integer $length + * @param integer $origLength + */ function _writeJPEGMarker($marker, $length, &$data, $origLength) { if ($length <= 0) { return false; @@ -1334,7 +1420,6 @@ class JpegMeta { return false; } - $pos = 0; $this->_info['jfif'] = array(); $vmaj = $this->_getByte($data, 5); @@ -1420,7 +1505,6 @@ class JpegMeta { break; default: return false; - break; } $this->_info['sof']['Format'] = $format; @@ -1491,6 +1575,7 @@ class JpegMeta { * Parses XMP nodes by recursion * * @author Hakan Sandell <hakan.sandell@mydata.se> + * @param integer $count */ function _parseXmpNode($values, &$i, &$meta, $count) { if ($values[$i]['type'] == 'close') return; @@ -1594,6 +1679,12 @@ class JpegMeta { } /*************************************************************/ + + /** + * @param integer $base + * @param boolean $isBigEndian + * @param string $mode + */ function _readIFD($data, $base, $offset, $isBigEndian, $mode) { $EXIFTags = $this->_exifTagNames($mode); @@ -1849,6 +1940,12 @@ class JpegMeta { } /*************************************************************/ + + /** + * @param integer $offsetBase + * @param boolean $isBigEndian + * @param boolean $hasNext + */ function _writeIFD(&$data, $pos, $offsetBase, &$entries, $isBigEndian, $hasNext) { $tiffData = null; $tiffDataOffsetPos = -1; @@ -1905,6 +2002,11 @@ class JpegMeta { } /*************************************************************/ + + /** + * @param boolean $isBigEndian + * @param string $mode + */ function & _getIFDEntries($isBigEndian, $mode) { $EXIFNames = $this->_exifTagNames($mode); $EXIFTags = $this->_exifNameTags($mode); @@ -2413,6 +2515,10 @@ class JpegMeta { } /*************************************************************/ + + /** + * @param integer $pos + */ function _write8BIM(&$data, $pos, $type, $header, &$value) { $signature = "8BIM"; @@ -2473,6 +2579,10 @@ class JpegMeta { } /*************************************************************/ + + /** + * @param integer $pos + */ function _writeIPTCEntry(&$data, $pos, $type, &$value) { $pos = $this->_putShort($data, $pos, 0x1C02); $pos = $this->_putByte($data, $pos, $type); @@ -2833,11 +2943,19 @@ class JpegMeta { } /*************************************************************/ + + /** + * @param integer $pos + */ function _getByte(&$data, $pos) { return ord($data{$pos}); } /*************************************************************/ + + /** + * @param integer $pos + */ function _putByte(&$data, $pos, $val) { $val = intval($val); @@ -2873,6 +2991,10 @@ class JpegMeta { } /*************************************************************/ + + /** + * @param integer $pos + */ function _getLong(&$data, $pos, $bigEndian = true) { if ($bigEndian) { return (ord($data{$pos}) << 24) @@ -2888,6 +3010,10 @@ class JpegMeta { } /*************************************************************/ + + /** + * @param integer $pos + */ function _putLong(&$data, $pos, $val, $bigEndian = true) { $val = intval($val); @@ -2929,7 +3055,8 @@ class JpegMeta { $length = strlen($data) - $pos; } - return substr($data, $pos, $length); + $rv = substr($data, $pos, $length); + return $rv; } /*************************************************************/ diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php index 2ac2c1d60..087d82c99 100644 --- a/inc/Mailer.class.php +++ b/inc/Mailer.class.php @@ -39,6 +39,8 @@ class Mailer { */ public function __construct() { global $conf; + /* @var Input $INPUT */ + global $INPUT; $server = parse_url(DOKU_URL, PHP_URL_HOST); if(strpos($server,'.') === false) $server = $server.'.localhost'; @@ -53,7 +55,7 @@ class Mailer { // add some default headers for mailfiltering FS#2247 $this->setHeader('X-Mailer', 'DokuWiki'); - $this->setHeader('X-DokuWiki-User', $_SERVER['REMOTE_USER']); + $this->setHeader('X-DokuWiki-User', $INPUT->server->str('REMOTE_USER')); $this->setHeader('X-DokuWiki-Title', $conf['title']); $this->setHeader('X-DokuWiki-Server', $server); $this->setHeader('X-Auto-Response-Suppress', 'OOF'); @@ -106,6 +108,9 @@ class Mailer { /** * Callback function to automatically embed images referenced in HTML templates + * + * @param array $matches + * @return string placeholder */ protected function autoembed_cb($matches) { static $embeds = 0; @@ -128,7 +133,7 @@ class Mailer { * If an empy value is passed, the header is removed * * @param string $header the header name (no trailing colon!) - * @param string $value the value of the header + * @param string|string[] $value the value of the header * @param bool $clean remove all non-ASCII chars and line feeds? */ public function setHeader($header, $value, $clean = true) { @@ -158,6 +163,8 @@ class Mailer { * * Whatever is set here is directly passed to PHP's mail() command as last * parameter. Depending on the PHP setup this might break mailing alltogether + * + * @param string $param */ public function setParameters($param) { $this->sendparam = $param; @@ -175,12 +182,15 @@ class Mailer { * @param string $text plain text body * @param array $textrep replacements to apply on the text part * @param array $htmlrep replacements to apply on the HTML part, leave null to use $textrep - * @param array $html the HTML body, leave null to create it from $text + * @param string $html the HTML body, leave null to create it from $text * @param bool $wrap wrap the HTML in the default header/Footer */ public function setBody($text, $textrep = null, $htmlrep = null, $html = null, $wrap = true) { global $INFO; global $conf; + /* @var Input $INPUT */ + global $INPUT; + $htmlrep = (array)$htmlrep; $textrep = (array)$textrep; @@ -218,24 +228,24 @@ class Mailer { $cip = gethostsbyaddrs($ip); $trep = array( 'DATE' => dformat(), - 'BROWSER' => $_SERVER['HTTP_USER_AGENT'], + 'BROWSER' => $INPUT->server->str('HTTP_USER_AGENT'), 'IPADDRESS' => $ip, 'HOSTNAME' => $cip, 'TITLE' => $conf['title'], 'DOKUWIKIURL' => DOKU_URL, - 'USER' => $_SERVER['REMOTE_USER'], + 'USER' => $INPUT->server->str('REMOTE_USER'), 'NAME' => $INFO['userinfo']['name'], 'MAIL' => $INFO['userinfo']['mail'], ); $trep = array_merge($trep, (array)$textrep); $hrep = array( 'DATE' => '<i>'.hsc(dformat()).'</i>', - 'BROWSER' => hsc($_SERVER['HTTP_USER_AGENT']), + 'BROWSER' => hsc($INPUT->server->str('HTTP_USER_AGENT')), 'IPADDRESS' => '<code>'.hsc($ip).'</code>', 'HOSTNAME' => '<code>'.hsc($cip).'</code>', 'TITLE' => hsc($conf['title']), 'DOKUWIKIURL' => '<a href="'.DOKU_URL.'">'.DOKU_URL.'</a>', - 'USER' => hsc($_SERVER['REMOTE_USER']), + 'USER' => hsc($INPUT->server->str('REMOTE_USER')), 'NAME' => hsc($INFO['userinfo']['name']), 'MAIL' => '<a href="mailto:"'.hsc($INFO['userinfo']['mail']).'">'. hsc($INFO['userinfo']['mail']).'</a>', @@ -260,6 +270,8 @@ class Mailer { * Placeholders can be used to reference embedded attachments * * You probably want to use setBody() instead + * + * @param string $html */ public function setHTML($html) { $this->html = $html; @@ -269,6 +281,8 @@ class Mailer { * Set the plain text part of the mail * * You probably want to use setBody() instead + * + * @param string $text */ public function setText($text) { $this->text = $text; @@ -277,8 +291,8 @@ class Mailer { /** * Add the To: recipients * - * @see setAddress - * @param string|array $address Multiple adresses separated by commas or as array + * @see cleanAddress + * @param string|string[] $address Multiple adresses separated by commas or as array */ public function to($address) { $this->setHeader('To', $address, false); @@ -287,8 +301,8 @@ class Mailer { /** * Add the Cc: recipients * - * @see setAddress - * @param string|array $address Multiple adresses separated by commas or as array + * @see cleanAddress + * @param string|string[] $address Multiple adresses separated by commas or as array */ public function cc($address) { $this->setHeader('Cc', $address, false); @@ -297,8 +311,8 @@ class Mailer { /** * Add the Bcc: recipients * - * @see setAddress - * @param string|array $address Multiple adresses separated by commas or as array + * @see cleanAddress + * @param string|string[] $address Multiple adresses separated by commas or as array */ public function bcc($address) { $this->setHeader('Bcc', $address, false); @@ -310,7 +324,7 @@ class Mailer { * This is set to $conf['mailfrom'] when not specified so you shouldn't need * to call this function * - * @see setAddress + * @see cleanAddress * @param string $address from address */ public function from($address) { @@ -333,10 +347,10 @@ class Mailer { * for headers. Addresses may not contain Non-ASCII data! * * Example: - * setAddress("föö <foo@bar.com>, me@somewhere.com","TBcc"); + * cc("föö <foo@bar.com>, me@somewhere.com","TBcc"); * - * @param string|array $address Multiple adresses separated by commas or as array - * @return bool|string the prepared header (can contain multiple lines) + * @param string|string[] $addresses Multiple adresses separated by commas or as array + * @return false|string the prepared header (can contain multiple lines) */ public function cleanAddress($addresses) { // No named recipients for To: in Windows (see FS#652) @@ -413,6 +427,8 @@ class Mailer { * Prepare the mime multiparts for all attachments * * Replaces placeholders in the HTML with the correct CIDs + * + * @return string mime multiparts */ protected function prepareAttachments() { $mime = ''; @@ -522,7 +538,7 @@ class Mailer { // clean up addresses if(empty($this->headers['From'])) $this->from($conf['mailfrom']); - $addrs = array('To', 'From', 'Cc', 'Bcc'); + $addrs = array('To', 'From', 'Cc', 'Bcc', 'Reply-To', 'Sender'); foreach($addrs as $addr) { if(isset($this->headers[$addr])) { $this->headers[$addr] = $this->cleanAddress($this->headers[$addr]); @@ -560,9 +576,9 @@ class Mailer { /** * Returns a complete, EOL terminated header line, wraps it if necessary * - * @param $key - * @param $val - * @return string + * @param string $key + * @param string $val + * @return string line */ protected function wrappedHeaderLine($key, $val){ return wordwrap("$key: $val", 78, MAILHEADER_EOL.' ').MAILHEADER_EOL; diff --git a/inc/PassHash.class.php b/inc/PassHash.class.php index db6a3a77c..15f896dcf 100644 --- a/inc/PassHash.class.php +++ b/inc/PassHash.class.php @@ -16,8 +16,9 @@ class PassHash { * match true is is returned else false * * @author Andreas Gohr <andi@splitbrain.org> - * @param $clear string Clear-Text password - * @param $hash string Hash to compare against + * + * @param string $clear Clear-Text password + * @param string $hash Hash to compare against * @return bool */ function verify_hash($clear, $hash) { @@ -109,9 +110,9 @@ class PassHash { * If $salt is not null, the value is kept, but the lenght restriction is * 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 bool $cut Apply length restriction to existing salt? + * @param string|null &$salt The salt, pass null if you want one generated + * @param int $len The length of the salt + * @param bool $cut Apply length restriction to existing salt? */ public function init_salt(&$salt, $len = 32, $cut = true) { if(is_null($salt)) { @@ -135,6 +136,7 @@ class PassHash { * @author Andreas Gohr <andi@splitbrain.org> * @author <mikey_nich at hotmail dot com> * @link http://de.php.net/manual/en/function.crypt.php#73619 + * * @param string $clear The clear text to hash * @param string $salt The salt to use, null for random * @return string Hashed password @@ -175,6 +177,7 @@ class PassHash { * * @author <mikey_nich at hotmail dot com> * @link http://de.php.net/manual/en/function.crypt.php#73619 + * * @param string $clear The clear text to hash * @param string $salt The salt to use, null for random * @param string $magic The hash identifier (apr1 or 1) @@ -337,6 +340,7 @@ 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) @@ -404,6 +408,7 @@ class PassHash { * This is used by the Django Python framework * * @link http://docs.djangoproject.com/en/dev/topics/auth/#passwords + * * @param string $clear The clear text to hash * @param string $salt The salt to use, null for random * @return string Hashed password @@ -420,6 +425,7 @@ class PassHash { * This is used by the Django Python framework * * @link http://docs.djangoproject.com/en/dev/topics/auth/#passwords + * * @param string $clear The clear text to hash * @param string $salt The salt to use, null for random * @return string Hashed password @@ -486,6 +492,7 @@ class PassHash { * 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 @@ -511,7 +518,6 @@ class PassHash { * @param string $data Message to be hashed. * @param string $key Shared secret key used for generating the HMAC variant of the message digest. * @param bool $raw_output When set to TRUE, outputs raw binary data. FALSE outputs lowercase hexits. - * * @return string */ public static function hmac($algo, $data, $key, $raw_output = false) { @@ -545,9 +551,8 @@ class PassHash { /** * Use DokuWiki's secure random generator if available * - * @param $min - * @param $max - * + * @param int $min + * @param int $max * @return int */ protected function random($min, $max){ diff --git a/inc/RemoteAPICore.php b/inc/RemoteAPICore.php index 2eb8ea403..c0e6869f1 100644 --- a/inc/RemoteAPICore.php +++ b/inc/RemoteAPICore.php @@ -3,7 +3,7 @@ /** * Increased whenever the API is changed */ -define('DOKU_API_VERSION', 8); +define('DOKU_API_VERSION', 9); class RemoteAPICore { @@ -13,6 +13,11 @@ class RemoteAPICore { $this->api = $api; } + /** + * Returns details about the core methods + * + * @return array + */ function __getRemoteInfo() { return array( 'dokuwiki.getVersion' => array( @@ -24,6 +29,10 @@ class RemoteAPICore { 'return' => 'int', 'doc' => 'Tries to login with the given credentials and sets auth cookies.', 'public' => '1' + ), 'dokuwiki.logoff' => array( + 'args' => array(), + 'return' => 'int', + 'doc' => 'Tries to logoff by expiring auth cookies and the associated PHP session.' ), 'dokuwiki.getPagelist' => array( 'args' => array('string', 'array'), 'return' => 'array', @@ -154,19 +163,27 @@ class RemoteAPICore { ); } + /** + * @return string + */ function getVersion() { return getVersion(); } + /** + * @return int unix timestamp + */ function getTime() { return time(); } /** * Return a raw wiki page + * * @param string $id wiki page id - * @param string $rev revision number of the page - * @return page text. + * @param int|string $rev revision timestamp of the page or empty string + * @return string page text. + * @throws RemoteAccessDeniedException if no permission for page */ function rawPage($id,$rev=''){ $id = $this->resolvePageId($id); @@ -185,8 +202,11 @@ class RemoteAPICore { * Return a media file * * @author Gina Haeussge <osd@foosel.net> + * * @param string $id file id - * @return media file + * @return mixed media file + * @throws RemoteAccessDeniedException no permission for media + * @throws RemoteException not exist */ function getAttachment($id){ $id = cleanID($id); @@ -207,6 +227,9 @@ class RemoteAPICore { * Return info about a media file * * @author Gina Haeussge <osd@foosel.net> + * + * @param string $id page id + * @return array */ function getAttachmentInfo($id){ $id = cleanID($id); @@ -226,6 +249,11 @@ class RemoteAPICore { /** * Return a wiki page rendered to html + * + * @param string $id page id + * @param string|int $rev revision timestamp or empty string + * @return null|string html + * @throws RemoteAccessDeniedException no access to page */ function htmlPage($id,$rev=''){ $id = $this->resolvePageId($id); @@ -237,6 +265,8 @@ class RemoteAPICore { /** * List all pages - we use the indexer list here + * + * @return array */ function listPages(){ $list = array(); @@ -261,6 +291,12 @@ class RemoteAPICore { /** * List all pages in the given namespace (and below) + * + * @param string $ns + * @param array $opts + * $opts['depth'] recursion level, 0 for all + * $opts['hash'] do md5 sum of content? + * @return array */ function readNamespace($ns,$opts){ global $conf; @@ -277,9 +313,12 @@ class RemoteAPICore { /** * List all pages in the given namespace (and below) + * + * @param string $query + * @return array */ function search($query){ - $regex = ''; + $regex = array(); $data = ft_pageSearch($query,$regex); $pages = array(); @@ -310,6 +349,8 @@ class RemoteAPICore { /** * Returns the wiki title. + * + * @return string */ function getTitle(){ global $conf; @@ -324,6 +365,15 @@ class RemoteAPICore { * a regular expression matching their name. * * @author Gina Haeussge <osd@foosel.net> + * + * @param string $ns + * @param array $options + * $options['depth'] recursion level, 0 for all + * $options['showmsg'] shows message if invalid media id is used + * $options['pattern'] check given pattern + * $options['hash'] add hashes to result list + * @return array + * @throws RemoteAccessDeniedException no access to the media files */ function listAttachments($ns, $options = array()) { global $conf; @@ -355,6 +405,9 @@ class RemoteAPICore { /** * Return a list of backlinks + * + * @param string $id page id + * @return array */ function listBackLinks($id){ return ft_backlinks($this->resolvePageId($id)); @@ -362,6 +415,12 @@ class RemoteAPICore { /** * Return some basic data about a page + * + * @param string $id page id + * @param string|int $rev revision timestamp or empty string + * @return array + * @throws RemoteAccessDeniedException no access for page + * @throws RemoteException page not exist */ function pageInfo($id,$rev=''){ $id = $this->resolvePageId($id); @@ -374,7 +433,8 @@ class RemoteAPICore { throw new RemoteException('The requested page does not exist', 121); } - $info = getRevisionInfo($id, $time, 1024); + $pagelog = new PageChangeLog($id, 1024); + $info = $pagelog->getRevisionInfo($time); $data = array( 'name' => $id, @@ -390,6 +450,13 @@ class RemoteAPICore { * Save a wiki page * * @author Michael Klier <chi@chimeric.de> + * + * @param string $id page id + * @param string $text wiki text + * @param array $params parameters: summary, minor edit + * @return bool + * @throws RemoteAccessDeniedException no write access for page + * @throws RemoteException no id, empty new page or locked */ function putPage($id, $text, $params) { global $TEXT; @@ -446,6 +513,11 @@ class RemoteAPICore { /** * Appends text to a wiki page. + * + * @param string $id page id + * @param string $text wiki text + * @param array $params such as summary,minor + * @return bool|string */ function appendPage($id, $text, $params) { $currentpage = $this->rawPage($id); @@ -459,6 +531,12 @@ class RemoteAPICore { * Uploads a file to the wiki. * * Michael Klier <chi@chimeric.de> + * + * @param string $id page id + * @param string $file + * @param array $params such as overwrite + * @return false|string + * @throws RemoteException */ function putAttachment($id, $file, $params) { $id = cleanID($id); @@ -488,6 +566,11 @@ class RemoteAPICore { * Deletes a file from the wiki. * * @author Gina Haeussge <osd@foosel.net> + * + * @param string $id page id + * @return int + * @throws RemoteAccessDeniedException no permissions + * @throws RemoteException file in use or not deleted */ function deleteAttachment($id){ $id = cleanID($id); @@ -506,6 +589,9 @@ class RemoteAPICore { /** * Returns the permissions of a given wiki page + * + * @param string $id page id + * @return int permission level */ function aclCheck($id) { $id = $this->resolvePageId($id); @@ -516,6 +602,10 @@ class RemoteAPICore { * Lists all links contained in a wiki page * * @author Michael Klier <chi@chimeric.de> + * + * @param string $id page id + * @return array + * @throws RemoteAccessDeniedException no read access for page */ function listLinks($id) { $id = $this->resolvePageId($id); @@ -566,6 +656,10 @@ class RemoteAPICore { * * @author Michael Hamann <michael@content-space.de> * @author Michael Klier <chi@chimeric.de> + * + * @param int $timestamp unix timestamp + * @return array + * @throws RemoteException no valid timestamp */ function getRecentChanges($timestamp) { if(strlen($timestamp) != 10) { @@ -591,7 +685,7 @@ class RemoteAPICore { return $changes; } else { // in case we still have nothing at this point - return new RemoteException('There are no changes in the specified timeframe', 321); + throw new RemoteException('There are no changes in the specified timeframe', 321); } } @@ -600,6 +694,10 @@ class RemoteAPICore { * * @author Michael Hamann <michael@content-space.de> * @author Michael Klier <chi@chimeric.de> + * + * @param int $timestamp unix timestamp + * @return array + * @throws RemoteException no valid timestamp */ function getRecentMediaChanges($timestamp) { if(strlen($timestamp) != 10) @@ -632,6 +730,12 @@ class RemoteAPICore { * Returns a list of available revisions of a given wiki page * * @author Michael Klier <chi@chimeric.de> + * + * @param string $id page id + * @param int $first skip the first n changelog lines + * @return array + * @throws RemoteAccessDeniedException no read access for page + * @throws RemoteException empty id */ function pageVersions($id, $first) { $id = $this->resolvePageId($id); @@ -646,11 +750,12 @@ class RemoteAPICore { throw new RemoteException('Empty page ID', 131); } - $revisions = getRevisions($id, $first, $conf['recent']+1); + $pagelog = new PageChangeLog($id); + $revisions = $pagelog->getRevisions($first, $conf['recent']+1); if(count($revisions)==0 && $first!=0) { $first=0; - $revisions = getRevisions($id, $first, $conf['recent']+1); + $revisions = $pagelog->getRevisions($first, $conf['recent']+1); } if(count($revisions)>0 && $first==0) { @@ -672,8 +777,10 @@ class RemoteAPICore { // case this can lead to less pages being returned than // specified via $conf['recent'] if($time){ - $info = getRevisionInfo($id, $time, 1024); + $pagelog->setChunkSize(1024); + $info = $pagelog->getRevisionInfo($time); if(!empty($info)) { + $data = array(); $data['user'] = $info['user']; $data['ip'] = $info['ip']; $data['type'] = $info['type']; @@ -706,6 +813,9 @@ class RemoteAPICore { * * Returns an associative array with the keys locked, lockfail, unlocked and * unlockfail, each containing lists of pages. + * + * @param array[] $set list pages with array('lock' => array, 'unlock' => array) + * @return array */ function setLocks($set){ $locked = array(); @@ -740,13 +850,27 @@ class RemoteAPICore { ); } + /** + * Return API version + * + * @return int + */ function getAPIVersion(){ return DOKU_API_VERSION; } + /** + * Login + * + * @param string $user + * @param string $pass + * @return int + */ function login($user,$pass){ global $conf; + /** @var DokuWiki_Auth_Plugin $auth */ global $auth; + if(!$conf['useacl']) return 0; if(!$auth) return 0; @@ -767,6 +891,28 @@ class RemoteAPICore { return $ok; } + /** + * Log off + * + * @return int + */ + function logoff(){ + global $conf; + global $auth; + if(!$conf['useacl']) return 0; + if(!$auth) return 0; + + auth_logoff(); + + return 1; + } + + /** + * Resolve page id + * + * @param string $id page id + * @return string + */ private function resolvePageId($id) { $id = cleanID($id); if(empty($id)) { diff --git a/inc/Sitemapper.php b/inc/Sitemapper.php index bf89a311c..037990e96 100644 --- a/inc/Sitemapper.php +++ b/inc/Sitemapper.php @@ -24,6 +24,8 @@ class Sitemapper { * @author Andreas Gohr * @link https://www.google.com/webmasters/sitemaps/docs/en/about.html * @link http://www.sitemaps.org/ + * + * @return bool */ public static function generate(){ global $conf; @@ -31,7 +33,7 @@ class Sitemapper { $sitemap = Sitemapper::getFilePath(); - if(@file_exists($sitemap)){ + if(file_exists($sitemap)){ if(!is_writable($sitemap)) return false; }else{ if(!is_writable(dirname($sitemap))) return false; @@ -53,7 +55,7 @@ class Sitemapper { foreach($pages as $id){ //skip hidden, non existing and restricted files if(isHiddenPage($id)) continue; - if(auth_aclcheck($id,'','') < AUTH_READ) continue; + if(auth_aclcheck($id,'',array()) < AUTH_READ) continue; $item = SitemapItem::createFromID($id); if ($item !== null) $items[] = $item; @@ -75,6 +77,7 @@ class Sitemapper { * * @param $items array The SitemapItems that shall be included in the sitemap. * @return string The sitemap XML. + * * @author Michael Hamann */ private static function getXML($items) { @@ -95,6 +98,7 @@ class Sitemapper { * Helper function for getting the path to the sitemap file. * * @return string The path to the sitemap file. + * * @author Michael Hamann */ public static function getFilePath() { @@ -123,6 +127,8 @@ class Sitemapper { * urls to ping using the SITEMAP_PING event. * * @author Michael Hamann + * + * @return bool */ public static function pingSearchEngines() { //ping search engines... @@ -131,9 +137,9 @@ class Sitemapper { $encoded_sitemap_url = urlencode(wl('', array('do' => 'sitemap'), true, '&')); $ping_urls = array( - 'google' => 'http://www.google.com/webmasters/sitemaps/ping?sitemap='.$encoded_sitemap_url, - 'yahoo' => 'http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=dokuwiki&url='.$encoded_sitemap_url, + 'google' => 'http://www.google.com/webmasters/sitemaps/ping?sitemap='.$encoded_sitemap_url, 'microsoft' => 'http://www.bing.com/webmaster/ping.aspx?siteMap='.$encoded_sitemap_url, + 'yandex' => 'http://blogs.yandex.ru/pings/?status=success&url='.$encoded_sitemap_url ); $data = array('ping_urls' => $ping_urls, @@ -168,9 +174,9 @@ class SitemapItem { /** * Create a new item. * - * @param $url string The url of the item - * @param $lastmod int Timestamp of the last modification - * @param $changefreq string How frequently the item is likely to change. Valid values: always, hourly, daily, weekly, monthly, yearly, never. + * @param string $url The url of the item + * @param int $lastmod Timestamp of the last modification + * @param string $changefreq How frequently the item is likely to change. Valid values: always, hourly, daily, weekly, monthly, yearly, never. * @param $priority float|string The priority of the item relative to other URLs on your site. Valid values range from 0.0 to 1.0. */ public function __construct($url, $lastmod, $changefreq = null, $priority = null) { @@ -183,9 +189,9 @@ class SitemapItem { /** * Helper function for creating an item for a wikipage id. * - * @param $id string A wikipage id. - * @param $changefreq string How frequently the item is likely to change. Valid values: always, hourly, daily, weekly, monthly, yearly, never. - * @param $priority float|string The priority of the item relative to other URLs on your site. Valid values range from 0.0 to 1.0. + * @param string $id A wikipage id. + * @param string $changefreq How frequently the item is likely to change. Valid values: always, hourly, daily, weekly, monthly, yearly, never. + * @param float|string $priority The priority of the item relative to other URLs on your site. Valid values range from 0.0 to 1.0. * @return SitemapItem The sitemap item. */ public static function createFromID($id, $changefreq = null, $priority = null) { diff --git a/inc/Tar.class.php b/inc/Tar.class.php index bc87d7d29..0dc7dace2 100644 --- a/inc/Tar.class.php +++ b/inc/Tar.class.php @@ -53,6 +53,7 @@ class Tar { protected $file = ''; protected $comptype = Tar::COMPRESS_AUTO; + /** @var resource|int */ protected $fh; protected $memory = ''; protected $closed = true; @@ -105,6 +106,9 @@ class Tar { * * 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 + * + * @return array + * @throws TarIOException */ public function contents() { if($this->closed || !$this->file) throw new TarIOException('Can not read from a closed archive'); @@ -114,7 +118,7 @@ class Tar { $header = $this->parseHeader($read); if(!is_array($header)) continue; - $this->skipbytes(ceil($header['size'] / 512) * 512, 1); + $this->skipbytes(ceil($header['size'] / 512) * 512); $result[] = $header; } @@ -270,6 +274,7 @@ class Tar { * 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 @@ -377,6 +382,10 @@ class Tar { * Returns the created in-memory archive data * * This implicitly calls close() on the Archive + * + * @param int $comptype + * @param int $complevel + * @return mixed|string */ public function getArchive($comptype = Tar::COMPRESS_AUTO, $complevel = 9) { $this->close(); @@ -395,7 +404,7 @@ class Tar { * 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 string $file * @param int $comptype * @param int $complevel * @throws TarIOException @@ -522,7 +531,7 @@ class Tar { * Decode the given tar file header * * @param string $block a 512 byte block containign the header data - * @return array|bool + * @return false|array */ protected function parseHeader($block) { if(!$block || strlen($block) != 512) return false; @@ -536,6 +545,7 @@ class Tar { $header = @unpack("a100filename/a8perm/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $block); if(!$header) return false; + $return = array(); $return['checksum'] = OctDec(trim($header['checksum'])); if($return['checksum'] != $chks) return false; @@ -570,7 +580,7 @@ class Tar { /** * Cleans up a path and removes relative parts, also strips leading slashes * - * @param string $p_dir + * @param string $path * @return string */ public function cleanPath($path) { @@ -590,7 +600,7 @@ class Tar { /** * Checks if the given compression type is available and throws an exception if not * - * @param $comptype + * @param int $comptype * @throws TarIllegalCompressionException */ protected function compressioncheck($comptype) { @@ -624,8 +634,14 @@ class Tar { } } +/** + * Class TarIOException + */ class TarIOException extends Exception { } +/** + * Class TarIllegalCompressionException + */ class TarIllegalCompressionException extends Exception { } diff --git a/inc/TarLib.class.php b/inc/TarLib.class.php index ae08039ec..dd319a79a 100644 --- a/inc/TarLib.class.php +++ b/inc/TarLib.class.php @@ -26,6 +26,8 @@ class TarLib { public $_result = true; function __construct($file, $comptype = TarLib::COMPRESS_AUTO, $complevel = 9) { + dbg_deprecated('class Tar'); + if(!$file) $this->error('__construct', '$file'); $this->file = $file; diff --git a/inc/ZipLib.class.php b/inc/ZipLib.class.php index 918d38579..5b524c4ab 100644 --- a/inc/ZipLib.class.php +++ b/inc/ZipLib.class.php @@ -16,6 +16,10 @@ class ZipLib { var $old_offset = 0; var $dirs = Array("."); + /** + * @param string $zip_name filename path to file + * @return array|int + */ function get_List($zip_name) { $zip = @fopen($zip_name, 'rb'); if(!$zip) return(0); @@ -24,10 +28,12 @@ class ZipLib { @rewind($zip); @fseek($zip, $centd['offset']); + $ret = array(); for ($i=0; $i<$centd['entries']; $i++) { $header = $this->ReadCentralFileHeaders($zip); $header['index'] = $i; + $info = array(); $info['filename'] = $header['filename']; $info['stored_filename'] = $header['stored_filename']; $info['size'] = $header['size']; @@ -45,9 +51,15 @@ class ZipLib { return $ret; } + /** + * @param array $files array filled with array(string filename, string data) + * @param bool $compact + * @return array + */ function Add($files,$compact) { if(!is_array($files[0])) $files=Array($files); + $ret = array(); for($i=0;$files[$i];$i++){ $fn = $files[$i]; if(!in_Array(dirname($fn[0]),$this->dirs)) @@ -60,6 +72,10 @@ class ZipLib { /** * Zips recursively the $folder directory, from the $basedir directory + * + * @param string $folder filename path to file + * @param string|null $basedir + * @param string|null $parent */ function Compress($folder, $basedir=null, $parent=null) { $full_path = $basedir."/".$parent.$folder; @@ -70,6 +86,7 @@ class ZipLib { } $dir = new DirectoryIterator($full_path); foreach($dir as $file) { + /** @var DirectoryIterator $file */ if(!$file->isDot()) { $filename = $file->getFilename(); if($file->isDir()) { @@ -84,6 +101,8 @@ class ZipLib { /** * Returns the Zip file + * + * @return string */ function get_file() { $data = implode('', $this -> datasec); @@ -94,6 +113,9 @@ class ZipLib { pack('V', strlen($ctrldir)) . pack('V', strlen($data)) . "\x00\x00"; } + /** + * @param string $name the name of the directory + */ function add_dir($name) { $name = str_replace("\\", "/", $name); $fr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"; @@ -117,8 +139,13 @@ class ZipLib { /** * Add a file named $name from a string $data + * + * @param string $data + * @param string $name filename + * @param bool $compact + * @return bool */ - function add_File($data, $name, $compact = 1) { + function add_File($data, $name, $compact = true) { $name = str_replace('\\', '/', $name); $dtime = dechex($this->DosTime()); @@ -166,6 +193,9 @@ class ZipLib { return true; } + /** + * @return int + */ function DosTime() { $timearray = getdate(); if ($timearray['year'] < 1980) { @@ -186,10 +216,14 @@ class ZipLib { /** * Extract a zip file $zn to the $to directory + * + * @param string $zn filename + * @param string $to filename path to file + * @param array $index + * @return array|int */ function Extract ( $zn, $to, $index = Array(-1) ) { if(!@is_dir($to)) $this->_mkdir($to); - $ok = 0; $zip = @fopen($zn,'rb'); if(!$zip) return(-1); $cdir = $this->ReadCentralDir($zip,$zn); @@ -203,6 +237,7 @@ class ZipLib { return(-1); } + $stat = array(); for ($i=0; $i<$cdir['entries']; $i++) { @fseek($zip, $pos_entry); $header = $this->ReadCentralFileHeaders($zip); @@ -218,6 +253,11 @@ class ZipLib { return $stat; } + /** + * @param resource $zip + * @param array $header + * @return array + */ function ReadFileHeader($zip, $header) { $binary_data = fread($zip, 30); $data = unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $binary_data); @@ -254,6 +294,10 @@ class ZipLib { return $header; } + /** + * @param resource $zip + * @return array + */ function ReadCentralFileHeaders($zip){ $binary_data = fread($zip, 46); $header = unpack('vchkid/vid/vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $binary_data); @@ -295,6 +339,11 @@ class ZipLib { return $header; } + /** + * @param resource $zip + * @param string $zip_name filename path to file + * @return array + */ function ReadCentralDir($zip,$zip_name) { $size = filesize($zip_name); if ($size < 277){ @@ -320,6 +369,7 @@ class ZipLib { $data=unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', fread($zip, 18)); + $centd = array(); if ($data['comment_size'] != 0){ $centd['comment'] = fread($zip, $data['comment_size']); } else { @@ -334,6 +384,12 @@ class ZipLib { return $centd; } + /** + * @param array $header + * @param string $to filename path to file + * @param resource $zip + * @return bool|int + */ function ExtractFile($header,$to,$zip) { $header = $this->readfileheader($zip, $header); @@ -414,14 +470,20 @@ class ZipLib { * centralize mkdir calls and use dokuwiki io functions * * @author Christopher Smith <chris@jalakai.co.uk> + * + * @param string $d filename path to file + * @return bool|int|string */ function _mkdir($d) { return io_mkdir_p($d); } - + /** + * @param string $zn + * @param string $name + * @return null|string + */ function ExtractStr($zn, $name) { - $ok = 0; $zip = @fopen($zn,'rb'); if(!$zip) return(null); $cdir = $this->ReadCentralDir($zip,$zn); @@ -445,8 +507,13 @@ class ZipLib { return null; } + /** + * @param array $header + * @param resource $zip + * @return null|string + */ function ExtractStrFile($header,$zip) { - $hdr = $this->readfileheader($zip); + $hdr = $this->readfileheader($zip, $header); $binary_data = ''; if (!($header['external']==0x41FF0010) && !($header['external']==16)) { if ($header['compression']==0) { @@ -484,6 +551,10 @@ class ZipLib { return null; } + /** + * @param string $val + * @return int|string + */ function _ret_bytes($val) { $val = trim($val); $last = $val{strlen($val)-1}; diff --git a/inc/actions.php b/inc/actions.php index 50cbe369f..709c19ddd 100644 --- a/inc/actions.php +++ b/inc/actions.php @@ -20,6 +20,7 @@ function act_dispatch(){ global $ID; global $INFO; global $QUERY; + /* @var Input $INPUT */ global $INPUT; global $lang; global $conf; @@ -94,7 +95,7 @@ function act_dispatch(){ // user profile changes if (in_array($ACT, array('profile','profile_delete'))) { - if(!$_SERVER['REMOTE_USER']) { + if(!$INPUT->server->str('REMOTE_USER')) { $ACT = 'login'; } else { switch ($ACT) { @@ -190,7 +191,7 @@ function act_dispatch(){ unset($evt); // when action 'show', the intial not 'show' and POST, do a redirect - if($ACT == 'show' && $preact != 'show' && strtolower($_SERVER['REQUEST_METHOD']) == 'post'){ + if($ACT == 'show' && $preact != 'show' && strtolower($INPUT->server->str('REQUEST_METHOD')) == 'post'){ act_redirect($ID,$preact); } @@ -199,6 +200,7 @@ function act_dispatch(){ global $license; //call template FIXME: all needed vars available? + $headers = array(); $headers[] = 'Content-Type: text/html; charset=utf-8'; trigger_event('ACTION_HEADERS_SEND',$headers,'act_sendheaders'); @@ -220,6 +222,9 @@ function act_sendheaders($headers) { * Sanitize the action command * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array|string $act + * @return string */ function act_clean($act){ // check if the action was given as array key @@ -244,6 +249,9 @@ function act_clean($act){ * Add all allowed commands here. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array|string $act + * @return string */ function act_validate($act) { global $conf; @@ -283,10 +291,12 @@ function act_validate($act) { * Run permissionchecks * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $act action command + * @return string action command */ function act_permcheck($act){ global $INFO; - global $conf; if(in_array($act,array('save','preview','edit','recover'))){ if($INFO['exists']){ @@ -329,6 +339,9 @@ function act_permcheck($act){ * Handle 'draftdel' * * Deletes the draft for the current page and user + * + * @param string $act action command + * @return string action command */ function act_draftdel($act){ global $INFO; @@ -341,6 +354,9 @@ function act_draftdel($act){ * Saves a draft on preview * * @todo this currently duplicates code from ajax.php :-/ + * + * @param string $act action command + * @return string action command */ function act_draftsave($act){ global $INFO; @@ -371,6 +387,9 @@ function act_draftsave($act){ * returns a new action. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $act action command + * @return string action command */ function act_save($act){ global $ID; @@ -393,7 +412,7 @@ function act_save($act){ return 'conflict'; //save it - saveWikiText($ID,con($PRE,$TEXT,$SUF,1),$SUM,$INPUT->bool('minor')); //use pretty mode for con + saveWikiText($ID,con($PRE,$TEXT,$SUF,true),$SUM,$INPUT->bool('minor')); //use pretty mode for con //unlock it unlock($ID); @@ -409,11 +428,16 @@ function act_save($act){ * Revert to a certain revision * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $act action command + * @return string action command */ function act_revert($act){ global $ID; global $REV; global $lang; + /* @var Input $INPUT */ + global $INPUT; // FIXME $INFO['writable'] currently refers to the attic version // global $INFO; // if (!$INFO['writable']) { @@ -445,7 +469,7 @@ function act_revert($act){ session_write_close(); // when done, show current page - $_SERVER['REQUEST_METHOD'] = 'post'; //should force a redirect + $INPUT->server->set('REQUEST_METHOD','post'); //should force a redirect $REV = ''; return 'show'; } @@ -454,6 +478,9 @@ function act_revert($act){ * Do a redirect after receiving post data * * Tries to add the section id as hash mark after section editing + * + * @param string $id page id + * @param string $preact action command before redirect */ function act_redirect($id,$preact){ global $PRE; @@ -475,7 +502,7 @@ function act_redirect($id,$preact){ /** * Execute the redirect * - * @param array $opts id and fragment for the redirect + * @param array $opts id and fragment for the redirect and the preact */ function act_redirect_execute($opts){ $go = wl($opts['id'],'',true); @@ -489,21 +516,27 @@ function act_redirect_execute($opts){ * Handle 'login', 'logout' * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $act action command + * @return string action command */ function act_auth($act){ global $ID; global $INFO; + /* @var Input $INPUT */ + global $INPUT; //already logged in? - if(isset($_SERVER['REMOTE_USER']) && $act=='login'){ + if($INPUT->server->has('REMOTE_USER') && $act=='login'){ return 'show'; } //handle logout if($act=='logout'){ $lockedby = checklock($ID); //page still locked? - if($lockedby == $_SERVER['REMOTE_USER']) + if($lockedby == $INPUT->server->str('REMOTE_USER')){ unlock($ID); //try to unlock + } // do the logout stuff auth_logoff(); @@ -521,6 +554,9 @@ function act_auth($act){ * Handle 'edit', 'preview', 'recover' * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $act action command + * @return string action command */ function act_edit($act){ global $ID; @@ -585,6 +621,9 @@ function act_edit($act){ * * @author Andreas Gohr <andi@splitbrain.org> * @author Michael Klier <chi@chimeric.de> + * + * @param string $act action command + * @return string action command */ function act_export($act){ global $ID; @@ -594,7 +633,6 @@ function act_export($act){ $pre = ''; $post = ''; - $output = ''; $headers = array(); // search engines: never cache exported docs! (Google only currently) @@ -638,7 +676,7 @@ function act_export($act){ $output = p_wiki_xhtml($ID,$REV,false); break; default: - $output = p_cached_output(wikiFN($ID,$REV), $mode); + $output = p_cached_output(wikiFN($ID,$REV), $mode, $ID); $headers = p_get_metadata($ID,"format $mode"); break; } @@ -666,6 +704,8 @@ function act_export($act){ * Handle sitemap delivery * * @author Michael Hamann <michael@content-space.de> + * + * @param string $act action command */ function act_sitemap($act) { global $conf; @@ -697,7 +737,7 @@ function act_sitemap($act) { // Send file //use x-sendfile header to pass the delivery to compatible webservers - if (http_sendfile($sitemap)) exit; + http_sendfile($sitemap); readfile($sitemap); exit; @@ -714,15 +754,20 @@ function act_sitemap($act) { * Throws exception on error. * * @author Adrian Lang <lang@cosmocode.de> + * + * @param string $act action command + * @return string action command + * @throws Exception if (un)subscribing fails */ function act_subscription($act){ global $lang; global $INFO; global $ID; + /* @var Input $INPUT */ global $INPUT; // subcriptions work for logged in users only - if(!$_SERVER['REMOTE_USER']) return 'show'; + if(!$INPUT->server->str('REMOTE_USER')) return 'show'; // get and preprocess data. $params = array(); @@ -733,7 +778,7 @@ function act_subscription($act){ } // any action given? if not just return and show the subscription page - if(!$params['action'] || !checkSecurityToken()) return $act; + if(empty($params['action']) || !checkSecurityToken()) return $act; // Handle POST data, may throw exception. trigger_event('ACTION_HANDLE_SUBSCRIBE', $params, 'subscription_handle_post'); @@ -745,9 +790,9 @@ function act_subscription($act){ // Perform action. $sub = new Subscription(); if($action == 'unsubscribe'){ - $ok = $sub->remove($target, $_SERVER['REMOTE_USER'], $style); + $ok = $sub->remove($target, $INPUT->server->str('REMOTE_USER'), $style); }else{ - $ok = $sub->add($target, $_SERVER['REMOTE_USER'], $style); + $ok = $sub->add($target, $INPUT->server->str('REMOTE_USER'), $style); } if($ok) { @@ -772,10 +817,15 @@ function act_subscription($act){ * default action for the event ACTION_HANDLE_SUBSCRIBE. * * @author Adrian Lang <lang@cosmocode.de> + * + * @param array &$params the parameters: target, style and action + * @throws Exception */ function subscription_handle_post(&$params) { global $INFO; global $lang; + /* @var Input $INPUT */ + global $INPUT; // Get and validate parameters. if (!isset($params['target'])) { @@ -806,7 +856,7 @@ function subscription_handle_post(&$params) { } if ($is === false) { throw new Exception(sprintf($lang['subscr_not_subscribed'], - $_SERVER['REMOTE_USER'], + $INPUT->server->str('REMOTE_USER'), prettyprint_id($target))); } // subscription_set deletes a subscription if style = null. diff --git a/inc/auth.php b/inc/auth.php index b793f5d12..17923ba2a 100644 --- a/inc/auth.php +++ b/inc/auth.php @@ -95,9 +95,10 @@ function auth_setup() { $INPUT->set('http_credentials', true); } - // apply cleaning + // apply cleaning (auth specific user names, remove control chars) if (true === $auth->success) { - $INPUT->set('u', $auth->cleanUser($INPUT->str('u'))); + $INPUT->set('u', $auth->cleanUser(stripctl($INPUT->str('u')))); + $INPUT->set('p', stripctl($INPUT->str('p'))); } if($INPUT->str('authtok')) { @@ -126,11 +127,14 @@ function auth_setup() { * Loads the ACL setup and handle user wildcards * * @author Andreas Gohr <andi@splitbrain.org> + * * @return array */ function auth_loadACL() { global $config_cascade; global $USERINFO; + /* @var Input $INPUT */ + global $INPUT; if(!is_readable($config_cascade['acl']['default'])) return array(); @@ -145,10 +149,10 @@ function auth_loadACL() { // substitute user wildcard first (its 1:1) if(strstr($line, '%USER%')){ // if user is not logged in, this ACL line is meaningless - skip it - if (!isset($_SERVER['REMOTE_USER'])) continue; + if (!$INPUT->server->has('REMOTE_USER')) continue; - $id = str_replace('%USER%',cleanID($_SERVER['REMOTE_USER']),$id); - $rest = str_replace('%USER%',auth_nameencode($_SERVER['REMOTE_USER']),$rest); + $id = str_replace('%USER%',cleanID($INPUT->server->str('REMOTE_USER')),$id); + $rest = str_replace('%USER%',auth_nameencode($INPUT->server->str('REMOTE_USER')),$rest); } // substitute group wildcard (its 1:m) @@ -170,7 +174,7 @@ function auth_loadACL() { /** * Event hook callback for AUTH_LOGIN_CHECK * - * @param $evdata + * @param array $evdata * @return bool */ function auth_login_wrapper($evdata) { @@ -217,6 +221,8 @@ function auth_login($user, $pass, $sticky = false, $silent = false) { global $lang; /* @var DokuWiki_Auth_Plugin $auth */ global $auth; + /* @var Input $INPUT */ + global $INPUT; $sticky ? $sticky = true : $sticky = false; //sanity check @@ -224,9 +230,9 @@ function auth_login($user, $pass, $sticky = false, $silent = false) { if(!empty($user)) { //usual login - if($auth->checkPass($user, $pass)) { + if(!empty($pass) && $auth->checkPass($user, $pass)) { // make logininfo globally available - $_SERVER['REMOTE_USER'] = $user; + $INPUT->server->set('REMOTE_USER', $user); $secret = auth_cookiesalt(!$sticky, true); //bind non-sticky to session auth_setCookie($user, auth_encrypt($pass, $secret), $sticky); return true; @@ -253,7 +259,7 @@ function auth_login($user, $pass, $sticky = false, $silent = false) { ) { // he has session, cookie and browser right - let him in - $_SERVER['REMOTE_USER'] = $user; + $INPUT->server->set('REMOTE_USER', $user); $USERINFO = $session['info']; //FIXME move all references to session return true; } @@ -275,8 +281,9 @@ function auth_login($user, $pass, $sticky = false, $silent = false) { * token is correct. Will exit with a 401 Status if not. * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $token The authentication token - * @return boolean true (or will exit on failure) + * @return boolean|null true (or will exit on failure) */ function auth_validateToken($token) { if(!$token || $token != $_SESSION[DOKU_COOKIE]['auth']['token']) { @@ -288,7 +295,10 @@ function auth_validateToken($token) { } // still here? trust the session data global $USERINFO; - $_SERVER['REMOTE_USER'] = $_SESSION[DOKU_COOKIE]['auth']['user']; + /* @var Input $INPUT */ + global $INPUT; + + $INPUT->server->set('REMOTE_USER',$_SESSION[DOKU_COOKIE]['auth']['user']); $USERINFO = $_SESSION[DOKU_COOKIE]['auth']['info']; return true; } @@ -299,6 +309,7 @@ function auth_validateToken($token) { * NOTE: this is completely unrelated to the getSecurityToken() function * * @author Andreas Gohr <andi@splitbrain.org> + * * @return string The auth token */ function auth_createToken() { @@ -321,11 +332,13 @@ function auth_createToken() { * @return string a MD5 sum of various browser headers */ function auth_browseruid() { + /* @var Input $INPUT */ + global $INPUT; + $ip = clientIP(true); $uid = ''; - $uid .= $_SERVER['HTTP_USER_AGENT']; - $uid .= $_SERVER['HTTP_ACCEPT_ENCODING']; - $uid .= $_SERVER['HTTP_ACCEPT_CHARSET']; + $uid .= $INPUT->server->str('HTTP_USER_AGENT'); + $uid .= $INPUT->server->str('HTTP_ACCEPT_CHARSET'); $uid .= substr($ip, 0, strpos($ip, '.')); $uid = strtolower($uid); return md5($uid); @@ -340,6 +353,7 @@ function auth_browseruid() { * and stored in this file. * * @author Andreas Gohr <andi@splitbrain.org> + * * @param bool $addsession if true, the sessionid is added to the salt * @param bool $secure if security is more important than keeping the old value * @return string @@ -367,6 +381,7 @@ function auth_cookiesalt($addsession = false, $secure = false) { * @author Mark Seecof * @author Michael Hamann <michael@content-space.de> * @link http://www.php.net/manual/de/function.mt-rand.php#83655 + * * @param int $length number of bytes to get * @return string binary random strings */ @@ -433,6 +448,7 @@ function auth_randombytes($length) { * * @author Michael Samuel * @author Michael Hamann <michael@content-space.de> + * * @param int $min * @param int $max * @return int @@ -504,6 +520,7 @@ function auth_decrypt($ciphertext, $secret) { * off. It also clears session data. * * @author Andreas Gohr <andi@splitbrain.org> + * * @param bool $keepbc - when true, the breadcrumb data is not cleared */ function auth_logoff($keepbc = false) { @@ -511,6 +528,8 @@ function auth_logoff($keepbc = false) { global $USERINFO; /* @var DokuWiki_Auth_Plugin $auth */ global $auth; + /* @var Input $INPUT */ + global $INPUT; // make sure the session is writable (it usually is) @session_start(); @@ -523,16 +542,11 @@ function auth_logoff($keepbc = false) { unset($_SESSION[DOKU_COOKIE]['auth']['info']); if(!$keepbc && isset($_SESSION[DOKU_COOKIE]['bc'])) unset($_SESSION[DOKU_COOKIE]['bc']); - if(isset($_SERVER['REMOTE_USER'])) - unset($_SERVER['REMOTE_USER']); + $INPUT->server->remove('REMOTE_USER'); $USERINFO = null; //FIXME $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir']; - if(version_compare(PHP_VERSION, '5.2.0', '>')) { - setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true); - } else { - setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl())); - } + setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true); if($auth) $auth->logOff(); } @@ -547,6 +561,7 @@ function auth_logoff($keepbc = false) { * * @author Andreas Gohr <andi@splitbrain.org> * @see auth_isadmin + * * @param string $user Username * @param array $groups List of groups the user is in * @param bool $adminonly when true checks if user is admin @@ -557,13 +572,16 @@ function auth_ismanager($user = null, $groups = null, $adminonly = false) { global $USERINFO; /* @var DokuWiki_Auth_Plugin $auth */ global $auth; + /* @var Input $INPUT */ + global $INPUT; + if(!$auth) return false; if(is_null($user)) { - if(!isset($_SERVER['REMOTE_USER'])) { + if(!$INPUT->server->has('REMOTE_USER')) { return false; } else { - $user = $_SERVER['REMOTE_USER']; + $user = $INPUT->server->str('REMOTE_USER'); } } if(is_null($groups)) { @@ -588,6 +606,7 @@ function auth_ismanager($user = null, $groups = null, $adminonly = false) { * * @author Andreas Gohr <andi@splitbrain.org> * @see auth_ismanager() + * * @param string $user Username * @param array $groups List of groups the user is in * @return bool @@ -602,9 +621,9 @@ function auth_isadmin($user = null, $groups = null) { * * Note: all input should NOT be nameencoded. * - * @param $memberlist string commaseparated list of allowed users and groups - * @param $user string user to match against - * @param $groups array groups the user is member of + * @param string $memberlist commaseparated list of allowed users and groups + * @param string $user user to match against + * @param array $groups groups the user is member of * @return bool true for membership acknowledged */ function auth_isMember($memberlist, $user, array $groups) { @@ -628,6 +647,7 @@ function auth_isMember($memberlist, $user, array $groups) { // compare cleaned values foreach($members as $member) { + if($member == '@ALL' ) return true; if(!$auth->isCaseSensitive()) $member = utf8_strtolower($member); if($member[0] == '@') { $member = $auth->cleanGroup(substr($member, 1)); @@ -655,23 +675,49 @@ function auth_isMember($memberlist, $user, array $groups) { function auth_quickaclcheck($id) { global $conf; global $USERINFO; + /* @var Input $INPUT */ + global $INPUT; # if no ACL is used always return upload rights if(!$conf['useacl']) return AUTH_UPLOAD; - return auth_aclcheck($id, $_SERVER['REMOTE_USER'], $USERINFO['grps']); + return auth_aclcheck($id, $INPUT->server->str('REMOTE_USER'), $USERINFO['grps']); } /** - * Returns the maximum rights a user has for - * the given ID or its namespace + * Returns the maximum rights a user has for the given ID or its namespace * * @author Andreas Gohr <andi@splitbrain.org> * + * @triggers AUTH_ACL_CHECK * @param string $id page ID (needs to be resolved and cleaned) * @param string $user Username * @param array|null $groups Array of groups the user is in * @return int permission level */ function auth_aclcheck($id, $user, $groups) { + $data = array( + 'id' => $id, + 'user' => $user, + 'groups' => $groups + ); + + return trigger_event('AUTH_ACL_CHECK', $data, 'auth_aclcheck_cb'); +} + +/** + * default ACL check method + * + * DO NOT CALL DIRECTLY, use auth_aclcheck() instead + * + * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $data event data + * @return int permission level + */ +function auth_aclcheck_cb($data) { + $id =& $data['id']; + $user =& $data['user']; + $groups =& $data['groups']; + global $conf; global $AUTH_ACL; /* @var DokuWiki_Auth_Plugin $auth */ @@ -796,6 +842,10 @@ function auth_aclcheck($id, $user, $groups) { * * @author Andreas Gohr <gohr@cosmocode.de> * @see rawurldecode() + * + * @param string $name + * @param bool $skip_group + * @return string */ function auth_nameencode($name, $skip_group = false) { global $cache_authname; @@ -823,6 +873,12 @@ function auth_nameencode($name, $skip_group = false) { return $cache[$name][$skip_group]; } +/** + * callback encodes the matches + * + * @param array $matches first complete match, next matching subpatterms + * @return string + */ function auth_nameencode_callback($matches) { return '%'.dechex(ord(substr($matches[1],-1))); } @@ -871,6 +927,7 @@ function auth_pwgen($foruser = '') { * Sends a password to the given user * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $user Login name of the user * @param string $password The new password in clear text * @return bool true on success @@ -882,7 +939,7 @@ function auth_sendPassword($user, $password) { if(!$auth) return false; $user = $auth->cleanUser($user); - $userinfo = $auth->getUserData($user); + $userinfo = $auth->getUserData($user, $requireGroups = false); if(!$userinfo['mail']) return false; @@ -906,6 +963,7 @@ function auth_sendPassword($user, $password) { * This registers a new user - Data is read directly from $_POST * * @author Andreas Gohr <andi@splitbrain.org> + * * @return bool true on success, false on any error */ function register() { @@ -1034,18 +1092,18 @@ function updateprofile() { } if($conf['profileconfirm']) { - if(!$auth->checkPass($_SERVER['REMOTE_USER'], $INPUT->post->str('oldpass'))) { + if(!$auth->checkPass($INPUT->server->str('REMOTE_USER'), $INPUT->post->str('oldpass'))) { msg($lang['badpassconfirm'], -1); return false; } } - if($result = $auth->triggerUserMod('modify', array($_SERVER['REMOTE_USER'], $changes))) { + if($result = $auth->triggerUserMod('modify', array($INPUT->server->str('REMOTE_USER'), &$changes))) { // update cookie and session with the changed data if($changes['pass']) { list( /*user*/, $sticky, /*pass*/) = auth_getCookie(); $pass = auth_encrypt($changes['pass'], auth_cookiesalt(!$sticky, true)); - auth_setCookie($_SERVER['REMOTE_USER'], $pass, (bool) $sticky); + auth_setCookie($INPUT->server->str('REMOTE_USER'), $pass, (bool) $sticky); } return true; } @@ -1053,6 +1111,11 @@ function updateprofile() { return false; } +/** + * Delete the current logged-in user + * + * @return bool true on success, false on any error + */ function auth_deleteprofile(){ global $conf; global $lang; @@ -1076,13 +1139,14 @@ function auth_deleteprofile(){ } if($conf['profileconfirm']) { - if(!$auth->checkPass($_SERVER['REMOTE_USER'], $INPUT->post->str('oldpass'))) { + if(!$auth->checkPass($INPUT->server->str('REMOTE_USER'), $INPUT->post->str('oldpass'))) { msg($lang['badpassconfirm'], -1); return false; } } - $deleted[] = $_SERVER['REMOTE_USER']; + $deleted = array(); + $deleted[] = $INPUT->server->str('REMOTE_USER'); if($auth->triggerUserMod('delete', array($deleted))) { // force and immediate logout including removing the sticky cookie auth_logoff(); @@ -1125,7 +1189,7 @@ function act_resendpwd() { // we're in token phase - get user info from token $tfile = $conf['cachedir'].'/'.$token{0}.'/'.$token.'.pwauth'; - if(!@file_exists($tfile)) { + if(!file_exists($tfile)) { msg($lang['resendpwdbadauth'], -1); $INPUT->remove('pwauth'); return false; @@ -1139,7 +1203,7 @@ function act_resendpwd() { } $user = io_readfile($tfile); - $userinfo = $auth->getUserData($user); + $userinfo = $auth->getUserData($user, $requireGroups = false); if(!$userinfo['mail']) { msg($lang['resendpwdnouser'], -1); return false; @@ -1191,7 +1255,7 @@ function act_resendpwd() { $user = trim($auth->cleanUser($INPUT->post->str('login'))); } - $userinfo = $auth->getUserData($user); + $userinfo = $auth->getUserData($user, $requireGroups = false); if(!$userinfo['mail']) { msg($lang['resendpwdnouser'], -1); return false; @@ -1232,6 +1296,7 @@ function act_resendpwd() { * is chosen. * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $clear The clear text password * @param string $method The hashing method * @param string $salt A salt, null for random @@ -1256,6 +1321,7 @@ function auth_cryptPassword($clear, $method = '', $salt = null) { * Verifies a cleartext password against a crypted hash * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $clear The clear text password * @param string $crypt The hash to compare with * @return bool true if both match @@ -1286,11 +1352,8 @@ function auth_setCookie($user, $pass, $sticky) { $cookie = base64_encode($user).'|'.((int) $sticky).'|'.base64_encode($pass); $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir']; $time = $sticky ? (time() + 60 * 60 * 24 * 365) : 0; //one year - if(version_compare(PHP_VERSION, '5.2.0', '>')) { - setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true); - } else { - setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl())); - } + setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true); + // set session $_SESSION[DOKU_COOKIE]['auth']['user'] = $user; $_SESSION[DOKU_COOKIE]['auth']['pass'] = sha1($pass); diff --git a/inc/blowfish.php b/inc/blowfish.php index bcf5804a2..7499515bc 100644 --- a/inc/blowfish.php +++ b/inc/blowfish.php @@ -356,7 +356,7 @@ class Horde_Cipher_blowfish * Encrypt a block on data. * * @param String $block The data to encrypt - * @param optional String $key The key to use + * @param String $key optional The key to use * * @return String the encrypted output */ @@ -404,8 +404,8 @@ class Horde_Cipher_blowfish /** * Decrypt a block on data. * - * @param String $block The data to decrypt - * @param optional String $key The key to use + * @param String $block The data to decrypt + * @param String $key optional The key to use * * @return String the decrypted output */ @@ -452,6 +452,7 @@ class Horde_Cipher_blowfish /** * Converts a text key into an array. * + * @param string $key * @return array The key. */ function _formatKey($key) { @@ -464,8 +465,8 @@ class Horde_Cipher_blowfish /** * Encryption using blowfish algorithm * - * @param string original data - * @param string the secret + * @param string $data original data + * @param string $secret the secret * * @return string the encrypted result * @@ -493,8 +494,8 @@ function PMA_blowfish_encrypt($data, $secret) { /** * Decryption using blowfish algorithm * - * @param string encrypted data - * @param string the secret + * @param string $encdata encrypted data + * @param string $secret the secret * * @return string original data * diff --git a/inc/cache.php b/inc/cache.php index 5eac94934..68f64eaa2 100644 --- a/inc/cache.php +++ b/inc/cache.php @@ -8,16 +8,25 @@ if(!defined('DOKU_INC')) die('meh.'); +/** + * Generic handling of caching + */ class cache { - var $key = ''; // primary identifier for this item - var $ext = ''; // file ext for cache data, secondary identifier for this item - var $cache = ''; // cache file name - var $depends = array(); // array containing cache dependency information, - // used by _useCache to determine cache validity + public $key = ''; // primary identifier for this item + public $ext = ''; // file ext for cache data, secondary identifier for this item + public $cache = ''; // cache file name + public $depends = array(); // array containing cache dependency information, + // used by _useCache to determine cache validity var $_event = ''; // event to be triggered during useCache + var $_time; + var $_nocache = false; // if set to true, cache will not be used or stored - function cache($key,$ext) { + /** + * @param string $key primary identifier + * @param string $ext file extension + */ + public function cache($key,$ext) { $this->key = $key; $this->ext = $ext; $this->cache = getCacheName($key,$ext); @@ -26,7 +35,7 @@ class cache { /** * public method to determine whether the cache can be used * - * to assist in cetralisation of event triggering and calculation of cache statistics, + * to assist in centralisation of event triggering and calculation of cache statistics, * don't override this function override _useCache() * * @param array $depends array of cache dependencies, support dependecies: @@ -36,12 +45,12 @@ class cache { * * @return bool true if cache can be used, false otherwise */ - function useCache($depends=array()) { + public function useCache($depends=array()) { $this->depends = $depends; $this->_addDependencies(); if ($this->_event) { - return $this->_stats(trigger_event($this->_event,$this,array($this,'_useCache'))); + return $this->_stats(trigger_event($this->_event, $this, array($this,'_useCache'))); } else { return $this->_stats($this->_useCache()); } @@ -55,12 +64,15 @@ class cache { * age - expire cache if older than age (seconds) * files - expire cache if any file in this array was updated more recently than the cache * + * Note that this function needs to be public as it is used as callback for the event handler + * * can be overridden * * @return bool see useCache() */ - function _useCache() { + public function _useCache() { + if ($this->_nocache) return false; // caching turned off if (!empty($this->depends['purge'])) return false; // purge requested? if (!($this->_time = @filemtime($this->cache))) return false; // cache exists? @@ -83,7 +95,7 @@ class cache { * it should not remove any existing dependencies and * it should only overwrite a dependency when the new value is more stringent than the old */ - function _addDependencies() { + protected function _addDependencies() { global $INPUT; if ($INPUT->has('purge')) $this->depends['purge'] = true; // purge requested } @@ -94,7 +106,7 @@ class cache { * @param bool $clean true to clean line endings, false to leave line endings alone * @return string cache contents */ - function retrieveCache($clean=true) { + public function retrieveCache($clean=true) { return io_readFile($this->cache, $clean); } @@ -104,14 +116,16 @@ class cache { * @param string $data the data to be cached * @return bool true on success, false otherwise */ - function storeCache($data) { + public function storeCache($data) { + if ($this->_nocache) return false; + return io_savefile($this->cache, $data); } /** * remove any cached data associated with this cache instance */ - function removeCache() { + public function removeCache() { @unlink($this->cache); } @@ -122,7 +136,7 @@ class cache { * @param bool $success result of this cache use attempt * @return bool pass-thru $success value */ - function _stats($success) { + protected function _stats($success) { global $conf; static $stats = null; static $file; @@ -157,14 +171,24 @@ class cache { } } +/** + * Parser caching + */ class cache_parser extends cache { - var $file = ''; // source file for cache - var $mode = ''; // input mode (represents the processing the input file will undergo) + public $file = ''; // source file for cache + public $mode = ''; // input mode (represents the processing the input file will undergo) + public $page = ''; var $_event = 'PARSER_CACHE_USE'; - function cache_parser($id, $file, $mode) { + /** + * + * @param string $id page id + * @param string $file source file for cache + * @param string $mode input mode + */ + public function cache_parser($id, $file, $mode) { if ($id) $this->page = $id; $this->file = $file; $this->mode = $mode; @@ -172,24 +196,25 @@ class cache_parser extends cache { parent::cache($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.$mode); } - function _useCache() { + /** + * method contains cache use decision logic + * + * @return bool see useCache() + */ + public function _useCache() { - if (!@file_exists($this->file)) return false; // source exists? + if (!file_exists($this->file)) return false; // source exists? return parent::_useCache(); } - function _addDependencies() { - global $conf, $config_cascade; - - $this->depends['age'] = isset($this->depends['age']) ? - min($this->depends['age'],$conf['cachetime']) : $conf['cachetime']; + protected function _addDependencies() { // parser cache file dependencies ... - $files = array($this->file, // ... source + $files = array($this->file, // ... source DOKU_INC.'inc/parser/parser.php', // ... parser DOKU_INC.'inc/parser/handler.php', // ... handler ); - $files = array_merge($files, getConfigFiles('main')); // ... wiki settings + $files = array_merge($files, getConfigFiles('main')); // ... wiki settings $this->depends['files'] = !empty($this->depends['files']) ? array_merge($files, $this->depends['files']) : $files; parent::_addDependencies(); @@ -197,8 +222,17 @@ class cache_parser extends cache { } +/** + * Caching of data of renderer + */ class cache_renderer extends cache_parser { - function _useCache() { + + /** + * method contains cache use decision logic + * + * @return bool see useCache() + */ + public function _useCache() { global $conf; if (!parent::_useCache()) return false; @@ -231,7 +265,19 @@ class cache_renderer extends cache_parser { return true; } - function _addDependencies() { + protected function _addDependencies() { + global $conf; + + // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values: + // -1 : do not cache (should not be overridden) + // 0 : cache never expires (can be overridden) - no need to set depends['age'] + if ($conf['cachetime'] == -1) { + $this->_nocache = true; + return; + } elseif ($conf['cachetime'] > 0) { + $this->depends['age'] = isset($this->depends['age']) ? + min($this->depends['age'],$conf['cachetime']) : $conf['cachetime']; + } // renderer cache file dependencies ... $files = array( @@ -253,18 +299,39 @@ class cache_renderer extends cache_parser { } } +/** + * Caching of parser instructions + */ class cache_instructions extends cache_parser { - function cache_instructions($id, $file) { + /** + * @param string $id page id + * @param string $file source file for cache + */ + public function cache_instructions($id, $file) { parent::cache_parser($id, $file, 'i'); } - function retrieveCache($clean=true) { + /** + * retrieve the cached data + * + * @param bool $clean true to clean line endings, false to leave line endings alone + * @return array cache contents + */ + public function retrieveCache($clean=true) { $contents = io_readFile($this->cache, false); return !empty($contents) ? unserialize($contents) : array(); } - function storeCache($instructions) { + /** + * cache $instructions + * + * @param array $instructions the instruction to be cached + * @return bool true on success, false otherwise + */ + public function storeCache($instructions) { + if ($this->_nocache) return false; + return io_savefile($this->cache,serialize($instructions)); } } diff --git a/inc/changelog.php b/inc/changelog.php index 6ff1e0eca..d1ef7973e 100644 --- a/inc/changelog.php +++ b/inc/changelog.php @@ -18,6 +18,9 @@ define('DOKU_CHANGE_TYPE_REVERT', 'R'); * parses a changelog line into it's components * * @author Ben Coburn <btcoburn@silicodon.net> + * + * @param string $line changelog line + * @return array|bool parsed line or false */ function parseChangelogLine($line) { $tmp = explode("\t", $line); @@ -43,7 +46,7 @@ function parseChangelogLine($line) { * @param String $summary Summary of the change * @param mixed $extra In case of a revert the revision (timestmp) of the reverted page * @param array $flags Additional flags in a key value array. - * Availible flags: + * Available flags: * - ExternalEdit - mark as an external edit. * * @author Andreas Gohr <andi@splitbrain.org> @@ -52,6 +55,8 @@ function parseChangelogLine($line) { */ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null){ global $conf, $INFO; + /** @var Input $INPUT */ + global $INPUT; // check for special flags as keys if (!is_array($flags)) { $flags = array(); } @@ -65,7 +70,7 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr if(!$date) $date = time(); //use current time if none supplied $remote = (!$flagExternalEdit)?clientIP(true):'127.0.0.1'; - $user = (!$flagExternalEdit)?$_SERVER['REMOTE_USER']:''; + $user = (!$flagExternalEdit)?$INPUT->server->str('REMOTE_USER'):''; $strip = array("\t", "\n"); $logline = array( @@ -78,17 +83,19 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr 'extra' => str_replace($strip, '', $extra) ); + $wasCreated = ($type===DOKU_CHANGE_TYPE_CREATE); + $wasReverted = ($type===DOKU_CHANGE_TYPE_REVERT); // update metadata if (!$wasRemoved) { $oldmeta = p_read_metadata($id); $meta = array(); - if (!$INFO['exists'] && empty($oldmeta['persistent']['date']['created'])){ // newly created + if ($wasCreated && empty($oldmeta['persistent']['date']['created'])){ // newly created $meta['date']['created'] = $created; if ($user){ $meta['creator'] = $INFO['userinfo']['name']; $meta['user'] = $user; } - } elseif (!$INFO['exists'] && !empty($oldmeta['persistent']['date']['created'])) { // re-created / restored + } elseif (($wasCreated || $wasReverted) && !empty($oldmeta['persistent']['date']['created'])) { // re-created / restored $meta['date']['created'] = $oldmeta['persistent']['date']['created']; $meta['date']['modified'] = $created; // use the files ctime here $meta['creator'] = $oldmeta['persistent']['creator']; @@ -114,15 +121,26 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr * @author Andreas Gohr <andi@splitbrain.org> * @author Esther Brunner <wikidesign@gmail.com> * @author Ben Coburn <btcoburn@silicodon.net> + * + * @param int $date Timestamp of the change + * @param String $id Name of the affected page + * @param String $type Type of the change see DOKU_CHANGE_TYPE_* + * @param String $summary Summary of the change + * @param mixed $extra In case of a revert the revision (timestmp) of the reverted page + * @param array $flags Additional flags in a key value array. + * Available flags: + * - (none, so far) */ function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null){ global $conf; + /** @var Input $INPUT */ + global $INPUT; $id = cleanid($id); if(!$date) $date = time(); //use current time if none supplied $remote = clientIP(true); - $user = $_SERVER['REMOTE_USER']; + $user = $INPUT->server->str('REMOTE_USER'); $strip = array("\t", "\n"); $logline = array( @@ -290,6 +308,12 @@ function getRecentsSince($from,$to=null,$ns='',$flags=0){ * @see getRecents() * @author Andreas Gohr <andi@splitbrain.org> * @author Ben Coburn <btcoburn@silicodon.net> + * + * @param string $line changelog line + * @param string $ns restrict to given namespace + * @param int $flags flags to control which changes are included + * @param array $seen listing of seen pages + * @return array|bool false or array with info about a change */ function _handleRecent($line,$ns,$flags,&$seen){ if(empty($line)) return false; //skip empty lines @@ -327,102 +351,713 @@ function _handleRecent($line,$ns,$flags,&$seen){ // check existance if($flags & RECENTS_SKIP_DELETED){ $fn = (($flags & RECENTS_MEDIA_CHANGES) ? mediaFN($recent['id']) : wikiFN($recent['id'])); - if(!@file_exists($fn)) return false; + if(!file_exists($fn)) return false; } return $recent; } /** - * Get the changelog information for a specific page id - * and revision (timestamp). Adjacent changelog lines - * are optimistically parsed and cached to speed up - * consecutive calls to getRevisionInfo. For large - * changelog files, only the chunk containing the - * requested changelog line is read. - * - * @author Ben Coburn <btcoburn@silicodon.net> - * @author Kate Arzamastseva <pshns@ukr.net> + * Class ChangeLog + * methods for handling of changelog of pages or media files */ -function getRevisionInfo($id, $rev, $chunk_size=8192, $media=false) { - global $cache_revinfo; - $cache =& $cache_revinfo; - if (!isset($cache[$id])) { $cache[$id] = array(); } - $rev = max($rev, 0); - - // check if it's already in the memory cache - if (isset($cache[$id]) && isset($cache[$id][$rev])) { - return $cache[$id][$rev]; +abstract class ChangeLog { + + /** @var string */ + protected $id; + /** @var int */ + protected $chunk_size; + /** @var array */ + protected $cache; + + /** + * Constructor + * + * @param string $id page id + * @param int $chunk_size maximum block size read from file + */ + public function __construct($id, $chunk_size = 8192) { + global $cache_revinfo; + + $this->cache =& $cache_revinfo; + if(!isset($this->cache[$id])) { + $this->cache[$id] = array(); + } + + $this->id = $id; + $this->setChunkSize($chunk_size); + } - if ($media) { - $file = mediaMetaFN($id, '.changes'); - } else { - $file = metaFN($id, '.changes'); + /** + * Set chunk size for file reading + * Chunk size zero let read whole file at once + * + * @param int $chunk_size maximum block size read from file + */ + public function setChunkSize($chunk_size) { + if(!is_numeric($chunk_size)) $chunk_size = 0; + + $this->chunk_size = (int) max($chunk_size, 0); } - if (!@file_exists($file)) { return false; } - if (filesize($file)<$chunk_size || $chunk_size==0) { - // read whole file - $lines = file($file); - if ($lines===false) { return false; } - } else { - // read by chunk - $fp = fopen($file, 'rb'); // "file pointer" - if ($fp===false) { return false; } - $head = 0; - fseek($fp, 0, SEEK_END); - $tail = ftell($fp); - $finger = 0; - $finger_rev = 0; - - // find chunk - while ($tail-$head>$chunk_size) { - $finger = $head+floor(($tail-$head)/2.0); - fseek($fp, $finger); - fgets($fp); // slip the finger forward to a new line - $finger = ftell($fp); - $tmp = fgets($fp); // then read at that location - $tmp = parseChangelogLine($tmp); - $finger_rev = $tmp['date']; - if ($finger==$head || $finger==$tail) { break; } - if ($finger_rev>$rev) { - $tail = $finger; - } else { - $head = $finger; + + /** + * Returns path to changelog + * + * @return string path to file + */ + abstract protected function getChangelogFilename(); + + /** + * Returns path to current page/media + * + * @return string path to file + */ + abstract protected function getFilename(); + + /** + * Get the changelog information for a specific page id and revision (timestamp) + * + * Adjacent changelog lines are optimistically parsed and cached to speed up + * consecutive calls to getRevisionInfo. For large changelog files, only the chunk + * containing the requested changelog line is read. + * + * @param int $rev revision timestamp + * @return bool|array false or array with entries: + * - date: unix timestamp + * - ip: IPv4 address (127.0.0.1) + * - type: log line type + * - id: page id + * - user: user name + * - sum: edit summary (or action reason) + * - extra: extra data (varies by line type) + * + * @author Ben Coburn <btcoburn@silicodon.net> + * @author Kate Arzamastseva <pshns@ukr.net> + */ + public function getRevisionInfo($rev) { + $rev = max($rev, 0); + + // check if it's already in the memory cache + if(isset($this->cache[$this->id]) && isset($this->cache[$this->id][$rev])) { + return $this->cache[$this->id][$rev]; + } + + //read lines from changelog + list($fp, $lines) = $this->readloglines($rev); + if($fp) { + fclose($fp); + } + if(empty($lines)) return false; + + // parse and cache changelog lines + foreach($lines as $value) { + $tmp = parseChangelogLine($value); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; } } + if(!isset($this->cache[$this->id][$rev])) { + return false; + } + return $this->cache[$this->id][$rev]; + } + + /** + * Return a list of page revisions numbers + * + * Does not guarantee that the revision exists in the attic, + * only that a line with the date exists in the changelog. + * By default the current revision is skipped. + * + * The current revision is automatically skipped when the page exists. + * See $INFO['meta']['last_change'] for the current revision. + * A negative $first let read the current revision too. + * + * For efficiency, the log lines are parsed and cached for later + * calls to getRevisionInfo. Large changelog files are read + * backwards in chunks until the requested number of changelog + * lines are recieved. + * + * @param int $first skip the first n changelog lines + * @param int $num number of revisions to return + * @return array with the revision timestamps + * + * @author Ben Coburn <btcoburn@silicodon.net> + * @author Kate Arzamastseva <pshns@ukr.net> + */ + public function getRevisions($first, $num) { + $revs = array(); + $lines = array(); + $count = 0; - if ($tail-$head<1) { - // cound not find chunk, assume requested rev is missing + $num = max($num, 0); + if($num == 0) { + return $revs; + } + + if($first < 0) { + $first = 0; + } else if(file_exists($this->getFilename())) { + // skip current revision if the page exists + $first = max($first + 1, 0); + } + + $file = $this->getChangelogFilename(); + + if(!file_exists($file)) { + return $revs; + } + if(filesize($file) < $this->chunk_size || $this->chunk_size == 0) { + // read whole file + $lines = file($file); + if($lines === false) { + return $revs; + } + } else { + // read chunks backwards + $fp = fopen($file, 'rb'); // "file pointer" + if($fp === false) { + return $revs; + } + fseek($fp, 0, SEEK_END); + $tail = ftell($fp); + + // chunk backwards + $finger = max($tail - $this->chunk_size, 0); + while($count < $num + $first) { + $nl = $this->getNewlinepointer($fp, $finger); + + // was the chunk big enough? if not, take another bite + if($nl > 0 && $tail <= $nl) { + $finger = max($finger - $this->chunk_size, 0); + continue; + } else { + $finger = $nl; + } + + // read chunk + $chunk = ''; + $read_size = max($tail - $finger, 0); // found chunk size + $got = 0; + while($got < $read_size && !feof($fp)) { + $tmp = @fread($fp, max(min($this->chunk_size, $read_size - $got), 0)); + if($tmp === false) { + break; + } //error state + $got += strlen($tmp); + $chunk .= $tmp; + } + $tmp = explode("\n", $chunk); + array_pop($tmp); // remove trailing newline + + // combine with previous chunk + $count += count($tmp); + $lines = array_merge($tmp, $lines); + + // next chunk + if($finger == 0) { + break; + } // already read all the lines + else { + $tail = $finger; + $finger = max($tail - $this->chunk_size, 0); + } + } fclose($fp); + } + + // skip parsing extra lines + $num = max(min(count($lines) - $first, $num), 0); + if ($first > 0 && $num > 0) { $lines = array_slice($lines, max(count($lines) - $first - $num, 0), $num); } + else if($first > 0 && $num == 0) { $lines = array_slice($lines, 0, max(count($lines) - $first, 0)); } + else if($first == 0 && $num > 0) { $lines = array_slice($lines, max(count($lines) - $num, 0)); } + + // handle lines in reverse order + for($i = count($lines) - 1; $i >= 0; $i--) { + $tmp = parseChangelogLine($lines[$i]); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + $revs[] = $tmp['date']; + } + } + + return $revs; + } + + /** + * Get the nth revision left or right handside for a specific page id and revision (timestamp) + * + * For large changelog files, only the chunk containing the + * reference revision $rev is read and sometimes a next chunck. + * + * Adjacent changelog lines are optimistically parsed and cached to speed up + * consecutive calls to getRevisionInfo. + * + * @param int $rev revision timestamp used as startdate (doesn't need to be revisionnumber) + * @param int $direction give position of returned revision with respect to $rev; positive=next, negative=prev + * @return bool|int + * timestamp of the requested revision + * otherwise false + */ + public function getRelativeRevision($rev, $direction) { + $rev = max($rev, 0); + $direction = (int) $direction; + + //no direction given or last rev, so no follow-up + if(!$direction || ($direction > 0 && $this->isCurrentRevision($rev))) { return false; } - // read chunk + //get lines from changelog + list($fp, $lines, $head, $tail, $eof) = $this->readloglines($rev); + if(empty($lines)) return false; + + // look for revisions later/earlier then $rev, when founded count till the wanted revision is reached + // also parse and cache changelog lines for getRevisionInfo(). + $revcounter = 0; + $relativerev = false; + $checkotherchunck = true; //always runs once + while(!$relativerev && $checkotherchunck) { + $tmp = array(); + //parse in normal or reverse order + $count = count($lines); + if($direction > 0) { + $start = 0; + $step = 1; + } else { + $start = $count - 1; + $step = -1; + } + for($i = $start; $i >= 0 && $i < $count; $i = $i + $step) { + $tmp = parseChangelogLine($lines[$i]); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + //look for revs older/earlier then reference $rev and select $direction-th one + if(($direction > 0 && $tmp['date'] > $rev) || ($direction < 0 && $tmp['date'] < $rev)) { + $revcounter++; + if($revcounter == abs($direction)) { + $relativerev = $tmp['date']; + } + } + } + } + + //true when $rev is found, but not the wanted follow-up. + $checkotherchunck = $fp + && ($tmp['date'] == $rev || ($revcounter > 0 && !$relativerev)) + && !(($tail == $eof && $direction > 0) || ($head == 0 && $direction < 0)); + + if($checkotherchunck) { + list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, $direction); + + if(empty($lines)) break; + } + } + if($fp) { + fclose($fp); + } + + return $relativerev; + } + + /** + * Returns revisions around rev1 and rev2 + * When available it returns $max entries for each revision + * + * @param int $rev1 oldest revision timestamp + * @param int $rev2 newest revision timestamp (0 looks up last revision) + * @param int $max maximum number of revisions returned + * @return array with two arrays with revisions surrounding rev1 respectively rev2 + */ + public function getRevisionsAround($rev1, $rev2, $max = 50) { + $max = floor(abs($max) / 2)*2 + 1; + $rev1 = max($rev1, 0); + $rev2 = max($rev2, 0); + + if($rev2) { + if($rev2 < $rev1) { + $rev = $rev2; + $rev2 = $rev1; + $rev1 = $rev; + } + } else { + //empty right side means a removed page. Look up last revision. + $revs = $this->getRevisions(-1, 1); + $rev2 = $revs[0]; + } + //collect revisions around rev2 + list($revs2, $allrevs, $fp, $lines, $head, $tail) = $this->retrieveRevisionsAround($rev2, $max); + + if(empty($revs2)) return array(array(), array()); + + //collect revisions around rev1 + $index = array_search($rev1, $allrevs); + if($index === false) { + //no overlapping revisions + list($revs1,,,,,) = $this->retrieveRevisionsAround($rev1, $max); + if(empty($revs1)) $revs1 = array(); + } else { + //revisions overlaps, reuse revisions around rev2 + $revs1 = $allrevs; + while($head > 0) { + for($i = count($lines) - 1; $i >= 0; $i--) { + $tmp = parseChangelogLine($lines[$i]); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + $revs1[] = $tmp['date']; + $index++; + + if($index > floor($max / 2)) break 2; + } + } + + list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, -1); + } + sort($revs1); + //return wanted selection + $revs1 = array_slice($revs1, max($index - floor($max/2), 0), $max); + } + + return array(array_reverse($revs1), array_reverse($revs2)); + } + + /** + * Returns lines from changelog. + * If file larger than $chuncksize, only chunck is read that could contain $rev. + * + * @param int $rev revision timestamp + * @return array|false + * if success returns array(fp, array(changeloglines), $head, $tail, $eof) + * where fp only defined for chuck reading, needs closing. + * otherwise false + */ + protected function readloglines($rev) { + $file = $this->getChangelogFilename(); + + if(!file_exists($file)) { + return false; + } + + $fp = null; + $head = 0; + $tail = 0; + $eof = 0; + + if(filesize($file) < $this->chunk_size || $this->chunk_size == 0) { + // read whole file + $lines = file($file); + if($lines === false) { + return false; + } + } else { + // read by chunk + $fp = fopen($file, 'rb'); // "file pointer" + if($fp === false) { + return false; + } + $head = 0; + fseek($fp, 0, SEEK_END); + $eof = ftell($fp); + $tail = $eof; + + // find chunk + while($tail - $head > $this->chunk_size) { + $finger = $head + floor(($tail - $head) / 2.0); + $finger = $this->getNewlinepointer($fp, $finger); + $tmp = fgets($fp); + if($finger == $head || $finger == $tail) { + break; + } + $tmp = parseChangelogLine($tmp); + $finger_rev = $tmp['date']; + + if($finger_rev > $rev) { + $tail = $finger; + } else { + $head = $finger; + } + } + + if($tail - $head < 1) { + // cound not find chunk, assume requested rev is missing + fclose($fp); + return false; + } + + $lines = $this->readChunk($fp, $head, $tail); + } + return array( + $fp, + $lines, + $head, + $tail, + $eof + ); + } + + /** + * Read chunk and return array with lines of given chunck. + * Has no check if $head and $tail are really at a new line + * + * @param resource $fp resource filepointer + * @param int $head start point chunck + * @param int $tail end point chunck + * @return array lines read from chunck + */ + protected function readChunk($fp, $head, $tail) { $chunk = ''; - $chunk_size = max($tail-$head, 0); // found chunk size + $chunk_size = max($tail - $head, 0); // found chunk size $got = 0; fseek($fp, $head); - while ($got<$chunk_size && !feof($fp)) { - $tmp = @fread($fp, max($chunk_size-$got, 0)); - if ($tmp===false) { break; } //error state + while($got < $chunk_size && !feof($fp)) { + $tmp = @fread($fp, max(min($this->chunk_size, $chunk_size - $got), 0)); + if($tmp === false) { //error state + break; + } $got += strlen($tmp); $chunk .= $tmp; } $lines = explode("\n", $chunk); array_pop($lines); // remove trailing newline - fclose($fp); + return $lines; } - // parse and cache changelog lines - foreach ($lines as $value) { - $tmp = parseChangelogLine($value); - if ($tmp!==false) { - $cache[$id][$tmp['date']] = $tmp; + /** + * Set pointer to first new line after $finger and return its position + * + * @param resource $fp filepointer + * @param int $finger a pointer + * @return int pointer + */ + protected function getNewlinepointer($fp, $finger) { + fseek($fp, $finger); + $nl = $finger; + if($finger > 0) { + fgets($fp); // slip the finger forward to a new line + $nl = ftell($fp); + } + return $nl; + } + + /** + * Check whether given revision is the current page + * + * @param int $rev timestamp of current page + * @return bool true if $rev is current revision, otherwise false + */ + public function isCurrentRevision($rev) { + return $rev == @filemtime($this->getFilename()); + } + + /** + * Return an existing revision for a specific date which is + * the current one or younger or equal then the date + * + * @param string $id + * @param number $date_at timestamp + * @return string revision ('' for current) + */ + function getLastRevisionAt($date_at){ + //requested date_at(timestamp) younger or equal then modified_time($this->id) => load current + if($date_at >= @filemtime($this->getFilename())) { + return ''; + } else if ($rev = $this->getRelativeRevision($date_at+1, -1)) { //+1 to get also the requested date revision + return $rev; + } else { + return false; } } - if (!isset($cache[$id][$rev])) { return false; } - return $cache[$id][$rev]; + + /** + * Returns the next lines of the changelog of the chunck before head or after tail + * + * @param resource $fp filepointer + * @param int $head position head of last chunk + * @param int $tail position tail of last chunk + * @param int $direction positive forward, negative backward + * @return array with entries: + * - $lines: changelog lines of readed chunk + * - $head: head of chunk + * - $tail: tail of chunk + */ + protected function readAdjacentChunk($fp, $head, $tail, $direction) { + if(!$fp) return array(array(), $head, $tail); + + if($direction > 0) { + //read forward + $head = $tail; + $tail = $head + floor($this->chunk_size * (2 / 3)); + $tail = $this->getNewlinepointer($fp, $tail); + } else { + //read backward + $tail = $head; + $head = max($tail - $this->chunk_size, 0); + while(true) { + $nl = $this->getNewlinepointer($fp, $head); + // was the chunk big enough? if not, take another bite + if($nl > 0 && $tail <= $nl) { + $head = max($head - $this->chunk_size, 0); + } else { + $head = $nl; + break; + } + } + } + + //load next chunck + $lines = $this->readChunk($fp, $head, $tail); + return array($lines, $head, $tail); + } + + /** + * Collect the $max revisions near to the timestamp $rev + * + * @param int $rev revision timestamp + * @param int $max maximum number of revisions to be returned + * @return bool|array + * return array with entries: + * - $requestedrevs: array of with $max revision timestamps + * - $revs: all parsed revision timestamps + * - $fp: filepointer only defined for chuck reading, needs closing. + * - $lines: non-parsed changelog lines before the parsed revisions + * - $head: position of first readed changelogline + * - $lasttail: position of end of last readed changelogline + * otherwise false + */ + protected function retrieveRevisionsAround($rev, $max) { + //get lines from changelog + list($fp, $lines, $starthead, $starttail, /* $eof */) = $this->readloglines($rev); + if(empty($lines)) return false; + + //parse chunk containing $rev, and read forward more chunks until $max/2 is reached + $head = $starthead; + $tail = $starttail; + $revs = array(); + $aftercount = $beforecount = 0; + while(count($lines) > 0) { + foreach($lines as $line) { + $tmp = parseChangelogLine($line); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + $revs[] = $tmp['date']; + if($tmp['date'] >= $rev) { + //count revs after reference $rev + $aftercount++; + if($aftercount == 1) $beforecount = count($revs); + } + //enough revs after reference $rev? + if($aftercount > floor($max / 2)) break 2; + } + } + //retrieve next chunk + list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, 1); + } + if($aftercount == 0) return false; + + $lasttail = $tail; + + //read additional chuncks backward until $max/2 is reached and total number of revs is equal to $max + $lines = array(); + $i = 0; + if($aftercount > 0) { + $head = $starthead; + $tail = $starttail; + while($head > 0) { + list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, -1); + + for($i = count($lines) - 1; $i >= 0; $i--) { + $tmp = parseChangelogLine($lines[$i]); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + $revs[] = $tmp['date']; + $beforecount++; + //enough revs before reference $rev? + if($beforecount > max(floor($max / 2), $max - $aftercount)) break 2; + } + } + } + } + sort($revs); + + //keep only non-parsed lines + $lines = array_slice($lines, 0, $i); + //trunk desired selection + $requestedrevs = array_slice($revs, -$max, $max); + + return array($requestedrevs, $revs, $fp, $lines, $head, $lasttail); + } +} + +/** + * Class PageChangelog handles changelog of a wiki page + */ +class PageChangelog extends ChangeLog { + + /** + * Returns path to changelog + * + * @return string path to file + */ + protected function getChangelogFilename() { + return metaFN($this->id, '.changes'); + } + + /** + * Returns path to current page/media + * + * @return string path to file + */ + protected function getFilename() { + return wikiFN($this->id); + } +} + +/** + * Class MediaChangelog handles changelog of a media file + */ +class MediaChangelog extends ChangeLog { + + /** + * Returns path to changelog + * + * @return string path to file + */ + protected function getChangelogFilename() { + return mediaMetaFN($this->id, '.changes'); + } + + /** + * Returns path to current page/media + * + * @return string path to file + */ + protected function getFilename() { + return mediaFN($this->id); + } +} + +/** + * Get the changelog information for a specific page id + * and revision (timestamp). Adjacent changelog lines + * are optimistically parsed and cached to speed up + * consecutive calls to getRevisionInfo. For large + * changelog files, only the chunk containing the + * requested changelog line is read. + * + * @deprecated 2013-11-20 + * + * @author Ben Coburn <btcoburn@silicodon.net> + * @author Kate Arzamastseva <pshns@ukr.net> + */ +function getRevisionInfo($id, $rev, $chunk_size = 8192, $media = false) { + dbg_deprecated('class PageChangeLog or class MediaChangelog'); + if($media) { + $changelog = new MediaChangeLog($id, $chunk_size); + } else { + $changelog = new PageChangeLog($id, $chunk_size); + } + return $changelog->getRevisionInfo($rev); } /** @@ -431,10 +1066,6 @@ function getRevisionInfo($id, $rev, $chunk_size=8192, $media=false) { * only that a line with the date exists in the changelog. * By default the current revision is skipped. * - * id: the page of interest - * first: skip the first n changelog lines - * num: number of revisions to return - * * The current revision is automatically skipped when the page exists. * See $INFO['meta']['last_change'] for the current revision. * @@ -443,106 +1074,25 @@ function getRevisionInfo($id, $rev, $chunk_size=8192, $media=false) { * backwards in chunks until the requested number of changelog * lines are recieved. * + * @deprecated 2013-11-20 + * * @author Ben Coburn <btcoburn@silicodon.net> * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $id the page of interest + * @param int $first skip the first n changelog lines + * @param int $num number of revisions to return + * @param int $chunk_size + * @param bool $media + * @return array */ -function getRevisions($id, $first, $num, $chunk_size=8192, $media=false) { - global $cache_revinfo; - $cache =& $cache_revinfo; - if (!isset($cache[$id])) { $cache[$id] = array(); } - - $revs = array(); - $lines = array(); - $count = 0; - if ($media) { - $file = mediaMetaFN($id, '.changes'); +function getRevisions($id, $first, $num, $chunk_size = 8192, $media = false) { + dbg_deprecated('class PageChangeLog or class MediaChangelog'); + if($media) { + $changelog = new MediaChangeLog($id, $chunk_size); } else { - $file = metaFN($id, '.changes'); - } - $num = max($num, 0); - if ($num == 0) { return $revs; } - - $chunk_size = max($chunk_size, 0); - if ($first<0) { - $first = 0; - } else if (!$media && @file_exists(wikiFN($id)) || $media && @file_exists(mediaFN($id))) { - // skip current revision if the page exists - $first = max($first+1, 0); + $changelog = new PageChangeLog($id, $chunk_size); } - - if (!@file_exists($file)) { return $revs; } - if (filesize($file)<$chunk_size || $chunk_size==0) { - // read whole file - $lines = file($file); - if ($lines===false) { return $revs; } - } else { - // read chunks backwards - $fp = fopen($file, 'rb'); // "file pointer" - if ($fp===false) { return $revs; } - fseek($fp, 0, SEEK_END); - $tail = ftell($fp); - - // chunk backwards - $finger = max($tail-$chunk_size, 0); - while ($count<$num+$first) { - fseek($fp, $finger); - $nl = $finger; - if ($finger>0) { - fgets($fp); // slip the finger forward to a new line - $nl = ftell($fp); - } - - // was the chunk big enough? if not, take another bite - if($nl > 0 && $tail <= $nl){ - $finger = max($finger-$chunk_size, 0); - continue; - }else{ - $finger = $nl; - } - - // read chunk - $chunk = ''; - $read_size = max($tail-$finger, 0); // found chunk size - $got = 0; - while ($got<$read_size && !feof($fp)) { - $tmp = @fread($fp, max($read_size-$got, 0)); - if ($tmp===false) { break; } //error state - $got += strlen($tmp); - $chunk .= $tmp; - } - $tmp = explode("\n", $chunk); - array_pop($tmp); // remove trailing newline - - // combine with previous chunk - $count += count($tmp); - $lines = array_merge($tmp, $lines); - - // next chunk - if ($finger==0) { break; } // already read all the lines - else { - $tail = $finger; - $finger = max($tail-$chunk_size, 0); - } - } - fclose($fp); - } - - // skip parsing extra lines - $num = max(min(count($lines)-$first, $num), 0); - if ($first>0 && $num>0) { $lines = array_slice($lines, max(count($lines)-$first-$num, 0), $num); } - else if ($first>0 && $num==0) { $lines = array_slice($lines, 0, max(count($lines)-$first, 0)); } - else if ($first==0 && $num>0) { $lines = array_slice($lines, max(count($lines)-$num, 0)); } - - // handle lines in reverse order - for ($i = count($lines)-1; $i >= 0; $i--) { - $tmp = parseChangelogLine($lines[$i]); - if ($tmp!==false) { - $cache[$id][$tmp['date']] = $tmp; - $revs[] = $tmp['date']; - } - } - - return $revs; + return $changelog->getRevisions($first, $num); } - diff --git a/inc/cli.php b/inc/cli.php new file mode 100644 index 000000000..14e2c0c8d --- /dev/null +++ b/inc/cli.php @@ -0,0 +1,652 @@ +<?php + +/** + * Class DokuCLI + * + * All DokuWiki commandline scripts should inherit from this class and implement the abstract methods. + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +abstract class DokuCLI { + /** @var string the executed script itself */ + protected $bin; + /** @var DokuCLI_Options the option parser */ + protected $options; + /** @var DokuCLI_Colors */ + public $colors; + + /** + * constructor + * + * Initialize the arguments, set up helper classes and set up the CLI environment + */ + public function __construct() { + set_exception_handler(array($this, 'fatal')); + + $this->options = new DokuCLI_Options(); + $this->colors = new DokuCLI_Colors(); + } + + /** + * Register options and arguments on the given $options object + * + * @param DokuCLI_Options $options + * @return void + */ + abstract protected function setup(DokuCLI_Options $options); + + /** + * Your main program + * + * Arguments and options have been parsed when this is run + * + * @param DokuCLI_Options $options + * @return void + */ + abstract protected function main(DokuCLI_Options $options); + + /** + * Execute the CLI program + * + * Executes the setup() routine, adds default options, initiate the options parsing and argument checking + * and finally executes main() + */ + public function run() { + if('cli' != php_sapi_name()) throw new DokuCLI_Exception('This has to be run from the command line'); + + // setup + $this->setup($this->options); + $this->options->registerOption( + 'no-colors', + 'Do not use any colors in output. Useful when piping output to other tools or files.' + ); + $this->options->registerOption( + 'help', + 'Display this help screen and exit immeadiately.', + 'h' + ); + + // parse + $this->options->parseOptions(); + + // handle defaults + if($this->options->getOpt('no-colors')) { + $this->colors->disable(); + } + if($this->options->getOpt('help')) { + echo $this->options->help(); + exit(0); + } + + // check arguments + $this->options->checkArguments(); + + // execute + $this->main($this->options); + + exit(0); + } + + /** + * Exits the program on a fatal error + * + * @param Exception|string $error either an exception or an error message + */ + public function fatal($error) { + $code = 0; + if(is_object($error) && is_a($error, 'Exception')) { + /** @var Exception $error */ + $code = $error->getCode(); + $error = $error->getMessage(); + } + if(!$code) $code = DokuCLI_Exception::E_ANY; + + $this->error($error); + exit($code); + } + + /** + * Print an error message + * + * @param string $string + */ + public function error($string) { + $this->colors->ptln("E: $string", 'red', STDERR); + } + + /** + * Print a success message + * + * @param string $string + */ + public function success($string) { + $this->colors->ptln("S: $string", 'green', STDERR); + } + + /** + * Print an info message + * + * @param string $string + */ + public function info($string) { + $this->colors->ptln("I: $string", 'cyan', STDERR); + } + +} + +/** + * Class DokuCLI_Colors + * + * Handles color output on (Linux) terminals + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +class DokuCLI_Colors { + /** @var array known color names */ + protected $colors = array( + 'reset' => "\33[0m", + 'black' => "\33[0;30m", + 'darkgray' => "\33[1;30m", + 'blue' => "\33[0;34m", + 'lightblue' => "\33[1;34m", + 'green' => "\33[0;32m", + 'lightgreen' => "\33[1;32m", + 'cyan' => "\33[0;36m", + 'lightcyan' => "\33[1;36m", + 'red' => "\33[0;31m", + 'lightred' => "\33[1;31m", + 'purple' => "\33[0;35m", + 'lightpurple' => "\33[1;35m", + 'brown' => "\33[0;33m", + 'yellow' => "\33[1;33m", + 'lightgray' => "\33[0;37m", + 'white' => "\33[1;37m", + ); + + /** @var bool should colors be used? */ + protected $enabled = true; + + /** + * Constructor + * + * Tries to disable colors for non-terminals + */ + public function __construct() { + if(function_exists('posix_isatty') && !posix_isatty(STDOUT)) { + $this->enabled = false; + return; + } + if(!getenv('TERM')) { + $this->enabled = false; + return; + } + } + + /** + * enable color output + */ + public function enable() { + $this->enabled = true; + } + + /** + * disable color output + */ + public function disable() { + $this->enabled = false; + } + + /** + * Convenience function to print a line in a given color + * + * @param string $line + * @param string $color + * @param resource $channel + */ + public function ptln($line, $color, $channel = STDOUT) { + $this->set($color); + fwrite($channel, rtrim($line)."\n"); + $this->reset(); + } + + /** + * Set the given color for consecutive output + * + * @param string $color one of the supported color names + * @throws DokuCLI_Exception + */ + public function set($color) { + if(!$this->enabled) return; + if(!isset($this->colors[$color])) throw new DokuCLI_Exception("No such color $color"); + echo $this->colors[$color]; + } + + /** + * reset the terminal color + */ + public function reset() { + $this->set('reset'); + } +} + +/** + * Class DokuCLI_Options + * + * Parses command line options passed to the CLI script. Allows CLI scripts to easily register all accepted options and + * commands and even generates a help text from this setup. + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +class DokuCLI_Options { + /** @var array keeps the list of options to parse */ + protected $setup; + + /** @var array store parsed options */ + protected $options = array(); + + /** @var string current parsed command if any */ + protected $command = ''; + + /** @var array passed non-option arguments */ + public $args = array(); + + /** @var string the executed script */ + protected $bin; + + /** + * Constructor + */ + public function __construct() { + $this->setup = array( + '' => array( + 'opts' => array(), + 'args' => array(), + 'help' => '' + ) + ); // default command + + $this->args = $this->readPHPArgv(); + $this->bin = basename(array_shift($this->args)); + + $this->options = array(); + } + + /** + * Sets the help text for the tool itself + * + * @param string $help + */ + public function setHelp($help) { + $this->setup['']['help'] = $help; + } + + /** + * Register the names of arguments for help generation and number checking + * + * This has to be called in the order arguments are expected + * + * @param string $arg argument name (just for help) + * @param string $help help text + * @param bool $required is this a required argument + * @param string $command if theses apply to a sub command only + * @throws DokuCLI_Exception + */ + public function registerArgument($arg, $help, $required = true, $command = '') { + if(!isset($this->setup[$command])) throw new DokuCLI_Exception("Command $command not registered"); + + $this->setup[$command]['args'][] = array( + 'name' => $arg, + 'help' => $help, + 'required' => $required + ); + } + + /** + * This registers a sub command + * + * Sub commands have their own options and use their own function (not main()). + * + * @param string $command + * @param string $help + * @throws DokuCLI_Exception + */ + public function registerCommand($command, $help) { + if(isset($this->setup[$command])) throw new DokuCLI_Exception("Command $command already registered"); + + $this->setup[$command] = array( + 'opts' => array(), + 'args' => array(), + 'help' => $help + ); + + } + + /** + * Register an option for option parsing and help generation + * + * @param string $long multi character option (specified with --) + * @param string $help help text for this option + * @param string|null $short one character option (specified with -) + * @param bool|string $needsarg does this option require an argument? give it a name here + * @param string $command what command does this option apply to + * @throws DokuCLI_Exception + */ + public function registerOption($long, $help, $short = null, $needsarg = false, $command = '') { + if(!isset($this->setup[$command])) throw new DokuCLI_Exception("Command $command not registered"); + + $this->setup[$command]['opts'][$long] = array( + 'needsarg' => $needsarg, + 'help' => $help, + 'short' => $short + ); + + if($short) { + if(strlen($short) > 1) throw new DokuCLI_Exception("Short options should be exactly one ASCII character"); + + $this->setup[$command]['short'][$short] = $long; + } + } + + /** + * Checks the actual number of arguments against the required number + * + * Throws an exception if arguments are missing. Called from parseOptions() + * + * @throws DokuCLI_Exception + */ + public function checkArguments() { + $argc = count($this->args); + + $req = 0; + foreach($this->setup[$this->command]['args'] as $arg) { + if(!$arg['required']) break; // last required arguments seen + $req++; + } + + if($req > $argc) throw new DokuCLI_Exception("Not enough arguments", DokuCLI_Exception::E_OPT_ARG_REQUIRED); + } + + /** + * Parses the given arguments for known options and command + * + * The given $args array should NOT contain the executed file as first item anymore! The $args + * array is stripped from any options and possible command. All found otions can be accessed via the + * getOpt() function + * + * Note that command options will overwrite any global options with the same name + * + * @throws DokuCLI_Exception + */ + public function parseOptions() { + $non_opts = array(); + + $argc = count($this->args); + for($i = 0; $i < $argc; $i++) { + $arg = $this->args[$i]; + + // The special element '--' means explicit end of options. Treat the rest of the arguments as non-options + // and end the loop. + if($arg == '--') { + $non_opts = array_merge($non_opts, array_slice($this->args, $i + 1)); + break; + } + + // '-' is stdin - a normal argument + if($arg == '-') { + $non_opts = array_merge($non_opts, array_slice($this->args, $i)); + break; + } + + // first non-option + if($arg{0} != '-') { + $non_opts = array_merge($non_opts, array_slice($this->args, $i)); + break; + } + + // long option + if(strlen($arg) > 1 && $arg{1} == '-') { + list($opt, $val) = explode('=', substr($arg, 2), 2); + + if(!isset($this->setup[$this->command]['opts'][$opt])) { + throw new DokuCLI_Exception("No such option $arg", DokuCLI_Exception::E_UNKNOWN_OPT); + } + + // argument required? + if($this->setup[$this->command]['opts'][$opt]['needsarg']) { + if(is_null($val) && $i + 1 < $argc && !preg_match('/^--?[\w]/', $this->args[$i + 1])) { + $val = $this->args[++$i]; + } + if(is_null($val)) { + throw new DokuCLI_Exception("Option $arg requires an argument", DokuCLI_Exception::E_OPT_ARG_REQUIRED); + } + $this->options[$opt] = $val; + } else { + $this->options[$opt] = true; + } + + continue; + } + + // short option + $opt = substr($arg, 1); + if(!isset($this->setup[$this->command]['short'][$opt])) { + throw new DokuCLI_Exception("No such option $arg", DokuCLI_Exception::E_UNKNOWN_OPT); + } else { + $opt = $this->setup[$this->command]['short'][$opt]; // store it under long name + } + + // argument required? + if($this->setup[$this->command]['opts'][$opt]['needsarg']) { + $val = null; + if($i + 1 < $argc && !preg_match('/^--?[\w]/', $this->args[$i + 1])) { + $val = $this->args[++$i]; + } + if(is_null($val)) { + throw new DokuCLI_Exception("Option $arg requires an argument", DokuCLI_Exception::E_OPT_ARG_REQUIRED); + } + $this->options[$opt] = $val; + } else { + $this->options[$opt] = true; + } + } + + // parsing is now done, update args array + $this->args = $non_opts; + + // if not done yet, check if first argument is a command and reexecute argument parsing if it is + if(!$this->command && $this->args && isset($this->setup[$this->args[0]])) { + // it is a command! + $this->command = array_shift($this->args); + $this->parseOptions(); // second pass + } + } + + /** + * Get the value of the given option + * + * Please note that all options are accessed by their long option names regardless of how they were + * specified on commandline. + * + * Can only be used after parseOptions() has been run + * + * @param string $option + * @param bool|string $default what to return if the option was not set + * @return bool|string + */ + public function getOpt($option, $default = false) { + if(isset($this->options[$option])) return $this->options[$option]; + return $default; + } + + /** + * Return the found command if any + * + * @return string + */ + public function getCmd() { + return $this->command; + } + + /** + * Builds a help screen from the available options. You may want to call it from -h or on error + * + * @return string + */ + public function help() { + $text = ''; + + $hascommands = (count($this->setup) > 1); + foreach($this->setup as $command => $config) { + $hasopts = (bool) $this->setup[$command]['opts']; + $hasargs = (bool) $this->setup[$command]['args']; + + if(!$command) { + $text .= 'USAGE: '.$this->bin; + } else { + $text .= "\n$command"; + } + + if($hasopts) $text .= ' <OPTIONS>'; + + foreach($this->setup[$command]['args'] as $arg) { + if($arg['required']) { + $text .= ' <'.$arg['name'].'>'; + } else { + $text .= ' [<'.$arg['name'].'>]'; + } + } + $text .= "\n"; + + if($this->setup[$command]['help']) { + $text .= "\n"; + $text .= $this->tableFormat( + array(2, 72), + array('', $this->setup[$command]['help']."\n") + ); + } + + if($hasopts) { + $text .= "\n OPTIONS\n\n"; + foreach($this->setup[$command]['opts'] as $long => $opt) { + + $name = ''; + if($opt['short']) { + $name .= '-'.$opt['short']; + if($opt['needsarg']) $name .= ' <'.$opt['needsarg'].'>'; + $name .= ', '; + } + $name .= "--$long"; + if($opt['needsarg']) $name .= ' <'.$opt['needsarg'].'>'; + + $text .= $this->tableFormat( + array(2, 20, 52), + array('', $name, $opt['help']) + ); + $text .= "\n"; + } + } + + if($hasargs) { + $text .= "\n"; + foreach($this->setup[$command]['args'] as $arg) { + $name = '<'.$arg['name'].'>'; + + $text .= $this->tableFormat( + array(2, 20, 52), + array('', $name, $arg['help']) + ); + } + } + + if($command == '' && $hascommands) { + $text .= "\nThis tool accepts a command as first parameter as outlined below:\n"; + } + } + + return $text; + } + + /** + * Safely read the $argv PHP array across different PHP configurations. + * Will take care on register_globals and register_argc_argv ini directives + * + * @throws DokuCLI_Exception + * @return array the $argv PHP array or PEAR error if not registered + */ + private function readPHPArgv() { + global $argv; + if(!is_array($argv)) { + if(!@is_array($_SERVER['argv'])) { + if(!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) { + throw new DokuCLI_Exception( + "Could not read cmd args (register_argc_argv=Off?)", + DOKU_CLI_OPTS_ARG_READ + ); + } + return $GLOBALS['HTTP_SERVER_VARS']['argv']; + } + return $_SERVER['argv']; + } + return $argv; + } + + /** + * Displays text in multiple word wrapped columns + * + * @param int[] $widths list of column widths (in characters) + * @param string[] $texts list of texts for each column + * @return string + */ + private function tableFormat($widths, $texts) { + $wrapped = array(); + $maxlen = 0; + + foreach($widths as $col => $width) { + $wrapped[$col] = explode("\n", wordwrap($texts[$col], $width - 1, "\n", true)); // -1 char border + $len = count($wrapped[$col]); + if($len > $maxlen) $maxlen = $len; + + } + + $out = ''; + for($i = 0; $i < $maxlen; $i++) { + foreach($widths as $col => $width) { + if(isset($wrapped[$col][$i])) { + $val = $wrapped[$col][$i]; + } else { + $val = ''; + } + $out .= sprintf('%-'.$width.'s', $val); + } + $out .= "\n"; + } + return $out; + } +} + +/** + * Class DokuCLI_Exception + * + * The code is used as exit code for the CLI tool. This should probably be extended. Many cases just fall back to the + * E_ANY code. + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +class DokuCLI_Exception extends Exception { + const E_ANY = -1; // no error code specified + const E_UNKNOWN_OPT = 1; //Unrecognized option + const E_OPT_ARG_REQUIRED = 2; //Option requires argument + const E_OPT_ARG_DENIED = 3; //Option not allowed argument + const E_OPT_ABIGUOUS = 4; //Option abiguous + const E_ARG_READ = 5; //Could not read argv + + /** + * @param string $message The Exception message to throw. + * @param int $code The Exception code + * @param Exception $previous The previous exception used for the exception chaining. + */ + public function __construct($message = "", $code = 0, Exception $previous = null) { + if(!$code) $code = DokuCLI_Exception::E_ANY; + parent::__construct($message, $code, $previous); + } +} diff --git a/inc/cliopts.php b/inc/cliopts.php index 9cea686a2..7d71c7dc9 100644 --- a/inc/cliopts.php +++ b/inc/cliopts.php @@ -36,9 +36,9 @@ if (version_compare(phpversion(), '4.3.0', '<') || php_sapi_name() == 'cgi') { // PHP ini settings set_time_limit(0); - ini_set('track_errors', true); - ini_set('html_errors', false); - ini_set('magic_quotes_runtime', false); + ini_set('track_errors', "1"); + ini_set('html_errors', "0"); + ini_set('magic_quotes_runtime', "0"); // Define stream constants define('STDIN', fopen('php://stdin', 'r')); @@ -68,16 +68,17 @@ define('DOKU_CLI_OPTS_ARG_READ',5);//Could not read argv * * @author Andrei Zmievski <andrei@php.net> * + * @deprecated 2014-05-16 */ class Doku_Cli_Opts { /** * <?php ?> * @see http://www.sitepoint.com/article/php-command-line-1/3 - * @param string executing file name - this MUST be passed the __FILE__ constant - * @param string short options - * @param array (optional) long options - * @return Doku_Cli_Opts_Container or Doku_Cli_Opts_Error + * @param string $bin_file executing file name - this MUST be passed the __FILE__ constant + * @param string $short_options short options + * @param array $long_options (optional) long options + * @return Doku_Cli_Opts_Container|Doku_Cli_Opts_Error */ function & getOptions($bin_file, $short_options, $long_options = null) { $args = Doku_Cli_Opts::readPHPArgv(); @@ -233,12 +234,12 @@ class Doku_Cli_Opts { * Parse short option * * @param string $arg Argument - * @param string[] $short_options Available short options + * @param string $short_options Available short options * @param string[][] &$opts * @param string[] &$args * * @access private - * @return void + * @return void|Doku_Cli_Opts_Error */ function _parseShortOption($arg, $short_options, &$opts, &$args) { $len = strlen($arg); @@ -324,7 +325,7 @@ class Doku_Cli_Opts { * @param string[] &$args * * @access private - * @return void|PEAR_Error + * @return void|Doku_Cli_Opts_Error */ function _parseLongOption($arg, $long_options, &$opts, &$args) { @list($opt, $opt_arg) = explode('=', $arg, 2); @@ -402,7 +403,7 @@ class Doku_Cli_Opts { * Will take care on register_globals and register_argc_argv ini directives * * @access public - * @return mixed the $argv PHP array or PEAR error if not registered + * @return array|Doku_Cli_Opts_Error the $argv PHP array or PEAR error if not registered */ function readPHPArgv() { global $argv; @@ -421,10 +422,19 @@ class Doku_Cli_Opts { return $argv; } + /** + * @param $code + * @param $msg + * @return Doku_Cli_Opts_Error + */ function raiseError($code, $msg) { return new Doku_Cli_Opts_Error($code, $msg); } + /** + * @param $obj + * @return bool + */ function isError($obj) { return is_a($obj, 'Doku_Cli_Opts_Error'); } diff --git a/inc/common.php b/inc/common.php index 32771285b..5a8b5c900 100644 --- a/inc/common.php +++ b/inc/common.php @@ -22,6 +22,9 @@ define('RECENTS_MEDIA_PAGES_MIXED', 32); * * @author Andreas Gohr <andi@splitbrain.org> * @see htmlspecialchars() + * + * @param string $string the string being converted + * @return string converted string */ function hsc($string) { return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); @@ -33,6 +36,9 @@ function hsc($string) { * You can give an indention as optional parameter * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $string line of text + * @param int $indent number of spaces indention */ function ptln($string, $indent = 0) { echo str_repeat(' ', $indent)."$string\n"; @@ -42,6 +48,9 @@ function ptln($string, $indent = 0) { * strips control characters (<32) from the given string * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $string being stripped + * @return string */ function stripctl($string) { return preg_replace('/[\x00-\x1F]+/s', '', $string); @@ -53,18 +62,25 @@ function stripctl($string) { * @author Andreas Gohr <andi@splitbrain.org> * @link http://en.wikipedia.org/wiki/Cross-site_request_forgery * @link http://christ1an.blogspot.com/2007/04/preventing-csrf-efficiently.html + * * @return string */ function getSecurityToken() { - return PassHash::hmac('md5', session_id().$_SERVER['REMOTE_USER'], auth_cookiesalt()); + /** @var Input $INPUT */ + global $INPUT; + return PassHash::hmac('md5', session_id().$INPUT->server->str('REMOTE_USER'), auth_cookiesalt()); } /** * Check the secret CSRF token + * + * @param null|string $token security token or null to read it from request variable + * @return bool success if the token matched */ function checkSecurityToken($token = null) { + /** @var Input $INPUT */ global $INPUT; - if(empty($_SERVER['REMOTE_USER'])) return true; // no logged in user, no need for a check + if(!$INPUT->server->str('REMOTE_USER')) return true; // no logged in user, no need for a check if(is_null($token)) $token = $INPUT->str('sectok'); if(getSecurityToken() != $token) { @@ -78,6 +94,9 @@ function checkSecurityToken($token = null) { * Print a hidden form field with a secret CSRF token * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param bool $print if true print the field, otherwise html of the field is returned + * @return string html of hidden form field */ function formSecurityToken($print = true) { $ret = '<div class="no"><input type="hidden" name="sectok" value="'.getSecurityToken().'" /></div>'."\n"; @@ -90,17 +109,25 @@ function formSecurityToken($print = true) { * * @author Andreas Gohr <andi@splitbrain.org> * @author Chris Smith <chris@jalakai.co.uk> + * + * @param string $id pageid + * @param bool $htmlClient add info about whether is mobile browser + * @return array with info for a request of $id + * */ function basicinfo($id, $htmlClient=true){ global $USERINFO; + /* @var Input $INPUT */ + global $INPUT; // set info about manager/admin status. + $info = array(); $info['isadmin'] = false; $info['ismanager'] = false; - if(isset($_SERVER['REMOTE_USER'])) { + if($INPUT->server->has('REMOTE_USER')) { $info['userinfo'] = $USERINFO; $info['perm'] = auth_quickaclcheck($id); - $info['client'] = $_SERVER['REMOTE_USER']; + $info['client'] = $INPUT->server->str('REMOTE_USER'); if($info['perm'] == AUTH_ADMIN) { $info['isadmin'] = true; @@ -111,7 +138,7 @@ function basicinfo($id, $htmlClient=true){ // if some outside auth were used only REMOTE_USER is set if(!$info['userinfo']['name']) { - $info['userinfo']['name'] = $_SERVER['REMOTE_USER']; + $info['userinfo']['name'] = $INPUT->server->str('REMOTE_USER'); } } else { @@ -134,12 +161,16 @@ function basicinfo($id, $htmlClient=true){ * array. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @return array with info about current document */ function pageinfo() { global $ID; global $REV; global $RANGE; global $lang; + /* @var Input $INPUT */ + global $INPUT; $info = basicinfo($ID); @@ -148,19 +179,20 @@ function pageinfo() { $info['id'] = $ID; $info['rev'] = $REV; - if(isset($_SERVER['REMOTE_USER'])) { + if($INPUT->server->has('REMOTE_USER')) { $sub = new Subscription(); $info['subscribed'] = $sub->user_subscription(); } else { $info['subscribed'] = false; } - $info['locked'] = checklock($ID); - $info['filepath'] = fullpath(wikiFN($ID)); - $info['exists'] = @file_exists($info['filepath']); + $info['locked'] = checklock($ID); + $info['filepath'] = fullpath(wikiFN($ID)); + $info['exists'] = file_exists($info['filepath']); + $info['currentrev'] = @filemtime($info['filepath']); if($REV) { //check if current revision was meant - if($info['exists'] && (@filemtime($info['filepath']) == $REV)) { + if($info['exists'] && ($info['currentrev'] == $REV)) { $REV = ''; } elseif($RANGE) { //section editing does not work with old revisions! @@ -170,7 +202,7 @@ function pageinfo() { } else { //really use old revision $info['filepath'] = fullpath(wikiFN($ID, $REV)); - $info['exists'] = @file_exists($info['filepath']); + $info['exists'] = file_exists($info['filepath']); } } $info['rev'] = $REV; @@ -187,13 +219,14 @@ function pageinfo() { $info['meta'] = p_get_metadata($ID); //who's the editor + $pagelog = new PageChangeLog($ID, 1024); if($REV) { - $revinfo = getRevisionInfo($ID, $REV, 1024); + $revinfo = $pagelog->getRevisionInfo($REV); } else { - if(is_array($info['meta']['last_change'])) { + if(!empty($info['meta']['last_change']) && is_array($info['meta']['last_change'])) { $revinfo = $info['meta']['last_change']; } else { - $revinfo = getRevisionInfo($ID, $info['lastmod'], 1024); + $revinfo = $pagelog->getRevisionInfo($info['lastmod']); // cache most recent changelog line in metadata if missing and still valid if($revinfo !== false) { $info['meta']['last_change'] = $revinfo; @@ -223,7 +256,7 @@ function pageinfo() { // draft $draft = getCacheName($info['client'].$ID, '.draft'); - if(@file_exists($draft)) { + if(file_exists($draft)) { if(@filemtime($draft) < @filemtime(wikiFN($ID))) { // remove stale draft @unlink($draft); @@ -237,6 +270,8 @@ function pageinfo() { /** * Return information about the current media item as an associative array. + * + * @return array with info about current media item */ function mediainfo(){ global $NS; @@ -252,6 +287,10 @@ function mediainfo(){ * Build an string of URL parameters * * @author Andreas Gohr + * + * @param array $params array with key-value pairs + * @param string $sep series of pairs are separated by this character + * @return string query string */ function buildURLparams($params, $sep = '&') { $url = ''; @@ -272,6 +311,10 @@ function buildURLparams($params, $sep = '&') { * Skips keys starting with '_', values get HTML encoded * * @author Andreas Gohr + * + * @param array $params array with (attribute name-attribute value) pairs + * @param bool $skipempty skip empty string values? + * @return string */ function buildAttributes($params, $skipempty = false) { $url = ''; @@ -293,6 +336,8 @@ function buildAttributes($params, $skipempty = false) { * This builds the breadcrumb trail and returns it as array * * @author Andreas Gohr <andi@splitbrain.org> + * + * @return string[] with the data: array(pageid=>name, ... ) */ function breadcrumbs() { // we prepare the breadcrumbs early for quick session closing @@ -307,7 +352,7 @@ function breadcrumbs() { $crumbs = isset($_SESSION[DOKU_COOKIE]['bc']) ? $_SESSION[DOKU_COOKIE]['bc'] : array(); //we only save on show and existing wiki documents $file = wikiFN($ID); - if($ACT != 'show' || !@file_exists($file)) { + if($ACT != 'show' || !file_exists($file)) { $_SESSION[DOKU_COOKIE]['bc'] = $crumbs; return $crumbs; } @@ -352,20 +397,28 @@ function breadcrumbs() { * Urlencoding is ommitted when the second parameter is false * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id pageid being filtered + * @param bool $ue apply urlencoding? + * @return string */ function idfilter($id, $ue = true) { global $conf; + /* @var Input $INPUT */ + global $INPUT; + if($conf['useslash'] && $conf['userewrite']) { $id = strtr($id, ':', '/'); } elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' && $conf['userewrite'] && - strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') === false + strpos($INPUT->server->str('SERVER_SOFTWARE'), 'Microsoft-IIS') === false ) { $id = strtr($id, ':', ';'); } if($ue) { $id = rawurlencode($id); $id = str_replace('%3A', ':', $id); //keep as colon + $id = str_replace('%3B', ';', $id); //keep as semicolon $id = str_replace('%2F', '/', $id); //keep as slash } return $id; @@ -374,14 +427,21 @@ function idfilter($id, $ue = true) { /** * This builds a link to a wikipage * - * It handles URL rewriting and adds additional parameter if - * given in $more + * It handles URL rewriting and adds additional parameters * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id page id, defaults to start page + * @param string|array $urlParameters URL parameters, associative array recommended + * @param bool $absolute request an absolute URL instead of relative + * @param string $separator parameter separator + * @return string */ function wl($id = '', $urlParameters = '', $absolute = false, $separator = '&') { global $conf; if(is_array($urlParameters)) { + if(isset($urlParameters['rev']) && !$urlParameters['rev']) unset($urlParameters['rev']); + if(isset($urlParameters['at']) && $conf['date_at_format']) $urlParameters['at'] = date($conf['date_at_format'],$urlParameters['at']); $urlParameters = buildURLparams($urlParameters, $separator); } else { $urlParameters = str_replace(',', $separator, $urlParameters); @@ -419,13 +479,19 @@ function wl($id = '', $urlParameters = '', $absolute = false, $separator = '& * Handles URL rewriting if enabled. Follows the style of wl(). * * @author Ben Coburn <btcoburn@silicodon.net> + * @param string $id page id, defaults to start page + * @param string $format the export renderer to use + * @param string|array $urlParameters URL parameters, associative array recommended + * @param bool $abs request an absolute URL instead of relative + * @param string $sep parameter separator + * @return string */ -function exportlink($id = '', $format = 'raw', $more = '', $abs = false, $sep = '&') { +function exportlink($id = '', $format = 'raw', $urlParameters = '', $abs = false, $sep = '&') { global $conf; - if(is_array($more)) { - $more = buildURLparams($more, $sep); + if(is_array($urlParameters)) { + $urlParameters = buildURLparams($urlParameters, $sep); } else { - $more = str_replace(',', $sep, $more); + $urlParameters = str_replace(',', $sep, $urlParameters); } $format = rawurlencode($format); @@ -438,13 +504,13 @@ function exportlink($id = '', $format = 'raw', $more = '', $abs = false, $sep = if($conf['userewrite'] == 2) { $xlink .= DOKU_SCRIPT.'/'.$id.'?do=export_'.$format; - if($more) $xlink .= $sep.$more; + if($urlParameters) $xlink .= $sep.$urlParameters; } elseif($conf['userewrite'] == 1) { $xlink .= '_export/'.$format.'/'.$id; - if($more) $xlink .= '?'.$more; + if($urlParameters) $xlink .= '?'.$urlParameters; } else { $xlink .= DOKU_SCRIPT.'?do=export_'.$format.$sep.'id='.$id; - if($more) $xlink .= $sep.$more; + if($urlParameters) $xlink .= $sep.$urlParameters; } return $xlink; @@ -482,6 +548,7 @@ function ml($id = '', $more = '', $direct = true, $sep = '&', $abs = false) if(empty($more['w'])) unset($more['w']); if(empty($more['h'])) unset($more['h']); if(isset($more['id']) && $direct) unset($more['id']); + if(isset($more['rev']) && !$more['rev']) unset($more['rev']); $more = buildURLparams($more, $sep); } else { $matches = array(); @@ -551,6 +618,8 @@ function ml($id = '', $more = '', $direct = true, $sep = '&', $abs = false) * Consider using wl() instead, unless you absoutely need the doku.php endpoint * * @author Andreas Gohr <andi@splitbrain.org> + * + * @return string */ function script() { return DOKU_BASE.DOKU_SCRIPT; @@ -577,6 +646,7 @@ function script() { * * @author Andreas Gohr <andi@splitbrain.org> * @author Michael Klier <chi@chimeric.de> + * * @param string $text - optional text to check, if not given the globals are used * @return bool - true if a spam word was found */ @@ -587,6 +657,8 @@ function checkwordblock($text = '') { global $SUM; global $conf; global $INFO; + /* @var Input $INPUT */ + global $INPUT; if(!$conf['usewordblock']) return false; @@ -618,10 +690,11 @@ function checkwordblock($text = '') { } if(count($re) && preg_match('#('.join('|', $re).')#si', $text, $matches)) { // prepare event data + $data = array(); $data['matches'] = $matches; - $data['userinfo']['ip'] = $_SERVER['REMOTE_ADDR']; - if($_SERVER['REMOTE_USER']) { - $data['userinfo']['user'] = $_SERVER['REMOTE_USER']; + $data['userinfo']['ip'] = $INPUT->server->str('REMOTE_ADDR'); + if($INPUT->server->str('REMOTE_USER')) { + $data['userinfo']['user'] = $INPUT->server->str('REMOTE_USER'); $data['userinfo']['name'] = $INFO['userinfo']['name']; $data['userinfo']['mail'] = $INFO['userinfo']['mail']; } @@ -643,16 +716,22 @@ function checkwordblock($text = '') { * headers * * @author Andreas Gohr <andi@splitbrain.org> + * * @param boolean $single If set only a single IP is returned * @return string */ function clientIP($single = false) { + /* @var Input $INPUT */ + global $INPUT; + $ip = array(); - $ip[] = $_SERVER['REMOTE_ADDR']; - if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) - $ip = array_merge($ip, explode(',', str_replace(' ', '', $_SERVER['HTTP_X_FORWARDED_FOR']))); - if(!empty($_SERVER['HTTP_X_REAL_IP'])) - $ip = array_merge($ip, explode(',', str_replace(' ', '', $_SERVER['HTTP_X_REAL_IP']))); + $ip[] = $INPUT->server->str('REMOTE_ADDR'); + if($INPUT->server->str('HTTP_X_FORWARDED_FOR')) { + $ip = array_merge($ip, explode(',', str_replace(' ', '', $INPUT->server->str('HTTP_X_FORWARDED_FOR')))); + } + if($INPUT->server->str('HTTP_X_REAL_IP')) { + $ip = array_merge($ip, explode(',', str_replace(' ', '', $INPUT->server->str('HTTP_X_REAL_IP')))); + } // some IPv4/v6 regexps borrowed from Feyd // see: http://forums.devnetwork.net/viewtopic.php?f=38&t=53479 @@ -709,18 +788,22 @@ function clientIP($single = false) { * Adapted from the example code at url below * * @link http://www.brainhandles.com/2007/10/15/detecting-mobile-browsers/#code + * + * @return bool if true, client is mobile browser; otherwise false */ function clientismobile() { + /* @var Input $INPUT */ + global $INPUT; - if(isset($_SERVER['HTTP_X_WAP_PROFILE'])) return true; + if($INPUT->server->has('HTTP_X_WAP_PROFILE')) return true; - if(preg_match('/wap\.|\.wap/i', $_SERVER['HTTP_ACCEPT'])) return true; + if(preg_match('/wap\.|\.wap/i', $INPUT->server->str('HTTP_ACCEPT'))) return true; - if(!isset($_SERVER['HTTP_USER_AGENT'])) return false; + if(!$INPUT->server->has('HTTP_USER_AGENT')) return false; $uamatches = 'midp|j2me|avantg|docomo|novarra|palmos|palmsource|240x320|opwv|chtml|pda|windows ce|mmp\/|blackberry|mib\/|symbian|wireless|nokia|hand|mobi|phone|cdm|up\.b|audio|SIE\-|SEC\-|samsung|HTC|mot\-|mitsu|sagem|sony|alcatel|lg|erics|vx|NEC|philips|mmm|xx|panasonic|sharp|wap|sch|rover|pocket|benq|java|pt|pg|vox|amoi|bird|compal|kg|voda|sany|kdd|dbt|sendo|sgh|gradi|jb|\d\d\di|moto'; - if(preg_match("/$uamatches/i", $_SERVER['HTTP_USER_AGENT'])) return true; + if(preg_match("/$uamatches/i", $INPUT->server->str('HTTP_USER_AGENT'))) return true; return false; } @@ -731,6 +814,7 @@ function clientismobile() { * If $conf['dnslookups'] is disabled it simply returns the input string * * @author Glen Harris <astfgl@iamnota.org> + * * @param string $ips comma separated list of IP addresses * @return string a comma separated list of hostnames */ @@ -757,13 +841,19 @@ function gethostsbyaddrs($ips) { * removes stale lockfiles * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id page id + * @return bool page is locked? */ function checklock($id) { global $conf; + /* @var Input $INPUT */ + global $INPUT; + $lock = wikiLockFN($id); //no lockfile - if(!@file_exists($lock)) return false; + if(!file_exists($lock)) return false; //lockfile expired if((time() - filemtime($lock)) > $conf['locktime']) { @@ -772,8 +862,8 @@ function checklock($id) { } //my own lock - list($ip, $session) = explode("\n", io_readFile($lock)); - if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()) { + @list($ip, $session) = explode("\n", io_readFile($lock)); + if($ip == $INPUT->server->str('REMOTE_USER') || $ip == clientIP() || (session_id() && $session == session_id())) { return false; } @@ -784,17 +874,21 @@ function checklock($id) { * Lock a page for editing * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id page id to lock */ function lock($id) { global $conf; + /* @var Input $INPUT */ + global $INPUT; if($conf['locktime'] == 0) { return; } $lock = wikiLockFN($id); - if($_SERVER['REMOTE_USER']) { - io_saveFile($lock, $_SERVER['REMOTE_USER']); + if($INPUT->server->str('REMOTE_USER')) { + io_saveFile($lock, $INPUT->server->str('REMOTE_USER')); } else { io_saveFile($lock, clientIP()."\n".session_id()); } @@ -804,14 +898,18 @@ function lock($id) { * Unlock a page if it was locked by the user * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $id page id to unlock * @return bool true if a lock was removed */ function unlock($id) { + /* @var Input $INPUT */ + global $INPUT; + $lock = wikiLockFN($id); - if(@file_exists($lock)) { - list($ip, $session) = explode("\n", io_readFile($lock)); - if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()) { + if(file_exists($lock)) { + @list($ip, $session) = explode("\n", io_readFile($lock)); + if($ip == $INPUT->server->str('REMOTE_USER') || $ip == clientIP() || $session == session_id()) { @unlink($lock); return true; } @@ -826,6 +924,9 @@ function unlock($id) { * * @see formText() for 2crlf conversion * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $text + * @return string */ function cleanText($text) { $text = preg_replace("/(\015\012)|(\015)/", "\012", $text); @@ -845,6 +946,9 @@ function cleanText($text) { * * @see cleanText() for 2unix conversion * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $text + * @return string */ function formText($text) { $text = str_replace("\012", "\015\012", $text); @@ -855,6 +959,10 @@ function formText($text) { * Returns the specified local text in raw format * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id page id + * @param string $ext extension of file being read, default 'txt' + * @return string */ function rawLocale($id, $ext = 'txt') { return io_readFile(localeFN($id, $ext)); @@ -864,6 +972,10 @@ function rawLocale($id, $ext = 'txt') { * Returns the raw WikiText * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id page id + * @param string|int $rev timestamp when a revision of wikitext is desired + * @return string */ function rawWiki($id, $rev = '') { return io_readWikiPage(wikiFN($id, $rev), $id, $rev); @@ -874,6 +986,9 @@ function rawWiki($id, $rev = '') { * * @triggers COMMON_PAGETPL_LOAD * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id the id of the page to be created + * @return string parsed pagetemplate content */ function pageTemplate($id) { global $conf; @@ -895,13 +1010,13 @@ function pageTemplate($id) { // if the before event did not set a template file, try to find one if(empty($data['tplfile'])) { $path = dirname(wikiFN($id)); - if(@file_exists($path.'/_template.txt')) { + if(file_exists($path.'/_template.txt')) { $data['tplfile'] = $path.'/_template.txt'; } else { // search upper namespaces for templates $len = strlen(rtrim($conf['datadir'], '/')); while(strlen($path) >= $len) { - if(@file_exists($path.'/__template.txt')) { + if(file_exists($path.'/__template.txt')) { $data['tplfile'] = $path.'/__template.txt'; break; } @@ -925,6 +1040,9 @@ function pageTemplate($id) { * This works on data from COMMON_PAGETPL_LOAD * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $data array with event data + * @return string */ function parsePageTemplate(&$data) { /** @@ -937,6 +1055,8 @@ function parsePageTemplate(&$data) { global $USERINFO; global $conf; + /* @var Input $INPUT */ + global $INPUT; // replace placeholders $file = noNS($id); @@ -968,7 +1088,7 @@ function parsePageTemplate(&$data) { utf8_ucfirst($page), utf8_ucwords($page), utf8_strtoupper($page), - $_SERVER['REMOTE_USER'], + $INPUT->server->str('REMOTE_USER'), $USERINFO['name'], $USERINFO['mail'], $conf['dformat'], @@ -990,6 +1110,11 @@ function parsePageTemplate(&$data) { * The returned order is prefix, section and suffix. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $range in form "from-to" + * @param string $id page id + * @param string $rev optional, the revision timestamp + * @return string[] with three slices */ function rawWikiSlices($range, $id, $rev = '') { $text = io_readWikiPage(wikiFN($id, $rev), $id, $rev); @@ -1000,6 +1125,7 @@ function rawWikiSlices($range, $id, $rev = '') { $from = !$from ? 0 : ($from - 1); $to = !$to ? strlen($text) : ($to - 1); + $slices = array(); $slices[0] = substr($text, 0, $from); $slices[1] = substr($text, $from, $to - $from); $slices[2] = substr($text, $to); @@ -1014,6 +1140,12 @@ function rawWikiSlices($range, $id, $rev = '') { * lines between sections if needed (used on saving). * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $pre prefix + * @param string $text text in the middle + * @param string $suf suffix + * @param bool $pretty add additional empty lines between sections + * @return string */ function con($pre, $text, $suf, $pretty = false) { if($pretty) { @@ -1038,6 +1170,11 @@ function con($pre, $text, $suf, $pretty = false) { * * @author Andreas Gohr <andi@splitbrain.org> * @author Ben Coburn <btcoburn@silicodon.net> + * + * @param string $id page id + * @param string $text wikitext being saved + * @param string $summary summary of text update + * @param bool $minor mark this saved version as minor update */ function saveWikiText($id, $text, $summary, $minor = false) { /* Note to developers: @@ -1049,6 +1186,9 @@ function saveWikiText($id, $text, $summary, $minor = false) { global $conf; global $lang; global $REV; + /* @var Input $INPUT */ + global $INPUT; + // ignore if no changes were made if($text == rawWiki($id, '')) { return; @@ -1057,12 +1197,13 @@ function saveWikiText($id, $text, $summary, $minor = false) { $file = wikiFN($id); $old = @filemtime($file); // from page $wasRemoved = (trim($text) == ''); // check for empty or whitespace only - $wasCreated = !@file_exists($file); + $wasCreated = !file_exists($file); $wasReverted = ($REV == true); + $pagelog = new PageChangeLog($id, 1024); $newRev = false; - $oldRev = getRevisions($id, -1, 1, 1024); // from changelog + $oldRev = $pagelog->getRevisions(-1, 1); // from changelog $oldRev = (int) (empty($oldRev) ? 0 : $oldRev[0]); - if(!@file_exists(wikiFN($id, $old)) && @file_exists($file) && $old >= $oldRev) { + if(!file_exists(wikiFN($id, $old)) && file_exists($file) && $old >= $oldRev) { // add old revision to the attic if missing saveOldRevision($id); // add a changelog entry if this edit came from outside dokuwiki @@ -1111,7 +1252,7 @@ function saveWikiText($id, $text, $summary, $minor = false) { $type = DOKU_CHANGE_TYPE_CREATE; } else if($wasRemoved) { $type = DOKU_CHANGE_TYPE_DELETE; - } else if($minor && $conf['useacl'] && $_SERVER['REMOTE_USER']) { + } else if($minor && $conf['useacl'] && $INPUT->server->str('REMOTE_USER')) { $type = DOKU_CHANGE_TYPE_MINOR_EDIT; } //minor edits only for logged in users @@ -1138,11 +1279,13 @@ function saveWikiText($id, $text, $summary, $minor = false) { * revision date * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id page id + * @return int|string revision timestamp */ function saveOldRevision($id) { - global $conf; $oldf = wikiFN($id); - if(!@file_exists($oldf)) return ''; + if(!file_exists($oldf)) return ''; $date = filemtime($oldf); $newf = wikiFN($id, $date); io_writeWikiPage($newf, rawWiki($id), $id, $date); @@ -1157,13 +1300,15 @@ function saveOldRevision($id) { * @param int|string $rev Old page revision * @param string $summary What changed * @param boolean $minor Is this a minor edit? - * @param array $replace Additional string substitutions, @KEY@ to be replaced by value - * + * @param string[] $replace Additional string substitutions, @KEY@ to be replaced by value * @return bool + * * @author Andreas Gohr <andi@splitbrain.org> */ function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = array()) { global $conf; + /* @var Input $INPUT */ + global $INPUT; // decide if there is something to do, eg. whom to mail if($who == 'admin') { @@ -1172,8 +1317,8 @@ function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = $to = $conf['notify']; } elseif($who == 'subscribers') { 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); + if($conf['useacl'] && $INPUT->server->str('REMOTE_USER') && $minor) return false; //skip minors + $data = array('id' => $id, 'addresslist' => '', 'self' => false, 'replacements' => $replace); trigger_event( 'COMMON_NOTIFY_ADDRESSLIST', $data, array(new Subscription(), 'notifyaddresses') @@ -1195,12 +1340,17 @@ function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = * * @author Andreas Gohr <andi@splitbrain.org> * @author Todd Augsburger <todd@rollerorgans.com> + * + * @return array|string */ function getGoogleQuery() { - if(!isset($_SERVER['HTTP_REFERER'])) { + /* @var Input $INPUT */ + global $INPUT; + + if(!$INPUT->server->has('HTTP_REFERER')) { return ''; } - $url = parse_url($_SERVER['HTTP_REFERER']); + $url = parse_url($INPUT->server->str('HTTP_REFERER')); // only handle common SEs if(!preg_match('/(google|bing|yahoo|ask|duckduckgo|babylon|aol|yandex)/',$url['host'])) return ''; @@ -1230,8 +1380,10 @@ function getGoogleQuery() { /** * Return the human readable size of a file * - * @param int $size A file size - * @param int $dec A number of decimal places + * @param int $size A file size + * @param int $dec A number of decimal places + * @return string human readable size + * * @author Martin Benjamin <b.martin@cybernet.ch> * @author Aidan Lister <aidan@php.net> * @version 1.0.0 @@ -1253,6 +1405,9 @@ function filesize_h($size, $dec = 1) { * Return the given timestamp as human readable, fuzzy age * * @author Andreas Gohr <gohr@cosmocode.de> + * + * @param int $dt timestamp + * @return string */ function datetime_h($dt) { global $lang; @@ -1287,6 +1442,10 @@ function datetime_h($dt) { * * @see datetime_h * @author Andreas Gohr <gohr@cosmocode.de> + * + * @param int|null $dt timestamp when given, null will take current timestamp + * @param string $format empty default to $conf['dformat'], or provide format as recognized by strftime() + * @return string */ function dformat($dt = null, $format = '') { global $conf; @@ -1304,7 +1463,8 @@ function dformat($dt = null, $format = '') { * * @author <ungu at terong dot com> * @link http://www.php.net/manual/en/function.date.php#54072 - * @param int $int_date: current date in UNIX timestamp + * + * @param int $int_date current date in UNIX timestamp * @return string */ function date_iso8601($int_date) { @@ -1320,6 +1480,9 @@ function date_iso8601($int_date) { * * @author Harry Fuecks <hfuecks@gmail.com> * @author Christopher Smith <chris@jalakai.co.uk> + * + * @param string $email email address + * @return string */ function obfuscate($email) { global $conf; @@ -1347,6 +1510,10 @@ function obfuscate($email) { * Removes quoting backslashes * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $string + * @param string $char backslashed character + * @return string */ function unslash($string, $char = "'") { return str_replace('\\'.$char, $char, $string); @@ -1357,19 +1524,27 @@ function unslash($string, $char = "'") { * * @author <gilthans dot NO dot SPAM at gmail dot com> * @link http://de3.php.net/manual/en/ini.core.php#79564 + * + * @param string $v shorthands + * @return int|string */ function php_to_byte($v) { $l = substr($v, -1); $ret = substr($v, 0, -1); switch(strtoupper($l)) { + /** @noinspection PhpMissingBreakStatementInspection */ case 'P': $ret *= 1024; + /** @noinspection PhpMissingBreakStatementInspection */ case 'T': $ret *= 1024; + /** @noinspection PhpMissingBreakStatementInspection */ case 'G': $ret *= 1024; + /** @noinspection PhpMissingBreakStatementInspection */ case 'M': $ret *= 1024; + /** @noinspection PhpMissingBreakStatementInspection */ case 'K': $ret *= 1024; break; @@ -1382,6 +1557,9 @@ function php_to_byte($v) { /** * Wrapper around preg_quote adding the default delimiter + * + * @param string $string + * @return string */ function preg_quote_cb($string) { return preg_quote($string, '/'); @@ -1412,40 +1590,136 @@ function shorten($keep, $short, $max, $min = 9, $char = '…') { } /** - * Return the users realname or e-mail address for use + * Return the users real name or e-mail address for use * in page footer and recent changes pages * + * @param string|null $username or null when currently logged-in user should be used + * @param bool $textonly true returns only plain text, true allows returning html + * @return string html or plain text(not escaped) of formatted user name + * * @author Andy Webber <dokuwiki AT andywebber DOT com> */ -function editorinfo($username) { - global $conf; +function editorinfo($username, $textonly = false) { + return userlink($username, $textonly); +} + +/** + * Returns users realname w/o link + * + * @param string|null $username or null when currently logged-in user should be used + * @param bool $textonly true returns only plain text, true allows returning html + * @return string html or plain text(not escaped) of formatted user name + * + * @triggers COMMON_USER_LINK + */ +function userlink($username = null, $textonly = false) { + global $conf, $INFO; + /** @var DokuWiki_Auth_Plugin $auth */ global $auth; + /** @var Input $INPUT */ + global $INPUT; + + // prepare initial event data + $data = array( + 'username' => $username, // the unique user name + 'name' => '', + 'link' => array( //setting 'link' to false disables linking + 'target' => '', + 'pre' => '', + 'suf' => '', + 'style' => '', + 'more' => '', + 'url' => '', + 'title' => '', + 'class' => '' + ), + 'userlink' => '', // formatted user name as will be returned + 'textonly' => $textonly + ); + if($username === null) { + $data['username'] = $username = $INPUT->server->str('REMOTE_USER'); + if($textonly){ + $data['name'] = $INFO['userinfo']['name']. ' (' . $INPUT->server->str('REMOTE_USER') . ')'; + }else { + $data['name'] = '<bdi>' . hsc($INFO['userinfo']['name']) . '</bdi> (<bdi>' . hsc($INPUT->server->str('REMOTE_USER')) . '</bdi>)'; + } + } - switch($conf['showuseras']) { - case 'username': - case 'email': - case 'email_link': + $evt = new Doku_Event('COMMON_USER_LINK', $data); + if($evt->advise_before(true)) { + if(empty($data['name'])) { if($auth) $info = $auth->getUserData($username); - break; - default: - return hsc($username); - } - - if(isset($info) && $info) { - switch($conf['showuseras']) { - case 'username': - return hsc($info['name']); - case 'email': - return obfuscate($info['mail']); - case 'email_link': - $mail = obfuscate($info['mail']); - return '<a href="mailto:'.$mail.'">'.$mail.'</a>'; - default: - return hsc($username); + if($conf['showuseras'] != 'loginname' && isset($info) && $info) { + switch($conf['showuseras']) { + case 'username': + case 'username_link': + $data['name'] = $textonly ? $info['name'] : hsc($info['name']); + break; + case 'email': + case 'email_link': + $data['name'] = obfuscate($info['mail']); + break; + } + } else { + $data['name'] = $textonly ? $data['username'] : hsc($data['username']); + } + } + + /** @var Doku_Renderer_xhtml $xhtml_renderer */ + static $xhtml_renderer = null; + + if(!$data['textonly'] && empty($data['link']['url'])) { + + if(in_array($conf['showuseras'], array('email_link', 'username_link'))) { + if(!isset($info)) { + if($auth) $info = $auth->getUserData($username); + } + if(isset($info) && $info) { + if($conf['showuseras'] == 'email_link') { + $data['link']['url'] = 'mailto:' . obfuscate($info['mail']); + } else { + if(is_null($xhtml_renderer)) { + $xhtml_renderer = p_get_renderer('xhtml'); + } + if(empty($xhtml_renderer->interwiki)) { + $xhtml_renderer->interwiki = getInterwiki(); + } + $shortcut = 'user'; + $exists = null; + $data['link']['url'] = $xhtml_renderer->_resolveInterWiki($shortcut, $username, $exists); + $data['link']['class'] .= ' interwiki iw_user'; + if($exists !== null) { + if($exists) { + $data['link']['class'] .= ' wikilink1'; + } else { + $data['link']['class'] .= ' wikilink2'; + $data['link']['rel'] = 'nofollow'; + } + } + } + } else { + $data['textonly'] = true; + } + + } else { + $data['textonly'] = true; + } + } + + if($data['textonly']) { + $data['userlink'] = $data['name']; + } else { + $data['link']['name'] = $data['name']; + if(is_null($xhtml_renderer)) { + $xhtml_renderer = p_get_renderer('xhtml'); + } + $data['userlink'] = $xhtml_renderer->_formatLink($data['link']); } - } else { - return hsc($username); } + $evt->advise_after(); + unset($evt); + + return $data['userlink']; } /** @@ -1453,6 +1727,7 @@ function editorinfo($username) { * When no image exists, returns an empty string * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $type - type of image 'badge' or 'button' * @return string */ @@ -1461,7 +1736,6 @@ function license_img($type) { global $conf; if(!$conf['license']) return ''; if(!is_array($license[$conf['license']])) return ''; - $lic = $license[$conf['license']]; $try = array(); $try[] = 'lib/images/license/'.$type.'/'.$conf['license'].'.png'; $try[] = 'lib/images/license/'.$type.'/'.$conf['license'].'.gif'; @@ -1469,7 +1743,7 @@ function license_img($type) { $try[] = 'lib/images/license/'.$type.'/cc.png'; } foreach($try as $src) { - if(@file_exists(DOKU_INC.$src)) return $src; + if(file_exists(DOKU_INC.$src)) return $src; } return ''; } @@ -1483,9 +1757,8 @@ function license_img($type) { * @author Filip Oscadal <webmaster@illusionsoftworks.cz> * @author Andreas Gohr <andi@splitbrain.org> * - * @param int $mem Size of memory you want to allocate in bytes - * @param int $bytes - * @internal param int $used already allocated memory (see above) + * @param int $mem Size of memory you want to allocate in bytes + * @param int $bytes already allocated memory (see above) * @return bool */ function is_mem_available($mem, $bytes = 1048576) { @@ -1516,8 +1789,13 @@ function is_mem_available($mem, $bytes = 1048576) { * * @link http://support.microsoft.com/kb/q176113/ * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $url url being directed to */ function send_redirect($url) { + /* @var Input $INPUT */ + global $INPUT; + //are there any undisplayed messages? keep them in session for display global $MSG; if(isset($MSG) && count($MSG) && !defined('NOSESSION')) { @@ -1529,27 +1807,18 @@ function send_redirect($url) { // always close the session session_write_close(); - // work around IE bug - // http://www.ianhoar.com/2008/11/16/internet-explorer-6-and-redirected-anchor-links/ - list($url, $hash) = explode('#', $url); - if($hash) { - if(strpos($url, '?')) { - $url = $url.'&#'.$hash; - } else { - $url = $url.'?&#'.$hash; - } - } - // check if running on IIS < 6 with CGI-PHP - if(isset($_SERVER['SERVER_SOFTWARE']) && isset($_SERVER['GATEWAY_INTERFACE']) && - (strpos($_SERVER['GATEWAY_INTERFACE'], 'CGI') !== false) && - (preg_match('|^Microsoft-IIS/(\d)\.\d$|', trim($_SERVER['SERVER_SOFTWARE']), $matches)) && + if($INPUT->server->has('SERVER_SOFTWARE') && $INPUT->server->has('GATEWAY_INTERFACE') && + (strpos($INPUT->server->str('GATEWAY_INTERFACE'), 'CGI') !== false) && + (preg_match('|^Microsoft-IIS/(\d)\.\d$|', trim($INPUT->server->str('SERVER_SOFTWARE')), $matches)) && $matches[1] < 6 ) { header('Refresh: 0;url='.$url); } else { header('Location: '.$url); } + + if(defined('DOKU_UNITTEST')) return; // no exits during unit tests exit; } @@ -1584,6 +1853,10 @@ function valid_input_set($param, $valid_values, $array, $exc = '') { /** * Read a preference from the DokuWiki cookie * (remembering both keys & values are urlencoded) + * + * @param string $pref preference key + * @param mixed $default value returned when preference not found + * @return string preference value */ function get_doku_pref($pref, $default) { $enc_pref = urlencode($pref); @@ -1602,6 +1875,9 @@ function get_doku_pref($pref, $default) { /** * Add a preference to the DokuWiki cookie * (remembering $_COOKIE['DOKU_PREFS'] is urlencoded) + * + * @param string $pref preference key + * @param string $val preference value */ function set_doku_pref($pref, $val) { global $conf; @@ -1630,4 +1906,13 @@ function set_doku_pref($pref, $val) { } } +/** + * Strips source mapping declarations from given text #601 + * + * @param string &$text reference to the CSS or JavaScript code to clean + */ +function stripsourcemaps(&$text){ + $text = preg_replace('/^(\/\/|\/\*)[@#]\s+sourceMappingURL=.*?(\*\/)?$/im', '\\1\\2', $text); +} + //Setup VIM: ex: et ts=2 : diff --git a/inc/compatibility.php b/inc/compatibility.php index ae780e5ac..cb865a2d7 100644 --- a/inc/compatibility.php +++ b/inc/compatibility.php @@ -33,4 +33,50 @@ if(!function_exists('ctype_digit')) { if(preg_match('/^\d+$/', $text)) return true; return false; } +} + +if(!function_exists('gzopen') && function_exists('gzopen64')) { + /** + * work around for PHP compiled against certain zlib versions #865 + * + * @link http://stackoverflow.com/questions/23417519/php-zlib-gzopen-not-exists + * + * @param string $filename + * @param string $mode + * @param int $use_include_path + * @return mixed + */ + function gzopen($filename, $mode, $use_include_path = 0) { + return gzopen64($filename, $mode, $use_include_path); + } +} + +if(!function_exists('gzseek') && function_exists('gzseek64')) { + /** + * work around for PHP compiled against certain zlib versions #865 + * + * @link http://stackoverflow.com/questions/23417519/php-zlib-gzopen-not-exists + * + * @param resource $zp + * @param int $offset + * @param int $whence + * @return int + */ + function gzseek($zp, $offset, $whence = SEEK_SET) { + return gzseek64($zp, $offset, $whence); + } +} + +if(!function_exists('gztell') && function_exists('gztell64')) { + /** + * work around for PHP compiled against certain zlib versions #865 + * + * @link http://stackoverflow.com/questions/23417519/php-zlib-gzopen-not-exists + * + * @param resource $zp + * @return int + */ + function gztell($zp) { + return gztell64($zp); + } }
\ No newline at end of file diff --git a/inc/config_cascade.php b/inc/config_cascade.php index 2c4f1612b..a6dfadc80 100644 --- a/inc/config_cascade.php +++ b/inc/config_cascade.php @@ -8,71 +8,75 @@ $config_cascade = array_merge( array( 'main' => array( - 'default' => array(DOKU_CONF.'dokuwiki.php'), - 'local' => array(DOKU_CONF.'local.php'), - 'protected' => array(DOKU_CONF.'local.protected.php'), - ), - 'acronyms' => array( - 'default' => array(DOKU_CONF.'acronyms.conf'), - 'local' => array(DOKU_CONF.'acronyms.local.conf'), - ), - 'entities' => array( - 'default' => array(DOKU_CONF.'entities.conf'), - 'local' => array(DOKU_CONF.'entities.local.conf'), - ), + 'default' => array(DOKU_CONF . 'dokuwiki.php'), + 'local' => array(DOKU_CONF . 'local.php'), + 'protected' => array(DOKU_CONF . 'local.protected.php'), + ), + 'acronyms' => array( + 'default' => array(DOKU_CONF . 'acronyms.conf'), + 'local' => array(DOKU_CONF . 'acronyms.local.conf'), + ), + 'entities' => array( + 'default' => array(DOKU_CONF . 'entities.conf'), + 'local' => array(DOKU_CONF . 'entities.local.conf'), + ), 'interwiki' => array( - 'default' => array(DOKU_CONF.'interwiki.conf'), - 'local' => array(DOKU_CONF.'interwiki.local.conf'), - ), + 'default' => array(DOKU_CONF . 'interwiki.conf'), + 'local' => array(DOKU_CONF . 'interwiki.local.conf'), + ), 'license' => array( - 'default' => array(DOKU_CONF.'license.php'), - 'local' => array(DOKU_CONF.'license.local.php'), - ), + 'default' => array(DOKU_CONF . 'license.php'), + 'local' => array(DOKU_CONF . 'license.local.php'), + ), 'mediameta' => array( - 'default' => array(DOKU_CONF.'mediameta.php'), - 'local' => array(DOKU_CONF.'mediameta.local.php'), - ), - 'mime' => array( - 'default' => array(DOKU_CONF.'mime.conf'), - 'local' => array(DOKU_CONF.'mime.local.conf'), - ), - 'scheme' => array( - 'default' => array(DOKU_CONF.'scheme.conf'), - 'local' => array(DOKU_CONF.'scheme.local.conf'), - ), - 'smileys' => array( - 'default' => array(DOKU_CONF.'smileys.conf'), - 'local' => array(DOKU_CONF.'smileys.local.conf'), - ), + 'default' => array(DOKU_CONF . 'mediameta.php'), + 'local' => array(DOKU_CONF . 'mediameta.local.php'), + ), + 'mime' => array( + 'default' => array(DOKU_CONF . 'mime.conf'), + 'local' => array(DOKU_CONF . 'mime.local.conf'), + ), + 'scheme' => array( + 'default' => array(DOKU_CONF . 'scheme.conf'), + 'local' => array(DOKU_CONF . 'scheme.local.conf'), + ), + 'smileys' => array( + 'default' => array(DOKU_CONF . 'smileys.conf'), + 'local' => array(DOKU_CONF . 'smileys.local.conf'), + ), 'wordblock' => array( - 'default' => array(DOKU_CONF.'wordblock.conf'), - 'local' => array(DOKU_CONF.'wordblock.local.conf'), - ), + 'default' => array(DOKU_CONF . 'wordblock.conf'), + 'local' => array(DOKU_CONF . 'wordblock.local.conf'), + ), 'userstyle' => array( - 'screen' => DOKU_CONF.'userstyle.css', - 'print' => DOKU_CONF.'userprint.css', - 'feed' => DOKU_CONF.'userfeed.css', - 'all' => DOKU_CONF.'userall.css', - ), + 'screen' => array(DOKU_CONF . 'userstyle.css', DOKU_CONF . 'userstyle.less'), + 'print' => array(DOKU_CONF . 'userprint.css', DOKU_CONF . 'userprint.less'), + 'feed' => array(DOKU_CONF . 'userfeed.css', DOKU_CONF . 'userfeed.less'), + 'all' => array(DOKU_CONF . 'userall.css', DOKU_CONF . 'userall.less') + ), 'userscript' => array( - 'default' => DOKU_CONF.'userscript.js' - ), - 'acl' => array( - 'default' => DOKU_CONF.'acl.auth.php', - ), + 'default' => array(DOKU_CONF . 'userscript.js') + ), + 'acl' => array( + 'default' => DOKU_CONF . 'acl.auth.php', + ), 'plainauth.users' => array( - 'default' => DOKU_CONF.'users.auth.php', - ), - + 'default' => DOKU_CONF . 'users.auth.php', + ), 'plugins' => array( - 'default' => array(DOKU_CONF.'plugins.php'), - 'local' => array(DOKU_CONF.'plugins.local.php'), + 'default' => array(DOKU_CONF . 'plugins.php'), + 'local' => array(DOKU_CONF . 'plugins.local.php'), 'protected' => array( - DOKU_CONF.'plugins.required.php', - DOKU_CONF.'plugins.protected.php', - ), + DOKU_CONF . 'plugins.required.php', + DOKU_CONF . 'plugins.protected.php', ), ), - $config_cascade + 'lang' => array( + 'core' => array(DOKU_CONF . 'lang/'), + 'plugin' => array(DOKU_CONF . 'plugin_lang/'), + 'template' => array(DOKU_CONF . 'template_lang/') + ) + ), + $config_cascade ); diff --git a/inc/confutils.php b/inc/confutils.php index 0ac003b72..8643a056c 100644 --- a/inc/confutils.php +++ b/inc/confutils.php @@ -14,6 +14,10 @@ * are returned. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $file file name + * @param bool $knownonly + * @return array with extension, mimetype and if it should be downloaded */ function mimetype($file, $knownonly=true){ $mtypes = getMimeTypes(); // known mimetypes @@ -202,7 +206,7 @@ function retrieveConfig($type,$fn,$params=null) { foreach (array('default','local','protected') as $config_group) { if (empty($config_cascade[$type][$config_group])) continue; foreach ($config_cascade[$type][$config_group] as $file) { - if (@file_exists($file)) { + if (file_exists($file)) { $config = call_user_func_array($fn,array_merge(array($file),$params)); $combined = array_merge($combined, $config); } @@ -237,13 +241,14 @@ function getConfigFiles($type) { * check if the given action was disabled in config * * @author Andreas Gohr <andi@splitbrain.org> + * @param string $action * @returns boolean true if enabled, false if disabled */ function actionOK($action){ static $disabled = null; if(is_null($disabled) || defined('SIMPLE_TEST')){ global $conf; - /** @var auth_basic $auth */ + /** @var DokuWiki_Auth_Plugin $auth */ global $auth; // prepare disabled actions array and handle legacy options diff --git a/inc/events.php b/inc/events.php index f7b1a7a16..256fb561e 100644 --- a/inc/events.php +++ b/inc/events.php @@ -8,15 +8,18 @@ if(!defined('DOKU_INC')) die('meh.'); +/** + * The event + */ class Doku_Event { // public properties - var $name = ''; // READONLY event name, objects must register against this name to see the event - var $data = null; // READWRITE data relevant to the event, no standardised format (YET!) - var $result = null; // READWRITE the results of the event action, only relevant in "_AFTER" advise + public $name = ''; // READONLY event name, objects must register against this name to see the event + public $data = null; // READWRITE data relevant to the event, no standardised format (YET!) + public $result = null; // READWRITE the results of the event action, only relevant in "_AFTER" advise // event handlers may modify this if they are preventing the default action // to provide the after event handlers with event results - var $canPreventDefault = true; // READONLY if true, event handlers can prevent the events default action + public $canPreventDefault = true; // READONLY if true, event handlers can prevent the events default action // private properties, event handlers can effect these through the provided methods var $_default = true; // whether or not to carry out the default action associated with the event @@ -24,6 +27,9 @@ class Doku_Event { /** * event constructor + * + * @param string $name + * @param mixed $data */ function Doku_Event($name, &$data) { @@ -33,6 +39,13 @@ class Doku_Event { } /** + * @return string + */ + function __toString() { + return $this->name; + } + + /** * advise functions * * advise all registered handlers of this event @@ -47,7 +60,8 @@ class Doku_Event { * $evt->advise_after(); * unset($evt); * - * @return results of processing the event, usually $this->_default + * @param bool $enablePreventDefault + * @return bool results of processing the event, usually $this->_default */ function advise_before($enablePreventDefault=true) { global $EVENT_HANDLER; @@ -73,14 +87,21 @@ class Doku_Event { * $this->_default, all of which may have been modified by the event handlers. * - advise all registered (<event>_AFTER) handlers that the event has taken place * - * @return $event->results + * @param null|callable $action + * @param bool $enablePrevent + * @return mixed $event->results * the value set by any <event>_before or <event> handlers if the default action is prevented * or the results of the default action (as modified by <event>_after handlers) * or NULL no action took place and no handler modified the value */ function trigger($action=null, $enablePrevent=true) { - if (!is_callable($action)) $enablePrevent = false; + if (!is_callable($action)) { + $enablePrevent = false; + if (!is_null($action)) { + trigger_error('The default action of '.$this.' is not null but also not callable. Maybe the method is not public?', E_USER_WARNING); + } + } if ($this->advise_before($enablePrevent) && is_callable($action)) { if (is_array($action)) { @@ -102,22 +123,29 @@ class Doku_Event { * stop any further processing of the event by event handlers * this function does not prevent the default action taking place */ - function stopPropagation() { $this->_continue = false; } + function stopPropagation() { + $this->_continue = false; + } /** * preventDefault * * prevent the default action taking place */ - function preventDefault() { $this->_default = false; } + function preventDefault() { + $this->_default = false; + } } +/** + * Controls the registration and execution of all events, + */ class Doku_Event_Handler { // public properties: none // private properties - var $_hooks = array(); // array of events and their registered handlers + protected $_hooks = array(); // array of events and their registered handlers /** * event_handler @@ -128,6 +156,7 @@ class Doku_Event_Handler { function Doku_Event_Handler() { // load action plugins + /** @var DokuWiki_Action_Plugin $plugin */ $plugin = null; $pluginlist = plugin_list('action'); @@ -143,34 +172,47 @@ class Doku_Event_Handler { * * register a hook for an event * - * @param $event (string) name used by the event, (incl '_before' or '_after' for triggers) - * @param $obj (obj) object in whose scope method is to be executed, + * @param string $event string name used by the event, (incl '_before' or '_after' for triggers) + * @param string $advise + * @param object $obj object in whose scope method is to be executed, * if NULL, method is assumed to be a globally available function - * @param $method (function) event handler function - * @param $param (mixed) data passed to the event handler + * @param string $method event handler function + * @param mixed $param data passed to the event handler + * @param int $seq sequence number for ordering hook execution (ascending) */ - function register_hook($event, $advise, $obj, $method, $param=null) { - $this->_hooks[$event.'_'.$advise][] = array($obj, $method, $param); + function register_hook($event, $advise, $obj, $method, $param=null, $seq=0) { + $seq = (int)$seq; + $doSort = !isset($this->_hooks[$event.'_'.$advise][$seq]); + $this->_hooks[$event.'_'.$advise][$seq][] = array($obj, $method, $param); + + if ($doSort) { + ksort($this->_hooks[$event.'_'.$advise]); + } } - function process_event(&$event,$advise='') { + /** + * process the before/after event + * + * @param Doku_Event $event + * @param string $advise BEFORE or AFTER + */ + function process_event($event,$advise='') { $evt_name = $event->name . ($advise ? '_'.$advise : '_BEFORE'); if (!empty($this->_hooks[$evt_name])) { - foreach ($this->_hooks[$evt_name] as $hook) { - // list($obj, $method, $param) = $hook; - $obj =& $hook[0]; - $method = $hook[1]; - $param = $hook[2]; - - if (is_null($obj)) { - $method($event, $param); - } else { - $obj->$method($event, $param); - } + foreach ($this->_hooks[$evt_name] as $sequenced_hooks) { + foreach ($sequenced_hooks as $hook) { + list($obj, $method, $param) = $hook; - if (!$event->_continue) break; + if (is_null($obj)) { + $method($event, $param); + } else { + $obj->$method($event, $param); + } + + if (!$event->_continue) return; + } } } } @@ -181,14 +223,14 @@ class Doku_Event_Handler { * * function wrapper to process (create, trigger and destroy) an event * - * @param $name (string) name for the event - * @param $data (mixed) event data - * @param $action (callback) (optional, default=NULL) default action, a php callback function - * @param $canPreventDefault (bool) (optional, default=true) can hooks prevent the default action + * @param string $name name for the event + * @param mixed $data event data + * @param callback $action (optional, default=NULL) default action, a php callback function + * @param bool $canPreventDefault (optional, default=true) can hooks prevent the default action * - * @return (mixed) the event results value after all event processing is complete - * by default this is the return value of the default action however - * it can be set or modified by event handler hooks + * @return mixed the event results value after all event processing is complete + * by default this is the return value of the default action however + * it can be set or modified by event handler hooks */ function trigger_event($name, &$data, $action=null, $canPreventDefault=true) { diff --git a/inc/farm.php b/inc/farm.php index cee61816c..87fcdade8 100644 --- a/inc/farm.php +++ b/inc/farm.php @@ -135,12 +135,12 @@ $config_cascade = array( ), ), 'userstyle' => array( - 'screen' => DOKU_CONF.'userstyle.css', - 'print' => DOKU_CONF.'userprint.css', - 'feed' => DOKU_CONF.'userfeed.css', - 'all' => DOKU_CONF.'userall.css', + 'screen' => array(DOKU_CONF . 'userstyle.css', DOKU_CONF . 'userstyle.less'), + 'print' => array(DOKU_CONF . 'userprint.css', DOKU_CONF . 'userprint.less'), + 'feed' => array(DOKU_CONF . 'userfeed.css', DOKU_CONF . 'userfeed.less'), + 'all' => array(DOKU_CONF . 'userall.css', DOKU_CONF . 'userall.less') ), 'userscript' => array( - 'default' => DOKU_CONF.'userscript.js' + 'default' => array(DOKU_CONF . 'userscript.js') ), ); diff --git a/inc/feedcreator.class.php b/inc/feedcreator.class.php index 670a1bc29..b90da5724 100644 --- a/inc/feedcreator.class.php +++ b/inc/feedcreator.class.php @@ -185,6 +185,8 @@ class HtmlDescribable { */ var $descriptionTruncSize; + var $description; + /** * Returns a formatted description field, depending on descriptionHtmlSyndicated and * $descriptionTruncSize properties @@ -222,7 +224,7 @@ class FeedHtmlField { /** * Creates a new instance of FeedHtmlField. - * @param $string: if given, sets the rawFieldContent property + * @param string $parFieldContent: if given, sets the rawFieldContent property */ function FeedHtmlField($parFieldContent) { if ($parFieldContent) { @@ -267,8 +269,14 @@ class FeedHtmlField { * @author Kai Blankenhorn <kaib@bitfolge.de> */ class UniversalFeedCreator extends FeedCreator { + /** @var FeedCreator */ var $_feed; + /** + * Sets format + * + * @param string $format + */ function _setFormat($format) { switch (strtoupper($format)) { @@ -344,7 +352,7 @@ class UniversalFeedCreator extends FeedCreator { * Creates a syndication feed based on the items previously added. * * @see FeedCreator::addItem() - * @param string format format the feed should comply to. Valid values are: + * @param string $format format the feed should comply to. Valid values are: * "PIE0.1", "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3", "HTML", "JS" * @return string the contents of the feed. */ @@ -358,10 +366,10 @@ class UniversalFeedCreator extends FeedCreator { * header may be sent to redirect the use to the newly created file. * @since 1.4 * - * @param string format format the feed should comply to. Valid values are: + * @param string $format format the feed should comply to. Valid values are: * "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM", "ATOM0.3", "HTML", "JS" - * @param string filename optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). - * @param boolean displayContents optional send the content of the file or not. If true, the file will be sent in the body of the response. + * @param string $filename optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). + * @param boolean $displayContents optional send the content of the file or not. If true, the file will be sent in the body of the response. */ function saveFeed($format="RSS0.91", $filename="", $displayContents=true) { $this->_setFormat($format); @@ -376,10 +384,10 @@ class UniversalFeedCreator extends FeedCreator { * before anything else, especially before you do the time consuming task to build the feed * (web fetching, for example). * - * @param string format format the feed should comply to. Valid values are: + * @param string $format format the feed should comply to. Valid values are: * "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3". - * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). - * @param timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour) + * @param string $filename optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). + * @param int $timeout optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour) */ function useCached($format="RSS0.91", $filename="", $timeout=3600) { $this->_setFormat($format); @@ -390,7 +398,7 @@ class UniversalFeedCreator extends FeedCreator { /** * Outputs feed to the browser - needed for on-the-fly feed generation (like it is done in WordPress, etc.) * - * @param format string format the feed should comply to. Valid values are: + * @param $format string format the feed should comply to. Valid values are: * "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3". */ function outputFeed($format='RSS0.91') { @@ -422,7 +430,13 @@ class FeedCreator extends HtmlDescribable { /** * Optional attributes of a feed. */ - var $syndicationURL, $image, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays; + var $syndicationURL, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays; + /** + * Optional attribute of a feed + * + * @var FeedImage + */ + var $image = null; /** * The url of the external xsl stylesheet used to format the naked rss feed. @@ -430,13 +444,18 @@ class FeedCreator extends HtmlDescribable { */ var $xslStyleSheet = ""; + /** + * Style sheet for rss feed + */ + var $cssStyleSheet = ""; + /** * @access private + * @var FeedItem[] */ var $items = Array(); - /** * This feed's MIME content type. * @since 1.4 @@ -466,7 +485,7 @@ class FeedCreator extends HtmlDescribable { /** * Adds an FeedItem to the feed. * - * @param object FeedItem $item The FeedItem to add to the feed. + * @param FeedItem $item The FeedItem to add to the feed. * @access public */ function addItem($item) { @@ -482,8 +501,8 @@ class FeedCreator extends HtmlDescribable { * If the string is already shorter than $length, it is returned unchanged. * * @static - * @param string string A string to be truncated. - * @param int length the maximum length the string should be truncated to + * @param string $string A string to be truncated. + * @param int $length the maximum length the string should be truncated to * @return string the truncated string */ function iTrunc($string, $length) { @@ -527,8 +546,8 @@ class FeedCreator extends HtmlDescribable { /** * Creates a string containing all additional elements specified in * $additionalElements. - * @param elements array an associative array containing key => value pairs - * @param indentString string a string that will be inserted before every generated line + * @param $elements array an associative array containing key => value pairs + * @param $indentString string a string that will be inserted before every generated line * @return string the XML tags corresponding to $additionalElements */ function _createAdditionalElements($elements, $indentString="") { @@ -541,6 +560,9 @@ class FeedCreator extends HtmlDescribable { return $ae; } + /** + * Create elements for stylesheets + */ function _createStylesheetReferences() { $xml = ""; if ($this->cssStyleSheet) $xml .= "<?xml-stylesheet href=\"".$this->cssStyleSheet."\" type=\"text/css\"?>\n"; @@ -610,8 +632,8 @@ class FeedCreator extends HtmlDescribable { * before anything else, especially before you do the time consuming task to build the feed * (web fetching, for example). * @since 1.4 - * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). - * @param timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour) + * @param $filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). + * @param $timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour) */ function useCached($filename="", $timeout=3600) { $this->_timeout = $timeout; @@ -629,8 +651,8 @@ class FeedCreator extends HtmlDescribable { * header may be sent to redirect the user to the newly created file. * @since 1.4 * - * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). - * @param redirect boolean optional send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file. + * @param $filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). + * @param $displayContents boolean optional send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file. */ function saveFeed($filename="", $displayContents=true) { if ($filename=="") { @@ -667,6 +689,7 @@ class FeedCreator extends HtmlDescribable { * Usually, you won't need to use this. */ class FeedDate { + /** @var int */ var $unix; /** @@ -726,7 +749,7 @@ class FeedDate { /** * Gets the date stored in this FeedDate as an RFC 822 date. * - * @return a date in RFC 822 format + * @return string a date in RFC 822 format */ function rfc822() { //return gmdate("r",$this->unix); @@ -738,7 +761,7 @@ class FeedDate { /** * Gets the date stored in this FeedDate as an ISO 8601 date. * - * @return a date in ISO 8601 (RFC 3339) format + * @return string a date in ISO 8601 (RFC 3339) format */ function iso8601() { $date = gmdate("Y-m-d\TH:i:sO",$this->unix); @@ -751,7 +774,7 @@ class FeedDate { /** * Gets the date stored in this FeedDate as unix time stamp. * - * @return a date as a unix time stamp + * @return int a date as a unix time stamp */ function unix() { return $this->unix; @@ -777,7 +800,7 @@ class RSSCreator10 extends FeedCreator { $feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n"; $feed.= $this->_createGeneratorComment(); if ($this->cssStyleSheet=="") { - $cssStyleSheet = "http://www.w3.org/2000/08/w3c-synd/style.css"; + $this->cssStyleSheet = "http://www.w3.org/2000/08/w3c-synd/style.css"; } $feed.= $this->_createStylesheetReferences(); $feed.= "<rdf:RDF\n"; @@ -1032,12 +1055,16 @@ class PIECreator01 extends FeedCreator { $this->encoding = "utf-8"; } + /** + * Build content + * @return string + */ function createFeed() { $feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n"; $feed.= $this->_createStylesheetReferences(); $feed.= "<feed version=\"0.1\" xmlns=\"http://example.com/newformat#\">\n"; $feed.= " <title>".FeedCreator::iTrunc(htmlspecialchars($this->title),100)."</title>\n"; - $this->truncSize = 500; + $this->descriptionTruncSize = 500; $feed.= " <subtitle>".$this->getDescription()."</subtitle>\n"; $feed.= " <link>".$this->link."</link>\n"; $icnt = count($this->items); @@ -1091,6 +1118,10 @@ class AtomCreator10 extends FeedCreator { $this->encoding = "utf-8"; } + /** + * Build content + * @return string + */ function createFeed() { $feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n"; $feed.= $this->_createGeneratorComment(); @@ -1174,6 +1205,10 @@ class AtomCreator03 extends FeedCreator { $this->encoding = "utf-8"; } + /** + * Build content + * @return string + */ function createFeed() { $feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n"; $feed.= $this->_createGeneratorComment(); @@ -1281,6 +1316,7 @@ class MBOXCreator extends FeedCreator { */ function createFeed() { $icnt = count($this->items); + $feed = ""; for ($i=0; $i<$icnt; $i++) { if ($this->items[$i]->author!="") { $from = $this->items[$i]->author; @@ -1331,6 +1367,10 @@ class OPMLCreator extends FeedCreator { $this->encoding = "utf-8"; } + /** + * Build content + * @return string + */ function createFeed() { $feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n"; $feed.= $this->_createGeneratorComment(); @@ -1441,6 +1481,7 @@ class HTMLCreator extends FeedCreator { } //set an openInNewWindow_token_to be inserted or not + $targetInsert = ""; if ($this->openInNewWindow) { $targetInsert = " target='_blank'"; } @@ -1568,6 +1609,14 @@ class JSCreator extends HTMLCreator { * @author Andreas Gohr <andi@splitbrain.org> */ class DokuWikiFeedCreator extends UniversalFeedCreator{ + + /** + * Build content + * + * @param string $format + * @param string $encoding + * @return string + */ function createFeed($format = "RSS0.91",$encoding='iso-8859-15') { $this->_setFormat($format); $this->_feed->encoding = $encoding; diff --git a/inc/fetch.functions.php b/inc/fetch.functions.php index 207ad9e5f..c99fbf20a 100644 --- a/inc/fetch.functions.php +++ b/inc/fetch.functions.php @@ -15,13 +15,16 @@ * * @author Andreas Gohr <andi@splitbrain.org> * @author Ben Coburn <btcoburn@silicodon.net> + * @author Gerry Weissbach <dokuwiki@gammaproduction.de> + * * @param string $file local file to send * @param string $mime mime type of the file * @param bool $dl set to true to force a browser download * @param int $cache remaining cache time in seconds (-1 for $conf['cache'], 0 for no-cache) * @param bool $public is this a public ressource or a private one? + * @param string $orig original file to send - the file name will be used for the Content-Disposition */ -function sendFile($file, $mime, $dl, $cache, $public = false) { +function sendFile($file, $mime, $dl, $cache, $public = false, $orig = null) { global $conf; // send mime headers header("Content-Type: $mime"); @@ -62,15 +65,20 @@ function sendFile($file, $mime, $dl, $cache, $public = false) { $fmtime = @filemtime($file); http_conditionalRequest($fmtime); + // Use the current $file if is $orig is not set. + if ( $orig == null ) { + $orig = $file; + } + //download or display? if($dl) { - header('Content-Disposition: attachment; filename="'.utf8_basename($file).'";'); + header('Content-Disposition: attachment;'.rfc2231_encode('filename', utf8_basename($orig)).';'); } else { - header('Content-Disposition: inline; filename="'.utf8_basename($file).'";'); + header('Content-Disposition: inline;'.rfc2231_encode('filename', utf8_basename($orig)).';'); } //use x-sendfile header to pass the delivery to compatible webservers - if(http_sendfile($file)) exit; + http_sendfile($file); // send file contents $fp = @fopen($file, "rb"); @@ -83,18 +91,44 @@ function sendFile($file, $mime, $dl, $cache, $public = false) { } /** + * Try an rfc2231 compatible encoding. This ensures correct + * interpretation of filenames outside of the ASCII set. + * This seems to be needed for file names with e.g. umlauts that + * would otherwise decode wrongly in IE. + * + * There is no additional checking, just the encoding and setting the key=value for usage in headers + * + * @author Gerry Weissbach <gerry.w@gammaproduction.de> + * @param string $name name of the field to be set in the header() call + * @param string $value value of the field to be set in the header() call + * @param string $charset used charset for the encoding of value + * @param string $lang language used. + * @return string in the format " name=value" for values WITHOUT special characters + * @return string in the format " name*=charset'lang'value" for values WITH special characters + */ +function rfc2231_encode($name, $value, $charset='utf-8', $lang='en') { + $internal = preg_replace_callback('/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/', function($match) { return rawurlencode($match[0]); }, $value); + if ( $value != $internal ) { + return ' '.$name.'*='.$charset."'".$lang."'".$internal; + } else { + return ' '.$name.'="'.$value.'"'; + } +} + +/** * Check for media for preconditions and return correct status code * * READ: MEDIA, MIME, EXT, CACHE * WRITE: MEDIA, FILE, array( STATUS, STATUSMESSAGE ) * * @author Gerry Weissbach <gerry.w@gammaproduction.de> + * * @param string $media reference to the media id * @param string $file reference to the file variable * @param string $rev * @param int $width * @param int $height - * @return array(STATUS, STATUSMESSAGE) + * @return array as array(STATUS, STATUSMESSAGE) */ function checkFileStatus(&$media, &$file, $rev = '', $width=0, $height=0) { global $MIME, $EXT, $CACHE, $INPUT; @@ -129,7 +163,7 @@ function checkFileStatus(&$media, &$file, $rev = '', $width=0, $height=0) { } //check file existance - if(!@file_exists($file)) { + if(!file_exists($file)) { return array(404, 'Not Found'); } @@ -142,6 +176,9 @@ function checkFileStatus(&$media, &$file, $rev = '', $width=0, $height=0) { * Resolves named constants * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $cache + * @return int cachetime in seconds */ function calc_cache($cache) { global $conf; diff --git a/inc/form.php b/inc/form.php index a4cd2e682..00eea9b3a 100644 --- a/inc/form.php +++ b/inc/form.php @@ -47,15 +47,12 @@ class Doku_Form { * with up to four parameters is deprecated, instead the first parameter * should be an array with parameters. * - * @param mixed $params Parameters for the HTML form element; Using the - * deprecated calling convention this is the ID - * attribute of the form - * @param string $action (optional, deprecated) submit URL, defaults to - * current page - * @param string $method (optional, deprecated) 'POST' or 'GET', default - * is POST - * @param string $enctype (optional, deprecated) Encoding type of the - * data + * @param mixed $params Parameters for the HTML form element; Using the deprecated + * calling convention this is the ID attribute of the form + * @param bool|string $action (optional, deprecated) submit URL, defaults to current page + * @param bool|string $method (optional, deprecated) 'POST' or 'GET', default is POST + * @param bool|string $enctype (optional, deprecated) Encoding type of the data + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function Doku_Form($params, $action=false, $method=false, $enctype=false) { @@ -88,6 +85,7 @@ class Doku_Form { * Usually results in a border drawn around the form. * * @param string $legend Label that will be printed with the border. + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function startFieldset($legend) { @@ -119,6 +117,7 @@ class Doku_Form { * * @param string $name Field name. * @param string $value Field value. If null, remove a previously added field. + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function addHidden($name, $value) { @@ -135,7 +134,8 @@ class Doku_Form { * The element can be either a pseudo-tag or string. * If string, it is printed without escaping special chars. * * - * @param string $elem Pseudo-tag or string to add to the form. + * @param string|array $elem Pseudo-tag or string to add to the form. + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function addElement($elem) { @@ -147,8 +147,9 @@ class Doku_Form { * * Inserts a content element at a position. * - * @param string $pos 0-based index where the element will be inserted. - * @param string $elem Pseudo-tag or string to add to the form. + * @param string $pos 0-based index where the element will be inserted. + * @param string|array $elem Pseudo-tag or string to add to the form. + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function insertElement($pos, $elem) { @@ -160,8 +161,9 @@ class Doku_Form { * * Replace with NULL to remove an element. * - * @param int $pos 0-based index the element will be placed at. - * @param string $elem Pseudo-tag or string to add to the form. + * @param int $pos 0-based index the element will be placed at. + * @param string|array $elem Pseudo-tag or string to add to the form. + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function replaceElement($pos, $elem) { @@ -176,7 +178,8 @@ class Doku_Form { * Gets the position of the first of a type of element. * * @param string $type Element type to look for. - * @return array pseudo-element if found, false otherwise + * @return int|false position of element if found, otherwise false + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function findElementByType($type) { @@ -193,7 +196,8 @@ class Doku_Form { * Gets the position of the element with an ID attribute. * * @param string $id ID of the element to find. - * @return array pseudo-element if found, false otherwise + * @return int|false position of element if found, otherwise false + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function findElementById($id) { @@ -211,7 +215,8 @@ class Doku_Form { * * @param string $name Attribute name. * @param string $value Attribute value. - * @return array pseudo-element if found, false otherwise + * @return int|false position of element if found, otherwise false + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function findElementByAttribute($name, $value) { @@ -230,7 +235,8 @@ class Doku_Form { * first (underflow) or last (overflow) element. * * @param int $pos 0-based index - * @return arrayreference pseudo-element + * @return array reference pseudo-element + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function &getElementAt($pos) { @@ -247,6 +253,8 @@ class Doku_Form { * 'form_$type'. The function should return the HTML to be printed. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @return string html of the form */ function getForm() { global $lang; @@ -314,6 +322,7 @@ class Doku_Form { * @param string $tag Tag name. * @param array $attrs Optional attributes. * @return array pseudo-tag + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function form_makeTag($tag, $attrs=array()) { @@ -330,6 +339,7 @@ function form_makeTag($tag, $attrs=array()) { * @param string $tag Tag name. * @param array $attrs Optional attributes. * @return array pseudo-tag + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function form_makeOpenTag($tag, $attrs=array()) { @@ -345,6 +355,7 @@ function form_makeOpenTag($tag, $attrs=array()) { * * @param string $tag Tag name. * @return array pseudo-tag + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function form_makeCloseTag($tag) { @@ -362,6 +373,7 @@ function form_makeCloseTag($tag) { * @param string $text Text to fill the field with. * @param array $attrs Optional attributes. * @return array pseudo-tag + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function form_makeWikiText($text, $attrs=array()) { @@ -382,6 +394,7 @@ function form_makeWikiText($text, $attrs=array()) { * @param string $value (optional) Displayed label. Uses $act if not provided. * @param array $attrs Optional attributes. * @return array pseudo-tag + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function form_makeButton($type, $act, $value='', $attrs=array()) { @@ -410,6 +423,7 @@ function form_makeButton($type, $act, $value='', $attrs=array()) { * reference it with a 'for' attribute. * @param array $attrs Optional attributes. * @return array pseudo-tag + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function form_makeField($type, $name, $value='', $label=null, $id='', $class='', $attrs=array()) { @@ -526,6 +540,18 @@ function form_makeRadioField($name, $value='1', $label=null, $id='', $class='', * a string. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param string $name Name attribute of the input. + * @param string[]|array[] $values The list of values can be strings, arrays of (value,text), + * or an associative array with the values as keys and labels as values. + * @param string|int $selected default selected value, string or index number + * @param string $class Class attribute of the label. If this is 'block', + * then a line break will be added after the field. + * @param string $label Label that will be printed before the input. + * @param string $id ID attribute of the input. If set, the label will + * reference it with a 'for' attribute. + * @param array $attrs Optional attributes. + * @return array pseudo-tag */ function form_makeMenuField($name, $values, $selected='', $label=null, $id='', $class='', $attrs=array()) { if (is_null($label)) $label = $name; @@ -560,15 +586,28 @@ function form_makeMenuField($name, $values, $selected='', $label=null, $id='', $ * Items are selected by supplying its value or an array of values. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param string $name Name attribute of the input. + * @param string[]|array[] $values The list of values can be strings, arrays of (value,text), + * or an associative array with the values as keys and labels as values. + * @param array|string $selected value or array of values of the items that need to be selected + * @param string $class Class attribute of the label. If this is 'block', + * then a line break will be added after the field. + * @param string $label Label that will be printed before the input. + * @param string $id ID attribute of the input. If set, the label will + * reference it with a 'for' attribute. + * @param array $attrs Optional attributes. + * @return array pseudo-tag */ function form_makeListboxField($name, $values, $selected='', $label=null, $id='', $class='', $attrs=array()) { if (is_null($label)) $label = $name; $options = array(); reset($values); - if (is_null($selected) || $selected == '') + if (is_null($selected) || $selected == '') { $selected = array(); - elseif (!is_array($selected)) + } elseif (!is_array($selected)) { $selected = array($selected); + } // FIXME: php doesn't know the difference between a string and an integer if (is_string(key($values))) { foreach ($values as $val=>$text) { @@ -576,11 +615,13 @@ function form_makeListboxField($name, $values, $selected='', $label=null, $id='' } } else { foreach ($values as $val) { - if (is_array($val)) - @list($val,$text) = $val; - else + $disabled = false; + if (is_array($val)) { + @list($val,$text,$disabled) = $val; + } else { $text = null; - $options[] = array($val,$text,in_array($val,$selected)); + } + $options[] = array($val,$text,in_array($val,$selected),$disabled); } } $elem = array('_elem'=>'listboxfield', '_options'=>$options, '_text'=>$label, '_class'=>$class, @@ -596,6 +637,9 @@ function form_makeListboxField($name, $values, $selected='', $label=null, $id='' * Attributes are passed to buildAttributes() * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html of tag */ function form_tag($attrs) { return '<'.$attrs['_tag'].' '.buildAttributes($attrs,true).'/>'; @@ -609,6 +653,9 @@ function form_tag($attrs) { * Attributes are passed to buildAttributes() * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html of tag */ function form_opentag($attrs) { return '<'.$attrs['_tag'].' '.buildAttributes($attrs,true).'>'; @@ -622,6 +669,9 @@ function form_opentag($attrs) { * There are no attributes. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html of tag */ function form_closetag($attrs) { return '</'.$attrs['_tag'].'>'; @@ -635,6 +685,9 @@ function form_closetag($attrs) { * Attributes are passed to buildAttributes() * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_openfieldset($attrs) { $s = '<fieldset '.buildAttributes($attrs,true).'>'; @@ -649,6 +702,8 @@ function form_openfieldset($attrs) { * There are no attributes. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @return string html */ function form_closefieldset() { return '</fieldset>'; @@ -662,6 +717,9 @@ function form_closefieldset() { * Value is passed to formText() * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_hidden($attrs) { return '<input type="hidden" name="'.$attrs['name'].'" value="'.formText($attrs['value']).'" />'; @@ -675,6 +733,9 @@ function form_hidden($attrs) { * Text will be passed to formText(), attributes to buildAttributes() * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_wikitext($attrs) { // mandatory attributes @@ -694,6 +755,9 @@ function form_wikitext($attrs) { * Other attributes are passed to buildAttributes() * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_button($attrs) { $p = (!empty($attrs['_action'])) ? 'name="do['.$attrs['_action'].']" ' : ''; @@ -709,6 +773,9 @@ function form_button($attrs) { * Other attributes are passed to buildAttributes() for the input tag. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_field($attrs) { $s = '<label'; @@ -730,6 +797,9 @@ function form_field($attrs) { * Other attributes are passed to buildAttributes() for the input tag. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_fieldright($attrs) { $s = '<label'; @@ -751,6 +821,9 @@ function form_fieldright($attrs) { * Other attributes are passed to buildAttributes() for the input tag. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_textfield($attrs) { // mandatory attributes @@ -774,6 +847,9 @@ function form_textfield($attrs) { * Other attributes are passed to buildAttributes() for the input tag. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_passwordfield($attrs) { // mandatory attributes @@ -799,6 +875,9 @@ function form_passwordfield($attrs) { * Other attributes are passed to buildAttributes() for the input tag * * @author Michael Klier <chi@chimeric.de> + * + * @param array $attrs attributes + * @return string html */ function form_filefield($attrs) { $s = '<label'; @@ -825,6 +904,9 @@ function form_filefield($attrs) { * $attrs['value'][1] is constructed as well. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_checkboxfield($attrs) { // mandatory attributes @@ -854,6 +936,9 @@ function form_checkboxfield($attrs) { * Other attributes are passed to buildAttributes() for the input tag. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_radiofield($attrs) { // mandatory attributes @@ -880,6 +965,9 @@ function form_radiofield($attrs) { * Other attributes are passed to buildAttributes() for the input tag. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_menufield($attrs) { $attrs['size'] = '1'; @@ -925,6 +1013,9 @@ function form_menufield($attrs) { * Other attributes are passed to buildAttributes() for the input tag. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param array $attrs attributes + * @return string html */ function form_listboxfield($attrs) { $s = '<label'; @@ -934,11 +1025,12 @@ function form_listboxfield($attrs) { $s .= '<select '.buildAttributes($attrs,true).'>'.DOKU_LF; if (!empty($attrs['_options'])) { foreach ($attrs['_options'] as $opt) { - @list($value,$text,$select) = $opt; + @list($value,$text,$select,$disabled) = $opt; $p = ''; if(is_null($text)) $text = $value; $p .= ' value="'.formText($value).'"'; if (!empty($select)) $p .= ' selected="selected"'; + if ($disabled) $p .= ' disabled="disabled"'; $s .= '<option'.$p.'>'.formText($text).'</option>'; } } else { diff --git a/inc/fulltext.php b/inc/fulltext.php index bd8e6b866..d6cddc566 100644 --- a/inc/fulltext.php +++ b/inc/fulltext.php @@ -20,9 +20,13 @@ if(!defined('FT_SNIPPET_NUMBER')) define('FT_SNIPPET_NUMBER',15); * * refactored into ft_pageSearch(), _ft_pageSearch() and trigger_event() * + * @param string $query + * @param array $highlight + * @return array */ function ft_pageSearch($query,&$highlight){ + $data = array(); $data['query'] = $query; $data['highlight'] =& $highlight; @@ -34,6 +38,9 @@ function ft_pageSearch($query,&$highlight){ * * @author Andreas Gohr <andi@splitbrain.org> * @author Kazutaka Miyasaka <kazmiya@gmail.com> + * + * @param array $data event data + * @return array matching documents */ function _ft_pageSearch(&$data) { $Indexer = idx_get_indexer(); @@ -72,8 +79,20 @@ function _ft_pageSearch(&$data) { $pages = end($stack); $pages_matched = array(); foreach(array_keys($pages) as $id){ - $text = utf8_strtolower(rawWiki($id)); - if (strpos($text, $phrase) !== false) { + $evdata = array( + 'id' => $id, + 'phrase' => $phrase, + 'text' => rawWiki($id) + ); + $evt = new Doku_Event('FULLTEXT_PHRASE_MATCH',$evdata); + if ($evt->advise_before() && $evt->result !== true) { + $text = utf8_strtolower($evdata['text']); + if (strpos($text, $phrase) !== false) { + $evt->result = true; + } + } + $evt->advise_after(); + if ($evt->result === true) { $pages_matched[$id] = 0; // phrase: always 0 hit } } @@ -193,6 +212,11 @@ function ft_mediause($id, $ignore_perms = false){ * @triggers SEARCH_QUERY_PAGELOOKUP * @author Andreas Gohr <andi@splitbrain.org> * @author Adrian Lang <lang@cosmocode.de> + * + * @param string $id page id + * @param bool $in_ns match against namespace as well? + * @param bool $in_title search in title? + * @return string[] */ function ft_pageLookup($id, $in_ns=false, $in_title=false){ $data = compact('id', 'in_ns', 'in_title'); @@ -200,10 +224,16 @@ function ft_pageLookup($id, $in_ns=false, $in_title=false){ return trigger_event('SEARCH_QUERY_PAGELOOKUP', $data, '_ft_pageLookup'); } +/** + * Returns list of pages as array(pageid => First Heading) + * + * @param array &$data event data + * @return string[] + */ function _ft_pageLookup(&$data){ // split out original parameters $id = $data['id']; - if (preg_match('/(?:^| )@(\w+)/', $id, $matches)) { + if (preg_match('/(?:^| )(?:@|ns:)([\w:]+)/', $id, $matches)) { $ns = cleanID($matches[1]) . ':'; $id = str_replace($matches[0], '', $id); } @@ -257,6 +287,10 @@ function _ft_pageLookup(&$data){ * Tiny helper function for comparing the searched title with the title * from the search index. This function is a wrapper around stripos with * adapted argument order and return value. + * + * @param string $search searched title + * @param string $title title from index + * @return bool */ function _ft_pageLookupTitleCompare($search, $title) { return stripos($title, $search) !== false; @@ -266,6 +300,10 @@ function _ft_pageLookupTitleCompare($search, $title) { * Sort pages based on their namespace level first, then on their string * values. This makes higher hierarchy pages rank higher than lower hierarchy * pages. + * + * @param string $a + * @param string $b + * @return int Returns < 0 if $a is less than $b; > 0 if $a is greater than $b, and 0 if they are equal. */ function ft_pagesorter($a, $b){ $ac = count(explode(':',$a)); @@ -283,6 +321,10 @@ function ft_pagesorter($a, $b){ * * @author Andreas Gohr <andi@splitbrain.org> * @triggers FULLTEXT_SNIPPET_CREATE + * + * @param string $id page id + * @param array $highlight + * @return mixed */ function ft_snippet($id,$highlight){ $text = rawWiki($id); @@ -333,7 +375,7 @@ function ft_snippet($id,$highlight){ $pre = min($pre,100-$post); } else if ($post>50) { $post = min($post, 100-$pre); - } else { + } else if ($offset == 0) { // both are less than 50, means the context is the whole string // make it so and break out of this loop - there is no need for the // complex snippet calculations @@ -354,12 +396,12 @@ function ft_snippet($id,$highlight){ } // set $offset for next match attempt - // substract strlen to avoid splitting a potential search success, - // this is an approximation as the search pattern may match strings - // of varying length and it will fail if the context snippet - // boundary breaks a matching string longer than the current match - $utf8_offset = $utf8_idx + $post; - $offset = $idx + strlen(utf8_substr($text,$utf8_idx,$post)); + // continue matching after the current match + // if the current match is not the longest possible match starting at the current offset + // this prevents further matching of this snippet but for possible matches of length + // smaller than match length + context (at least 50 characters) this match is part of the context + $utf8_offset = $utf8_idx + $utf8_len; + $offset = $idx + strlen(utf8_substr($text,$utf8_idx,$utf8_len)); $offset = utf8_correctIdx($text,$offset); } @@ -377,6 +419,9 @@ function ft_snippet($id,$highlight){ /** * Wraps a search term in regex boundary checks. + * + * @param string $term + * @return string */ function ft_snippet_re_preprocess($term) { // do not process asian terms where word boundaries are not explicit @@ -420,6 +465,7 @@ function ft_snippet_re_preprocess($term) { * based upon PEAR's PHP_Compat function for array_intersect_key() * * @param array $args An array of page arrays + * @return array */ function ft_resultCombine($args){ $array_count = count($args); @@ -449,6 +495,8 @@ function ft_resultCombine($args){ * based upon ft_resultCombine() function * * @param array $args An array of page arrays + * @return array + * * @author Kazutaka Miyasaka <kazmiya@gmail.com> */ function ft_resultUnite($args) { @@ -472,6 +520,8 @@ function ft_resultUnite($args) { * nearly identical to PHP5's array_diff_key() * * @param array $args An array of page arrays + * @return array + * * @author Kazutaka Miyasaka <kazmiya@gmail.com> */ function ft_resultComplement($args) { @@ -494,6 +544,10 @@ function ft_resultComplement($args) { * * @author Andreas Gohr <andi@splitbrain.org> * @author Kazutaka Miyasaka <kazmiya@gmail.com> + * + * @param Doku_Indexer $Indexer + * @param string $query search query + * @return array of search formulas */ function ft_queryParser($Indexer, $query){ /** @@ -724,6 +778,12 @@ function ft_queryParser($Indexer, $query){ * This function is used in ft_queryParser() and not for general purpose use. * * @author Kazutaka Miyasaka <kazmiya@gmail.com> + * + * @param Doku_Indexer $Indexer + * @param string $term + * @param bool $consider_asian + * @param bool $phrase_mode + * @return string */ function ft_termParser($Indexer, $term, $consider_asian = true, $phrase_mode = false) { $parsed = ''; diff --git a/inc/html.php b/inc/html.php index 7f473cdb6..3a93a6604 100644 --- a/inc/html.php +++ b/inc/html.php @@ -19,6 +19,7 @@ if(!defined('NL')) define('NL',"\n"); * @return string the HTML code of the link */ function html_wikilink($id,$name=null,$search=''){ + /** @var Doku_Renderer_xhtml $xhtml_renderer */ static $xhtml_renderer = null; if(is_null($xhtml_renderer)){ $xhtml_renderer = p_get_renderer('xhtml'); @@ -64,10 +65,28 @@ function html_login(){ print '</div>'.NL; } + +/** + * Denied page content + * + * @return string html + */ +function html_denied() { + print p_locale_xhtml('denied'); + + if(!$_SERVER['REMOTE_USER']){ + html_login(); + } +} + /** * inserts section edit buttons if wanted or removes the markers * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $text + * @param bool $show show section edit buttons? + * @return string */ function html_secedit($text,$show=true){ global $INFO; @@ -86,8 +105,11 @@ function html_secedit($text,$show=true){ * prepares section edit button data for event triggering * used as a callback in html_secedit * - * @triggers HTML_SECEDIT_BUTTON * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $matches matches with regexp + * @return string + * @triggers HTML_SECEDIT_BUTTON */ function html_secedit_button($matches){ $data = array('secid' => $matches[1], @@ -106,6 +128,9 @@ function html_secedit_button($matches){ * used as default action form HTML_SECEDIT_BUTTON * * @author Adrian Lang <lang@cosmocode.de> + * + * @param array $data name, section id and target + * @return string html */ function html_secedit_get_button($data) { global $ID; @@ -132,6 +157,8 @@ function html_secedit_get_button($data) { * Just the back to top button (in its own form) * * @author Andreas Gohr <andi@splitbrain.org> + * + * @return string html */ function html_topbtn(){ global $lang; @@ -146,6 +173,15 @@ function html_topbtn(){ * If tooltip exists, the access key tooltip is replaced. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $name + * @param string $id + * @param string $akey access key + * @param string[] $params key-value pairs added as hidden inputs + * @param string $method + * @param string $tooltip + * @param bool|string $label label text, false: lookup btn_$name in localization + * @return string */ function html_btn($name,$id,$akey,$params,$method='get',$tooltip='',$label=false){ global $conf; @@ -198,15 +234,18 @@ function html_btn($name,$id,$akey,$params,$method='get',$tooltip='',$label=false } /** - * show a wiki page + * Show a wiki page * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param null|string $txt wiki text or null for showing $ID */ function html_show($txt=null){ global $ID; global $REV; global $HIGH; global $INFO; + global $DATE_AT; //disable section editing for old revisions or in preview if($txt || $REV){ $secedit = false; @@ -226,8 +265,8 @@ function html_show($txt=null){ echo '</div></div>'; }else{ - if ($REV) print p_locale_xhtml('showrev'); - $html = p_wiki_xhtml($ID,$REV,true); + if ($REV||$DATE_AT) print p_locale_xhtml('showrev'); + $html = p_wiki_xhtml($ID,$REV,true,$DATE_AT); $html = html_secedit($html,$secedit); if($INFO['prependTOC']) $html = tpl_toc(true).$html; $html = html_hilight($html,$HIGH); @@ -266,6 +305,10 @@ function html_draft(){ * * @author Andreas Gohr <andi@splitbrain.org> * @author Harry Fuecks <hfuecks@gmail.com> + * + * @param string $html + * @param array|string $phrases + * @return string html */ function html_hilight($html,$phrases){ $phrases = (array) $phrases; @@ -284,6 +327,9 @@ function html_hilight($html,$phrases){ * Callback used by html_hilight() * * @author Harry Fuecks <hfuecks@gmail.com> + * + * @param array $m matches + * @return string html */ function html_hilight_callback($m) { $hlight = unslash($m[0]); @@ -299,15 +345,17 @@ function html_hilight_callback($m) { * @author Andreas Gohr <andi@splitbrain.org> */ function html_search(){ - global $QUERY; + global $QUERY, $ID; global $lang; $intro = p_locale_xhtml('searchpage'); // allow use of placeholder in search intro + $pagecreateinfo = (auth_quickaclcheck($ID) >= AUTH_CREATE) ? $lang['searchcreatepage'] : ''; $intro = str_replace( - array('@QUERY@','@SEARCH@'), - array(hsc(rawurlencode($QUERY)),hsc($QUERY)), - $intro); + array('@QUERY@', '@SEARCH@', '@CREATEPAGEINFO@'), + array(hsc(rawurlencode($QUERY)), hsc($QUERY), $pagecreateinfo), + $intro + ); echo $intro; flush(); @@ -396,8 +444,8 @@ function html_locked(){ print p_locale_xhtml('locked'); print '<ul>'; - print '<li><div class="li"><strong>'.$lang['lockedby'].':</strong> '.editorinfo($INFO['locked']).'</div></li>'; - print '<li><div class="li"><strong>'.$lang['lockexpire'].':</strong> '.$expire.' ('.$min.' min)</div></li>'; + print '<li><div class="li"><strong>'.$lang['lockedby'].'</strong> '.editorinfo($INFO['locked']).'</div></li>'; + print '<li><div class="li"><strong>'.$lang['lockexpire'].'</strong> '.$expire.' ('.$min.' min)</div></li>'; print '</ul>'; } @@ -407,6 +455,9 @@ function html_locked(){ * @author Andreas Gohr <andi@splitbrain.org> * @author Ben Coburn <btcoburn@silicodon.net> * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param int $first skip the first n changelog lines + * @param bool|string $media_id id of media, or false for current page */ function html_revisions($first=0, $media_id = false){ global $ID; @@ -414,20 +465,23 @@ function html_revisions($first=0, $media_id = false){ global $conf; global $lang; $id = $ID; + if ($media_id) { + $id = $media_id; + $changelog = new MediaChangeLog($id); + } else { + $changelog = new PageChangeLog($id); + } + /* we need to get one additional log entry to be able to * decide if this is the last page or is there another one. * see html_recent() */ - if (!$media_id) $revisions = getRevisions($ID, $first, $conf['recent']+1); - else { - $revisions = getRevisions($media_id, $first, $conf['recent']+1, 8192, true); - $id = $media_id; - } + + $revisions = $changelog->getRevisions($first, $conf['recent']+1); if(count($revisions)==0 && $first!=0){ $first=0; - if (!$media_id) $revisions = getRevisions($ID, $first, $conf['recent']+1); - else $revisions = getRevisions($media_id, $first, $conf['recent']+1, 8192, true); + $revisions = $changelog->getRevisions($first, $conf['recent']+1); } $hasNext = false; if (count($revisions)>$conf['recent']) { @@ -447,7 +501,7 @@ function html_revisions($first=0, $media_id = false){ $form->addElement(form_makeOpenTag('ul')); if (!$media_id) $exists = $INFO['exists']; - else $exists = @file_exists(mediaFN($id)); + else $exists = file_exists(mediaFN($id)); $display_name = (!$media_id && useHeading('navigation')) ? hsc(p_get_first_heading($id)) : $id; if (!$display_name) $display_name = $id; @@ -486,15 +540,18 @@ function html_revisions($first=0, $media_id = false){ $form->addElement(form_makeCloseTag('span')); } + $changelog->setChunkSize(1024); + $form->addElement(form_makeOpenTag('span', array('class' => 'user'))); - if (!$media_id) $editor = $INFO['editor']; - else { - $revinfo = getRevisionInfo($id, @filemtime(fullpath(mediaFN($id))), 1024, true); - if($revinfo['user']){ + if($media_id) { + $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id)))); + if($revinfo['user']) { $editor = $revinfo['user']; - }else{ + } else { $editor = $revinfo['ip']; } + } else { + $editor = $INFO['editor']; } $form->addElement((empty($editor))?('('.$lang['external_edit'].')'):editorinfo($editor)); $form->addElement(form_makeCloseTag('span')); @@ -509,12 +566,11 @@ function html_revisions($first=0, $media_id = false){ foreach($revisions as $rev){ $date = dformat($rev); - if (!$media_id) { - $info = getRevisionInfo($id,$rev,true); - $exists = page_exists($id,$rev); - } else { - $info = getRevisionInfo($id,$rev,true,true); - $exists = @file_exists(mediaFN($id,$rev)); + $info = $changelog->getRevisionInfo($rev); + if($media_id) { + $exists = file_exists(mediaFN($id, $rev)); + } else { + $exists = page_exists($id, $rev); } if ($info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) @@ -623,6 +679,9 @@ function html_revisions($first=0, $media_id = false){ * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> * @author Ben Coburn <btcoburn@silicodon.net> * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param int $first + * @param string $show_changes */ function html_recent($first=0, $show_changes='both'){ global $conf; @@ -691,7 +750,7 @@ function html_recent($first=0, $show_changes='both'){ $form->addElement(form_makeOpenTag('div', array('class' => 'li'))); - if ($recent['media']) { + if (!empty($recent['media'])) { $form->addElement(media_printicon($recent['id'])); } else { $icon = DOKU_BASE.'lib/images/fileicons/file.png'; @@ -705,8 +764,8 @@ function html_recent($first=0, $show_changes='both'){ $diff = false; $href = ''; - if ($recent['media']) { - $diff = (count(getRevisions($recent['id'], 0, 1, 8192, true)) && @file_exists(mediaFN($recent['id']))); + if (!empty($recent['media'])) { + $diff = (count(getRevisions($recent['id'], 0, 1, 8192, true)) && file_exists(mediaFN($recent['id']))); if ($diff) { $href = media_managerURL(array('tab_details' => 'history', 'mediado' => 'diff', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&'); @@ -715,7 +774,7 @@ function html_recent($first=0, $show_changes='both'){ $href = wl($recent['id'],"do=diff", false, '&'); } - if ($recent['media'] && !$diff) { + if (!empty($recent['media']) && !$diff) { $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />'); } else { $form->addElement(form_makeOpenTag('a', array('class' => 'diff_link', 'href' => $href))); @@ -729,7 +788,7 @@ function html_recent($first=0, $show_changes='both'){ $form->addElement(form_makeCloseTag('a')); } - if ($recent['media']) { + if (!empty($recent['media'])) { $href = media_managerURL(array('tab_details' => 'history', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&'); } else { @@ -745,7 +804,7 @@ function html_recent($first=0, $show_changes='both'){ ))); $form->addElement(form_makeCloseTag('a')); - if ($recent['media']) { + if (!empty($recent['media'])) { $href = media_managerURL(array('tab_details' => 'view', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&'); $class = (file_exists(mediaFN($recent['id']))) ? 'wikilink1' : $class = 'wikilink2'; $form->addElement(form_makeOpenTag('a', array('class' => $class, 'href' => $href))); @@ -810,6 +869,8 @@ function html_recent($first=0, $show_changes='both'){ * Display page index * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $ns */ function html_index($ns){ global $conf; @@ -838,6 +899,9 @@ function html_index($ns){ * User function for html_buildlist() * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $item + * @return string */ function html_list_index($item){ global $ID, $conf; @@ -868,10 +932,23 @@ function html_list_index($item){ * it gives different classes to opened or closed "folders" * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $item + * @return string html */ function html_li_index($item){ + global $INFO; + + $class = ''; + $id = ''; + if($item['type'] == "f"){ - return '<li class="level'.$item['level'].'">'; + // scroll to the current item + if($item['id'] == $INFO['id']) { + $id = ' id="scroll__here"'; + $class = ' bounce'; + } + return '<li class="level'.$item['level'].$class.'" '.$id.'>'; }elseif($item['open']){ return '<li class="open">'; }else{ @@ -883,6 +960,9 @@ function html_li_index($item){ * Default List item * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $item + * @return string html */ function html_li_default($item){ return '<li class="level'.$item['level'].'">'; @@ -902,6 +982,14 @@ function html_li_default($item){ * a member of an object. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $data array with item arrays + * @param string $class class of ul wrapper + * @param callable $func callback to print an list item + * @param callable $lifunc callback to the opening li tag + * @param bool $forcewrapper Trigger building a wrapper ul if the first level is + 0 (we have a root object) or 1 (just the root content) + * @return string html of an unordered list */ function html_buildlist($data,$class,$func,$lifunc='html_li_default',$forcewrapper=false){ if (count($data) === 0) { @@ -990,12 +1078,13 @@ function html_backlinks(){ /** * Get header of diff HTML + * * @param string $l_rev Left revisions * @param string $r_rev Right revision * @param string $id Page id, if null $ID is used * @param bool $media If it is for media files * @param bool $inline Return the header on a single line - * @return array HTML snippets for diff header + * @return string[] HTML snippets for diff header */ function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false) { global $lang; @@ -1008,10 +1097,15 @@ function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = fa $ml_or_wl = $media ? 'ml' : 'wl'; $l_minor = $r_minor = ''; + if($media) { + $changelog = new MediaChangeLog($id); + } else { + $changelog = new PageChangeLog($id); + } if(!$l_rev){ $l_head = '—'; }else{ - $l_info = getRevisionInfo($id,$l_rev,true, $media); + $l_info = $changelog->getRevisionInfo($l_rev); if($l_info['user']){ $l_user = '<bdi>'.editorinfo($l_info['user']).'</bdi>'; if(auth_ismanager()) $l_user .= ' <bdo dir="ltr">('.$l_info['ip'].')</bdo>'; @@ -1029,7 +1123,7 @@ function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = fa } if($r_rev){ - $r_info = getRevisionInfo($id,$r_rev,true, $media); + $r_info = $changelog->getRevisionInfo($r_rev); if($r_info['user']){ $r_user = '<bdi>'.editorinfo($r_info['user']).'</bdi>'; if(auth_ismanager()) $r_user .= ' <bdo dir="ltr">('.$r_info['ip'].')</bdo>'; @@ -1045,7 +1139,7 @@ function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = fa $r_head_title.'</a></bdi>'. $head_separator.$r_user.' '.$r_sum; }elseif($_rev = @filemtime($media_or_wikiFN($id))){ - $_info = getRevisionInfo($id,$_rev,true, $media); + $_info = $changelog->getRevisionInfo($_rev); if($_info['user']){ $_user = '<bdi>'.editorinfo($_info['user']).'</bdi>'; if(auth_ismanager()) $_user .= ' <bdo dir="ltr">('.$_info['ip'].')</bdo>'; @@ -1069,162 +1163,386 @@ function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = fa } /** - * show diff + * Show diff + * between current page version and provided $text + * or between the revisions provided via GET or POST * * @author Andreas Gohr <andi@splitbrain.org> - * @param string $text - compare with this text with most current version - * @param bool $intro - display the intro text - * @param string $type type of the diff (inline or sidebyside) + * @param string $text when non-empty: compare with this text with most current version + * @param bool $intro display the intro text + * @param string $type type of the diff (inline or sidebyside) */ -function html_diff($text='',$intro=true,$type=null){ +function html_diff($text = '', $intro = true, $type = null) { global $ID; global $REV; global $lang; global $INPUT; global $INFO; + $pagelog = new PageChangeLog($ID); + /* + * Determine diff type + */ if(!$type) { $type = $INPUT->str('difftype'); - if (empty($type)) { + if(empty($type)) { $type = get_doku_pref('difftype', $type); - if (empty($type) && $INFO['ismobile']) { + if(empty($type) && $INFO['ismobile']) { $type = 'inline'; } } } if($type != 'inline') $type = 'sidebyside'; + /* + * Determine requested revision(s) + */ // we're trying to be clever here, revisions to compare can be either // given as rev and rev2 parameters, with rev2 being optional. Or in an // array in rev2. $rev1 = $REV; $rev2 = $INPUT->ref('rev2'); - if(is_array($rev2)){ + if(is_array($rev2)) { $rev1 = (int) $rev2[0]; $rev2 = (int) $rev2[1]; - if(!$rev1){ + if(!$rev1) { $rev1 = $rev2; unset($rev2); } - }else{ + } else { $rev2 = $INPUT->int('rev2'); } + /* + * Determine left and right revision, its texts and the header + */ $r_minor = ''; $l_minor = ''; - if($text){ // compare text to the most current revision - $l_rev = ''; - $l_text = rawWiki($ID,''); - $l_head = '<a class="wikilink1" href="'.wl($ID).'">'. - $ID.' '.dformat((int) @filemtime(wikiFN($ID))).'</a> '. + if($text) { // compare text to the most current revision + $l_rev = ''; + $l_text = rawWiki($ID, ''); + $l_head = '<a class="wikilink1" href="' . wl($ID) . '">' . + $ID . ' ' . dformat((int) @filemtime(wikiFN($ID))) . '</a> ' . $lang['current']; - $r_rev = ''; - $r_text = cleanText($text); - $r_head = $lang['yours']; - }else{ - if($rev1 && isset($rev2) && $rev2){ // two specific revisions wanted + $r_rev = ''; + $r_text = cleanText($text); + $r_head = $lang['yours']; + } else { + if($rev1 && isset($rev2) && $rev2) { // two specific revisions wanted // make sure order is correct (older on the left) - if($rev1 < $rev2){ + if($rev1 < $rev2) { $l_rev = $rev1; $r_rev = $rev2; - }else{ + } else { $l_rev = $rev2; $r_rev = $rev1; } - }elseif($rev1){ // single revision given, compare to current + } elseif($rev1) { // single revision given, compare to current $r_rev = ''; $l_rev = $rev1; - }else{ // no revision was given, compare previous to current + } else { // no revision was given, compare previous to current $r_rev = ''; - $revs = getRevisions($ID, 0, 1); + $revs = $pagelog->getRevisions(0, 1); $l_rev = $revs[0]; $REV = $l_rev; // store revision back in $REV } // when both revisions are empty then the page was created just now - if(!$l_rev && !$r_rev){ + if(!$l_rev && !$r_rev) { $l_text = ''; - }else{ - $l_text = rawWiki($ID,$l_rev); + } else { + $l_text = rawWiki($ID, $l_rev); } - $r_text = rawWiki($ID,$r_rev); + $r_text = rawWiki($ID, $r_rev); list($l_head, $r_head, $l_minor, $r_minor) = html_diff_head($l_rev, $r_rev, null, false, $type == 'inline'); } - $df = new Diff(explode("\n",$l_text),explode("\n",$r_text)); + /* + * Build navigation + */ + $l_nav = ''; + $r_nav = ''; + if(!$text) { + list($l_nav, $r_nav) = html_diff_navigation($pagelog, $type, $l_rev, $r_rev); + } + /* + * Create diff object and the formatter + */ + $diff = new Diff(explode("\n", $l_text), explode("\n", $r_text)); - if($type == 'inline'){ - $tdf = new InlineDiffFormatter(); + if($type == 'inline') { + $diffformatter = new InlineDiffFormatter(); } else { - $tdf = new TableDiffFormatter(); + $diffformatter = new TableDiffFormatter(); } - + /* + * Display intro + */ if($intro) print p_locale_xhtml('diff'); - if (!$text) { - ptln('<div class="diffoptions">'); - - $form = new Doku_Form(array('action'=>wl())); - $form->addHidden('id',$ID); - $form->addHidden('rev2[0]',$l_rev); - $form->addHidden('rev2[1]',$r_rev); - $form->addHidden('do','diff'); - $form->addElement(form_makeListboxField( - 'difftype', - array( - 'sidebyside' => $lang['diff_side'], - 'inline' => $lang['diff_inline']), - $type, - $lang['diff_type'], - '','', - array('class'=>'quickselect'))); - $form->addElement(form_makeButton('submit', 'diff','Go')); + /* + * Display type and exact reference + */ + if(!$text) { + ptln('<div class="diffoptions group">'); + + + $form = new Doku_Form(array('action' => wl())); + $form->addHidden('id', $ID); + $form->addHidden('rev2[0]', $l_rev); + $form->addHidden('rev2[1]', $r_rev); + $form->addHidden('do', 'diff'); + $form->addElement( + form_makeListboxField( + 'difftype', + array( + 'sidebyside' => $lang['diff_side'], + 'inline' => $lang['diff_inline'] + ), + $type, + $lang['diff_type'], + '', '', + array('class' => 'quickselect') + ) + ); + $form->addElement(form_makeButton('submit', 'diff', 'Go')); $form->printForm(); - $diffurl = wl($ID, array( - 'do' => 'diff', - 'rev2[0]' => $l_rev, - 'rev2[1]' => $r_rev, - 'difftype' => $type, - )); - ptln('<p><a class="wikilink1" href="'.$diffurl.'">'.$lang['difflink'].'</a></p>'); - ptln('</div>'); + ptln('<p>'); + // link to exactly this view FS#2835 + echo html_diff_navigationlink($type, 'difflink', $l_rev, $r_rev ? $r_rev : $INFO['currentrev']); + ptln('</p>'); + + ptln('</div>'); // .diffoptions } + + /* + * Display diff view table + */ ?> <div class="table"> - <table class="diff diff_<?php echo $type?>"> - <?php if ($type == 'inline') { ?> - <tr> - <th class="diff-lineheader">-</th><th <?php echo $l_minor?>> - <?php echo $l_head?> - </th> - </tr> - <tr> - <th class="diff-lineheader">+</th><th <?php echo $r_minor?>> - <?php echo $r_head?> - </th> - </tr> - <?php } else { ?> - <tr> - <th colspan="2" <?php echo $l_minor?>> - <?php echo $l_head?> - </th> - <th colspan="2" <?php echo $r_minor?>> - <?php echo $r_head?> - </th> - </tr> - <?php } - echo html_insert_softbreaks($tdf->format($df)); ?> + <table class="diff diff_<?php echo $type ?>"> + + <?php + //navigation and header + if($type == 'inline') { + if(!$text) { ?> + <tr> + <td class="diff-lineheader">-</td> + <td class="diffnav"><?php echo $l_nav ?></td> + </tr> + <tr> + <th class="diff-lineheader">-</th> + <th <?php echo $l_minor ?>> + <?php echo $l_head ?> + </th> + </tr> + <?php } ?> + <tr> + <td class="diff-lineheader">+</td> + <td class="diffnav"><?php echo $r_nav ?></td> + </tr> + <tr> + <th class="diff-lineheader">+</th> + <th <?php echo $r_minor ?>> + <?php echo $r_head ?> + </th> + </tr> + <?php } else { + if(!$text) { ?> + <tr> + <td colspan="2" class="diffnav"><?php echo $l_nav ?></td> + <td colspan="2" class="diffnav"><?php echo $r_nav ?></td> + </tr> + <?php } ?> + <tr> + <th colspan="2" <?php echo $l_minor ?>> + <?php echo $l_head ?> + </th> + <th colspan="2" <?php echo $r_minor ?>> + <?php echo $r_head ?> + </th> + </tr> + <?php } + + //diff view + echo html_insert_softbreaks($diffformatter->format($diff)); ?> + </table> </div> - <?php +<?php +} + +/** + * Create html for revision navigation + * + * @param PageChangeLog $pagelog changelog object of current page + * @param string $type inline vs sidebyside + * @param int $l_rev left revision timestamp + * @param int $r_rev right revision timestamp + * @return string[] html of left and right navigation elements + */ +function html_diff_navigation($pagelog, $type, $l_rev, $r_rev) { + global $INFO, $ID; + + // last timestamp is not in changelog, retrieve timestamp from metadata + // note: when page is removed, the metadata timestamp is zero + $r_rev = $r_rev ? $r_rev : $INFO['meta']['last_change']['date']; + + //retrieve revisions with additional info + list($l_revs, $r_revs) = $pagelog->getRevisionsAround($l_rev, $r_rev); + $l_revisions = array(); + if(!$l_rev) { + $l_revisions[0] = array(0, "", false); //no left revision given, add dummy + } + foreach($l_revs as $rev) { + $info = $pagelog->getRevisionInfo($rev); + $l_revisions[$rev] = array( + $rev, + dformat($info['date']) . ' ' . editorinfo($info['user'], true) . ' ' . $info['sum'], + $r_rev ? $rev >= $r_rev : false //disable? + ); + } + $r_revisions = array(); + if(!$r_rev) { + $r_revisions[0] = array(0, "", false); //no right revision given, add dummy + } + foreach($r_revs as $rev) { + $info = $pagelog->getRevisionInfo($rev); + $r_revisions[$rev] = array( + $rev, + dformat($info['date']) . ' ' . editorinfo($info['user'], true) . ' ' . $info['sum'], + $rev <= $l_rev //disable? + ); + } + + //determine previous/next revisions + $l_index = array_search($l_rev, $l_revs); + $l_prev = $l_revs[$l_index + 1]; + $l_next = $l_revs[$l_index - 1]; + if($r_rev) { + $r_index = array_search($r_rev, $r_revs); + $r_prev = $r_revs[$r_index + 1]; + $r_next = $r_revs[$r_index - 1]; + } else { + //removed page + if($l_next) { + $r_prev = $r_revs[0]; + } else { + $r_prev = null; + } + $r_next = null; + } + + /* + * Left side: + */ + $l_nav = ''; + //move back + if($l_prev) { + $l_nav .= html_diff_navigationlink($type, 'diffbothprevrev', $l_prev, $r_prev); + $l_nav .= html_diff_navigationlink($type, 'diffprevrev', $l_prev, $r_rev); + } + //dropdown + $form = new Doku_Form(array('action' => wl())); + $form->addHidden('id', $ID); + $form->addHidden('difftype', $type); + $form->addHidden('rev2[1]', $r_rev); + $form->addHidden('do', 'diff'); + $form->addElement( + form_makeListboxField( + 'rev2[0]', + $l_revisions, + $l_rev, + '', '', '', + array('class' => 'quickselect') + ) + ); + $form->addElement(form_makeButton('submit', 'diff', 'Go')); + $l_nav .= $form->getForm(); + //move forward + if($l_next && ($l_next < $r_rev || !$r_rev)) { + $l_nav .= html_diff_navigationlink($type, 'diffnextrev', $l_next, $r_rev); + } + + /* + * Right side: + */ + $r_nav = ''; + //move back + if($l_rev < $r_prev) { + $r_nav .= html_diff_navigationlink($type, 'diffprevrev', $l_rev, $r_prev); + } + //dropdown + $form = new Doku_Form(array('action' => wl())); + $form->addHidden('id', $ID); + $form->addHidden('rev2[0]', $l_rev); + $form->addHidden('difftype', $type); + $form->addHidden('do', 'diff'); + $form->addElement( + form_makeListboxField( + 'rev2[1]', + $r_revisions, + $r_rev, + '', '', '', + array('class' => 'quickselect') + ) + ); + $form->addElement(form_makeButton('submit', 'diff', 'Go')); + $r_nav .= $form->getForm(); + //move forward + if($r_next) { + if($pagelog->isCurrentRevision($r_next)) { + $r_nav .= html_diff_navigationlink($type, 'difflastrev', $l_rev); //last revision is diff with current page + } else { + $r_nav .= html_diff_navigationlink($type, 'diffnextrev', $l_rev, $r_next); + } + $r_nav .= html_diff_navigationlink($type, 'diffbothnextrev', $l_next, $r_next); + } + return array($l_nav, $r_nav); +} + +/** + * Create html link to a diff defined by two revisions + * + * @param string $difftype display type + * @param string $linktype + * @param int $lrev oldest revision + * @param int $rrev newest revision or null for diff with current revision + * @return string html of link to a diff + */ +function html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null) { + global $ID, $lang; + if(!$rrev) { + $urlparam = array( + 'do' => 'diff', + 'rev' => $lrev, + 'difftype' => $difftype, + ); + } else { + $urlparam = array( + 'do' => 'diff', + 'rev2[0]' => $lrev, + 'rev2[1]' => $rrev, + 'difftype' => $difftype, + ); + } + return '<a class="' . $linktype . '" href="' . wl($ID, $urlparam) . '" title="' . $lang[$linktype] . '">' . + '<span>' . $lang[$linktype] . '</span>' . + '</a>' . "\n"; } +/** + * Insert soft breaks in diff html + * + * @param string $diffhtml + * @return string + */ function html_insert_softbreaks($diffhtml) { // search the diff html string for both: // - html tags, so these can be ignored @@ -1232,6 +1550,12 @@ function html_insert_softbreaks($diffhtml) { return preg_replace_callback('/<[^>]*>|[^<> ]{12,}/','html_softbreak_callback',$diffhtml); } +/** + * callback which adds softbreaks + * + * @param array $match array with first the complete match + * @return string the replacement + */ function html_softbreak_callback($match){ // if match is an html tag, return it intact if ($match[0]{0} == '<') return $match[0]; @@ -1255,6 +1579,9 @@ REGEX; * show warning on conflict detection * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $text + * @param string $summary */ function html_conflict($text,$summary){ global $ID; @@ -1343,7 +1670,7 @@ function html_updateprofile(){ global $conf; global $INPUT; global $INFO; - /** @var auth_basic $auth */ + /** @var DokuWiki_Auth_Plugin $auth */ global $auth; print p_locale_xhtml('updateprofile'); @@ -1415,7 +1742,6 @@ function html_edit(){ global $lang; global $conf; global $TEXT; - global $RANGE; if ($INPUT->has('changecheck')) { $check = $INPUT->str('changecheck'); @@ -1517,6 +1843,8 @@ function html_edit(){ * Display the default edit form * * Is the default action for HTML_EDIT_FORMSELECTION. + * + * @param mixed[] $param */ function html_edit_form($param) { global $TEXT; @@ -1535,6 +1863,8 @@ function html_edit_form($param) { * Adds a checkbox for minor edits for logged in users * * @author Andreas Gohr <andi@splitbrain.org> + * + * @return array|bool */ function html_minoredit(){ global $conf; @@ -1559,7 +1889,7 @@ function html_minoredit(){ function html_debug(){ global $conf; global $lang; - /** @var auth_basic $auth */ + /** @var DokuWiki_Auth_Plugin $auth */ global $auth; global $INFO; @@ -1634,6 +1964,18 @@ function html_debug(){ print_r($inis); print '</pre>'; + if (function_exists('apache_get_version')) { + $apache = array(); + $apache['version'] = apache_get_version(); + + if (function_exists('apache_get_modules')) { + $apache['modules'] = apache_get_modules(); + } + print '<b>Apache</b><pre>'; + print_r($apache); + print '</pre>'; + } + print '</body></html>'; } @@ -1698,12 +2040,12 @@ function html_admin(){ } unset($menu['acl']); - if($menu['plugin']){ + if($menu['extension']){ ptln(' <li class="admin_plugin"><div class="li">'. - '<a href="'.wl($ID, array('do' => 'admin','page' => 'plugin')).'">'. - $menu['plugin']['prompt'].'</a></div></li>'); + '<a href="'.wl($ID, array('do' => 'admin','page' => 'extension')).'">'. + $menu['extension']['prompt'].'</a></div></li>'); } - unset($menu['plugin']); + unset($menu['extension']); if($menu['config']){ ptln(' <li class="admin_config"><div class="li">'. @@ -1802,6 +2144,9 @@ function html_resendpwd() { * Return the TOC rendered to XHTML * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $toc + * @return string html */ function html_TOC($toc){ if(!count($toc)) return ''; @@ -1820,6 +2165,9 @@ function html_TOC($toc){ /** * Callback for html_buildlist + * + * @param array $item + * @return string html */ function html_list_toc($item){ if(isset($item['hid'])){ @@ -1854,6 +2202,7 @@ function html_mktocitem($link, $text, $level, $hash='#'){ * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT * * @author Tom N Harris <tnharris@whoopdedo.org> + * * @param string $name The name of the form * @param Doku_Form $form The form */ @@ -1866,6 +2215,7 @@ function html_form($name, &$form) { /** * Form print function. * Just calls printForm() on the data object. + * * @param Doku_Form $data The form */ function html_form_output($data) { diff --git a/inc/httputils.php b/inc/httputils.php index ca60ed509..ac79aa176 100644 --- a/inc/httputils.php +++ b/inc/httputils.php @@ -15,6 +15,7 @@ define('HTTP_CHUNK_SIZE',16*1024); * * @author Simon Willison <swillison@gmail.com> * @link http://simonwillison.net/2003/Apr/23/conditionalGet/ + * * @param int $timestamp lastmodified time of the cache file * @returns void or exits with previously header() commands executed */ @@ -64,12 +65,14 @@ function http_conditionalRequest($timestamp){ * Let the webserver send the given file via x-sendfile method * * @author Chris Smith <chris@jalakai.co.uk> - * @returns void or exits with previously header() commands executed + * + * @param string $file absolute path of file to send + * @returns void or exits with previous header() commands executed */ function http_sendfile($file) { global $conf; - //use x-sendfile header to pass the delivery to compatible webservers + //use x-sendfile header to pass the delivery to compatible web servers if($conf['xsendfile'] == 1){ header("X-LIGHTTPD-send-file: $file"); ob_end_clean(); @@ -79,12 +82,12 @@ function http_sendfile($file) { ob_end_clean(); exit; }elseif($conf['xsendfile'] == 3){ + // FS#2388 nginx just needs the relative path. + $file = DOKU_REL.substr($file, strlen(fullpath(DOKU_INC)) + 1); header("X-Accel-Redirect: $file"); ob_end_clean(); exit; } - - return false; } /** @@ -92,7 +95,7 @@ function http_sendfile($file) { * * This function exits the running script * - * @param ressource $fh - file handle for an already open file + * @param resource $fh - file handle for an already open file * @param int $size - size of the whole file * @param int $mime - MIME type of the file * @@ -189,6 +192,9 @@ function http_rangeRequest($fh,$size,$mime){ * (samepath/samefilename.sameext.gz) created after the uncompressed file * * @author Chris Smith <chris.eureka@jalakai.co.uk> + * + * @param string $uncompressed_file + * @return bool */ function http_gzip_valid($uncompressed_file) { $gzip = $uncompressed_file.'.gz'; @@ -204,7 +210,10 @@ function http_gzip_valid($uncompressed_file) { * * This function handles output of cacheable resource files. It ses the needed * HTTP headers. If a useable cache is present, it is passed to the web server - * and the scrpt is terminated. + * and the script is terminated. + * + * @param string $cache cache file name + * @param bool $cache_ok if cache can be used */ function http_cached($cache, $cache_ok) { global $conf; @@ -223,7 +232,8 @@ function http_cached($cache, $cache_ok) { header('Content-Encoding: gzip'); readfile($cache.".gz"); } else { - if (!http_sendfile($cache)) readfile($cache); + http_sendfile($cache); + readfile($cache); } exit; } @@ -233,6 +243,9 @@ function http_cached($cache, $cache_ok) { /** * Cache content and print it + * + * @param string $file file name + * @param string $content */ function http_cached_finish($file, $content) { global $conf; diff --git a/inc/indexer.php b/inc/indexer.php index 658fb966b..a86bfc656 100644 --- a/inc/indexer.php +++ b/inc/indexer.php @@ -10,7 +10,7 @@ if(!defined('DOKU_INC')) die('meh.'); // Version tag used to force rebuild on upgrade -define('INDEXER_VERSION', 7); +define('INDEXER_VERSION', 8); // set the minimum token length to use in the index (note, this doesn't apply to numeric tokens) if (!defined('IDX_MINWORDLENGTH')) define('IDX_MINWORDLENGTH',2); @@ -61,6 +61,8 @@ define('IDX_ASIAN', '(?:'.IDX_ASIAN1.'|'.IDX_ASIAN2.'|'.IDX_ASIAN3.')'); * * @author Tom N Harris <tnharris@whoopdedo.org> * @author Michael Hamann <michael@content-space.de> + * + * @return int|string */ function idx_get_version(){ static $indexer_version = null; @@ -84,6 +86,9 @@ function idx_get_version(){ * Differs from strlen in handling of asian characters. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param string $w + * @return int */ function wordlen($w){ $l = strlen($w); @@ -115,7 +120,8 @@ class Doku_Indexer { * * @param string $page a page name * @param string $text the body of the page - * @return boolean the function completed successfully + * @return string|boolean the function completed successfully + * * @author Tom N Harris <tnharris@whoopdedo.org> * @author Andreas Gohr <andi@splitbrain.org> */ @@ -190,6 +196,7 @@ class Doku_Indexer { * * @param string $text content of the page * @return array list of word IDs and number of times used + * * @author Andreas Gohr <andi@splitbrain.org> * @author Christopher Smith <chris@jalakai.co.uk> * @author Tom N Harris <tnharris@whoopdedo.org> @@ -215,6 +222,7 @@ class Doku_Indexer { foreach (array_keys($words) as $wlen) { $word_idx = $this->getIndex('w', $wlen); foreach ($words[$wlen] as $word => $freq) { + $word = (string)$word; $wid = array_search($word, $word_idx, true); if ($wid === false) { $wid = count($word_idx); @@ -244,7 +252,8 @@ class Doku_Indexer { * @param string $page a page name * @param mixed $key a key string or array of key=>value pairs * @param mixed $value the value or list of values - * @return boolean the function completed successfully + * @return boolean|string the function completed successfully + * * @author Tom N Harris <tnharris@whoopdedo.org> * @author Michael Hamann <michael@content-space.de> */ @@ -269,8 +278,9 @@ class Doku_Indexer { // Special handling for titles so the index file is simpler if (array_key_exists('title', $key)) { $value = $key['title']; - if (is_array($value)) + if (is_array($value)) { $value = $value[0]; + } $this->saveIndexKey('title', '', $pid, $value); unset($key['title']); } @@ -298,20 +308,24 @@ class Doku_Indexer { if ($val !== "") { $id = array_search($val, $metawords, true); if ($id === false) { + // didn't find $val, so we'll add it to the end of metawords and create a placeholder in metaidx $id = count($metawords); $metawords[$id] = $val; + $metaidx[$id] = ''; $addwords = true; } // test if value is already in the index - if (isset($val_idx[$id]) && $val_idx[$id] <= 0) + if (isset($val_idx[$id]) && $val_idx[$id] <= 0){ $val_idx[$id] = 0; - else // else add it + } else { // else add it $val_idx[$id] = 1; + } } } - if ($addwords) + if ($addwords) { $this->saveIndex($metaname.'_w', '', $metawords); + } $vals_changed = false; foreach ($val_idx as $id => $action) { if ($action == -1) { @@ -447,7 +461,8 @@ class Doku_Indexer { * Erases entries in all known indexes. * * @param string $page a page name - * @return boolean the function completed successfully + * @return string|boolean the function completed successfully + * * @author Tom N Harris <tnharris@whoopdedo.org> */ public function deletePage($page) { @@ -468,6 +483,7 @@ class Doku_Indexer { * * @param string $page a page name * @return boolean the function completed successfully + * * @author Tom N Harris <tnharris@whoopdedo.org> */ protected function deletePageNoLock($page) { @@ -562,6 +578,7 @@ class Doku_Indexer { * @param string $text plain text * @param boolean $wc are wildcards allowed? * @return array list of words in the text + * * @author Tom N Harris <tnharris@whoopdedo.org> * @author Andreas Gohr <andi@splitbrain.org> */ @@ -670,6 +687,7 @@ class Doku_Indexer { * * @param array $tokens list of words to search for * @return array list of page names with usage counts + * * @author Tom N Harris <tnharris@whoopdedo.org> * @author Andreas Gohr <andi@splitbrain.org> */ @@ -724,6 +742,7 @@ class Doku_Indexer { * @param string $value search term to look for, must be a string or array of strings * @param callback $func comparison function * @return array lists with page names, keys are query values if $value is array + * * @author Tom N Harris <tnharris@whoopdedo.org> * @author Michael Hamann <michael@content-space.de> */ @@ -823,6 +842,7 @@ class Doku_Indexer { * @param array $words The query terms. * @param array $result Set to word => array("length*id" ...) * @return array Set to length => array(id ...) + * * @author Tom N Harris <tnharris@whoopdedo.org> */ protected function getIndexWords(&$words, &$result) { @@ -903,6 +923,7 @@ class Doku_Indexer { * * @param string $key list only pages containing the metadata key (optional) * @return array list of page names + * * @author Tom N Harris <tnharris@whoopdedo.org> */ public function getPages($key=null) { @@ -936,6 +957,7 @@ class Doku_Indexer { * @param int $minlen minimum length of words to count * @param string $key metadata key to list. Uses the fulltext index if not given * @return array list of words as the keys and frequency as values + * * @author Tom N Harris <tnharris@whoopdedo.org> */ public function histogram($min=1, $max=0, $minlen=3, $key=null) { @@ -996,6 +1018,8 @@ class Doku_Indexer { * Lock the indexer. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @return bool|string */ protected function lock() { global $conf; @@ -1027,6 +1051,8 @@ class Doku_Indexer { * Release the indexer lock. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @return bool */ protected function unlock() { global $conf; @@ -1044,12 +1070,13 @@ class Doku_Indexer { * @param string $idx name of the index * @param string $suffix subpart identifier * @return array list of lines without CR or LF + * * @author Tom N Harris <tnharris@whoopdedo.org> */ protected function getIndex($idx, $suffix) { global $conf; $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx'; - if (!@file_exists($fn)) return array(); + if (!file_exists($fn)) return array(); return file($fn, FILE_IGNORE_NEW_LINES); } @@ -1060,6 +1087,7 @@ class Doku_Indexer { * @param string $suffix subpart identifier * @param array $lines list of lines without LF * @return bool If saving succeeded + * * @author Tom N Harris <tnharris@whoopdedo.org> */ protected function saveIndex($idx, $suffix, &$lines) { @@ -1084,12 +1112,13 @@ class Doku_Indexer { * @param string $suffix subpart identifier * @param int $id the line number * @return string a line with trailing whitespace removed + * * @author Tom N Harris <tnharris@whoopdedo.org> */ protected function getIndexKey($idx, $suffix, $id) { global $conf; $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx'; - if (!@file_exists($fn)) return ''; + if (!file_exists($fn)) return ''; $fh = @fopen($fn, 'r'); if (!$fh) return ''; $ln = -1; @@ -1108,6 +1137,7 @@ class Doku_Indexer { * @param int $id the line number * @param string $line line to write * @return bool If saving succeeded + * * @author Tom N Harris <tnharris@whoopdedo.org> */ protected function saveIndexKey($idx, $suffix, $id, $line) { @@ -1149,6 +1179,7 @@ class Doku_Indexer { * @param string $suffix subpart identifier * @param string $value line to find in the index * @return int|bool line number of the value in the index or false if writing the index failed + * * @author Tom N Harris <tnharris@whoopdedo.org> */ protected function addIndexKey($idx, $suffix, $value) { @@ -1172,6 +1203,8 @@ class Doku_Indexer { * a sorted array of lengths of the words used in the wiki. * * @author YoBoY <yoboy.leguesh@gmail.com> + * + * @return array */ protected function listIndexLengths() { return idx_listIndexLengths(); @@ -1184,6 +1217,9 @@ class Doku_Indexer { * that there are indices for. * * @author YoBoY <yoboy.leguesh@gmail.com> + * + * @param array|int $filter + * @return array */ protected function indexLengths($filter) { global $conf; @@ -1192,7 +1228,7 @@ class Doku_Indexer { // testing if index files exist only $path = $conf['indexdir']."/i"; foreach ($filter as $key => $value) { - if (@file_exists($path.$key.'.idx')) + if (file_exists($path.$key.'.idx')) $idx[] = $key; } } else { @@ -1210,19 +1246,25 @@ class Doku_Indexer { * Insert or replace a tuple in a line. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param string $line + * @param string|int $id + * @param int $count + * @return string */ protected function updateTuple($line, $id, $count) { - $newLine = $line; - if ($newLine !== '') - $newLine = preg_replace('/(^|:)'.preg_quote($id,'/').'\*\d*/', '', $newLine); - $newLine = trim($newLine, ':'); + if ($line != ''){ + $line = preg_replace('/(^|:)'.preg_quote($id,'/').'\*\d*/', '', $line); + } + $line = trim($line, ':'); if ($count) { - if (strlen($newLine) > 0) - return "$id*$count:".$newLine; - else - return "$id*$count".$newLine; + if ($line) { + return "$id*$count:".$line; + } else { + return "$id*$count"; + } } - return $newLine; + return $line; } /** @@ -1230,6 +1272,10 @@ class Doku_Indexer { * * @author Tom N Harris <tnharris@whoopdedo.org> * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $keys + * @param string $line + * @return array */ protected function parseTuples(&$keys, $line) { $result = array(); @@ -1250,13 +1296,16 @@ class Doku_Indexer { * Sum the counts in a list of tuples. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param string $line + * @return int */ protected function countTuples($line) { $freq = 0; $parts = explode(':', $line); foreach ($parts as $tuple) { if ($tuple === '') continue; - list($pid, $cnt) = explode('*', $tuple); + list(/* $pid */, $cnt) = explode('*', $tuple); $freq += (int)$cnt; } return $freq; @@ -1266,7 +1315,8 @@ class Doku_Indexer { /** * Create an instance of the indexer. * - * @return Doku_Indexer a Doku_Indexer + * @return Doku_Indexer a Doku_Indexer + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function idx_get_indexer() { @@ -1281,6 +1331,7 @@ function idx_get_indexer() { * Returns words that will be ignored. * * @return array list of stop words + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function & idx_get_stopwords() { @@ -1288,7 +1339,7 @@ function & idx_get_stopwords() { if (is_null($stopwords)) { global $conf; $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt'; - if(@file_exists($swfile)){ + if(file_exists($swfile)){ $stopwords = file($swfile, FILE_IGNORE_NEW_LINES); }else{ $stopwords = array(); @@ -1305,14 +1356,15 @@ function & idx_get_stopwords() { * @param string $page name of the page to index * @param boolean $verbose print status messages * @param boolean $force force reindexing even when the index is up to date - * @return boolean the function completed successfully + * @return string|boolean the function completed successfully + * * @author Tom N Harris <tnharris@whoopdedo.org> */ function idx_addPage($page, $verbose=false, $force=false) { $idxtag = metaFN($page,'.indexed'); // check if page was deleted but is still in the index if (!page_exists($page)) { - if (!@file_exists($idxtag)) { + if (!file_exists($idxtag)) { if ($verbose) print("Indexer: $page does not exist, ignoring".DOKU_LF); return false; } @@ -1327,7 +1379,7 @@ function idx_addPage($page, $verbose=false, $force=false) { } // check if indexing needed - if(!$force && @file_exists($idxtag)){ + if(!$force && file_exists($idxtag)){ if(trim(io_readFile($idxtag)) == idx_get_version()){ $last = @filemtime($idxtag); if($last > @filemtime(wikiFN($page))){ @@ -1340,7 +1392,7 @@ function idx_addPage($page, $verbose=false, $force=false) { $indexenabled = p_get_metadata($page, 'internal index', METADATA_RENDER_UNLIMITED); if ($indexenabled === false) { $result = false; - if (@file_exists($idxtag)) { + if (file_exists($idxtag)) { $Indexer = idx_get_indexer(); $result = $Indexer->deletePage($page); if ($result === "locked") { @@ -1434,11 +1486,15 @@ function idx_tokenizer($string, $wc=false) { * Read the list of words in an index (if it exists). * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param string $idx + * @param string $suffix + * @return array */ function idx_getIndex($idx, $suffix) { global $conf; $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx'; - if (!@file_exists($fn)) return array(); + if (!file_exists($fn)) return array(); return file($fn); } @@ -1449,6 +1505,8 @@ function idx_getIndex($idx, $suffix) { * a sorted array of lengths of the words used in the wiki. * * @author YoBoY <yoboy.leguesh@gmail.com> + * + * @return array */ function idx_listIndexLengths() { global $conf; @@ -1457,7 +1515,7 @@ function idx_listIndexLengths() { $docache = false; } else { clearstatcache(); - if (@file_exists($conf['indexdir'].'/lengths.idx') + if (file_exists($conf['indexdir'].'/lengths.idx') && (time() < @filemtime($conf['indexdir'].'/lengths.idx') + $conf['readdircache'])) { if (($lengths = @file($conf['indexdir'].'/lengths.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)) !== false) { $idx = array(); @@ -1503,6 +1561,9 @@ function idx_listIndexLengths() { * that there are indices for. * * @author YoBoY <yoboy.leguesh@gmail.com> + * + * @param array|int $filter + * @return array */ function idx_indexLengths($filter) { global $conf; @@ -1511,7 +1572,7 @@ function idx_indexLengths($filter) { // testing if index files exist only $path = $conf['indexdir']."/i"; foreach ($filter as $key => $value) { - if (@file_exists($path.$key.'.idx')) + if (file_exists($path.$key.'.idx')) $idx[] = $key; } } else { @@ -1532,6 +1593,9 @@ function idx_indexLengths($filter) { * not a letter, number, or underscore. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param string $name + * @return string */ function idx_cleanName($name) { $name = utf8_romanize(trim((string)$name)); diff --git a/inc/infoutils.php b/inc/infoutils.php index 7358955a0..fe312d13f 100644 --- a/inc/infoutils.php +++ b/inc/infoutils.php @@ -20,22 +20,28 @@ function checkUpdateMessages(){ if(!$conf['updatecheck']) return; if($conf['useacl'] && !$INFO['ismanager']) return; - $cf = $conf['cachedir'].'/messages.txt'; + $cf = getCacheName($updateVersion, '.updmsg'); $lm = @filemtime($cf); // check if new messages needs to be fetched if($lm < time()-(60*60*24) || $lm < @filemtime(DOKU_INC.DOKU_SCRIPT)){ @touch($cf); - dbglog("checkUpdateMessages(): downloading messages.txt"); + dbglog("checkUpdateMessages(): downloading messages to ".$cf); $http = new DokuHTTPClient(); $http->timeout = 12; - $data = $http->get(DOKU_MESSAGEURL.$updateVersion); - io_saveFile($cf,$data); + $resp = $http->get(DOKU_MESSAGEURL.$updateVersion); + if(is_string($resp) && ($resp == "" || substr(trim($resp), -1) == '%')) { + // basic sanity check that this is either an empty string response (ie "no messages") + // or it looks like one of our messages, not WiFi login or other interposed response + io_saveFile($cf,$resp); + } else { + dbglog("checkUpdateMessages(): unexpected HTTP response received"); + } }else{ - dbglog("checkUpdateMessages(): messages.txt up to date"); - $data = io_readFile($cf); + dbglog("checkUpdateMessages(): messages up to date"); } + $data = io_readFile($cf); // show messages through the usual message mechanism $msgs = explode("\n%\n",$data); foreach($msgs as $msg){ @@ -52,7 +58,7 @@ function checkUpdateMessages(){ function getVersionData(){ $version = array(); //import version string - if(@file_exists(DOKU_INC.'VERSION')){ + if(file_exists(DOKU_INC.'VERSION')){ //official release $version['date'] = trim(io_readfile(DOKU_INC.'VERSION')); $version['type'] = 'Release'; @@ -102,15 +108,21 @@ function getVersion(){ function check(){ global $conf; global $INFO; + /* @var Input $INPUT */ + global $INPUT; if ($INFO['isadmin'] || $INFO['ismanager']){ msg('DokuWiki version: '.getVersion(),1); - } - if(version_compare(phpversion(),'5.2.0','<')){ - msg('Your PHP version is too old ('.phpversion().' vs. 5.2.0+ needed)',-1); - }else{ - msg('PHP version '.phpversion(),1); + if(version_compare(phpversion(),'5.3.3','<')){ + msg('Your PHP version is too old ('.phpversion().' vs. 5.3.3+ needed)',-1); + }else{ + msg('PHP version '.phpversion(),1); + } + } else { + if(version_compare(phpversion(),'5.3.3','<')){ + msg('Your PHP version is too old',-1); + } } $mem = (int) php_to_byte(ini_get('memory_limit')); @@ -129,20 +141,20 @@ function check(){ if(is_writable($conf['changelog'])){ msg('Changelog is writable',1); }else{ - if (@file_exists($conf['changelog'])) { + if (file_exists($conf['changelog'])) { msg('Changelog is not writable',-1); } } - if (isset($conf['changelog_old']) && @file_exists($conf['changelog_old'])) { + if (isset($conf['changelog_old']) && file_exists($conf['changelog_old'])) { msg('Old changelog exists', 0); } - if (@file_exists($conf['changelog'].'_failed')) { + if (file_exists($conf['changelog'].'_failed')) { msg('Importing old changelog failed', -1); - } else if (@file_exists($conf['changelog'].'_importing')) { + } else if (file_exists($conf['changelog'].'_importing')) { msg('Importing old changelog now.', 0); - } else if (@file_exists($conf['changelog'].'_import_ok')) { + } else if (file_exists($conf['changelog'].'_import_ok')) { msg('Old changelog imported', 1); if (!plugin_isdisabled('importoldchangelog')) { msg('Importoldchangelog plugin not disabled after import', -1); @@ -200,7 +212,7 @@ function check(){ } if($INFO['userinfo']['name']){ - msg('You are currently logged in as '.$_SERVER['REMOTE_USER'].' ('.$INFO['userinfo']['name'].')',0); + msg('You are currently logged in as '.$INPUT->server->str('REMOTE_USER').' ('.$INFO['userinfo']['name'].')',0); msg('You are part of the groups '.join($INFO['userinfo']['grps'],', '),0); }else{ msg('You are currently not logged in',0); @@ -274,8 +286,18 @@ define('MSG_USERS_ONLY', 1); define('MSG_MANAGERS_ONLY',2); define('MSG_ADMINS_ONLY',4); +/** + * Display a message to the user + * + * @param string $message + * @param int $lvl -1 = error, 0 = info, 1 = success, 2 = notify + * @param string $line line number + * @param string $file file number + * @param int $allow who's allowed to see the message, see MSG_* constants + */ function msg($message,$lvl=0,$line='',$file='',$allow=MSG_PUBLIC){ global $MSG, $MSG_shown; + $errors = array(); $errors[-1] = 'error'; $errors[0] = 'info'; $errors[1] = 'success'; @@ -303,6 +325,7 @@ function msg($message,$lvl=0,$line='',$file='',$allow=MSG_PUBLIC){ * lvl => int, level of the message (see msg() function) * allow => int, flag used to determine who is allowed to see the message * see MSG_* constants + * @return bool */ function info_msg_allowed($msg){ global $INFO, $auth; @@ -357,6 +380,9 @@ function dbg($msg,$hidden=false){ */ function dbglog($msg,$header=''){ global $conf; + /* @var Input $INPUT */ + global $INPUT; + // The debug log isn't automatically cleaned thus only write it when // debugging has been enabled by the user. if($conf['allowdebug'] !== 1) return; @@ -369,12 +395,38 @@ function dbglog($msg,$header=''){ $file = $conf['cachedir'].'/debug.log'; $fh = fopen($file,'a'); if($fh){ - fwrite($fh,date('H:i:s ').$_SERVER['REMOTE_ADDR'].': '.$msg."\n"); + fwrite($fh,date('H:i:s ').$INPUT->server->str('REMOTE_ADDR').': '.$msg."\n"); fclose($fh); } } /** + * Log accesses to deprecated fucntions to the debug log + * + * @param string $alternative The function or method that should be used instead + */ +function dbg_deprecated($alternative = '') { + global $conf; + if(!$conf['allowdebug']) return; + + $backtrace = debug_backtrace(); + array_shift($backtrace); + $self = array_shift($backtrace); + $call = array_shift($backtrace); + + $called = trim($self['class'].'::'.$self['function'].'()', ':'); + $caller = trim($call['class'].'::'.$call['function'].'()', ':'); + + $msg = $called.' is deprecated. It was called from '; + $msg .= $caller.' in '.$call['file'].':'.$call['line']; + if($alternative) { + $msg .= ' '.$alternative.' should be used instead!'; + } + + dbglog($msg); +} + +/** * Print a reversed, prettyprinted backtrace * * @author Gary Owen <gary_owen@bigfoot.com> @@ -402,7 +454,7 @@ function dbg_backtrace(){ }elseif(is_array($arg)){ $params[] = '[Array]'; }elseif(is_null($arg)){ - $param[] = '[NULL]'; + $params[] = '[NULL]'; }else{ $params[] = (string) '"'.$arg.'"'; } diff --git a/inc/init.php b/inc/init.php index a937b934d..bc9ab6d70 100644 --- a/inc/init.php +++ b/inc/init.php @@ -16,7 +16,7 @@ $config_cascade = array(); // if available load a preload config file $preload = fullpath(dirname(__FILE__)).'/preload.php'; -if (@file_exists($preload)) include($preload); +if (file_exists($preload)) include($preload); // define the include path if(!defined('DOKU_INC')) define('DOKU_INC',fullpath(dirname(__FILE__).'/../').'/'); @@ -28,7 +28,7 @@ if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); if(!defined('DOKU_CONF')) define('DOKU_CONF',DOKU_INC.'conf/'); // check for error reporting override or set error reporting to sane values -if (!defined('DOKU_E_LEVEL') && @file_exists(DOKU_CONF.'report_e_all')) { +if (!defined('DOKU_E_LEVEL') && file_exists(DOKU_CONF.'report_e_all')) { define('DOKU_E_LEVEL', E_ALL); } if (!defined('DOKU_E_LEVEL')) { @@ -65,7 +65,7 @@ $conf = array(); foreach (array('default','local','protected') as $config_group) { if (empty($config_cascade['main'][$config_group])) continue; foreach ($config_cascade['main'][$config_group] as $config_file) { - if (@file_exists($config_file)) { + if (file_exists($config_file)) { include($config_file); } } @@ -79,7 +79,7 @@ $license = array(); foreach (array('default','local') as $config_group) { if (empty($config_cascade['license'][$config_group])) continue; foreach ($config_cascade['license'][$config_group] as $config_file) { - if(@file_exists($config_file)){ + if(file_exists($config_file)){ include($config_file); } } @@ -140,18 +140,21 @@ if ($conf['gzip_output'] && } // init session -if (!headers_sent() && !defined('NOSESSION')){ - session_name("DokuWiki"); - $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir']; - if (version_compare(PHP_VERSION, '5.2.0', '>')) { - session_set_cookie_params(0,$cookieDir,'',($conf['securecookie'] && is_ssl()),true); - }else{ - session_set_cookie_params(0,$cookieDir,'',($conf['securecookie'] && is_ssl())); +if(!headers_sent() && !defined('NOSESSION')) { + if(!defined('DOKU_SESSION_NAME')) define ('DOKU_SESSION_NAME', "DokuWiki"); + if(!defined('DOKU_SESSION_LIFETIME')) define ('DOKU_SESSION_LIFETIME', 0); + if(!defined('DOKU_SESSION_PATH')) { + $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir']; + define ('DOKU_SESSION_PATH', $cookieDir); } + if(!defined('DOKU_SESSION_DOMAIN')) define ('DOKU_SESSION_DOMAIN', ''); + + session_name(DOKU_SESSION_NAME); + session_set_cookie_params(DOKU_SESSION_LIFETIME, DOKU_SESSION_PATH, DOKU_SESSION_DOMAIN, ($conf['securecookie'] && is_ssl()), true); session_start(); // load left over messages - if(isset($_SESSION[DOKU_COOKIE]['msg'])){ + if(isset($_SESSION[DOKU_COOKIE]['msg'])) { $MSG = $_SESSION[DOKU_COOKIE]['msg']; unset($_SESSION[DOKU_COOKIE]['msg']); } @@ -173,20 +176,7 @@ if(function_exists('set_magic_quotes_runtime')) @set_magic_quotes_runtime(0); $_REQUEST = array_merge($_GET,$_POST); // we don't want a purge URL to be digged -if(isset($_REQUEST['purge']) && $_SERVER['HTTP_REFERER']) unset($_REQUEST['purge']); - -// disable gzip if not available -if($conf['compression'] == 'bz2' && !function_exists('bzopen')){ - $conf['compression'] = 'gz'; -} -if($conf['compression'] == 'gz' && !function_exists('gzopen')){ - $conf['compression'] = 0; -} - -// fix dateformat for upgraders -if(strpos($conf['dformat'],'%') === false){ - $conf['dformat'] = '%Y/%m/%d %H:%M'; -} +if(isset($_REQUEST['purge']) && !empty($_SERVER['HTTP_REFERER'])) unset($_REQUEST['purge']); // precalculate file creation modes init_creationmodes(); @@ -203,6 +193,14 @@ if (empty($plugin_controller_class)) $plugin_controller_class = 'Doku_Plugin_Con // load libraries require_once(DOKU_INC.'inc/load.php'); +// disable gzip if not available +if($conf['compression'] == 'bz2' && !function_exists('bzopen')){ + $conf['compression'] = 'gz'; +} +if($conf['compression'] == 'gz' && !function_exists('gzopen')){ + $conf['compression'] = 0; +} + // input handle class global $INPUT; $INPUT = new Input(); @@ -261,17 +259,33 @@ function init_paths(){ $conf['media_changelog'] = $conf['metadir'].'/_media.changes'; } +/** + * Load the language strings + * + * @param string $langCode language code, as passed by event handler + */ function init_lang($langCode) { //prepare language array - global $lang; + global $lang, $config_cascade; $lang = array(); //load the language files require(DOKU_INC.'inc/lang/en/lang.php'); + foreach ($config_cascade['lang']['core'] as $config_file) { + if (file_exists($config_file . 'en/lang.php')) { + include($config_file . 'en/lang.php'); + } + } + if ($langCode && $langCode != 'en') { if (file_exists(DOKU_INC."inc/lang/$langCode/lang.php")) { require(DOKU_INC."inc/lang/$langCode/lang.php"); } + foreach ($config_cascade['lang']['core'] as $config_file) { + if (file_exists($config_file . "$langCode/lang.php")) { + include($config_file . "$langCode/lang.php"); + } + } } } @@ -284,7 +298,7 @@ function init_files(){ $files = array($conf['indexdir'].'/page.idx'); foreach($files as $file){ - if(!@file_exists($file)){ + if(!file_exists($file)){ $fh = @fopen($file,'a'); if($fh){ fclose($fh); @@ -298,7 +312,7 @@ function init_files(){ # create title index (needs to have same length as page.idx) /* $file = $conf['indexdir'].'/title.idx'; - if(!@file_exists($file)){ + if(!file_exists($file)){ $pages = file($conf['indexdir'].'/page.idx'); $pages = count($pages); $fh = @fopen($file,'a'); @@ -325,9 +339,9 @@ function init_files(){ function init_path($path){ // check existence $p = fullpath($path); - if(!@file_exists($p)){ + if(!file_exists($p)){ $p = fullpath(DOKU_INC.$path); - if(!@file_exists($p)){ + if(!file_exists($p)){ return ''; } } @@ -338,7 +352,7 @@ function init_path($path){ } // check accessability (execute bit) for directories - if(@is_dir($p) && !@file_exists("$p/.")){ + if(@is_dir($p) && !file_exists("$p/.")){ return ''; } @@ -404,6 +418,10 @@ function remove_magic_quotes(&$array) { * Returns the full absolute URL to the directory where * DokuWiki is installed in (includes a trailing slash) * + * !! Can not access $_SERVER values through $INPUT + * !! here as this function is called before $INPUT is + * !! initialized. + * * @author Andreas Gohr <andi@splitbrain.org> */ function getBaseURL($abs=null){ @@ -411,7 +429,7 @@ function getBaseURL($abs=null){ //if canonical url enabled always return absolute if(is_null($abs)) $abs = $conf['canonical']; - if($conf['basedir']){ + if(!empty($conf['basedir'])){ $dir = $conf['basedir']; }elseif(substr($_SERVER['SCRIPT_NAME'],-4) == '.php'){ $dir = dirname($_SERVER['SCRIPT_NAME']); @@ -438,26 +456,22 @@ function getBaseURL($abs=null){ if(!$abs) return $dir; //use config option if available, trim any slash from end of baseurl to avoid multiple consecutive slashes in the path - if($conf['baseurl']) return rtrim($conf['baseurl'],'/').$dir; + if(!empty($conf['baseurl'])) return rtrim($conf['baseurl'],'/').$dir; //split hostheader into host and port if(isset($_SERVER['HTTP_HOST'])){ $parsed_host = parse_url('http://'.$_SERVER['HTTP_HOST']); - $host = $parsed_host['host']; - $port = $parsed_host['port']; + $host = isset($parsed_host['host']) ? $parsed_host['host'] : null; + $port = isset($parsed_host['port']) ? $parsed_host['port'] : null; }elseif(isset($_SERVER['SERVER_NAME'])){ $parsed_host = parse_url('http://'.$_SERVER['SERVER_NAME']); - $host = $parsed_host['host']; - $port = $parsed_host['port']; + $host = isset($parsed_host['host']) ? $parsed_host['host'] : null; + $port = isset($parsed_host['port']) ? $parsed_host['port'] : null; }else{ $host = php_uname('n'); $port = ''; } - if(!$port && isset($_SERVER['SERVER_PORT'])) { - $port = $_SERVER['SERVER_PORT']; - } - if(is_null($port)){ $port = ''; } @@ -488,6 +502,14 @@ function getBaseURL($abs=null){ * @returns bool true when SSL is active */ function is_ssl(){ + // check if we are behind a reverse proxy + if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) { + if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') { + return true; + } else { + return false; + } + } if (!isset($_SERVER['HTTPS']) || preg_match('/^(|off|false|disabled)$/i',$_SERVER['HTTPS'])){ return false; @@ -513,7 +535,7 @@ function nice_die($msg){ </body> </html> EOT; - exit; + exit(1); } /** @@ -571,7 +593,7 @@ function fullpath($path,$exists=false){ $finalpath = $root.implode('/', $newpath); // check for existence when needed (except when unit testing) - if($exists && !defined('DOKU_UNITTEST') && !@file_exists($finalpath)) { + if($exists && !defined('DOKU_UNITTEST') && !file_exists($finalpath)) { return false; } return $finalpath; diff --git a/inc/io.php b/inc/io.php index eff0279ac..3ed227162 100644 --- a/inc/io.php +++ b/inc/io.php @@ -20,6 +20,7 @@ if(!defined('DOKU_INC')) die('meh.'); * @param string $id - a pageid, the namespace of that id will be tried to deleted * @param string $basedir - the config name of the type to delete (datadir or mediadir usally) * @return bool - true if at least one namespace was deleted + * * @author Andreas Gohr <andi@splitbrain.org> * @author Ben Coburn <btcoburn@silicodon.net> */ @@ -60,6 +61,11 @@ function io_sweepNS($id,$basedir='datadir'){ * $data[3] rev: The page revision, false for current wiki pages. * * @author Ben Coburn <btcoburn@silicodon.net> + * + * @param string $file filename + * @param string $id page id + * @param bool|int $rev revision timestamp + * @return string */ function io_readWikiPage($file, $id, $rev=false) { if (empty($rev)) { $rev = false; } @@ -69,7 +75,11 @@ function io_readWikiPage($file, $id, $rev=false) { /** * Callback adapter for io_readFile(). + * * @author Ben Coburn <btcoburn@silicodon.net> + * + * @param array $data event data + * @return string */ function _io_readWikiPage_action($data) { if (is_array($data) && is_array($data[0]) && count($data[0])===2) { @@ -88,10 +98,14 @@ function _io_readWikiPage_action($data) { * be sure to set $clean to false! * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $file filename + * @param bool $clean + * @return string */ function io_readFile($file,$clean=true){ $ret = ''; - if(@file_exists($file)){ + if(file_exists($file)){ if(substr($file,-3) == '.gz'){ $ret = join('',gzfile($file)); }else if(substr($file,-4) == '.bz2'){ @@ -108,9 +122,12 @@ function io_readFile($file,$clean=true){ } /** * Returns the content of a .bz2 compressed file as string + * * @author marcel senf <marcel@rucksackreinigung.de> + * + * @param string $file filename + * @return string content */ - function bzfile($file){ $bz = bzopen($file,"r"); $str = ''; @@ -138,6 +155,12 @@ function bzfile($file){ * $data[3] rev: The page revision, false for current wiki pages. * * @author Ben Coburn <btcoburn@silicodon.net> + * + * @param string $file filename + * @param string $content + * @param string $id page id + * @param int|bool $rev timestamp of revision + * @return bool */ function io_writeWikiPage($file, $content, $id, $rev=false) { if (empty($rev)) { $rev = false; } @@ -149,6 +172,9 @@ function io_writeWikiPage($file, $content, $id, $rev=false) { /** * Callback adapter for io_saveFile(). * @author Ben Coburn <btcoburn@silicodon.net> + * + * @param array $data event data + * @return bool */ function _io_writeWikiPage_action($data) { if (is_array($data) && is_array($data[0]) && count($data[0])===3) { @@ -168,13 +194,17 @@ function _io_writeWikiPage_action($data) { * and bz2 if extension is .bz2 * * @author Andreas Gohr <andi@splitbrain.org> - * @return bool true on success + * + * @param string $file filename path to file + * @param string $content + * @param bool $append + * @return bool true on success, otherwise false */ function io_saveFile($file,$content,$append=false){ global $conf; $mode = ($append) ? 'ab' : 'wb'; - $fileexists = @file_exists($file); + $fileexists = file_exists($file); io_makeFileDir($file); io_lock($file); if(substr($file,-3) == '.gz'){ @@ -221,10 +251,14 @@ function io_saveFile($file,$content,$append=false){ * 2005-10-14 : added regex option -- Christopher Smith <chris@jalakai.co.uk> * * @author Steven Danz <steven-danz@kc.rr.com> + * + * @param string $file filename + * @param string $badline exact linematch to remove + * @param bool $regex use regexp? * @return bool true on success */ function io_deleteFromFile($file,$badline,$regex=false){ - if (!@file_exists($file)) return true; + if (!file_exists($file)) return true; io_lock($file); @@ -285,6 +319,8 @@ function io_deleteFromFile($file,$badline,$regex=false){ * the lock is assumed to be stale and the function goes on * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $file filename */ function io_lock($file){ global $conf; @@ -311,6 +347,8 @@ function io_lock($file){ * Unlocks a file * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $file filename */ function io_unlock($file){ global $conf; @@ -331,6 +369,9 @@ function io_unlock($file){ * $data[1] ns_type: 'pages' or 'media' namespace tree. * * @author Ben Coburn <btcoburn@silicodon.net> + * + * @param string $id page id + * @param string $ns_type 'pages' or 'media' */ function io_createNamespace($id, $ns_type='pages') { // verify ns_type @@ -344,7 +385,7 @@ function io_createNamespace($id, $ns_type='pages') { $ns_stack = explode(':', $id); $ns = $id; $tmp = dirname( $file = call_user_func($types[$ns_type], $ns) ); - while (!@is_dir($tmp) && !(@file_exists($tmp) && !is_dir($tmp))) { + while (!@is_dir($tmp) && !(file_exists($tmp) && !is_dir($tmp))) { array_pop($ns_stack); $ns = implode(':', $ns_stack); if (strlen($ns)==0) { break; } @@ -365,10 +406,10 @@ function io_createNamespace($id, $ns_type='pages') { * Create the directory needed for the given file * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $file file name */ function io_makeFileDir($file){ - global $conf; - $dir = dirname($file); if(!@is_dir($dir)){ io_mkdir_p($dir) || msg("Creating directory $dir failed",-1); @@ -381,11 +422,14 @@ function io_makeFileDir($file){ * @link http://www.php.net/manual/en/function.mkdir.php * @author <saint@corenova.com> * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $target filename + * @return bool|int|string */ function io_mkdir_p($target){ global $conf; if (@is_dir($target)||empty($target)) return 1; // best case check first - if (@file_exists($target) && !is_dir($target)) return 0; + if (file_exists($target) && !is_dir($target)) return 0; //recursion if (io_mkdir_p(substr($target,0,strrpos($target,'/')))){ if($conf['safemodehack']){ @@ -401,11 +445,64 @@ function io_mkdir_p($target){ } /** + * Recursively delete a directory + * + * @author Andreas Gohr <andi@splitbrain.org> + * @param string $path + * @param bool $removefiles defaults to false which will delete empty directories only + * @return bool + */ +function io_rmdir($path, $removefiles = false) { + if(!is_string($path) || $path == "") return false; + if(!file_exists($path)) return true; // it's already gone or was never there, count as success + + if(is_dir($path) && !is_link($path)) { + $dirs = array(); + $files = array(); + + if(!$dh = @opendir($path)) return false; + while(false !== ($f = readdir($dh))) { + if($f == '..' || $f == '.') continue; + + // collect dirs and files first + if(is_dir("$path/$f") && !is_link("$path/$f")) { + $dirs[] = "$path/$f"; + } else if($removefiles) { + $files[] = "$path/$f"; + } else { + return false; // abort when non empty + } + + } + closedir($dh); + + // now traverse into directories first + foreach($dirs as $dir) { + if(!io_rmdir($dir, $removefiles)) return false; // abort on any error + } + + // now delete files + foreach($files as $file) { + if(!@unlink($file)) return false; //abort on any error + } + + // remove self + return @rmdir($path); + } else if($removefiles) { + return @unlink($path); + } + return false; +} + +/** * Creates a directory using FTP * * This is used when the safemode workaround is enabled * * @author <andi@splitbrain.org> + * + * @param string $dir name of the new directory + * @return false|string */ function io_mkdir_ftp($dir){ global $conf; @@ -440,6 +537,8 @@ function io_mkdir_ftp($dir){ * its path. * * @author Michael Klier <chi@chimeric.de> + * + * @return false|string path to new directory or false */ function io_mktmpdir() { global $conf; @@ -468,6 +567,13 @@ function io_mktmpdir() { * * @author Andreas Gohr <andi@splitbrain.org> * @author Chris Smith <chris@jalakai.co.uk> + * + * @param string $url url to download + * @param string $file path to file or directory where to save + * @param bool $useAttachment if true: try to use name of download, uses otherwise $defaultName, false: uses $file as path to file + * @param string $defaultName fallback for if using $useAttachment + * @param int $maxSize maximum file size + * @return bool|string if failed false, otherwise true or the name of the file in the given dir */ function io_download($url,$file,$useAttachment=false,$defaultName='',$maxSize=2097152){ global $conf; @@ -500,7 +606,7 @@ function io_download($url,$file,$useAttachment=false,$defaultName='',$maxSize=20 $file = $file.$name; } - $fileexists = @file_exists($file); + $fileexists = file_exists($file); $fp = @fopen($file,"w"); if(!$fp) return false; fwrite($fp,$data); @@ -515,6 +621,10 @@ function io_download($url,$file,$useAttachment=false,$defaultName='',$maxSize=20 * * rename() can not overwrite existing files on Windows * this function will use copy/unlink instead + * + * @param string $from + * @param string $to + * @return bool succes or fail */ function io_rename($from,$to){ global $conf; @@ -534,6 +644,11 @@ function io_rename($from,$to){ * Returns the exit code from the process. * * @author Tom N Harris <tnharris@whoopdedo.org> + * + * @param string $cmd + * @param string $input input pipe + * @param string $output output pipe + * @return int exit code from process */ function io_exec($cmd, $input, &$output){ $descspec = array( diff --git a/inc/lang/af/jquery.ui.datepicker.js b/inc/lang/af/jquery.ui.datepicker.js new file mode 100644 index 000000000..ec86242d6 --- /dev/null +++ b/inc/lang/af/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Afrikaans initialisation for the jQuery UI date picker plugin. */ +/* Written by Renier Pretorius. */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['af'] = { + closeText: 'Selekteer', + prevText: 'Vorige', + nextText: 'Volgende', + currentText: 'Vandag', + monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie', + 'Julie','Augustus','September','Oktober','November','Desember'], + monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', + 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], + dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], + dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'], + dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['af']); + +return datepicker.regional['af']; + +})); diff --git a/inc/lang/af/lang.php b/inc/lang/af/lang.php index 826fda6e8..70672fbdd 100644 --- a/inc/lang/af/lang.php +++ b/inc/lang/af/lang.php @@ -25,7 +25,7 @@ $lang['btn_back'] = 'Terug'; $lang['btn_backlink'] = 'Wat skakel hierheen'; $lang['btn_subscribe'] = 'Hou bladsy dop'; $lang['btn_register'] = 'Skep gerus \'n rekening'; -$lang['loggedinas'] = 'Ingeteken as'; +$lang['loggedinas'] = 'Ingeteken as:'; $lang['user'] = 'Gebruikernaam'; $lang['pass'] = 'Wagwoord'; $lang['newpass'] = 'Nuive wagwoord'; @@ -52,7 +52,7 @@ $lang['mediaroot'] = 'root'; $lang['toc'] = 'Inhoud'; $lang['current'] = 'huidige'; $lang['line'] = 'Streak'; -$lang['youarehere'] = 'Jy is hier'; +$lang['youarehere'] = 'Jy is hier:'; $lang['by'] = 'by'; $lang['restored'] = 'Het terug gegaan na vroeëre weergawe (%s)'; $lang['summary'] = 'Voorskou'; @@ -63,8 +63,8 @@ $lang['qb_extlink'] = 'Eksterne skakel'; $lang['qb_hr'] = 'Horisontale streep'; $lang['qb_sig'] = 'Handtekening met datum'; $lang['admin_register'] = 'Skep gerus \'n rekening'; -$lang['img_backto'] = 'Terug na'; -$lang['img_date'] = 'Datem'; -$lang['img_camera'] = 'Camera'; +$lang['btn_img_backto'] = 'Terug na %s'; +$lang['img_date'] = 'Datem:'; +$lang['img_camera'] = 'Camera:'; $lang['i_wikiname'] = 'Wiki Naam'; $lang['i_funcna'] = 'PHP funksie <code>%s</code> is nie beskibaar nie. Miskien is dit af gehaal.'; diff --git a/inc/lang/ar/denied.txt b/inc/lang/ar/denied.txt index 11405233c..b369f7f23 100644 --- a/inc/lang/ar/denied.txt +++ b/inc/lang/ar/denied.txt @@ -1,3 +1,3 @@ ====== لا صلاحيات ====== -عذرا، ليس مصرح لك الاستمرار، لعلك نسيت تسجيل الدخول؟
\ No newline at end of file +عذرا، ليس مصرح لك الاستمرار
\ No newline at end of file diff --git a/inc/lang/ar/jquery.ui.datepicker.js b/inc/lang/ar/jquery.ui.datepicker.js new file mode 100644 index 000000000..c93fed48d --- /dev/null +++ b/inc/lang/ar/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Khaled Alhourani -- me@khaledalhourani.com */ +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['ar'] = { + closeText: 'إغلاق', + prevText: '<السابق', + nextText: 'التالي>', + currentText: 'اليوم', + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران', + 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'], + dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['ar']); + +return datepicker.regional['ar']; + +})); diff --git a/inc/lang/ar/lang.php b/inc/lang/ar/lang.php index fdb407da0..50984e630 100644 --- a/inc/lang/ar/lang.php +++ b/inc/lang/ar/lang.php @@ -8,6 +8,8 @@ * @author Usama Akkad <uahello@gmail.com> * @author uahello@gmail.com * @author Ahmad Abd-Elghany <tolpa1@gmail.com> + * @author alhajr <alhajr300@gmail.com> + * @author Mohamed Belhsine <b.mohamed897@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'rtl'; @@ -32,8 +34,8 @@ $lang['btn_upload'] = 'ارفع'; $lang['btn_cancel'] = 'ألغ'; $lang['btn_index'] = 'خريطة موقع'; $lang['btn_secedit'] = 'حرر'; -$lang['btn_login'] = 'لج'; -$lang['btn_logout'] = 'اخرج'; +$lang['btn_login'] = 'تسجيل الدخول'; +$lang['btn_logout'] = 'خروج'; $lang['btn_admin'] = 'المدير'; $lang['btn_update'] = 'حدّث'; $lang['btn_delete'] = 'احذف'; @@ -52,7 +54,9 @@ $lang['btn_register'] = 'سجّل'; $lang['btn_apply'] = 'طبق'; $lang['btn_media'] = 'مدير الوسائط'; $lang['btn_deleteuser'] = 'احذف حسابي الخاص'; -$lang['loggedinas'] = 'داخل باسم'; +$lang['btn_img_backto'] = 'عودة إلى %s'; +$lang['btn_mediaManager'] = 'اعرض في مدير الوسائط'; +$lang['loggedinas'] = 'داخل باسم:'; $lang['user'] = 'اسم المستخدم'; $lang['pass'] = 'كلمة السر'; $lang['newpass'] = 'كلمة سر جديدة'; @@ -67,6 +71,7 @@ $lang['badpassconfirm'] = 'عذراً,كلمة السر غير صحيحة $lang['minoredit'] = 'تعديلات طفيفة'; $lang['draftdate'] = 'حفظ المسودات آليا مفعّل'; $lang['nosecedit'] = 'غُيرت الصفحة في هذه الأثناء، معلومات الجزء اصبحت قديمة. حُمُلت كل الصفحة بدلا.'; +$lang['searchcreatepage'] = 'إن لم تجد ما تبحث عنه، يمكنك إنشاء صفحة جديدة بعنوان ما تبحث عنة بالضغط على زر "حرر هذه الصفحة".'; $lang['regmissing'] = 'عذرا، عليك ملء جميع الحقول.'; $lang['reguexists'] = 'عذرا، يوجد مشترك بنفس الاسم.'; $lang['regsuccess'] = 'أنشئ المستخدم و ارسلت كلمة السر بالبريد.'; @@ -85,6 +90,7 @@ $lang['profdeleteuser'] = 'احذف حساب'; $lang['profdeleted'] = 'حسابك الخاص تم حذفه من هذه الموسوعة'; $lang['profconfdelete'] = 'أنا أرغب في حذف حسابي من هذه الموسوعة.<br/> هذا الحدث غير ممكن.'; +$lang['profconfdeletemissing'] = 'لم تقم بوضع علامة في مربع التأكيد'; $lang['pwdforget'] = 'أنسيت كلمة السر؟ احصل على واحدة جديدة'; $lang['resendna'] = 'هذه الويكي لا تدعم إعادة إرسال كلمة المرور.'; $lang['resendpwd'] = 'اضبط كلمة سر جديدة لـ'; @@ -97,12 +103,12 @@ $lang['license'] = 'مالم يشر لخلاف ذلك، فإن ا $lang['licenseok'] = 'لاحظ: بتحرير هذه الصفحة أنت توافق على ترخيص محتواها تحت الرخصة التالية:'; $lang['searchmedia'] = 'ابحث في أسماء الملفات:'; $lang['searchmedia_in'] = 'ابحث في %s'; -$lang['txt_upload'] = 'اختر ملفاً للرفع'; -$lang['txt_filename'] = 'رفع كـ (اختياري)'; +$lang['txt_upload'] = 'اختر ملفاً للرفع:'; +$lang['txt_filename'] = 'رفع كـ (اختياري):'; $lang['txt_overwrt'] = 'اكتب على ملف موجود'; $lang['maxuploadsize'] = 'الحجم الاقصى %s للملف'; -$lang['lockedby'] = 'مقفلة حاليا لـ'; -$lang['lockexpire'] = 'ينتهي القفل في'; +$lang['lockedby'] = 'مقفلة حاليا لـ:'; +$lang['lockexpire'] = 'ينتهي القفل في:'; $lang['js']['willexpire'] = 'سينتهي قفل تحرير هذه الصفحه خلال دقيقة.\nلتجنب التعارض استخدم زر المعاينة لتصفير مؤقت القفل.'; $lang['js']['notsavedyet'] = 'التعديلات غير المحفوظة ستفقد.'; $lang['js']['searchmedia'] = 'ابحث عن ملفات'; @@ -182,10 +188,15 @@ $lang['difflink'] = 'رابط إلى هذه المقارنة'; $lang['diff_type'] = 'أظهر الفروق:'; $lang['diff_inline'] = 'ضمنا'; $lang['diff_side'] = 'جنبا إلى جنب'; +$lang['diffprevrev'] = 'المراجعة السابقة'; +$lang['diffnextrev'] = 'المراجعة التالية'; +$lang['difflastrev'] = 'المراجعة الأخيرة'; +$lang['diffbothprevrev'] = 'جانبي المراجعة السابقة'; +$lang['diffbothnextrev'] = 'جانبي المراجعة التالية'; $lang['line'] = 'سطر'; -$lang['breadcrumb'] = 'أثر'; -$lang['youarehere'] = 'أنت هنا'; -$lang['lastmod'] = 'آخر تعديل'; +$lang['breadcrumb'] = 'أثر:'; +$lang['youarehere'] = 'أنت هنا:'; +$lang['lastmod'] = 'آخر تعديل:'; $lang['by'] = 'بواسطة'; $lang['deleted'] = 'حذفت'; $lang['created'] = 'اُنشئت'; @@ -238,20 +249,18 @@ $lang['admin_register'] = 'أضف مستخدما جديدا'; $lang['metaedit'] = 'تحرير البيانات الشمولية '; $lang['metasaveerr'] = 'فشلت كتابة البيانات الشمولية'; $lang['metasaveok'] = 'حُفظت البيانات الشمولية'; -$lang['img_backto'] = 'عودة إلى'; -$lang['img_title'] = 'العنوان'; -$lang['img_caption'] = 'وصف'; -$lang['img_date'] = 'التاريخ'; -$lang['img_fname'] = 'اسم الملف'; -$lang['img_fsize'] = 'الحجم'; -$lang['img_artist'] = 'المصور'; -$lang['img_copyr'] = 'حقوق النسخ'; -$lang['img_format'] = 'الهيئة'; -$lang['img_camera'] = 'الكمرا'; -$lang['img_keywords'] = 'كلمات مفتاحية'; -$lang['img_width'] = 'العرض'; -$lang['img_height'] = 'الإرتفاع'; -$lang['img_manager'] = 'اعرض في مدير الوسائط'; +$lang['img_title'] = 'العنوان:'; +$lang['img_caption'] = 'وصف:'; +$lang['img_date'] = 'التاريخ:'; +$lang['img_fname'] = 'اسم الملف:'; +$lang['img_fsize'] = 'الحجم:'; +$lang['img_artist'] = 'المصور:'; +$lang['img_copyr'] = 'حقوق النسخ:'; +$lang['img_format'] = 'الهيئة:'; +$lang['img_camera'] = 'الكمرا:'; +$lang['img_keywords'] = 'كلمات مفتاحية:'; +$lang['img_width'] = 'العرض:'; +$lang['img_height'] = 'الإرتفاع:'; $lang['subscr_subscribe_success'] = 'اضيف %s لقائمة اشتراك %s'; $lang['subscr_subscribe_error'] = 'خطأ في إضافة %s لقائمة اشتراك %s'; $lang['subscr_subscribe_noaddress'] = 'ليس هناك عنوان مرتبط بولوجك، لا يمكن اضافتك لقائمة الاشتراك'; @@ -266,6 +275,8 @@ $lang['subscr_m_unsubscribe'] = 'ألغ الاشتراك'; $lang['subscr_m_subscribe'] = 'اشترك'; $lang['subscr_m_receive'] = 'استقبال'; $lang['subscr_style_every'] = 'بريدا على كل تغيير'; +$lang['subscr_style_digest'] = 'البريد الإلكتروني, ملخص للتغييرات لكل صفحة (كل يوم %.2f)'; +$lang['subscr_style_list'] = 'قائمة بالصفحات التي تم تغييرها منذ آخر بريد الإلكتروني (كل يوم %.2f)'; $lang['authtempfail'] = 'تصريح المشترك غير متوفر مؤقتاً، إن استمرت هذه الحالة يرجى مراسلة المدير'; $lang['authpwdexpire'] = 'ستنتهي صلاحية كلمة السر في %d . عليك بتغييرها سريعا.'; $lang['i_chooselang'] = 'اختر لغتك'; @@ -284,6 +295,7 @@ $lang['i_phpver'] = 'نسخة PHP التي لديك هي وهي أقل من النسخة المطلوبة <code>%s</code> عليك تحديث نسخة PHP'; +$lang['i_mbfuncoverload'] = 'يجب ايقاف تشغيل mbstring.func_overload في ملف php.ini لتشغيل دوكوويكي.'; $lang['i_permfail'] = 'إن <code>%s</code> غير قابل للكتابة بواسطة دوكو ويكي، عليك تعديل إعدادات الصلاحيات لهذا المجلد!'; $lang['i_confexists'] = 'إن <code>%s</code> موجود أصلاً'; $lang['i_writeerr'] = 'لا يمكن إنشاء <code>%s</code>، عليك التأكد من صلاحيات الملف أو المجلد وإنشاء الملف يدوياً.'; @@ -297,8 +309,12 @@ $lang['i_policy'] = 'تصريح ACL مبدئي'; $lang['i_pol0'] = 'ويكي مفتوحة؛ أي القراءة والكتابة والتحميل مسموحة للجميع'; $lang['i_pol1'] = 'ويكي عامة؛ أي القراءة للجميع ولكن الكتابة والتحميل للمشتركين المسجلين فقط'; $lang['i_pol2'] = 'ويكي مغلقة؛ أي القراءة والكتابة والتحميل للمشتركين المسجلين فقط'; +$lang['i_allowreg'] = 'السماح للمستخدمين بتسجيل أنفسهم'; $lang['i_retry'] = 'إعادة المحاولة'; $lang['i_license'] = 'اختر الرخصة التي تريد وضع المحتوى تحتها:'; +$lang['i_license_none'] = 'لا تظهر أية معلومات للترخيص'; +$lang['i_pop_field'] = 'من فضلك، ساعدنا على تحسين تجربة دوكي ويكي:'; +$lang['i_pop_label'] = 'مرة واحدة في شهر، إرسال بيانات استخدام المجهول للمطورين دوكي ويكي'; $lang['recent_global'] = 'انت تراقب حاليا التغييرات داخل نطاق <b>%s</b>. يمكنك أيضا <a href="%s">عرض أحدث تغييرات الويكي كلها</a>.'; $lang['years'] = '%d سنة مضت'; $lang['months'] = '%d شهرا مضى'; @@ -331,3 +347,7 @@ $lang['media_perm_read'] = 'عفوا، لست مخولا بقراءة ال $lang['media_perm_upload'] = 'عفوا، لست مخولا برفع الملفات.'; $lang['media_update'] = 'ارفع إصدارا أحدث'; $lang['media_restore'] = 'استرجع هذه النسخة'; +$lang['currentns'] = 'مساحة الاسم الحالية'; +$lang['searchresult'] = 'نتيجة البحث'; +$lang['plainhtml'] = 'نص HTML غير منسق'; +$lang['wikimarkup'] = 'علامات الوكي'; diff --git a/inc/lang/ar/searchpage.txt b/inc/lang/ar/searchpage.txt index 62c05f5e4..56355f85f 100644 --- a/inc/lang/ar/searchpage.txt +++ b/inc/lang/ar/searchpage.txt @@ -1,5 +1,5 @@ ====== بحث ====== -نتائج البحث . إن لم تجد ما تبحث عنه، يمكنك إنشاء صفحة جديدة بعنوان ما تبحث عنة بالضغط على زر "حرر هذه الصفحة". +نتائج البحث . @CREATEPAGEINFO@ ===== نتائج البحث =====
\ No newline at end of file diff --git a/inc/lang/az/denied.txt b/inc/lang/az/denied.txt index a68b08c8c..c6fddb63a 100644 --- a/inc/lang/az/denied.txt +++ b/inc/lang/az/denied.txt @@ -1,3 +1,3 @@ ====== Müraciət qadağan edilmişdir ====== -Sizin bu əməliyyat üçün kifayət qədər haqqınız yoxdur. Bəlkə, Siz sistemə oz istifadəçi adınız ilə girməyi unutmusunuz? +Sizin bu əməliyyat üçün kifayət qədər haqqınız yoxdur. diff --git a/inc/lang/az/jquery.ui.datepicker.js b/inc/lang/az/jquery.ui.datepicker.js new file mode 100644 index 000000000..be87ad411 --- /dev/null +++ b/inc/lang/az/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Jamil Najafov (necefov33@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['az'] = { + closeText: 'Bağla', + prevText: '<Geri', + nextText: 'İrəli>', + currentText: 'Bugün', + monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun', + 'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'], + monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun', + 'İyul','Avq','Sen','Okt','Noy','Dek'], + dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'], + dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'], + dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['az']); + +return datepicker.regional['az']; + +})); diff --git a/inc/lang/az/lang.php b/inc/lang/az/lang.php index df54b4f10..bcec31dae 100644 --- a/inc/lang/az/lang.php +++ b/inc/lang/az/lang.php @@ -44,7 +44,7 @@ $lang['btn_recover'] = 'Qaralamanı qaytar'; $lang['btn_draftdel'] = 'Qaralamanı sil'; $lang['btn_revert'] = 'Qaytar'; $lang['btn_register'] = 'Qeydiyyatdan keç'; -$lang['loggedinas'] = 'İstifadəcinin adı'; +$lang['loggedinas'] = 'İstifadəcinin adı:'; $lang['user'] = 'istifadəci adı'; $lang['pass'] = 'Şifrə'; $lang['newpass'] = 'Yeni şifrə'; @@ -58,6 +58,7 @@ $lang['badlogin'] = 'Təssüf ki istifadəçi adı və ya şifrə s $lang['minoredit'] = 'Az dəyişiklər'; $lang['draftdate'] = 'Qaralama yadda saxlandı'; $lang['nosecedit'] = 'Bu vaxt ərzində səhifə dəyişilmişdir, və bölmə haqqında məlumat köhnəlmişdir. Səhifənin tam versiyası yüklənmişdir.'; +$lang['searchcreatepage'] = "Əgər Siz axtardığınızı tapa bilmədinizsə, onda Siz adı axtarışınız ilə uyğun düşən yeni səhifə yarada bilərsiniz. Bunu eləmək üçün, sadəcə ''Səhifəni yarat'' düyməsini sıxın."; $lang['regmissing'] = 'Təssüf ki Siz bütün xanələri doldurmalısınız.'; $lang['reguexists'] = 'Təssüf ki bu ad ilə istifadəçi artıq mövcuddur.'; $lang['regsuccess'] = 'İstivadəci yaradıldı və şifrə sizin e-maila göndərildi.'; @@ -82,10 +83,10 @@ $lang['license'] = 'Fərqli şey göstərilmiş hallardan başqa, $lang['licenseok'] = 'Qeyd: bu səhifəni düzəliş edərək, Siz elədiyiniz düzəlişi aşağıda göstərilmiş lisenziyanın şərtlərinə uyğun istifadəsinə razılıq verirsiniz:'; $lang['searchmedia'] = 'Faylın adına görə axtarış:'; $lang['searchmedia_in'] = '%s-ın içində axtarış'; -$lang['txt_upload'] = 'Serverə yükləmək üçün fayl seçin'; -$lang['txt_filename'] = 'Faylın wiki-də olan adını daxil edin (mütləq deyil)'; +$lang['txt_upload'] = 'Serverə yükləmək üçün fayl seçin:'; +$lang['txt_filename'] = 'Faylın wiki-də olan adını daxil edin (mütləq deyil):'; $lang['txt_overwrt'] = 'Mövcud olan faylın üstündən yaz'; -$lang['lockedby'] = 'В данный момент заблокирован Bu an blokdadır'; +$lang['lockedby'] = 'В данный момент заблокирован Bu an blokdadır:'; $lang['lockexpire'] = 'Blok bitir:'; $lang['js']['willexpire'] = 'Sizin bu səhifədə dəyişik etmək üçün blokunuz bir dəqiqə ərzində bitəcək.\nMünaqişələrdən yayınmaq və blokun taymerini sıfırlamaq üçün, baxış düyməsini sıxın.'; $lang['rssfailed'] = 'Aşağıda göstərilmiş xəbər lentini əldə edən zaman xəta baş verdi: '; @@ -128,9 +129,9 @@ $lang['yours'] = 'Sizin versiyanız'; $lang['diff'] = 'hazırki versiyadan fərqləri göstər'; $lang['diff2'] = 'Versiyaların arasındaki fərqləri göstər '; $lang['line'] = 'Sətr'; -$lang['breadcrumb'] = 'Siz ziyarət etdiniz'; -$lang['youarehere'] = 'Siz burdasınız'; -$lang['lastmod'] = 'Son dəyişiklər'; +$lang['breadcrumb'] = 'Siz ziyarət etdiniz:'; +$lang['youarehere'] = 'Siz burdasınız:'; +$lang['lastmod'] = 'Son dəyişiklər:'; $lang['by'] = ' Kimdən'; $lang['deleted'] = 'silinib'; $lang['created'] = 'yaranıb'; @@ -172,17 +173,17 @@ $lang['admin_register'] = 'İstifadəçi əlavə et'; $lang['metaedit'] = 'Meta-məlumatlarda düzəliş et'; $lang['metasaveerr'] = 'Meta-məlumatları yazan zamanı xəta'; $lang['metasaveok'] = 'Meta-məlumatlar yadda saxlandı'; -$lang['img_backto'] = 'Qayıd'; -$lang['img_title'] = 'Başlıq'; -$lang['img_caption'] = 'İmza'; -$lang['img_date'] = 'Tarix'; -$lang['img_fname'] = 'Faylın adı'; -$lang['img_fsize'] = 'Boy'; -$lang['img_artist'] = 'Şkilin müəllifi'; -$lang['img_copyr'] = 'Müəllif hüquqları'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Model'; -$lang['img_keywords'] = 'Açar sözlər'; +$lang['btn_img_backto'] = 'Qayıd %s'; +$lang['img_title'] = 'Başlıq:'; +$lang['img_caption'] = 'İmza:'; +$lang['img_date'] = 'Tarix:'; +$lang['img_fname'] = 'Faylın adı:'; +$lang['img_fsize'] = 'Boy:'; +$lang['img_artist'] = 'Şkilin müəllifi:'; +$lang['img_copyr'] = 'Müəllif hüquqları:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Model:'; +$lang['img_keywords'] = 'Açar sözlər:'; $lang['authtempfail'] = 'İstifadəçilərin autentifikasiyası müvəqqəti dayandırılıb. Əgər bu problem uzun müddət davam edir sə, administrator ilə əlaqə saxlayın.'; $lang['i_chooselang'] = 'Dili seçin/Language'; $lang['i_installer'] = 'DokuWiki quraşdırılır'; diff --git a/inc/lang/az/searchpage.txt b/inc/lang/az/searchpage.txt index 4f8efe007..6b7fce754 100644 --- a/inc/lang/az/searchpage.txt +++ b/inc/lang/az/searchpage.txt @@ -1,5 +1,5 @@ ====== Axtarış ====== -Qarşınızda - axtarışın nəticələridir. Əgər Siz axtardığınızı tapa bilmədinizsə, onda Siz adı axtarışınız ilə uyğun düşən yeni səhifə yarada bilərsiniz. Bunu eləmək üçün, sadəcə ''Səhifəni yarat'' düyməsini sıxın. +Qarşınızda - axtarışın nəticələridir. @CREATEPAGEINFO@ ===== Nəticələr ===== diff --git a/inc/lang/bg/denied.txt b/inc/lang/bg/denied.txt index 45ce63769..bd695d46d 100644 --- a/inc/lang/bg/denied.txt +++ b/inc/lang/bg/denied.txt @@ -1,4 +1,4 @@ ====== Отказан достъп ====== -Нямате достатъчно права, за да продължите. Може би сте забравили да се впишете? +Нямате достатъчно права, за да продължите. diff --git a/inc/lang/bg/jquery.ui.datepicker.js b/inc/lang/bg/jquery.ui.datepicker.js new file mode 100644 index 000000000..0ee1b171d --- /dev/null +++ b/inc/lang/bg/jquery.ui.datepicker.js @@ -0,0 +1,38 @@ +/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['bg'] = { + closeText: 'затвори', + prevText: '<назад', + nextText: 'напред>', + nextBigText: '>>', + currentText: 'днес', + monthNames: ['Януари','Февруари','Март','Април','Май','Юни', + 'Юли','Август','Септември','Октомври','Ноември','Декември'], + monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни', + 'Юли','Авг','Сеп','Окт','Нов','Дек'], + dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'], + dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'], + dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['bg']); + +return datepicker.regional['bg']; + +})); diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php index e909980db..cfacd09aa 100644 --- a/inc/lang/bg/lang.php +++ b/inc/lang/bg/lang.php @@ -1,20 +1,20 @@ <?php + /** - * Bulgarian language file - * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * * @author Nikolay Vladimirov <nikolay@vladimiroff.com> * @author Viktor Usunov <usun0v@mail.bg> * @author Kiril <neohidra@gmail.com> + * @author Ivan Peltekov <ivan.peltekov@abv.bg> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; -$lang['doublequoteopening'] = '"'; //“ -$lang['doublequoteclosing'] = '"'; //” -$lang['singlequoteopening'] = '‘'; //‘ -$lang['singlequoteclosing'] = '’'; //’ -$lang['apostrophe'] = '’'; //’ - +$lang['doublequoteopening'] = '"'; +$lang['doublequoteclosing'] = '"'; +$lang['singlequoteopening'] = '‘'; +$lang['singlequoteclosing'] = '’'; +$lang['apostrophe'] = '’'; $lang['btn_edit'] = 'Редактиране'; $lang['btn_source'] = 'Преглед на кода'; $lang['btn_show'] = 'Преглед на страницата'; @@ -50,8 +50,8 @@ $lang['btn_revert'] = 'Възстановяване'; $lang['btn_register'] = 'Регистриране'; $lang['btn_apply'] = 'Прилагане'; $lang['btn_media'] = 'Диспечер на файлове'; - -$lang['loggedinas'] = 'Вписани сте като'; +$lang['btn_deleteuser'] = 'Изтриване на профила'; +$lang['loggedinas'] = 'Вписани сте като:'; $lang['user'] = 'Потребител'; $lang['pass'] = 'Парола'; $lang['newpass'] = 'Нова парола'; @@ -62,10 +62,11 @@ $lang['fullname'] = 'Истинско име'; $lang['email'] = 'Електронна поща'; $lang['profile'] = 'Потребителски профил'; $lang['badlogin'] = 'Грешно потребителско име или парола.'; +$lang['badpassconfirm'] = 'За съжаление паролата е грешна'; $lang['minoredit'] = 'Промените са незначителни'; -$lang['draftdate'] = 'Черновата е автоматично записана на'; // full dformat date will be added +$lang['draftdate'] = 'Черновата е автоматично записана на'; $lang['nosecedit'] = 'Страницата бе междувременно променена, презареждане на страницата поради неактуална информация.'; - +$lang['searchcreatepage'] = 'Ако не намирате каквото сте търсили, може да създадете или редактирате страница, кръстена на вашата заявка, чрез съответния бутон.'; $lang['regmissing'] = 'Моля, попълнете всички полета.'; $lang['reguexists'] = 'Вече съществува потребител с избраното име.'; $lang['regsuccess'] = 'Потребителят е създаден, а паролата е пратена по електронната поща.'; @@ -75,12 +76,15 @@ $lang['regbadmail'] = 'Въведеният адрес изглежд $lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново.'; $lang['regpwmail'] = 'Паролата ви за DokuWiki'; $lang['reghere'] = 'Все още нямате профил? Направете си'; - $lang['profna'] = 'Wiki-то не поддържа промяна на профила'; $lang['profnochange'] = 'Няма промени.'; -$lang['profnoempty'] = 'Въвеждането на име и ел. поща е задължително'; +$lang['profnoempty'] = 'Въвеждането на име и имейл е задължително'; $lang['profchanged'] = 'Потребителският профил е обновен успешно.'; - +$lang['profnodelete'] = 'Изтриването на потребители в това wiki не е възможно'; +$lang['profdeleteuser'] = 'Изтриване на профила'; +$lang['profdeleted'] = 'Вашият профил е премахнат от това wiki '; +$lang['profconfdelete'] = 'Искам да изтрия профила си от това wiki. <br/> Веднъж изтрит, профилът не може да бъде възстановен!'; +$lang['profconfdeletemissing'] = 'Не сте поставили отметка в кутията потвърждение'; $lang['pwdforget'] = 'Забравили сте паролата си? Получете нова'; $lang['resendna'] = 'Wiki-то не поддържа повторно пращане на паролата.'; $lang['resendpwd'] = 'Задаване на нова парола за'; @@ -89,19 +93,16 @@ $lang['resendpwdnouser'] = 'Потребителят не е намере $lang['resendpwdbadauth'] = 'Кодът за потвърждение е невалиден. Проверете дали сте използвали целия линк за потвърждение.'; $lang['resendpwdconfirm'] = 'Линк за потвърждение е пратен по електронната поща.'; $lang['resendpwdsuccess'] = 'Новата ви паролата е пратена по електронната поща.'; - $lang['license'] = 'Ако не е посочено друго, съдържанието на Wiki-то е лицензирано под следния лиценз:'; $lang['licenseok'] = 'Бележка: Редактирайки страницата, Вие се съгласявате да лицензирате промените (които сте направили) под следния лиценз:'; - $lang['searchmedia'] = 'Търсене на файл: '; $lang['searchmedia_in'] = 'Търсене в %s'; -$lang['txt_upload'] = 'Изберете файл за качване'; -$lang['txt_filename'] = 'Качи като (незадължително)'; +$lang['txt_upload'] = 'Изберете файл за качване:'; +$lang['txt_filename'] = 'Качи като (незадължително):'; $lang['txt_overwrt'] = 'Презапиши съществуващите файлове'; $lang['maxuploadsize'] = 'Макс. размер за отделните файлове е %s.'; -$lang['lockedby'] = 'В момента е заключена от'; -$lang['lockexpire'] = 'Ще бъде отключена на'; - +$lang['lockedby'] = 'В момента е заключена от:'; +$lang['lockexpire'] = 'Ще бъде отключена на:'; $lang['js']['willexpire'] = 'Страницата ще бъде отключена за редактиране след минута.\nЗа предотвратяване на конфликти, ползвайте бутона "Преглед", за рестартиране на брояча за заключване.'; $lang['js']['notsavedyet'] = 'Незаписаните промени ще бъдат загубени. Желаете ли да продължите?'; $lang['js']['searchmedia'] = 'Търсене на файлове'; @@ -140,13 +141,11 @@ $lang['js']['media_diff_portions'] = 'По половинка'; $lang['js']['media_select'] = 'Изберете файлове...'; $lang['js']['media_upload_btn'] = 'Качване'; $lang['js']['media_done_btn'] = 'Готово'; -$lang['js']['media_drop'] = 'Влачете и пуснете файливе тук, за да бъдат качени'; +$lang['js']['media_drop'] = 'Влачете и пуснете файлове тук, за да бъдат качени'; $lang['js']['media_cancel'] = 'премахване'; $lang['js']['media_overwrt'] = 'Презапиши съществуващите файлове'; - $lang['rssfailed'] = 'Възникна грешка при получаването на емисията: '; $lang['nothingfound'] = 'Нищо не е открито.'; - $lang['mediaselect'] = 'Файлове'; $lang['fileupload'] = 'Качване на файлове'; $lang['uploadsucc'] = 'Качването е успешно'; @@ -166,12 +165,11 @@ $lang['accessdenied'] = 'Нямате необходимите прав $lang['mediausage'] = 'Ползвайте следния синтаксис, за да упоменете файла:'; $lang['mediaview'] = 'Преглед на оригиналния файл'; $lang['mediaroot'] = 'root'; -$lang['mediaupload'] = 'Качете файл в текущото именно пространство. За създаване на подимено пространство, добавете име преди това на файла като ги разделите с двоеточие в полето "Качи като"'; +$lang['mediaupload'] = 'Качете файл в текущото именно пространство. За създаване на подименно пространство, добавете име преди това на файла като ги разделите с двоеточие в полето "Качи като"'; $lang['mediaextchange'] = 'Разширението на файла е сменено от .%s на .%s!'; $lang['reference'] = 'Връзки за'; $lang['ref_inuse'] = 'Файлът не може да бъде изтрит, защото все още се ползва от следните страници:'; $lang['ref_hidden'] = 'Някои връзки са към страници, които нямате права да четете'; - $lang['hits'] = 'Съвпадения'; $lang['quickhits'] = 'Съвпадащи имена на страници'; $lang['toc'] = 'Съдържание'; @@ -184,9 +182,9 @@ $lang['diff_type'] = 'Преглед на разликите:'; $lang['diff_inline'] = 'Вграден'; $lang['diff_side'] = 'Един до друг'; $lang['line'] = 'Ред'; -$lang['breadcrumb'] = 'Следа'; -$lang['youarehere'] = 'Намирате се в'; -$lang['lastmod'] = 'Последна промяна'; +$lang['breadcrumb'] = 'Следа:'; +$lang['youarehere'] = 'Намирате се в:'; +$lang['lastmod'] = 'Последна промяна:'; $lang['by'] = 'от'; $lang['deleted'] = 'изтрита'; $lang['created'] = 'създадена'; @@ -201,18 +199,15 @@ $lang['site_tools'] = 'Инструменти за сайта'; $lang['page_tools'] = 'Инструменти за страници'; $lang['skip_to_content'] = 'към съдържанието'; $lang['sidebar'] = 'Странична лента'; - $lang['mail_newpage'] = 'добавена страница: '; $lang['mail_changed'] = 'променена страница: '; $lang['mail_subscribe_list'] = 'променени страници в именно пространство: '; $lang['mail_new_user'] = 'нов потребител: '; $lang['mail_upload'] = 'качен файл: '; - $lang['changes_type'] = 'Преглед на променените'; $lang['pages_changes'] = 'Страници'; $lang['media_changes'] = 'Файлове'; $lang['both_changes'] = 'Страници и файлове'; - $lang['qb_bold'] = 'Удебелен текст'; $lang['qb_italic'] = 'Курсив текст'; $lang['qb_underl'] = 'Подчертан текст'; @@ -237,53 +232,44 @@ $lang['qb_media'] = 'Добавяне на изображения $lang['qb_sig'] = 'Вмъкване на подпис'; $lang['qb_smileys'] = 'Усмивчици'; $lang['qb_chars'] = 'Специални знаци'; - $lang['upperns'] = 'към майчиното именно пространство'; - $lang['admin_register'] = 'Добавяне на нов потребител'; - $lang['metaedit'] = 'Редактиране на метаданни'; $lang['metasaveerr'] = 'Записването на метаданните се провали'; $lang['metasaveok'] = 'Метаданните са запазени успешно'; -$lang['img_backto'] = 'Назад към'; -$lang['img_title'] = 'Заглавие'; -$lang['img_caption'] = 'Надпис'; -$lang['img_date'] = 'Дата'; -$lang['img_fname'] = 'Име на файла'; -$lang['img_fsize'] = 'Размер'; -$lang['img_artist'] = 'Фотограф'; -$lang['img_copyr'] = 'Авторско право'; -$lang['img_format'] = 'Формат'; -$lang['img_camera'] = 'Фотоапарат'; -$lang['img_keywords'] = 'Ключови думи'; -$lang['img_width'] = 'Ширина'; -$lang['img_height'] = 'Височина'; -$lang['img_manager'] = 'Преглед в диспечера на файлове'; - +$lang['btn_img_backto'] = 'Назад към %s'; +$lang['img_title'] = 'Заглавие:'; +$lang['img_caption'] = 'Надпис:'; +$lang['img_date'] = 'Дата:'; +$lang['img_fname'] = 'Име на файла:'; +$lang['img_fsize'] = 'Размер:'; +$lang['img_artist'] = 'Фотограф:'; +$lang['img_copyr'] = 'Авторско право:'; +$lang['img_format'] = 'Формат:'; +$lang['img_camera'] = 'Фотоапарат:'; +$lang['img_keywords'] = 'Ключови думи:'; +$lang['img_width'] = 'Ширина:'; +$lang['img_height'] = 'Височина:'; +$lang['btn_mediaManager'] = 'Преглед в диспечера на файлове'; $lang['subscr_subscribe_success'] = '%s е добавен към списъка с абониралите се за %s'; $lang['subscr_subscribe_error'] = 'Грешка при добавянето на %s към списъка с абониралите се за %s'; -$lang['subscr_subscribe_noaddress'] = 'Добавянето ви към списъка с абонати не е възможно поради липсата на свързан адрес (на ел. поща) с профила ви.'; +$lang['subscr_subscribe_noaddress'] = 'Добавянето ви към списъка с абонати не е възможно поради липсата на свързан адрес (имейл) с профила ви.'; $lang['subscr_unsubscribe_success'] = '%s е премахнат от списъка с абониралите се за %s'; $lang['subscr_unsubscribe_error'] = 'Грешка при премахването на %s от списъка с абониралите се за %s'; $lang['subscr_already_subscribed'] = '%s е вече абониран за %s'; $lang['subscr_not_subscribed'] = '%s не е абониран за %s'; -// Manage page for subscriptions $lang['subscr_m_not_subscribed'] = 'Не сте абониран за текущата страницата или именно пространство.'; $lang['subscr_m_new_header'] = 'Добави абонамент'; $lang['subscr_m_current_header'] = 'Текущи абонаменти'; $lang['subscr_m_unsubscribe'] = 'Прекратяване на абонамента'; $lang['subscr_m_subscribe'] = 'Абониране'; $lang['subscr_m_receive'] = 'Получаване'; -$lang['subscr_style_every'] = 'на ел. писмо при всяка промяна'; -$lang['subscr_style_digest'] = 'на ел. писмо с обобщение на промените във всяка страница (всеки %.2f дни)'; -$lang['subscr_style_list'] = 'на списък с променените страници от последното ел. писмо (всеки %.2f дни)'; - -/* auth.class language support */ +$lang['subscr_style_every'] = 'на имейл при всяка промяна'; +$lang['subscr_style_digest'] = 'на имейл с обобщение на промените във всяка страница (всеки %.2f дни)'; +$lang['subscr_style_list'] = 'на списък с променените страници от последния имейл (всеки %.2f дни)'; $lang['authtempfail'] = 'Удостоверяването на потребители не е възможно за момента. Ако продължи дълго, моля уведомете администратора на Wiki страницата.'; -$lang['authpwdexpire'] = 'Срока на паролата ви ще изтече след %d дни. Препорачително е да я смените по-скоро.'; - -/* installer strings */ -$lang['i_chooselang'] = 'Изберете вашия изик'; +$lang['authpwdexpire'] = 'Срока на паролата ви ще изтече след %d дни. Препоръчително е да я смените по-скоро.'; +$lang['i_chooselang'] = 'Изберете вашия език'; $lang['i_installer'] = 'Инсталатор на DokuWiki'; $lang['i_wikiname'] = 'Име на Wiki-то'; $lang['i_enableacl'] = 'Ползване на списък за достъп (ACL) [препоръчително]'; @@ -299,19 +285,18 @@ $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?id=wiki:welcome">Вашето ново 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 (всеки може да чете, само регистрирани пишат и качват)'; $lang['i_pol2'] = 'Затворено Wiki (само регистрирани четат, пишат и качват)'; +$lang['i_allowreg'] = 'Разрешете на потребителите за се регистрират сами'; $lang['i_retry'] = 'Повторен опит'; $lang['i_license'] = 'Моля, изберете лиценз под който желаете да публикувате съдържанието:'; $lang['i_license_none'] = 'Без показване на информация относно лиценза'; $lang['i_pop_field'] = 'Моля, помогнете за усъвършенстването на DokuWiki:'; $lang['i_pop_label'] = 'Изпращане на анонимна информация до разработчиците на DokuWiki, веднъж седмично'; - $lang['recent_global'] = 'В момента преглеждате промените в именно пространство <b>%s</b>. Може да прегледате и <a href="%s">промените в цялото Wiki</a>.'; $lang['years'] = 'преди %d години'; $lang['months'] = 'преди %d месеца'; @@ -320,9 +305,7 @@ $lang['days'] = 'преди %d дни'; $lang['hours'] = 'преди %d часа'; $lang['minutes'] = 'преди %d минути'; $lang['seconds'] = 'преди %d секунди'; - $lang['wordblock'] = 'Направените от Вас промени не са съхранени, защото съдържат забранен текст (SPAM).'; - $lang['media_uploadtab'] = 'Качване'; $lang['media_searchtab'] = 'Търсене'; $lang['media_file'] = 'Файл'; @@ -346,5 +329,5 @@ $lang['media_perm_read'] = 'За съжаление нямате дост $lang['media_perm_upload'] = 'За съжаление нямате достатъчно права, за да можете да качите файла.'; $lang['media_update'] = 'Качване на нова версия'; $lang['media_restore'] = 'Възстановяване на тази версия'; - -//Setup VIM: ex: et ts=2 : +$lang['searchresult'] = 'Резултати от търсенето'; +$lang['plainhtml'] = 'Обикновен HTML'; diff --git a/inc/lang/bg/register.txt b/inc/lang/bg/register.txt index 51fbb83fe..333428005 100644 --- a/inc/lang/bg/register.txt +++ b/inc/lang/bg/register.txt @@ -1,4 +1,4 @@ ====== Регистриране като нов потребител ====== -Моля, попълнете всичките полета отдолу, за да бъде създаден нов профил. Уверете се, че въведеният **адрес на ел. поща е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]]. +Моля, попълнете всичките полета отдолу, за да бъде създаден нов профил. Уверете се, че въведеният **имейл адрес е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]]. diff --git a/inc/lang/bg/resendpwd.txt b/inc/lang/bg/resendpwd.txt index 38e2d1fe4..19dffc070 100644 --- a/inc/lang/bg/resendpwd.txt +++ b/inc/lang/bg/resendpwd.txt @@ -1,3 +1,3 @@ ====== Пращане на нова парола ====== -Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. По ел. поща ще получите линк, с който да потвърдите. +Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. Чрез имейл ще получите линк, с който да потвърдите. diff --git a/inc/lang/bg/searchpage.txt b/inc/lang/bg/searchpage.txt index 48d47515a..a44c648ca 100644 --- a/inc/lang/bg/searchpage.txt +++ b/inc/lang/bg/searchpage.txt @@ -1,5 +1,5 @@ ====== Търсене ====== -Резултата от търсенето ще намерите по-долу. Ако не намирате каквото сте търсили, може да създадете или редактирате страница, кръстена на вашата заявка, чрез съответния бутон. +Резултата от търсенето ще намерите по-долу. @CREATEPAGEINFO@ ===== Резултати ===== diff --git a/inc/lang/bn/denied.txt b/inc/lang/bn/denied.txt index 711275bad..5ba0fcf4f 100644 --- a/inc/lang/bn/denied.txt +++ b/inc/lang/bn/denied.txt @@ -1,3 +1,3 @@ ====== অনুমতি অস্বীকার ===== -দুঃখিত, আপনি কি এগিয়ে যেতে যথেষ্ট অধিকার নেই. সম্ভবত আপনি লগইন ভুলে গেছেন?
\ No newline at end of file +দুঃখিত, আপনি কি এগিয়ে যেতে যথেষ্ট অধিকার নেই.
\ No newline at end of file diff --git a/inc/lang/bn/lang.php b/inc/lang/bn/lang.php index eb8d09e64..0995bc478 100644 --- a/inc/lang/bn/lang.php +++ b/inc/lang/bn/lang.php @@ -4,6 +4,8 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author Foysol <ragebot1125@gmail.com> + * @author ninetailz <ninetailz1125@gmail.com> + * @author Khan M. B. Asad <muhammad2017@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'itr'; @@ -25,3 +27,174 @@ $lang['btn_older'] = 'কম সাম্প্রতিক >>'; $lang['btn_revs'] = 'প্রাচীন সংশোধন'; $lang['btn_recent'] = 'সাধিত পরিবর্তনসমূহ'; $lang['btn_upload'] = 'আপলোড করুন'; +$lang['btn_cancel'] = 'বাতিল করা'; +$lang['btn_index'] = 'সাইট ম্যাপ'; +$lang['btn_secedit'] = 'সম্পাদন করা'; +$lang['btn_login'] = 'লগইন'; +$lang['btn_logout'] = 'লগ আউট'; +$lang['btn_admin'] = 'অ্যাডমিন'; +$lang['btn_update'] = 'আধুনিক করা'; +$lang['btn_delete'] = 'মুছে ফেলা'; +$lang['btn_back'] = 'পিছনে'; +$lang['btn_backlink'] = 'ব্যাকলিঙ্কগুলি'; +$lang['btn_backtomedia'] = 'পিছনে Mediafile নির্বাচনে যান'; +$lang['btn_subscribe'] = 'সাবস্ক্রিপশন পরিচালনা করুন'; +$lang['btn_profile'] = 'প্রোফাইল আপডেট করুন'; +$lang['btn_reset'] = 'রিসেট করুন'; +$lang['btn_resendpwd'] = 'সেট করুন নতুন পাসওয়ার্ড'; +$lang['btn_draft'] = 'সম্পাদনা খসড়া'; +$lang['btn_recover'] = 'খসড়া উদ্ধার'; +$lang['btn_draftdel'] = 'খসড়া মুছে দিন'; +$lang['btn_revert'] = 'পুনরূদ্ধার করা'; +$lang['btn_register'] = 'খাতা'; +$lang['btn_apply'] = 'প্রয়োগ করা'; +$lang['btn_media'] = 'মিডিয়া ম্যানেজার'; +$lang['btn_deleteuser'] = 'আমার অ্যাকাউন্ট অপসারণ করুন'; +$lang['btn_img_backto'] = 'ফিরে যান %s'; +$lang['btn_mediaManager'] = 'মিডিয়া ম্যানেজারে দেখুন'; +$lang['loggedinas'] = 'লগ ইন:'; +$lang['user'] = 'ইউজারনেম'; +$lang['pass'] = 'পাসওয়ার্ড'; +$lang['newpass'] = 'নতুন পাসওয়ার্ড'; +$lang['oldpass'] = 'বর্তমান পাসওয়ার্ড নিশ্চিত করুন'; +$lang['passchk'] = 'আরো একবার'; +$lang['remember'] = 'আমাকে মনে রেখো'; +$lang['fullname'] = 'আমাকে মনে রেখো'; +$lang['email'] = 'ই মেইল'; +$lang['profile'] = 'ব্যবহারকারী প্রোফাইল'; +$lang['badlogin'] = 'দুঃখিত, ব্যবহারকারীর নাম বা পাসওয়ার্ড ভুল ছিল.'; +$lang['badpassconfirm'] = 'দুঃখিত, পাসওয়ার্ড ভুল ছিল'; +$lang['minoredit'] = 'ক্ষুদ্র পরিবর্তনসমূহ'; +$lang['draftdate'] = 'খসড়া উপর স্বতঃসংরক্ষণ'; +$lang['nosecedit'] = 'পাতা ইতিমধ্যে পরিবর্তিত হয়েছিল, অধ্যায় তথ্যের পরিবর্তে পুরো পাতা লোড তারিখ সীমার বাইরে ছিল. +'; +$lang['regmissing'] = 'দুঃখিত, আপনি সমস্ত ক্ষেত্রগুলি পূরণ করা আবশ্যক.'; +$lang['reguexists'] = 'দুঃখিত, এই লগইন সঙ্গে একটি ব্যবহারকারী ইতিমধ্যেই বিদ্যমান.'; +$lang['regsuccess'] = 'ব্যবহারকারী তৈরি করা হয়েছে এবং পাসওয়ার্ড ইমেইল করে পাঠানো হয়েছিল.'; +$lang['regsuccess2'] = 'ব্যবহারকারী তৈরি করা হয়েছে.'; +$lang['regmailfail'] = 'একটি ত্রুটি পাসওয়ার্ড মেইল পাঠানোর নেভিগেশন ছিল মনে হচ্ছে. অ্যাডমিন যোগাযোগ করুন!'; +$lang['regbadmail'] = 'প্রদত্ত ইমেইল ঠিকানা সঠিক মনে হচ্ছে - আপনি এই একটি ত্রুটি মনে হলে, অ্যাডমিন যোগাযোগ'; +$lang['regbadpass'] = 'দুটি প্রদত্ত পাসওয়ার্ড অভিন্ন নয়, আবার চেষ্টা করুন.'; +$lang['regpwmail'] = 'আপনার DokuWiki পাসওয়ার্ড'; +$lang['reghere'] = 'যদিও তোমার কোনো একাউন্ট নেই? শুধু একটি পেতে'; +$lang['profna'] = 'এই উইকি প্রোফাইল পরিবর্তন সমর্থন করে না'; +$lang['profnochange'] = 'এমন কোন পরিবর্তন, না কিছুই.'; +$lang['profnoempty'] = 'একটি খালি নাম অথবা ইমেইল ঠিকানা অনুমোদিত নয়.'; +$lang['profchanged'] = 'ইউজার প্রোফাইল সফলভাবে আপডেট.'; +$lang['profnodelete'] = 'এই উইকি ব্যবহারকারী মুছে ফেলার সমর্থন করে না'; +$lang['profdeleteuser'] = 'একাউন্ট মুছে দিন'; +$lang['profdeleted'] = 'আপনার অ্যাকাউন্টটি এই উইকি থেকে মুছে ফেলা হয়েছে'; +$lang['profconfdelete'] = 'আমি এই উইকি থেকে আমার অ্যাকাউন্ট অপসারণ করতে ইচ্ছুক. <br/> এই ক্রিয়াটি পূর্বাবস্থায় ফেরানো যায় না.'; +$lang['profconfdeletemissing'] = 'নিশ্চিতকরণ চেক বক্স ticked না'; +$lang['pwdforget'] = 'আপনার পাসওয়ার্ড ভুলে গেছেন? একটি নতুন পান'; +$lang['resendna'] = 'এই উইকি পাসওয়ার্ড পুনরায় প্রেরণ সমর্থন করে না.'; +$lang['resendpwd'] = 'জন্য সেট করুন নতুন পাসওয়ার্ড'; +$lang['resendpwdmissing'] = 'দুঃখিত, আপনি সমস্ত ক্ষেত্রগুলি পূরণ করা আবশ্যক.'; +$lang['resendpwdnouser'] = 'দুঃখিত, আমরা আমাদের ডাটাবেসের মধ্যে ব্যবহারকারীর খুঁজে পাচ্ছি না.'; +$lang['resendpwdbadauth'] = 'দুঃখিত, এই auth কোড বৈধ নয়. আপনি সম্পূর্ণ কনফার্মেশন লিঙ্ক ব্যবহার নিশ্চিত করুন.'; +$lang['resendpwdconfirm'] = 'একটি নিশ্চায়ন লিঙ্ক ইমেলের মাধ্যমে পাঠানো হয়েছে.'; +$lang['resendpwdsuccess'] = 'আপনার নতুন পাসওয়ার্ড ইমেইলের মাধ্যমে পাঠানো হয়েছে.'; +$lang['license'] = 'অন্যথায় নোট যেখানে ছাড়া, এই উইকি নেভিগেশন কন্টেন্ট নিম্নলিখিত লাইসেন্সের আওতায় লাইসেন্সকৃত:'; +$lang['licenseok'] = 'দ্রষ্টব্য: আপনি নিম্নলিখিত লাইসেন্সের অধীনে আপনার বিষয়বস্তু লাইসেন্স সম্মত হন এই পৃষ্ঠার সম্পাদনার দ্বারা:'; +$lang['searchmedia'] = 'অনুসন্ধান ফাইলের নাম:'; +$lang['searchmedia_in'] = 'অনুসন্ধান %s -এ'; +$lang['txt_upload'] = 'আপলোড করার জন্য নির্বাচন করুন ফাইল:'; +$lang['txt_filename'] = 'হিসাবে আপলোড করুন (ঐচ্ছিক):'; +$lang['txt_overwrt'] = 'বিদ্যমান ফাইল মুছে যাবে'; +$lang['maxuploadsize'] = 'সর্বোচ্চ আপলোড করুন. %s-ফাইলের প্রতি.'; +$lang['lockedby'] = 'বর্তমানে দ্বারা লক:'; +$lang['lockexpire'] = 'তালা এ মেয়াদ শেষ:'; +$lang['js']['willexpire'] = 'এই পৃষ্ঠার সম্পাদনার জন্য আপনার লক এক মিনিটের মধ্যে মেয়াদ শেষ সম্পর্কে. \ দ্বন্দ্ব লক টাইমার রিসেট প্রিভিউ বাটন ব্যবহার এড়াতে.'; +$lang['js']['notsavedyet'] = 'অসংরক্ষিত পরিবর্তন হারিয়ে যাবে.'; +$lang['js']['searchmedia'] = 'ফাইলের জন্য অনুসন্ধান'; +$lang['js']['keepopen'] = 'নির্বাচনের উপর উইন্ডো খোলা রাখুন'; +$lang['js']['hidedetails'] = 'বিশদ আড়াল করুন'; +$lang['js']['mediatitle'] = 'লিংক সেটিংস'; +$lang['js']['mediadisplay'] = 'লিংক টাইপ'; +$lang['js']['mediaalign'] = 'শ্রেণীবিন্যাস'; +$lang['js']['mediasize'] = 'চিত্র আকার'; +$lang['js']['mediatarget'] = 'লিংক টার্গেট'; +$lang['js']['mediaclose'] = 'বন্ধ করা'; +$lang['js']['mediainsert'] = 'ঢোকান'; +$lang['js']['mediadisplayimg'] = 'ছবিটি দেখান'; +$lang['js']['mediadisplaylnk'] = 'শুধুমাত্র লিঙ্ক দেখান'; +$lang['js']['mediasmall'] = 'ক্ষুদ্র সংস্করণ'; +$lang['js']['mediamedium'] = 'মাধ্যম সংস্করণ'; +$lang['js']['medialarge'] = 'বড় সংস্করণ'; +$lang['js']['mediaoriginal'] = 'আসল সংস্করণ'; +$lang['js']['medialnk'] = 'বিস্তারিত পৃষ্ঠায় লিংক'; +$lang['js']['mediadirect'] = 'মূল সরাসরি লিঙ্ক'; +$lang['js']['medianolnk'] = 'কোনো লিঙ্ক নাই'; +$lang['js']['medianolink'] = 'ইমেজ লিঙ্ক কোরো না'; +$lang['js']['medialeft'] = 'বাম দিকে ইমেজ সারিবদ্ধ কর'; +$lang['js']['mediaright'] = 'ডান দিকে ইমেজ সারিবদ্ধ কর'; +$lang['js']['mediacenter'] = 'মাঝখানে ইমেজ সারিবদ্ধ কর'; +$lang['js']['medianoalign'] = 'কোনো সারিবদ্ধ করা প্রয়োজন নেই'; +$lang['js']['nosmblinks'] = 'উইন্ডোস শেয়ার এর সাথে সংযোগ সাধন কেবল মাইক্রোসফ্ট ইন্টারনেট এক্সপ্লোরারেই সম্ভব।\nতবে আপনি লিংকটি কপি পেস্ট করতেই পারেন।'; +$lang['js']['linkwiz'] = 'লিংক উইজার্ড'; +$lang['js']['linkto'] = 'সংযোগের লক্ষ্য:'; +$lang['js']['del_confirm'] = 'নির্বাচিত আইটেম(গুলো) আসলেই মুছে ফেলতে চান?'; +$lang['js']['restore_confirm'] = 'এই সংস্করণ সত্যিই পূর্বাবস্থায় ফিরিয়ে আনতে চান?'; +$lang['js']['media_diff'] = 'পার্থক্যগুলো দেখুন:'; +$lang['js']['media_diff_both'] = 'পাশাপাশি'; +$lang['js']['media_diff_opacity'] = 'শাইন-থ্রু'; +$lang['js']['media_diff_portions'] = 'ঝেঁটিয়ে বিদায়'; +$lang['js']['media_select'] = 'ফাইল নির্বাচন...'; +$lang['js']['media_upload_btn'] = 'আপলোড'; +$lang['js']['media_done_btn'] = 'সাধিত'; +$lang['js']['media_drop'] = 'আপলোডের জন্য এখানে ফাইল ফেলুন'; +$lang['js']['media_cancel'] = 'অপসারণ'; +$lang['js']['media_overwrt'] = 'বর্তমান ফাইল ওভাররাইট করুন'; +$lang['rssfailed'] = 'ফিডটি জোগাড় করতে গিয়ে একটি ত্রুটি ঘটেছে:'; +$lang['nothingfound'] = 'কিছু পাওয়া যায়নি।'; +$lang['mediaselect'] = 'মিডিয়া ফাইল'; +$lang['fileupload'] = 'মিডিয়া ফাইল আপলোড'; +$lang['uploadsucc'] = 'আপলোড সফল'; +$lang['uploadfail'] = 'আপলোড ব্যর্থ। অনুমতি জনিত ত্রুটি কী?'; +$lang['uploadwrong'] = 'আপলোড প্রত্যাখ্যাত। এই ফাইল এক্সটেনশন অননুমোদিত।'; +$lang['uploadexist'] = 'ফাইল ইতিমধ্যেই বিরাজমান। কিছু করা হয়নি।'; +$lang['uploadbadcontent'] = 'আপলোডকৃত সামগ্রী %s ফাইল এক্সটেনশন এর সাথে মিলেনি।'; +$lang['uploadspam'] = 'স্প্যাম ব্ল্যাকলিস্ট আপলোড আটকে দিয়েছে।'; +$lang['uploadxss'] = 'সামগ্রীটি ক্ষতিকর ভেবে আপলোড আটকে দেয়া হয়েছে।'; +$lang['uploadsize'] = 'আপলোডকৃত ফাইলটি বেশি বড়ো। (সর্বোচ্চ %s)'; +$lang['deletesucc'] = '"%s" ফাইলটি মুছে ফেলা হয়েছে।'; +$lang['deletefail'] = '"%s" ডিলিট করা যায়নি - অনুমতি আছে কি না দেখুন।'; +$lang['mediainuse'] = '"%s" ফাইলটি মোছা হয়নি - এটি এখনো ব্যবহৃত হচ্ছে।'; +$lang['namespaces'] = 'নামস্থান'; +$lang['mediafiles'] = 'ফাইল পাওয়া যাবে '; +$lang['accessdenied'] = 'আপনি এই পৃষ্ঠাটি দেখতে অনুমতি দেওয়া হয়নি'; +$lang['mediausage'] = 'এই ফাইলের উল্লেখ নিম্নলিখিত সিনট্যাক্স ব্যবহার করুন:'; +$lang['mediaview'] = 'মূল ফাইলটি দেখুন'; +$lang['mediaroot'] = 'মূল'; +$lang['mediaupload'] = 'এখানে বর্তমান নামস্থান একটি ফাইল আপলোড করুন. , Subnamespaces তৈরি আপনি ফাইল নির্বাচন পরে কোলন দ্বারা বিভাজিত আপনার ফাইলের নাম তাদের পূর্বে লিখুন করুন. কোন ফাইল এছাড়াও ড্র্যাগ এবং ড্রপ দ্বারা নির্বাচন করা সম্ভব.'; +$lang['mediaextchange'] = 'ফাইল এক্সটেনশন .%s থেকে .%s\'এ পরিবর্তন হলো !'; +$lang['reference'] = 'তথ্যসূত্রের জন্য '; +$lang['ref_inuse'] = 'এই ফাইল মুছে ফেলা যাবে না কারণ এটি এখনও ব্যবহৃত হচ্ছে নিম্নলিখিত পাতা দ্বারা:'; +$lang['ref_hidden'] = 'এই পাতায় কিছু রেফারেন্স পড়ার আপনার আনুমতি নেই'; +$lang['hits'] = 'সফল '; +$lang['quickhits'] = 'পৃষ্ঠা মেলে'; +$lang['toc'] = 'সূচীপত্র'; +$lang['current'] = 'বর্তমান'; +$lang['yours'] = 'আপনার সংস্করণ +'; +$lang['diff'] = 'বর্তমান সংস্করণের পার্থক্য দেখান '; +$lang['diff2'] = 'নির্বাচিত সংস্করণের মধ্যে পার্থক্য দেখান '; +$lang['diff_type'] = 'পার্থক্য দেখুন:'; +$lang['diff_inline'] = 'ইনলাইন'; +$lang['diff_side'] = 'পাশাপাশি'; +$lang['diffprevrev'] = 'পূর্ববর্তী সংস্করণ'; +$lang['diffnextrev'] = 'পরবর্তী সংস্করণ'; +$lang['difflastrev'] = 'সর্বশেষ সংস্করণ'; +$lang['diffbothprevrev'] = 'উভয় পক্ষের পূর্ববর্তী সংস্করণ'; +$lang['diffbothnextrev'] = 'উভয় পক্ষের পরবর্তী সংস্করণ'; +$lang['line'] = 'লাইন'; +$lang['breadcrumb'] = 'ট্রেস:'; +$lang['youarehere'] = 'আপনি এখানে আছেন:'; +$lang['lastmod'] = 'শেষ বার পরিমার্জিত'; +$lang['by'] = 'দ্বারা'; +$lang['deleted'] = 'মুছে ফেলা'; +$lang['created'] = 'তৈরি করা'; +$lang['restored'] = 'পুরানো সংস্করণের পুনঃস্থাপন (%s)'; +$lang['external_edit'] = 'বাহ্যিক সম্পাদনা'; +$lang['summary'] = 'সম্পাদনা সারাংশ'; +$lang['noflash'] = 'এ href="http://www.adobe.com/products/flashplayer/"> অ্যাডোবি ফ্ল্যাশ প্লাগইন </ a> এই সামগ্রী প্রদর্শন করার জন্য প্রয়োজন হয়.'; diff --git a/inc/lang/ca-valencia/denied.txt b/inc/lang/ca-valencia/denied.txt index 39c45d946..6640e07f5 100644 --- a/inc/lang/ca-valencia/denied.txt +++ b/inc/lang/ca-valencia/denied.txt @@ -1,4 +1,4 @@ ====== Permís denegat ====== -Disculpe, pero no té permís per a continuar. ¿Haurà oblidat iniciar sessió? +Disculpe, pero no té permís per a continuar. diff --git a/inc/lang/ca-valencia/lang.php b/inc/lang/ca-valencia/lang.php index 9ab423783..3a4e30923 100644 --- a/inc/lang/ca-valencia/lang.php +++ b/inc/lang/ca-valencia/lang.php @@ -45,7 +45,7 @@ $lang['btn_recover'] = 'Recuperar borrador'; $lang['btn_draftdel'] = 'Borrar borrador'; $lang['btn_revert'] = 'Recuperar'; $lang['btn_register'] = 'Registrar-se'; -$lang['loggedinas'] = 'Sessió de'; +$lang['loggedinas'] = 'Sessió de:'; $lang['user'] = 'Nom d\'usuari'; $lang['pass'] = 'Contrasenya'; $lang['newpass'] = 'Contrasenya nova'; @@ -59,6 +59,7 @@ $lang['badlogin'] = 'Disculpe, pero el nom d\'usuari o la contrasen $lang['minoredit'] = 'Canvis menors'; $lang['draftdate'] = 'Borrador gravat el'; $lang['nosecedit'] = 'La pàgina ha canviat mentres tant, l\'informació de la secció no estava al dia, s\'ha carregat la pàgina sancera.'; +$lang['searchcreatepage'] = 'Si no ha trobat lo que buscava pot crear o editar una pàgina en el mateix nom que el text que ha buscat utilisant el botó corresponent.'; $lang['regmissing'] = 'Disculpe, pero deu omplir tots els camps.'; $lang['reguexists'] = 'Disculpe, pero ya existix un usuari en este nom.'; $lang['regsuccess'] = 'S\'ha creat l\'usuari i se li ha enviat la contrasenya per correu electrònic.'; @@ -83,11 +84,11 @@ $lang['license'] = 'Excepte quan s\'indique una atra cosa, el cont $lang['licenseok'] = 'Nota: a l\'editar esta pàgina accepta llicenciar el seu contingut baix la següent llicència:'; $lang['searchmedia'] = 'Buscar nom d\'archiu:'; $lang['searchmedia_in'] = 'Buscar en %s'; -$lang['txt_upload'] = 'Seleccione l\'archiu que vol pujar'; -$lang['txt_filename'] = 'Enviar com (opcional)'; +$lang['txt_upload'] = 'Seleccione l\'archiu que vol pujar:'; +$lang['txt_filename'] = 'Enviar com (opcional):'; $lang['txt_overwrt'] = 'Sobreescriure archius existents'; -$lang['lockedby'] = 'Actualment bloquejat per'; -$lang['lockexpire'] = 'El bloqueig venç a les'; +$lang['lockedby'] = 'Actualment bloquejat per:'; +$lang['lockexpire'] = 'El bloqueig venç a les:'; $lang['js']['willexpire'] = 'El seu bloqueig per a editar esta pàgina vencerà en un minut.\nPer a evitar conflictes utilise el botó de vista prèvia i reiniciarà el contador.'; $lang['js']['notsavedyet'] = 'Els canvis no guardats es perdran.\n¿Segur que vol continuar?'; $lang['rssfailed'] = 'Ha ocorregut un erro al solicitar este canal: '; @@ -130,9 +131,9 @@ $lang['yours'] = 'La seua versió'; $lang['diff'] = 'Mostrar diferències en la versió actual'; $lang['diff2'] = 'Mostrar diferències entre versions'; $lang['line'] = 'Llínea'; -$lang['breadcrumb'] = 'Traça'; -$lang['youarehere'] = 'Vosté està ací'; -$lang['lastmod'] = 'Última modificació el'; +$lang['breadcrumb'] = 'Traça:'; +$lang['youarehere'] = 'Vosté està ací:'; +$lang['lastmod'] = 'Última modificació el:'; $lang['by'] = 'per'; $lang['deleted'] = 'borrat'; $lang['created'] = 'creat'; @@ -174,17 +175,17 @@ $lang['admin_register'] = 'Afegir nou usuari'; $lang['metaedit'] = 'Editar meta-senyes'; $lang['metasaveerr'] = 'Erro escrivint meta-senyes'; $lang['metasaveok'] = 'Meta-senyes guardades'; -$lang['img_backto'] = 'Tornar a'; -$lang['img_title'] = 'Títul'; -$lang['img_caption'] = 'Subtítul'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Nom de l\'archiu'; -$lang['img_fsize'] = 'Tamany'; -$lang['img_artist'] = 'Fotógraf'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Càmara'; -$lang['img_keywords'] = 'Paraules clau'; +$lang['btn_img_backto'] = 'Tornar a %s'; +$lang['img_title'] = 'Títul:'; +$lang['img_caption'] = 'Subtítul:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Nom de l\'archiu:'; +$lang['img_fsize'] = 'Tamany:'; +$lang['img_artist'] = 'Fotógraf:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Càmara:'; +$lang['img_keywords'] = 'Paraules clau:'; $lang['authtempfail'] = 'L\'autenticació d\'usuaris està desactivada temporalment. Si la situació persistix, per favor, informe a l\'administrador del Wiki.'; $lang['i_chooselang'] = 'Trie l\'idioma'; $lang['i_installer'] = 'Instalador de DokuWiki'; diff --git a/inc/lang/ca-valencia/searchpage.txt b/inc/lang/ca-valencia/searchpage.txt index 80f7e9119..7ed3cd2af 100644 --- a/inc/lang/ca-valencia/searchpage.txt +++ b/inc/lang/ca-valencia/searchpage.txt @@ -1,5 +1,5 @@ ====== Buscar ====== -Pot vore els resultats de la busca ací avall. Si no ha trobat lo que buscava pot crear o editar una pàgina en el mateix nom que el text que ha buscat utilisant el botó corresponent. +Pot vore els resultats de la busca ací avall. @CREATEPAGEINFO@ ===== Resultats ===== diff --git a/inc/lang/ca/denied.txt b/inc/lang/ca/denied.txt index e6125e83b..3f66d6bb6 100644 --- a/inc/lang/ca/denied.txt +++ b/inc/lang/ca/denied.txt @@ -1,4 +1,4 @@ ====== Permís denegat ====== -No teniu prou drets per continuar. Potser us heu descuidat d'entrar? +No teniu prou drets per continuar. diff --git a/inc/lang/ca/jquery.ui.datepicker.js b/inc/lang/ca/jquery.ui.datepicker.js new file mode 100644 index 000000000..ab1dbc34d --- /dev/null +++ b/inc/lang/ca/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Inicialització en català per a l'extensió 'UI date picker' per jQuery. */ +/* Writers: (joan.leon@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['ca'] = { + closeText: 'Tanca', + prevText: 'Anterior', + nextText: 'Següent', + currentText: 'Avui', + monthNames: ['gener','febrer','març','abril','maig','juny', + 'juliol','agost','setembre','octubre','novembre','desembre'], + monthNamesShort: ['gen','feb','març','abr','maig','juny', + 'jul','ag','set','oct','nov','des'], + dayNames: ['diumenge','dilluns','dimarts','dimecres','dijous','divendres','dissabte'], + dayNamesShort: ['dg','dl','dt','dc','dj','dv','ds'], + dayNamesMin: ['dg','dl','dt','dc','dj','dv','ds'], + weekHeader: 'Set', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['ca']); + +return datepicker.regional['ca']; + +})); diff --git a/inc/lang/ca/lang.php b/inc/lang/ca/lang.php index fd19c6834..31c16ee23 100644 --- a/inc/lang/ca/lang.php +++ b/inc/lang/ca/lang.php @@ -48,7 +48,7 @@ $lang['btn_draftdel'] = 'Suprimeix esborrany'; $lang['btn_revert'] = 'Restaura'; $lang['btn_register'] = 'Registra\'m'; $lang['btn_apply'] = 'Aplica'; -$lang['loggedinas'] = 'Heu entrat com'; +$lang['loggedinas'] = 'Heu entrat com:'; $lang['user'] = 'Nom d\'usuari'; $lang['pass'] = 'Contrasenya'; $lang['newpass'] = 'Nova contrasenya'; @@ -62,6 +62,7 @@ $lang['badlogin'] = 'Nom d\'usuari o contrasenya incorrectes.'; $lang['minoredit'] = 'Canvis menors'; $lang['draftdate'] = 'L\'esborrany s\'ha desat automàticament'; $lang['nosecedit'] = 'Mentrestant la pàgina ha estat modificada. La informació de seccions estava obsoleta i ha calgut carregar la pàgina sencera.'; +$lang['searchcreatepage'] = "Si no trobeu allò que buscàveu, podeu crear una pàgina nova per mitjà del botó ''Edita aquesta pàgina''."; $lang['regmissing'] = 'Heu d\'omplir tots els camps.'; $lang['reguexists'] = 'Ja existeix un altre usuari amb aquest nom.'; $lang['regsuccess'] = 'S\'ha creat l\'usuari. La contrasenya s\'ha enviat per correu.'; @@ -87,8 +88,8 @@ $lang['license'] = 'Excepte on es digui una altra cosa, el conting $lang['licenseok'] = 'Nota. En editar aquesta pàgina esteu acceptant que el vostre contingut estigui subjecte a la llicència següent:'; $lang['searchmedia'] = 'Cerca pel nom de fitxer'; $lang['searchmedia_in'] = 'Cerca en: %s'; -$lang['txt_upload'] = 'Trieu el fitxer que voleu penjar'; -$lang['txt_filename'] = 'Introduïu el nom wiki (opcional)'; +$lang['txt_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:'; @@ -174,9 +175,9 @@ $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í'; -$lang['lastmod'] = 'Darrera modificació'; +$lang['breadcrumb'] = 'Camí:'; +$lang['youarehere'] = 'Sou aquí:'; +$lang['lastmod'] = 'Darrera modificació:'; $lang['by'] = 'per'; $lang['deleted'] = 'suprimit'; $lang['created'] = 'creat'; @@ -228,19 +229,19 @@ $lang['admin_register'] = 'Afegeix nou usuari'; $lang['metaedit'] = 'Edita metadades'; $lang['metasaveerr'] = 'No s\'han pogut escriure les metadades'; $lang['metasaveok'] = 'S\'han desat les metadades'; -$lang['img_backto'] = 'Torna a'; -$lang['img_title'] = 'Títol'; -$lang['img_caption'] = 'Peu d\'imatge'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Nom de fitxer'; -$lang['img_fsize'] = 'Mida'; -$lang['img_artist'] = 'Fotògraf'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Càmera'; -$lang['img_keywords'] = 'Paraules clau'; -$lang['img_width'] = 'Ample'; -$lang['img_height'] = 'Alçada'; +$lang['btn_img_backto'] = 'Torna a %s'; +$lang['img_title'] = 'Títol:'; +$lang['img_caption'] = 'Peu d\'imatge:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Nom de fitxer:'; +$lang['img_fsize'] = 'Mida:'; +$lang['img_artist'] = 'Fotògraf:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Càmera:'; +$lang['img_keywords'] = 'Paraules clau:'; +$lang['img_width'] = 'Ample:'; +$lang['img_height'] = 'Alçada:'; $lang['subscr_subscribe_success'] = 'S\'ha afegit %s a la llista de subscripcions per %s'; $lang['subscr_subscribe_error'] = 'Hi ha hagut un error a l\'afegir %s a la llista per %s'; $lang['subscr_subscribe_noaddress'] = 'No hi ha cap adreça associada pel vostre nom d\'usuari, no podeu ser afegit a la llista de subscripcions'; diff --git a/inc/lang/ca/searchpage.txt b/inc/lang/ca/searchpage.txt index bf69aef15..27efcdabf 100644 --- a/inc/lang/ca/searchpage.txt +++ b/inc/lang/ca/searchpage.txt @@ -1,5 +1,5 @@ ====== Cerca ====== -Heus ací els resultats de la cerca. Si no trobeu allò que buscàveu, podeu crear una pàgina nova per mitjà del botó ''Edita aquesta pàgina''. +Heus ací els resultats de la cerca. @CREATEPAGEINFO@ ===== Resultats =====
\ No newline at end of file diff --git a/inc/lang/cs/adminplugins.txt b/inc/lang/cs/adminplugins.txt index 005f8f2df..88e547abf 100644 --- a/inc/lang/cs/adminplugins.txt +++ b/inc/lang/cs/adminplugins.txt @@ -1 +1 @@ -===== Další pluginy =====
\ No newline at end of file +===== Další zásuvné moduly =====
\ No newline at end of file diff --git a/inc/lang/cs/denied.txt b/inc/lang/cs/denied.txt index 00a8811de..29524e5db 100644 --- a/inc/lang/cs/denied.txt +++ b/inc/lang/cs/denied.txt @@ -1,3 +1,3 @@ ====== Nepovolená akce ====== -Promiňte, ale nemáte dostatečná oprávnění k této činnosti. Možná jste se zapomněli přihlásit? +Promiňte, ale nemáte dostatečná oprávnění k této činnosti. diff --git a/inc/lang/cs/jquery.ui.datepicker.js b/inc/lang/cs/jquery.ui.datepicker.js new file mode 100644 index 000000000..34dae5ecd --- /dev/null +++ b/inc/lang/cs/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['cs'] = { + closeText: 'Zavřít', + prevText: '<Dříve', + nextText: 'Později>', + currentText: 'Nyní', + monthNames: ['leden','únor','březen','duben','květen','červen', + 'červenec','srpen','září','říjen','listopad','prosinec'], + monthNamesShort: ['led','úno','bře','dub','kvě','čer', + 'čvc','srp','zář','říj','lis','pro'], + dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], + dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], + dayNamesMin: ['ne','po','út','st','čt','pá','so'], + weekHeader: 'Týd', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['cs']); + +return datepicker.regional['cs']; + +})); diff --git a/inc/lang/cs/lang.php b/inc/lang/cs/lang.php index 56ffd91de..1dd4def5a 100644 --- a/inc/lang/cs/lang.php +++ b/inc/lang/cs/lang.php @@ -15,7 +15,10 @@ * @author Jakub A. Těšínský (j@kub.cz) * @author mkucera66@seznam.cz * @author Zbyněk Křivka <krivka@fit.vutbr.cz> - * @author Gerrit Uitslag <klapinklapin@gmail.com> + * @author Petr Klíma <qaxi@seznam.cz> + * @author Radovan Buroň <radovan@buron.cz> + * @author Viktor Zavadil <vzavadil@newps.cz> + * @author Jaroslav Lichtblau <jlichtblau@seznam.cz> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -48,7 +51,7 @@ $lang['btn_delete'] = 'Vymazat'; $lang['btn_back'] = 'Zpět'; $lang['btn_backlink'] = 'Zpětné odkazy'; $lang['btn_backtomedia'] = 'Zpět do Výběru dokumentu'; -$lang['btn_subscribe'] = 'Odebírat emailem změny stránky'; +$lang['btn_subscribe'] = 'Odebírat e-mailem změny stránky'; $lang['btn_profile'] = 'Upravit profil'; $lang['btn_reset'] = 'Reset'; $lang['btn_resendpwd'] = 'Nastavit nové heslo'; @@ -60,12 +63,14 @@ $lang['btn_register'] = 'Registrovat'; $lang['btn_apply'] = 'Použít'; $lang['btn_media'] = 'Správa médií'; $lang['btn_deleteuser'] = 'Odstranit můj účet'; -$lang['loggedinas'] = 'Přihlášen(a) jako'; +$lang['btn_img_backto'] = 'Zpět na %s'; +$lang['btn_mediaManager'] = 'Zobrazit ve správě médií'; +$lang['loggedinas'] = 'Přihlášen(a) jako:'; $lang['user'] = 'Uživatelské jméno'; $lang['pass'] = 'Heslo'; $lang['newpass'] = 'Nové heslo'; $lang['oldpass'] = 'Současné heslo'; -$lang['passchk'] = 'ještě jednou'; +$lang['passchk'] = 'Zopakovat'; $lang['remember'] = 'Přihlásit se nastálo'; $lang['fullname'] = 'Celé jméno'; $lang['email'] = 'E-mail'; @@ -75,18 +80,19 @@ $lang['badpassconfirm'] = 'Bohužel špatné heslo'; $lang['minoredit'] = 'Drobné změny'; $lang['draftdate'] = 'Koncept automaticky uložen v'; $lang['nosecedit'] = 'Stránka byla v mezičase změněna. Informace o sekci již nebylo platné, byla načtena celá stránka.'; +$lang['searchcreatepage'] = 'Pokud jste nenašli, co hledáte, zkuste požadovanou stránku sami vytvořit stisknutím tlačítka \'\'Vytvořit stránku\'\'.'; $lang['regmissing'] = 'Musíte vyplnit všechny údaje.'; $lang['reguexists'] = 'Uživatel se stejným jménem už je zaregistrován.'; -$lang['regsuccess'] = 'Uživatelský účet byl vytvořen a heslo zasláno mailem.'; +$lang['regsuccess'] = 'Uživatelský účet byl vytvořen a heslo zasláno e-mailem.'; $lang['regsuccess2'] = 'Uživatelský účet byl vytvořen.'; $lang['regmailfail'] = 'Zdá se, že nastala chyba při posílání mailu s heslem. Zkuste kontaktovat správce.'; -$lang['regbadmail'] = 'Zadaná mailová adresa není platná. Pokud si myslíte, že to je špatně, zkuste kontaktovat správce.'; +$lang['regbadmail'] = 'Zadaná e-mailová adresa není platná. Pokud si myslíte, že to je špatně, zkuste kontaktovat správce.'; $lang['regbadpass'] = 'Heslo nebylo zadáno dvakrát stejně, zkuste to prosím znovu.'; $lang['regpwmail'] = 'Vaše heslo do systému DokuWiki'; $lang['reghere'] = 'Nemáte uživatelský účet? Zřiďte si ho'; $lang['profna'] = 'Tato wiki neumožňuje změnu profilu'; $lang['profnochange'] = 'Žádné změny nebyly provedeny.'; -$lang['profnoempty'] = 'Nelze zadat prázdné jméno nebo mailová adresa.'; +$lang['profnoempty'] = 'Nelze vynechat jméno nebo e-mailovou adresu.'; $lang['profchanged'] = 'Uživatelský profil změněn.'; $lang['profnodelete'] = 'Tato wiki nepodporuje mazání uživatelů'; $lang['profdeleteuser'] = 'Smazat účet'; @@ -99,14 +105,14 @@ $lang['resendpwd'] = 'Nastavit nové heslo pro'; $lang['resendpwdmissing'] = 'Musíte vyplnit všechny položky.'; $lang['resendpwdnouser'] = 'Bohužel takový uživatel v systému není.'; $lang['resendpwdbadauth'] = 'Autorizační kód není platný. Zadali jste opravdu celý odkaz na potvrzovací stránku?'; -$lang['resendpwdconfirm'] = 'Odkaz na potvrzovací stránku byl odeslán mailem.'; -$lang['resendpwdsuccess'] = 'Vaše nové heslo bylo odesláno emailem.'; +$lang['resendpwdconfirm'] = 'Odkaz na potvrzovací stránku byl odeslán e-mailem.'; +$lang['resendpwdsuccess'] = 'Vaše nové heslo bylo odesláno e-mailem.'; $lang['license'] = 'Kromě míst, kde je explicitně uvedeno jinak, je obsah této wiki licencován pod následující licencí:'; $lang['licenseok'] = 'Poznámka: Tím, že editujete tuto stránku, souhlasíte, aby váš obsah byl licencován pod následující licencí:'; $lang['searchmedia'] = 'Hledat jméno souboru:'; $lang['searchmedia_in'] = 'Hledat v %s'; -$lang['txt_upload'] = 'Vyberte soubor jako přílohu'; -$lang['txt_filename'] = 'Wiki jméno (volitelné)'; +$lang['txt_upload'] = 'Vyberte soubor jako přílohu:'; +$lang['txt_filename'] = 'Wiki jméno (volitelné):'; $lang['txt_overwrt'] = 'Přepsat existující soubor'; $lang['maxuploadsize'] = 'Max. velikost souboru %s'; $lang['lockedby'] = 'Právě zamknuto:'; @@ -191,10 +197,15 @@ $lang['difflink'] = 'Odkaz na výstup diff'; $lang['diff_type'] = 'Zobrazit rozdíly:'; $lang['diff_inline'] = 'Vložené'; $lang['diff_side'] = 'Přidané'; +$lang['diffprevrev'] = 'Předchozí verze'; +$lang['diffnextrev'] = 'Následující verze'; +$lang['difflastrev'] = 'Poslední revize'; +$lang['diffbothprevrev'] = 'Obě strany předchozí revize'; +$lang['diffbothnextrev'] = 'Obě strany příští revize'; $lang['line'] = 'Řádek'; -$lang['breadcrumb'] = 'Historie'; -$lang['youarehere'] = 'Umístění'; -$lang['lastmod'] = 'Poslední úprava'; +$lang['breadcrumb'] = 'Historie:'; +$lang['youarehere'] = 'Umístění:'; +$lang['lastmod'] = 'Poslední úprava:'; $lang['by'] = 'autor:'; $lang['deleted'] = 'odstraněno'; $lang['created'] = 'vytvořeno'; @@ -247,20 +258,18 @@ $lang['admin_register'] = 'Přidat nového uživatele'; $lang['metaedit'] = 'Upravit Metadata'; $lang['metasaveerr'] = 'Chyba při zápisu metadat'; $lang['metasaveok'] = 'Metadata uložena'; -$lang['img_backto'] = 'Zpět na'; -$lang['img_title'] = 'Titulek'; -$lang['img_caption'] = 'Popis'; -$lang['img_date'] = 'Datum'; -$lang['img_fname'] = 'Jméno souboru'; -$lang['img_fsize'] = 'Velikost'; -$lang['img_artist'] = 'Autor fotografie'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Formát'; -$lang['img_camera'] = 'Typ fotoaparátu'; -$lang['img_keywords'] = 'Klíčová slova'; -$lang['img_width'] = 'Šířka'; -$lang['img_height'] = 'Výška'; -$lang['img_manager'] = 'Zobrazit ve správě médií'; +$lang['img_title'] = 'Titulek:'; +$lang['img_caption'] = 'Popis:'; +$lang['img_date'] = 'Datum:'; +$lang['img_fname'] = 'Jméno souboru:'; +$lang['img_fsize'] = 'Velikost:'; +$lang['img_artist'] = 'Autor fotografie:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Formát:'; +$lang['img_camera'] = 'Typ fotoaparátu:'; +$lang['img_keywords'] = 'Klíčová slova:'; +$lang['img_width'] = 'Šířka:'; +$lang['img_height'] = 'Výška:'; $lang['subscr_subscribe_success'] = '%s byl přihlášen do seznamu odběratelů %s'; $lang['subscr_subscribe_error'] = 'Došlo k chybě při přihlašování %s do seznamu odběratelů %s'; $lang['subscr_subscribe_noaddress'] = 'K Vašemu loginu neexistuje žádná adresa, nemohl jste být přihlášen do seznamu odběratelů.'; @@ -269,14 +278,14 @@ $lang['subscr_unsubscribe_error'] = 'Došlo k chybě při odhlašování %s ze s $lang['subscr_already_subscribed'] = '%s již je přihlášen do seznamu odběratelů %s'; $lang['subscr_not_subscribed'] = '%s není přihlášen do seznamu odběratelů %s'; $lang['subscr_m_not_subscribed'] = 'V současné době neodebíráte změny na aktuální stránce nebo ve jmenném prostoru.'; -$lang['subscr_m_new_header'] = 'Přihlásit k odebírání změn emailem'; +$lang['subscr_m_new_header'] = 'Přihlásit k odebírání změn e-mailem'; $lang['subscr_m_current_header'] = 'Aktuální odběratelé změn'; -$lang['subscr_m_unsubscribe'] = 'Odhlásit z odběru změn emailem'; -$lang['subscr_m_subscribe'] = 'Přihlásit se k odběru změn emailem'; +$lang['subscr_m_unsubscribe'] = 'Odhlásit z odběru změn e-mailem'; +$lang['subscr_m_subscribe'] = 'Přihlásit se k odběru změn e-mailem'; $lang['subscr_m_receive'] = 'Přejete si dostávat'; -$lang['subscr_style_every'] = 'email pro každou změnu'; -$lang['subscr_style_digest'] = 'souhrnný email změn pro každou stránku (každé %.2f dny/dní)'; -$lang['subscr_style_list'] = 'seznam změněných stránek od posledního emailu (každé %.2f dny/dní)'; +$lang['subscr_style_every'] = 'e-mail pro každou změnu'; +$lang['subscr_style_digest'] = 'souhrnný e-mail změn pro každou stránku (každé %.2f dny/dní)'; +$lang['subscr_style_list'] = 'seznam změněných stránek od posledního e-mailu (každé %.2f dny/dní)'; $lang['authtempfail'] = 'Autentizace uživatelů je dočasně nedostupná. Pokud tento problém přetrvává, informujte prosím správce této wiki.'; $lang['authpwdexpire'] = 'Platnost vašeho hesla vyprší za %d dní, měli byste ho změnit co nejdříve.'; $lang['i_chooselang'] = 'Vyberte si jazyk'; @@ -288,6 +297,7 @@ $lang['i_problems'] = 'Instalátor narazil na níže popsané problé $lang['i_modified'] = 'Instalátor bude z bezpečnostních důvodů pracovat pouze s čistou a ještě neupravenou instalací DokuWiki. Buď znovu rozbalte soubory z instalačního balíčku, nebo zkuste prostudovat <a href="http://dokuwiki.org/install">instrukce pro instalaci DokuWiki</a>.'; $lang['i_funcna'] = 'PHP funkce <code>%s</code> není dostupná. Váš webhosting ji možná z nějakého důvodu vypnul.'; $lang['i_phpver'] = 'Verze vaší instalace PHP <code>%s</code> je nižší než požadovaná <code>%s</code>. Budete muset aktualizovat svou instalaci PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload musí být vypnut v php.ini pro běh DokuWiki.'; $lang['i_permfail'] = 'DokuWiki nemůže zapisovat do <code>%s</code>. Budete muset opravit práva k tomuto adresáři.'; $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ě.'; @@ -299,6 +309,7 @@ $lang['i_policy'] = 'Úvodní politika ACL'; $lang['i_pol0'] = 'Otevřená wiki (čtení, zápis a upload pro všechny)'; $lang['i_pol1'] = 'Veřejná wiki (čtení pro všechny, zápis a upload pro registrované uživatele)'; $lang['i_pol2'] = 'Uzavřená wiki (čtení, zápis a upload pouze pro registrované uživatele)'; +$lang['i_allowreg'] = 'Povol uživatelům registraci'; $lang['i_retry'] = 'Zkusit znovu'; $lang['i_license'] = 'Vyberte prosím licenci obsahu:'; $lang['i_license_none'] = 'Nezobrazovat žádné licenční informace'; @@ -336,3 +347,9 @@ $lang['media_perm_read'] = 'Bohužel, nemáte práva číst soubory.'; $lang['media_perm_upload'] = 'Bohužel, nemáte práva nahrávat soubory.'; $lang['media_update'] = 'Nahrát novou verzi'; $lang['media_restore'] = 'Obnovit tuto verzi'; +$lang['currentns'] = 'Aktuální jmenný prostor'; +$lang['searchresult'] = 'Výsledek hledání'; +$lang['plainhtml'] = 'Čisté HTML'; +$lang['wikimarkup'] = 'Wiki jazyk'; +$lang['page_nonexist_rev'] = 'Stránka neexistovala na %s. Byla vytvořena dodatečne na <a href="%s">%s</a>.'; +$lang['unable_to_parse_date'] = 'Nelze rozebrat parametr "%s".'; diff --git a/inc/lang/cs/mailtext.txt b/inc/lang/cs/mailtext.txt index f235a299b..443fc3e98 100644 --- a/inc/lang/cs/mailtext.txt +++ b/inc/lang/cs/mailtext.txt @@ -13,5 +13,5 @@ Uživatel : @USER@ -- -Tento email byl automaticky vygenerován systémem DokuWiki +Tento e-mail byl automaticky vygenerován systémem DokuWiki @DOKUWIKIURL@ diff --git a/inc/lang/cs/password.txt b/inc/lang/cs/password.txt index 18f21f1b1..1b9f77778 100644 --- a/inc/lang/cs/password.txt +++ b/inc/lang/cs/password.txt @@ -1,4 +1,4 @@ -Dobrý den, +Dobrý den! Zde jsou přihlašovací informace pro wiki @TITLE@ (@DOKUWIKIURL@) @@ -7,5 +7,5 @@ Uživatelské jméno : @LOGIN@ Heslo : @PASSWORD@ -- -Tento email byl automaticky vygenerován systémem DokuWiki +Tento e-mail byl automaticky vygenerován systémem DokuWiki @DOKUWIKIURL@ diff --git a/inc/lang/cs/pwconfirm.txt b/inc/lang/cs/pwconfirm.txt index aa37b3b84..4fcc0ab26 100644 --- a/inc/lang/cs/pwconfirm.txt +++ b/inc/lang/cs/pwconfirm.txt @@ -1,13 +1,13 @@ -Dobrý den, +Dobrý den! Někdo požádal o nové heslo k vašemu uživatelskému účtu na wiki @TITLE@ (@DOKUWIKIURL@) -Pokud jste o nové heslo nežádali, ignorujte prosím tento email. +Pokud jste o nové heslo nežádali, ignorujte prosím tento e-mail. Pro potvrzení, že jste tento požadavek poslali opravdu vy, prosím otevřete následující odkaz. @CONFIRM@ -- -Tento email byl automaticky vygenerován systémem DokuWiki +Tento e-mail byl automaticky vygenerován systémem DokuWiki @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/cs/registermail.txt b/inc/lang/cs/registermail.txt index 201e7b779..f44189941 100644 --- a/inc/lang/cs/registermail.txt +++ b/inc/lang/cs/registermail.txt @@ -10,5 +10,5 @@ IP adresa : @IPADDRESS@ Hostitel : @HOSTNAME@ -- -Tento email byl automaticky vygenerován systémem DokuWiki +Tento e-mail byl automaticky vygenerován systémem DokuWiki @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/cs/resendpwd.txt b/inc/lang/cs/resendpwd.txt index 1d2aa0d97..0820f287b 100644 --- a/inc/lang/cs/resendpwd.txt +++ b/inc/lang/cs/resendpwd.txt @@ -1,3 +1,3 @@ ====== Zaslat nové heslo ====== -Abyste získali nové heslo k vašemu učtu v této wiki, vyplňte všechny níže uvedené informace . Vaše nové heslo bude zasláno na emailovou adresu, kterou jste zadali při registraci. Uživatelské jméno by mělo být stejné jako vaše uživatelské jméno, s nímž se přihlašujete do této wiki. +Abyste získali nové heslo ke svému účtu v této wiki, vyplňte všechny níže uvedené informace. Nové heslo bude zasláno na e-mailovou adresu, kterou jste zadali při registraci. Uživatelské jméno by mělo být stejné jako vaše uživatelské jméno, s nímž se přihlašujete do této wiki. diff --git a/inc/lang/cs/searchpage.txt b/inc/lang/cs/searchpage.txt index ac045e100..2f5e89ff6 100644 --- a/inc/lang/cs/searchpage.txt +++ b/inc/lang/cs/searchpage.txt @@ -1,5 +1,5 @@ ====== Vyhledávání ====== -Výsledky hledání můžete vidět níže. Pokud jste nenašli, co hledáte, zkuste požadovanou stránku sami vytvořit stisknutím tlačítka ''Vytvořit stránku''. +Výsledky hledání můžete vidět níže. @CREATEPAGEINFO@ ===== Výsledky ===== diff --git a/inc/lang/cs/subscr_digest.txt b/inc/lang/cs/subscr_digest.txt index 1b1770965..128d91931 100644 --- a/inc/lang/cs/subscr_digest.txt +++ b/inc/lang/cs/subscr_digest.txt @@ -11,12 +11,12 @@ Stará revize: @OLDPAGE@ Nová revize: @NEWPAGE@ Pro odhlášení z odebírání změn na této webové stránce -se prosím příhlašte do wiki na adrese +se prosím přihlašte do wiki na adrese @DOKUWIKIURL@, pak navštivte @SUBSCRIBE@ -a odhlaště se z odebírání změn na stránce či +a odhlaste se z odebírání změn na stránce či ve jmenném prostoru. -- -Tento email byl automaticky vygenerován systémem DokuWiki +Tento e-mail byl automaticky vygenerován systémem DokuWiki @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/cs/subscr_list.txt b/inc/lang/cs/subscr_list.txt index f85be8a9f..81b344dc8 100644 --- a/inc/lang/cs/subscr_list.txt +++ b/inc/lang/cs/subscr_list.txt @@ -11,9 +11,9 @@ Pro odhlášení z odebírání změn se prosím příhlašte do wiki na adrese @DOKUWIKIURL@, pak navštivte @SUBSCRIBE@ -a odhlaště se z odebírání změn na stránce či +a odhlaste se z odebírání změn na stránce či ve jmenném prostoru. -- -Tento email byl automaticky vygenerován systémem DokuWiki +Tento e-mail byl automaticky vygenerován systémem DokuWiki @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/cs/subscr_single.txt b/inc/lang/cs/subscr_single.txt index 1ee33da09..6f3774cd9 100644 --- a/inc/lang/cs/subscr_single.txt +++ b/inc/lang/cs/subscr_single.txt @@ -14,12 +14,12 @@ Stará revize: @OLDPAGE@ Nová revize: @NEWPAGE@ Pro odhlášení z odebírání změn na této webové stránce -se prosím příhlašte do wiki na adrese +se prosím přihlašte do wiki na adrese @DOKUWIKIURL@, pak navštivte @SUBSCRIBE@ -a odhlaště se z odebírání změn na stránce či +a odhlaste se z odebírání změn na stránce či ve jmenném prostoru. -- -Tento email byl automaticky vygenerován systémem DokuWiki +Tento e-mail byl automaticky vygenerován systémem DokuWiki @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/cs/uploadmail.txt b/inc/lang/cs/uploadmail.txt index b19b0bf7e..28f4e2895 100644 --- a/inc/lang/cs/uploadmail.txt +++ b/inc/lang/cs/uploadmail.txt @@ -1,4 +1,4 @@ -Do vaší DokuWiki byl nahrán nový dokument. Tady jsou detaily: +Do DokuWiki byl nahrán nový dokument. Tady jsou detaily: Soubor : @MEDIA@ Datum : @DATE@ @@ -10,5 +10,5 @@ MIME typ : @MIME@ Uživatel : @USER@ -- -Tento email byl automaticky vygenerován systémem DokuWiki +Tento e-mail byl automaticky vygenerován systémem DokuWiki @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/da/denied.txt b/inc/lang/da/denied.txt index a4fa8b88f..7bf3b8b9b 100644 --- a/inc/lang/da/denied.txt +++ b/inc/lang/da/denied.txt @@ -1,3 +1,3 @@ ====== Adgang nægtet! ====== -Du har ikke rettigheder til at fortsætte. Måske er du ikke logget ind. +Du har ikke rettigheder til at fortsætte. diff --git a/inc/lang/da/jquery.ui.datepicker.js b/inc/lang/da/jquery.ui.datepicker.js new file mode 100644 index 000000000..d8881e1b6 --- /dev/null +++ b/inc/lang/da/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['da'] = { + closeText: 'Luk', + prevText: '<Forrige', + nextText: 'Næste>', + currentText: 'Idag', + monthNames: ['Januar','Februar','Marts','April','Maj','Juni', + 'Juli','August','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + weekHeader: 'Uge', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['da']); + +return datepicker.regional['da']; + +})); diff --git a/inc/lang/da/lang.php b/inc/lang/da/lang.php index eb50bb240..3b353d50c 100644 --- a/inc/lang/da/lang.php +++ b/inc/lang/da/lang.php @@ -17,6 +17,8 @@ * @author Soren Birk <soer9648@hotmail.com> * @author Jens Hyllegaard <jens.hyllegaard@gmail.com> * @author soer9648 <soer9648@eucl.dk> + * @author Søren Birk <sbi@eucl.dk> + * @author Søren Birk <soer9648@eucl.dk> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -61,7 +63,9 @@ $lang['btn_register'] = 'Registrér'; $lang['btn_apply'] = 'Anvend'; $lang['btn_media'] = 'Media Manager'; $lang['btn_deleteuser'] = 'Fjern Min Konto'; -$lang['loggedinas'] = 'Logget ind som'; +$lang['btn_img_backto'] = 'Tilbage til %s'; +$lang['btn_mediaManager'] = 'Vis i Media Manager'; +$lang['loggedinas'] = 'Logget ind som:'; $lang['user'] = 'Brugernavn'; $lang['pass'] = 'Adgangskode'; $lang['newpass'] = 'Ny adgangskode'; @@ -76,6 +80,7 @@ $lang['badpassconfirm'] = 'Kodeordet var desværre forkert'; $lang['minoredit'] = 'Mindre ændringer'; $lang['draftdate'] = 'Kladde automatisk gemt d.'; $lang['nosecedit'] = 'Siden blev ændret i mellemtiden, sektions information var for gammel, hentede hele siden i stedet.'; +$lang['searchcreatepage'] = 'Hvis resultaterne ikke indeholder det du søgte efter kan du oprette et nyt dokument med samme navn som søgningen ved at trykke på knappen **\'\'[Opret dette dokument]\'\'**.'; $lang['regmissing'] = 'Du skal udfylde alle felter.'; $lang['reguexists'] = 'Dette brugernavn er allerede i brug.'; $lang['regsuccess'] = 'Du er nu oprettet som bruger. Dit adgangskode bliver sendt til dig i en e-mail.'; @@ -105,12 +110,12 @@ $lang['license'] = 'Med mindre andet angivet, vil indhold på denn $lang['licenseok'] = 'Note: ved at ændre denne side, acceptere du at dit indhold bliver frigivet under følgende licens:'; $lang['searchmedia'] = 'Søg filnavn'; $lang['searchmedia_in'] = 'Søg i %s'; -$lang['txt_upload'] = 'Vælg den fil der skal overføres'; -$lang['txt_filename'] = 'Indtast wikinavn (valgfrit)'; +$lang['txt_upload'] = 'Vælg den fil der skal overføres:'; +$lang['txt_filename'] = 'Indtast wikinavn (valgfrit):'; $lang['txt_overwrt'] = 'Overskriv eksisterende fil'; $lang['maxuploadsize'] = 'Upload max. %s pr. fil.'; -$lang['lockedby'] = 'Midlertidig låst af'; -$lang['lockexpire'] = 'Lås udløber kl.'; +$lang['lockedby'] = 'Midlertidig låst af:'; +$lang['lockexpire'] = 'Lås udløber kl:.'; $lang['js']['willexpire'] = 'Din lås på dette dokument udløber om et minut.\nTryk på Forhåndsvisning-knappen for at undgå konflikter.'; $lang['js']['notsavedyet'] = 'Ugemte ændringer vil blive mistet Fortsæt alligevel?'; @@ -147,6 +152,7 @@ $lang['js']['restore_confirm'] = 'Vil du virkeligt genskabe denne version?'; $lang['js']['media_diff'] = 'Vis forskelle:'; $lang['js']['media_diff_both'] = 'Side ved Side'; $lang['js']['media_diff_opacity'] = 'Skin-igennem'; +$lang['js']['media_diff_portions'] = 'Skub'; $lang['js']['media_select'] = 'Vælg filer...'; $lang['js']['media_upload_btn'] = 'Upload'; $lang['js']['media_done_btn'] = 'Færdig'; @@ -190,10 +196,15 @@ $lang['difflink'] = 'Link til denne sammenlinings vising'; $lang['diff_type'] = 'Vis forskelle:'; $lang['diff_inline'] = 'Indeni'; $lang['diff_side'] = 'Side ved Side'; +$lang['diffprevrev'] = 'Forrige revision'; +$lang['diffnextrev'] = 'Næste revision'; +$lang['difflastrev'] = 'Sidste revision'; +$lang['diffbothprevrev'] = 'Begge sider forrige revision'; +$lang['diffbothnextrev'] = 'Begge sider næste revision'; $lang['line'] = 'Linje'; -$lang['breadcrumb'] = 'Sti'; -$lang['youarehere'] = 'Du er her'; -$lang['lastmod'] = 'Sidst ændret'; +$lang['breadcrumb'] = 'Sti:'; +$lang['youarehere'] = 'Du er her:'; +$lang['lastmod'] = 'Sidst ændret:'; $lang['by'] = 'af'; $lang['deleted'] = 'slettet'; $lang['created'] = 'oprettet'; @@ -246,20 +257,18 @@ $lang['admin_register'] = 'Tilføj ny bruger'; $lang['metaedit'] = 'Rediger metadata'; $lang['metasaveerr'] = 'Skrivning af metadata fejlede'; $lang['metasaveok'] = 'Metadata gemt'; -$lang['img_backto'] = 'Tilbage til'; -$lang['img_title'] = 'Titel'; -$lang['img_caption'] = 'Billedtekst'; -$lang['img_date'] = 'Dato'; -$lang['img_fname'] = 'Filnavn'; -$lang['img_fsize'] = 'Størrelse'; -$lang['img_artist'] = 'Fotograf'; -$lang['img_copyr'] = 'Ophavsret'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Emneord'; -$lang['img_width'] = 'Bredde'; -$lang['img_height'] = 'Højde'; -$lang['img_manager'] = 'Vis i Media Manager'; +$lang['img_title'] = 'Titel:'; +$lang['img_caption'] = 'Billedtekst:'; +$lang['img_date'] = 'Dato:'; +$lang['img_fname'] = 'Filnavn:'; +$lang['img_fsize'] = 'Størrelse:'; +$lang['img_artist'] = 'Fotograf:'; +$lang['img_copyr'] = 'Ophavsret:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Emneord:'; +$lang['img_width'] = 'Bredde:'; +$lang['img_height'] = 'Højde:'; $lang['subscr_subscribe_success'] = 'Tilføjede %s til abonnement listen for %s'; $lang['subscr_subscribe_error'] = 'Fejl ved tilføjelse af %s til abonnement listen for %s'; $lang['subscr_subscribe_noaddress'] = 'Der er ikke nogen addresse forbundet til din bruger, så du kan ikke blive tilføjet til abonnement listen'; @@ -289,6 +298,7 @@ Du burde enten gen-udpakke filerne fra den hentede pakke eller tjekke den fuldst <a href="http://dokuwiki.org/install">DokuWiki installations instruktioner</a>'; $lang['i_funcna'] = 'PHP funtionen <code>%s</code> er ikke tilgængelig. Måske har din udbyder slået det fra af en eller anden grund?'; $lang['i_phpver'] = 'Din PHP version <code>%s</code> er mindre en den nødvendige <code>%s</code>. Du er nød til at opgradere din PHP installation.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload skal være deaktiveret i php.ini for at køre DokuWiki.'; $lang['i_permfail'] = 'DokuWiki kan ikke skrive til <code>%s</code>. Du er nød til at rette tilladelses indstillingerne for denne mappe!'; $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.'; @@ -300,10 +310,12 @@ $lang['i_policy'] = 'Begyndende ACL politik'; $lang['i_pol0'] = 'Åben Wiki (alle kan læse, skrive og uploade)'; $lang['i_pol1'] = 'Offentlig Wiki (alle kan læse, kun registrerede brugere kan skrive og overføre)'; $lang['i_pol2'] = 'Lukket Wiki (kun for registerede brugere kan læse, skrive og overføre)'; +$lang['i_allowreg'] = 'Tillad at brugere kan registrere sig selv'; $lang['i_retry'] = 'Forsøg igen'; $lang['i_license'] = 'Vælg venligst licensen du vil tilføje dit indhold under:'; $lang['i_license_none'] = 'Vis ikke licensinformationer'; $lang['i_pop_field'] = 'Hjælp os venligst med at forbedre oplevelsen af DokuWiki:'; +$lang['i_pop_label'] = 'Send anonymt brugsdata til DokuWikis udviklere, én gang om måneden'; $lang['recent_global'] = 'Du ser lige nu ændringerne i <b>%s</b> navnerummet. Du kan også <a href="%s">se de sidste ændringer for hele wiki siden </a>'; $lang['years'] = '%d år siden'; $lang['months'] = '%d måned siden'; @@ -336,3 +348,8 @@ $lang['media_perm_read'] = 'Du har ikke nok rettigheder til at læse filer $lang['media_perm_upload'] = 'Du har ikke nok rettigheder til at uploade filer.'; $lang['media_update'] = 'Upload ny version'; $lang['media_restore'] = 'Genskab denne version'; +$lang['currentns'] = 'Nuværende navnerum'; +$lang['searchresult'] = 'Søgsresultat'; +$lang['plainhtml'] = 'Ren HTML'; +$lang['wikimarkup'] = 'Wiki Opmærkning'; +$lang['page_nonexist_rev'] = 'Siden blev ikke fundet ved %s. Den blev efterfølgende oprettet ved <a href="%s">%s</a>.'; diff --git a/inc/lang/da/searchpage.txt b/inc/lang/da/searchpage.txt index eca1b589c..9cefd419c 100644 --- a/inc/lang/da/searchpage.txt +++ b/inc/lang/da/searchpage.txt @@ -1,5 +1,5 @@ ====== Søgning ====== -Du kan se resultaterne af din søgning nedenunder. Hvis resultaterne ikke indeholder det du søgte efter kan du oprette et nyt dokument med samme navn som søgningen ved at trykke på knappen **''[Opret dette dokument]''**. +Du kan se resultaterne af din søgning nedenunder. @CREATEPAGEINFO@ ===== Søgeresultater ===== diff --git a/inc/lang/de-informal/denied.txt b/inc/lang/de-informal/denied.txt index 0bc0e59a8..99004f6e1 100644 --- a/inc/lang/de-informal/denied.txt +++ b/inc/lang/de-informal/denied.txt @@ -1,4 +1,4 @@ ====== Zugang verweigert ====== -Du hast nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. Eventuell bist du nicht am Wiki angemeldet? +Du hast nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. diff --git a/inc/lang/de-informal/jquery.ui.datepicker.js b/inc/lang/de-informal/jquery.ui.datepicker.js new file mode 100644 index 000000000..bc92a931b --- /dev/null +++ b/inc/lang/de-informal/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['de'] = { + closeText: 'Schließen', + prevText: '<Zurück', + nextText: 'Vor>', + currentText: 'Heute', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + weekHeader: 'KW', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['de']); + +return datepicker.regional['de']; + +})); diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php index be3f14a18..1a1491f6b 100644 --- a/inc/lang/de-informal/lang.php +++ b/inc/lang/de-informal/lang.php @@ -66,7 +66,7 @@ $lang['btn_register'] = 'Registrieren'; $lang['btn_apply'] = 'Übernehmen'; $lang['btn_media'] = 'Medien-Manager'; $lang['btn_deleteuser'] = 'Benutzerprofil löschen'; -$lang['loggedinas'] = 'Angemeldet als'; +$lang['loggedinas'] = 'Angemeldet als:'; $lang['user'] = 'Benutzername'; $lang['pass'] = 'Passwort'; $lang['newpass'] = 'Neues Passwort'; @@ -81,6 +81,7 @@ $lang['badpassconfirm'] = 'Das Passwort war falsch.'; $lang['minoredit'] = 'Kleine Änderung'; $lang['draftdate'] = 'Entwurf gespeichert am'; $lang['nosecedit'] = 'Diese Seite wurde in der Zwischenzeit geändert, da das Sektionsinfo veraltet ist. Die ganze Seite wird stattdessen geladen.'; +$lang['searchcreatepage'] = "Falls der gesuchte Begriff nicht gefunden wurde, kannst du direkt eine neue Seite für den Suchbegriff anlegen, indem du auf den Knopf **''[Seite anlegen]''** drückst."; $lang['regmissing'] = 'Alle Felder müssen ausgefüllt werden'; $lang['reguexists'] = 'Der Benutzername existiert leider schon.'; $lang['regsuccess'] = 'Der neue Benutzer wurde angelegt und das Passwort per E-Mail versandt.'; @@ -111,12 +112,12 @@ $lang['license'] = 'Falls nicht anders bezeichnet, ist der Inhalt $lang['licenseok'] = 'Hinweis: Durch das Bearbeiten dieser Seite gibst du dein Einverständnis, dass dein Inhalt unter der folgenden Lizenz veröffentlicht wird:'; $lang['searchmedia'] = 'Suche nach Datei:'; $lang['searchmedia_in'] = 'Suche in %s'; -$lang['txt_upload'] = 'Datei zum Hochladen auswählen'; -$lang['txt_filename'] = 'Hochladen als (optional)'; +$lang['txt_upload'] = 'Datei zum Hochladen auswählen:'; +$lang['txt_filename'] = 'Hochladen als (optional):'; $lang['txt_overwrt'] = 'Bestehende Datei überschreiben'; $lang['maxuploadsize'] = 'Max. %s pro Datei-Upload.'; -$lang['lockedby'] = 'Momentan gesperrt von'; -$lang['lockexpire'] = 'Sperre läuft ab am'; +$lang['lockedby'] = 'Momentan gesperrt von:'; +$lang['lockexpire'] = 'Sperre läuft ab am:'; $lang['js']['willexpire'] = 'Die Sperre zur Bearbeitung dieser Seite läuft in einer Minute ab.\nUm Bearbeitungskonflikte zu vermeiden, solltest du sie durch einen Klick auf den Vorschau-Knopf verlängern.'; $lang['js']['notsavedyet'] = 'Nicht gespeicherte Änderungen gehen verloren!'; $lang['js']['searchmedia'] = 'Suche nach Dateien'; @@ -196,9 +197,9 @@ $lang['diff_type'] = 'Unterschiede anzeigen:'; $lang['diff_inline'] = 'Inline'; $lang['diff_side'] = 'Side by Side'; $lang['line'] = 'Zeile'; -$lang['breadcrumb'] = 'Zuletzt angesehen'; -$lang['youarehere'] = 'Du befindest dich hier'; -$lang['lastmod'] = 'Zuletzt geändert'; +$lang['breadcrumb'] = 'Zuletzt angesehen:'; +$lang['youarehere'] = 'Du befindest dich hier:'; +$lang['lastmod'] = 'Zuletzt geändert:'; $lang['by'] = 'von'; $lang['deleted'] = 'gelöscht'; $lang['created'] = 'angelegt'; @@ -251,20 +252,20 @@ $lang['admin_register'] = 'Neuen Benutzer anmelden'; $lang['metaedit'] = 'Metadaten bearbeiten'; $lang['metasaveerr'] = 'Die Metadaten konnten nicht gesichert werden'; $lang['metasaveok'] = 'Metadaten gesichert'; -$lang['img_backto'] = 'Zurück zu'; -$lang['img_title'] = 'Titel'; -$lang['img_caption'] = 'Bildunterschrift'; -$lang['img_date'] = 'Datum'; -$lang['img_fname'] = 'Dateiname'; -$lang['img_fsize'] = 'Größe'; -$lang['img_artist'] = 'Fotograf'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Schlagwörter'; -$lang['img_width'] = 'Breite'; -$lang['img_height'] = 'Höhe'; -$lang['img_manager'] = 'Im Medien-Manager anzeigen'; +$lang['btn_img_backto'] = 'Zurück zu %s'; +$lang['img_title'] = 'Titel:'; +$lang['img_caption'] = 'Bildunterschrift:'; +$lang['img_date'] = 'Datum:'; +$lang['img_fname'] = 'Dateiname:'; +$lang['img_fsize'] = 'Größe:'; +$lang['img_artist'] = 'Fotograf:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Schlagwörter:'; +$lang['img_width'] = 'Breite:'; +$lang['img_height'] = 'Höhe:'; +$lang['btn_mediaManager'] = 'Im Medien-Manager anzeigen'; $lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementliste von %s hinzugefügt'; $lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementliste von %s'; $lang['subscr_subscribe_noaddress'] = 'In deinem Account ist keine E-Mail-Adresse hinterlegt. Dadurch kann die Seite nicht abonniert werden'; diff --git a/inc/lang/de-informal/searchpage.txt b/inc/lang/de-informal/searchpage.txt index 72c57b765..e78e4abdd 100644 --- a/inc/lang/de-informal/searchpage.txt +++ b/inc/lang/de-informal/searchpage.txt @@ -1,6 +1,6 @@ ====== Suche ====== -Unten sind die Ergebnisse deiner Suche gelistet. Falls der gesuchte Begriff nicht gefunden wurde, kannst du direkt eine neue Seite für den Suchbegriff anlegen, indem du auf den Knopf **''[Seite anlegen]''** drückst. +Unten sind die Ergebnisse deiner Suche gelistet. @CREATEPAGEINFO@ ===== Ergebnisse ===== diff --git a/inc/lang/de/backlinks.txt b/inc/lang/de/backlinks.txt index 1ffa815c2..25e0ed5f9 100644 --- a/inc/lang/de/backlinks.txt +++ b/inc/lang/de/backlinks.txt @@ -1,5 +1,5 @@ ====== Links hierher ====== -Dies ist eine Liste der Seiten, welche zurück zur momentanen Seite verlinken. +Dies ist eine Liste der Seiten, welche zurück zur momentanen Seite führen. diff --git a/inc/lang/de/denied.txt b/inc/lang/de/denied.txt index 8efa81f1b..db3343876 100644 --- a/inc/lang/de/denied.txt +++ b/inc/lang/de/denied.txt @@ -1,4 +1,4 @@ ====== Zugang verweigert ====== -Sie haben nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. Eventuell sind Sie nicht am Wiki angemeldet? +Sie haben nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. diff --git a/inc/lang/de/jquery.ui.datepicker.js b/inc/lang/de/jquery.ui.datepicker.js new file mode 100644 index 000000000..bc92a931b --- /dev/null +++ b/inc/lang/de/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['de'] = { + closeText: 'Schließen', + prevText: '<Zurück', + nextText: 'Vor>', + currentText: 'Heute', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + weekHeader: 'KW', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['de']); + +return datepicker.regional['de']; + +})); diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php index 9df1035f7..2725c247a 100644 --- a/inc/lang/de/lang.php +++ b/inc/lang/de/lang.php @@ -23,6 +23,11 @@ * @author Pierre Corell <info@joomla-praxis.de> * @author Mateng Schimmerlos <mateng@firemail.de> * @author Benedikt Fey <spam@lifeisgoooood.de> + * @author Joerg <scooter22@gmx.de> + * @author Simon <st103267@stud.uni-stuttgart.de> + * @author Hoisl <hoisl@gmx.at> + * @author Marcel Eickhoff <eickhoff.marcel@gmail.com> + * @author Pascal Schröder <Pascal1802@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -67,7 +72,9 @@ $lang['btn_register'] = 'Registrieren'; $lang['btn_apply'] = 'Übernehmen'; $lang['btn_media'] = 'Medien-Manager'; $lang['btn_deleteuser'] = 'Benutzerprofil löschen'; -$lang['loggedinas'] = 'Angemeldet als'; +$lang['btn_img_backto'] = 'Zurück zu %s'; +$lang['btn_mediaManager'] = 'Im Medien-Manager anzeigen'; +$lang['loggedinas'] = 'Angemeldet als:'; $lang['user'] = 'Benutzername'; $lang['pass'] = 'Passwort'; $lang['newpass'] = 'Neues Passwort'; @@ -82,6 +89,7 @@ $lang['badpassconfirm'] = 'Das Passwort war falsch.'; $lang['minoredit'] = 'kleine Änderung'; $lang['draftdate'] = 'Entwurf gespeichert am'; $lang['nosecedit'] = 'Diese Seite wurde in der Zwischenzeit geändert, Sektionsinfo ist veraltet, lade stattdessen volle Seite.'; +$lang['searchcreatepage'] = 'Falls der gesuchte Begriff nicht gefunden wurde, können Sie direkt eine neue Seite für den Suchbegriff anlegen, indem Sie auf den **\'\'[Seite anlegen]\'\'** Knopf drücken.'; $lang['regmissing'] = 'Alle Felder müssen ausgefüllt werden.'; $lang['reguexists'] = 'Der Benutzername existiert leider schon.'; $lang['regsuccess'] = 'Der neue Benutzer wurde angelegt und das Passwort per E-Mail versandt.'; @@ -112,12 +120,12 @@ $lang['license'] = 'Falls nicht anders bezeichnet, ist der Inhalt $lang['licenseok'] = 'Hinweis: Durch das Bearbeiten dieser Seite geben Sie Ihr Einverständnis, dass Ihr Inhalt unter der folgenden Lizenz veröffentlicht wird:'; $lang['searchmedia'] = 'Suche Dateinamen:'; $lang['searchmedia_in'] = 'Suche in %s'; -$lang['txt_upload'] = 'Datei zum Hochladen auswählen'; -$lang['txt_filename'] = 'Hochladen als (optional)'; +$lang['txt_upload'] = 'Datei zum Hochladen auswählen:'; +$lang['txt_filename'] = 'Hochladen als (optional):'; $lang['txt_overwrt'] = 'Bestehende Datei überschreiben'; $lang['maxuploadsize'] = 'Max. %s pro Datei-Upload.'; -$lang['lockedby'] = 'Momentan gesperrt von'; -$lang['lockexpire'] = 'Sperre läuft ab am'; +$lang['lockedby'] = 'Momentan gesperrt von:'; +$lang['lockexpire'] = 'Sperre läuft ab am:'; $lang['js']['willexpire'] = 'Die Sperre zur Bearbeitung dieser Seite läuft in einer Minute ab.\nUm Bearbeitungskonflikte zu vermeiden, sollten Sie sie durch einen Klick auf den Vorschau-Knopf verlängern.'; $lang['js']['notsavedyet'] = 'Nicht gespeicherte Änderungen gehen verloren!'; $lang['js']['searchmedia'] = 'Suche Dateien'; @@ -196,10 +204,15 @@ $lang['difflink'] = 'Link zu dieser Vergleichsansicht'; $lang['diff_type'] = 'Unterschiede anzeigen:'; $lang['diff_inline'] = 'Inline'; $lang['diff_side'] = 'Side by Side'; +$lang['diffprevrev'] = 'Vorhergehende Überarbeitung'; +$lang['diffnextrev'] = 'Nächste Überarbeitung'; +$lang['difflastrev'] = 'Letzte Überarbeitung'; +$lang['diffbothprevrev'] = 'Beide Seiten der vorigen Revision'; +$lang['diffbothnextrev'] = 'Beide Seiten der Revision'; $lang['line'] = 'Zeile'; -$lang['breadcrumb'] = 'Zuletzt angesehen'; -$lang['youarehere'] = 'Sie befinden sich hier'; -$lang['lastmod'] = 'Zuletzt geändert'; +$lang['breadcrumb'] = 'Zuletzt angesehen:'; +$lang['youarehere'] = 'Sie befinden sich hier:'; +$lang['lastmod'] = 'Zuletzt geändert:'; $lang['by'] = 'von'; $lang['deleted'] = 'gelöscht'; $lang['created'] = 'angelegt'; @@ -252,20 +265,18 @@ $lang['admin_register'] = 'Neuen Benutzer anmelden'; $lang['metaedit'] = 'Metadaten bearbeiten'; $lang['metasaveerr'] = 'Die Metadaten konnten nicht gesichert werden'; $lang['metasaveok'] = 'Metadaten gesichert'; -$lang['img_backto'] = 'Zurück zu'; -$lang['img_title'] = 'Titel'; -$lang['img_caption'] = 'Bildunterschrift'; -$lang['img_date'] = 'Datum'; -$lang['img_fname'] = 'Dateiname'; -$lang['img_fsize'] = 'Größe'; -$lang['img_artist'] = 'FotografIn'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Schlagwörter'; -$lang['img_width'] = 'Breite'; -$lang['img_height'] = 'Höhe'; -$lang['img_manager'] = 'Im Medien-Manager anzeigen'; +$lang['img_title'] = 'Titel:'; +$lang['img_caption'] = 'Bildunterschrift:'; +$lang['img_date'] = 'Datum:'; +$lang['img_fname'] = 'Dateiname:'; +$lang['img_fsize'] = 'Größe:'; +$lang['img_artist'] = 'FotografIn:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Schlagwörter:'; +$lang['img_width'] = 'Breite:'; +$lang['img_height'] = 'Höhe:'; $lang['subscr_subscribe_success'] = '%s hat nun Änderungen der Seite %s abonniert'; $lang['subscr_subscribe_error'] = '%s kann die Änderungen der Seite %s nicht abonnieren'; $lang['subscr_subscribe_noaddress'] = 'Weil Ihre E-Mail-Adresse fehlt, können Sie das Thema nicht abonnieren'; @@ -293,6 +304,7 @@ $lang['i_problems'] = 'Das Installationsprogramm hat unten aufgeführ $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_mbfuncoverload'] = 'Um DokuWiki zu starten muss mbstring.func_overload in php.ini ausgeschaltet sein.'; $lang['i_permfail'] = '<code>%s</code> ist nicht durch DokuWiki beschreibbar. Sie müssen die Berechtigungen dieses Ordners ändern!'; $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.'; @@ -345,3 +357,6 @@ $lang['media_restore'] = 'Diese Version wiederherstellen'; $lang['currentns'] = 'Aktueller Namensraum'; $lang['searchresult'] = 'Suchergebnisse'; $lang['plainhtml'] = 'HTML Klartext'; +$lang['wikimarkup'] = 'Wiki Markup'; +$lang['page_nonexist_rev'] = 'DIe Seite exitiert nicht unter %s. Sie wurde aber unter <a herf="%s">%s</a>'; +$lang['unable_to_parse_date'] = 'Parameter "%s" kann nicht geparsed werden.'; diff --git a/inc/lang/de/searchpage.txt b/inc/lang/de/searchpage.txt index 56104551b..6cd8006ac 100644 --- a/inc/lang/de/searchpage.txt +++ b/inc/lang/de/searchpage.txt @@ -1,6 +1,6 @@ ====== Suche ====== -Unten sind die Ergebnisse Ihrer Suche gelistet. Falls der gesuchte Begriff nicht gefunden wurde, können Sie direkt eine neue Seite für den Suchbegriff anlegen, indem Sie auf den **''[Seite anlegen]''** Knopf drücken. +Unten sind die Ergebnisse Ihrer Suche gelistet. @CREATEPAGEINFO@ ===== Ergebnisse ===== diff --git a/inc/lang/el/denied.txt b/inc/lang/el/denied.txt index 36d7ae103..25fcbe8ca 100644 --- a/inc/lang/el/denied.txt +++ b/inc/lang/el/denied.txt @@ -2,4 +2,3 @@ Συγγνώμη, αλλά δεν έχετε επαρκή δικαιώματα για την συγκεκριμένη ενέργεια. -Μήπως παραλείψατε να συνδεθείτε; diff --git a/inc/lang/el/jquery.ui.datepicker.js b/inc/lang/el/jquery.ui.datepicker.js new file mode 100644 index 000000000..a852a77d7 --- /dev/null +++ b/inc/lang/el/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Greek (el) initialisation for the jQuery UI date picker plugin. */ +/* Written by Alex Cicovic (http://www.alexcicovic.com) */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['el'] = { + closeText: 'Κλείσιμο', + prevText: 'Προηγούμενος', + nextText: 'Επόμενος', + currentText: 'Τρέχων Μήνας', + monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος', + 'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'], + monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν', + 'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'], + dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'], + dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'], + dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'], + weekHeader: 'Εβδ', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['el']); + +return datepicker.regional['el']; + +})); diff --git a/inc/lang/el/lang.php b/inc/lang/el/lang.php index 8007f2b23..e5371c9f3 100644 --- a/inc/lang/el/lang.php +++ b/inc/lang/el/lang.php @@ -11,6 +11,7 @@ * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com * @author Constantinos Xanthopoulos <conx@xanthopoulos.info> * @author chris taklis <ctaklis@gmail.com> + * @author cross <cross1962@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -55,7 +56,7 @@ $lang['btn_register'] = 'Εγγραφή'; $lang['btn_apply'] = 'Εφαρμογή'; $lang['btn_media'] = 'Διαχειριστής πολυμέσων'; $lang['btn_deleteuser'] = 'Αφαίρεσε τον λογαριασμό μου'; -$lang['loggedinas'] = 'Συνδεδεμένος ως'; +$lang['loggedinas'] = 'Συνδεδεμένος ως:'; $lang['user'] = 'Όνομα χρήστη'; $lang['pass'] = 'Κωδικός'; $lang['newpass'] = 'Νέος κωδικός'; @@ -99,12 +100,12 @@ $lang['license'] = 'Εκτός εάν αναφέρεται δια $lang['licenseok'] = 'Σημείωση: Τροποποιώντας αυτή την σελίδα αποδέχεστε την διάθεση του υλικού σας σύμφωνα με την ακόλουθη άδεια:'; $lang['searchmedia'] = 'Αναζήτηση αρχείου:'; $lang['searchmedia_in'] = 'Αναζήτηση σε %s'; -$lang['txt_upload'] = 'Επιλέξτε αρχείο για φόρτωση'; -$lang['txt_filename'] = 'Επιλέξτε νέο όνομα αρχείου (προαιρετικό)'; +$lang['txt_upload'] = 'Επιλέξτε αρχείο για φόρτωση:'; +$lang['txt_filename'] = 'Επιλέξτε νέο όνομα αρχείου (προαιρετικό):'; $lang['txt_overwrt'] = 'Αντικατάσταση υπάρχοντος αρχείου'; $lang['maxuploadsize'] = 'Μέγιστο μέγεθος αρχείου: %s.'; -$lang['lockedby'] = 'Προσωρινά κλειδωμένο από'; -$lang['lockexpire'] = 'Το κλείδωμα λήγει στις'; +$lang['lockedby'] = 'Προσωρινά κλειδωμένο από:'; +$lang['lockexpire'] = 'Το κλείδωμα λήγει στις:'; $lang['js']['willexpire'] = 'Το κλείδωμά σας για την επεξεργασία αυτής της σελίδας θα λήξει σε ένα λεπτό.\n Για να το ανανεώσετε χρησιμοποιήστε την Προεπισκόπηση.'; $lang['js']['notsavedyet'] = 'Οι μη αποθηκευμένες αλλαγές θα χαθούν. Θέλετε να συνεχίσετε;'; @@ -185,9 +186,9 @@ $lang['diff_type'] = 'Προβολή διαφορών:'; $lang['diff_inline'] = 'Σε σειρά'; $lang['diff_side'] = 'Δίπλα-δίπλα'; $lang['line'] = 'Γραμμή'; -$lang['breadcrumb'] = 'Ιστορικό'; -$lang['youarehere'] = 'Είστε εδώ'; -$lang['lastmod'] = 'Τελευταία τροποποίηση'; +$lang['breadcrumb'] = 'Ιστορικό:'; +$lang['youarehere'] = 'Είστε εδώ:'; +$lang['lastmod'] = 'Τελευταία τροποποίηση:'; $lang['by'] = 'από'; $lang['deleted'] = 'διαγράφηκε'; $lang['created'] = 'δημιουργήθηκε'; @@ -240,20 +241,20 @@ $lang['admin_register'] = 'Προσθήκη νέου χρήστη'; $lang['metaedit'] = 'Τροποποίηση metadata'; $lang['metasaveerr'] = 'Η αποθήκευση των metadata απέτυχε'; $lang['metasaveok'] = 'Επιτυχής αποθήκευση metadata'; -$lang['img_backto'] = 'Επιστροφή σε'; -$lang['img_title'] = 'Τίτλος'; -$lang['img_caption'] = 'Λεζάντα'; -$lang['img_date'] = 'Ημερομηνία'; -$lang['img_fname'] = 'Όνομα αρχείου'; -$lang['img_fsize'] = 'Μέγεθος'; -$lang['img_artist'] = 'Καλλιτέχνης'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Camera'; -$lang['img_keywords'] = 'Λέξεις-κλειδιά'; -$lang['img_width'] = 'Πλάτος'; -$lang['img_height'] = 'Ύψος'; -$lang['img_manager'] = 'Εμφάνιση στον διαχειριστή πολυμέσων'; +$lang['btn_img_backto'] = 'Επιστροφή σε %s'; +$lang['img_title'] = 'Τίτλος:'; +$lang['img_caption'] = 'Λεζάντα:'; +$lang['img_date'] = 'Ημερομηνία:'; +$lang['img_fname'] = 'Όνομα αρχείου:'; +$lang['img_fsize'] = 'Μέγεθος:'; +$lang['img_artist'] = 'Καλλιτέχνης:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Camera:'; +$lang['img_keywords'] = 'Λέξεις-κλειδιά:'; +$lang['img_width'] = 'Πλάτος:'; +$lang['img_height'] = 'Ύψος:'; +$lang['btn_mediaManager'] = 'Εμφάνιση στον διαχειριστή πολυμέσων'; $lang['subscr_subscribe_success'] = 'Ο/η %s προστέθηκε στην λίστα ειδοποιήσεων για το %s'; $lang['subscr_subscribe_error'] = 'Σφάλμα κατά την προσθήκη του/της %s στην λίστα ειδοποιήσεων για το %s'; $lang['subscr_subscribe_noaddress'] = 'Δεν υπάρχει διεύθυνση ταχυδρομείου συσχετισμένη με το όνομα χρήστη σας. Κατά συνέπεια δεν μπορείτε να προστεθείτε στην λίστα ειδοποιήσεων'; diff --git a/inc/lang/el/searchpage.txt b/inc/lang/el/searchpage.txt index b52162b60..c5bbbbfae 100644 --- a/inc/lang/el/searchpage.txt +++ b/inc/lang/el/searchpage.txt @@ -1,4 +1,4 @@ ====== Αναζήτηση ====== -Τα αποτελέσματα της αναζήτησής σας: +Τα αποτελέσματα της αναζήτησής σας. @CREATEPAGEINFO@ diff --git a/inc/lang/en/denied.txt b/inc/lang/en/denied.txt index 3ac72820c..34cb8456a 100644 --- a/inc/lang/en/denied.txt +++ b/inc/lang/en/denied.txt @@ -1,4 +1,4 @@ ====== Permission Denied ====== -Sorry, you don't have enough rights to continue. Perhaps you forgot to login? +Sorry, you don't have enough rights to continue. diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php index 17a75803f..a5347e026 100644 --- a/inc/lang/en/lang.php +++ b/inc/lang/en/lang.php @@ -27,13 +27,13 @@ $lang['btn_top'] = 'Back to top'; $lang['btn_newer'] = '<< more recent'; $lang['btn_older'] = 'less recent >>'; $lang['btn_revs'] = 'Old revisions'; -$lang['btn_recent'] = 'Recent changes'; +$lang['btn_recent'] = 'Recent Changes'; $lang['btn_upload'] = 'Upload'; $lang['btn_cancel'] = 'Cancel'; $lang['btn_index'] = 'Sitemap'; $lang['btn_secedit'] = 'Edit'; -$lang['btn_login'] = 'Login'; -$lang['btn_logout'] = 'Logout'; +$lang['btn_login'] = 'Log In'; +$lang['btn_logout'] = 'Log Out'; $lang['btn_admin'] = 'Admin'; $lang['btn_update'] = 'Update'; $lang['btn_delete'] = 'Delete'; @@ -52,8 +52,10 @@ $lang['btn_register'] = 'Register'; $lang['btn_apply'] = 'Apply'; $lang['btn_media'] = 'Media Manager'; $lang['btn_deleteuser'] = 'Remove My Account'; +$lang['btn_img_backto'] = 'Back to %s'; +$lang['btn_mediaManager'] = 'View in media manager'; -$lang['loggedinas'] = 'Logged in as'; +$lang['loggedinas'] = 'Logged in as:'; $lang['user'] = 'Username'; $lang['pass'] = 'Password'; $lang['newpass'] = 'New password'; @@ -68,6 +70,7 @@ $lang['badpassconfirm'] = 'Sorry, the password was wrong'; $lang['minoredit'] = 'Minor Changes'; $lang['draftdate'] = 'Draft autosaved on'; // full dformat date will be added $lang['nosecedit'] = 'The page was changed in the meantime, section info was out of date loaded full page instead.'; +$lang['searchcreatepage'] = 'If you didn\'t find what you were looking for, you can create or edit the page named after your query with the appropriate tool.'; $lang['regmissing'] = 'Sorry, you must fill in all fields.'; $lang['reguexists'] = 'Sorry, a user with this login already exists.'; @@ -103,12 +106,12 @@ $lang['licenseok'] = 'Note: By editing this page you agree to licens $lang['searchmedia'] = 'Search file name:'; $lang['searchmedia_in'] = 'Search in %s'; -$lang['txt_upload'] = 'Select file to upload'; -$lang['txt_filename'] = 'Upload as (optional)'; +$lang['txt_upload'] = 'Select file to upload:'; +$lang['txt_filename'] = 'Upload as (optional):'; $lang['txt_overwrt'] = 'Overwrite existing file'; $lang['maxuploadsize'] = 'Upload max. %s per file.'; -$lang['lockedby'] = 'Currently locked by'; -$lang['lockexpire'] = 'Lock expires at'; +$lang['lockedby'] = 'Currently locked by:'; +$lang['lockexpire'] = 'Lock expires at:'; $lang['js']['willexpire'] = 'Your lock for editing this page is about to expire in a minute.\nTo avoid conflicts use the preview button to reset the locktimer.'; $lang['js']['notsavedyet'] = 'Unsaved changes will be lost.'; @@ -191,10 +194,15 @@ $lang['difflink'] = 'Link to this comparison view'; $lang['diff_type'] = 'View differences:'; $lang['diff_inline'] = 'Inline'; $lang['diff_side'] = 'Side by Side'; +$lang['diffprevrev'] = 'Previous revision'; +$lang['diffnextrev'] = 'Next revision'; +$lang['difflastrev'] = 'Last revision'; +$lang['diffbothprevrev'] = 'Both sides previous revision'; +$lang['diffbothnextrev'] = 'Both sides next revision'; $lang['line'] = 'Line'; -$lang['breadcrumb'] = 'Trace'; -$lang['youarehere'] = 'You are here'; -$lang['lastmod'] = 'Last modified'; +$lang['breadcrumb'] = 'Trace:'; +$lang['youarehere'] = 'You are here:'; +$lang['lastmod'] = 'Last modified:'; $lang['by'] = 'by'; $lang['deleted'] = 'removed'; $lang['created'] = 'created'; @@ -224,7 +232,7 @@ $lang['both_changes'] = 'Both pages and media files'; $lang['qb_bold'] = 'Bold Text'; $lang['qb_italic'] = 'Italic Text'; $lang['qb_underl'] = 'Underlined Text'; -$lang['qb_code'] = 'Code Text'; +$lang['qb_code'] = 'Monospaced Text'; $lang['qb_strike'] = 'Strike-through Text'; $lang['qb_h1'] = 'Level 1 Headline'; $lang['qb_h2'] = 'Level 2 Headline'; @@ -253,20 +261,18 @@ $lang['admin_register'] = 'Add new user'; $lang['metaedit'] = 'Edit Metadata'; $lang['metasaveerr'] = 'Writing metadata failed'; $lang['metasaveok'] = 'Metadata saved'; -$lang['img_backto'] = 'Back to'; -$lang['img_title'] = 'Title'; -$lang['img_caption'] = 'Caption'; -$lang['img_date'] = 'Date'; -$lang['img_fname'] = 'Filename'; -$lang['img_fsize'] = 'Size'; -$lang['img_artist'] = 'Photographer'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Camera'; -$lang['img_keywords'] = 'Keywords'; -$lang['img_width'] = 'Width'; -$lang['img_height'] = 'Height'; -$lang['img_manager'] = 'View in media manager'; +$lang['img_title'] = 'Title:'; +$lang['img_caption'] = 'Caption:'; +$lang['img_date'] = 'Date:'; +$lang['img_fname'] = 'Filename:'; +$lang['img_fsize'] = 'Size:'; +$lang['img_artist'] = 'Photographer:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Camera:'; +$lang['img_keywords'] = 'Keywords:'; +$lang['img_width'] = 'Width:'; +$lang['img_height'] = 'Height:'; $lang['subscr_subscribe_success'] = 'Added %s to subscription list for %s'; $lang['subscr_subscribe_error'] = 'Error adding %s to subscription list for %s'; @@ -302,6 +308,7 @@ $lang['i_modified'] = 'For security reasons this script will only wor <a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>'; $lang['i_funcna'] = 'PHP function <code>%s</code> is not available. Maybe your hosting provider disabled it for some reason?'; $lang['i_phpver'] = 'Your PHP version <code>%s</code> is lower than the needed <code>%s</code>. You need to upgrade your PHP install.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload must be disabled in php.ini to run DokuWiki.'; $lang['i_permfail'] = '<code>%s</code> is not writable by DokuWiki. You need to fix the permission settings of this directory!'; $lang['i_confexists'] = '<code>%s</code> already exists'; $lang['i_writeerr'] = 'Unable to create <code>%s</code>. You will need to check directory/file permissions and create the file manually.'; @@ -361,4 +368,6 @@ $lang['currentns'] = 'Current namespace'; $lang['searchresult'] = 'Search Result'; $lang['plainhtml'] = 'Plain HTML'; $lang['wikimarkup'] = 'Wiki Markup'; +$lang['page_nonexist_rev'] = 'Page did not exist at %s. It was subsequently created at <a href="%s">%s</a>.'; +$lang['unable_to_parse_date'] = 'Unable to parse at parameter "%s".'; //Setup VIM: ex: et ts=2 : diff --git a/inc/lang/en/searchpage.txt b/inc/lang/en/searchpage.txt index 50578db3f..ba0960aa6 100644 --- a/inc/lang/en/searchpage.txt +++ b/inc/lang/en/searchpage.txt @@ -1,5 +1,5 @@ ====== Search ====== -You can find the results of your search below. If you didn't find what you were looking for, you can create or edit the page named after your query with the appropriate tool. +You can find the results of your search below. @CREATEPAGEINFO@ ===== Results ===== diff --git a/inc/lang/eo/admin.txt b/inc/lang/eo/admin.txt index 4b0cf7909..4b3cf0c2a 100644 --- a/inc/lang/eo/admin.txt +++ b/inc/lang/eo/admin.txt @@ -1,3 +1,3 @@ ====== Administrado ====== -Sube vi povas trovi liston de administraj taskoj disponeblaj en DokuWiki. +Sube vi trovas liston de administraj taskoj haveblaj en DokuWiki. diff --git a/inc/lang/eo/adminplugins.txt b/inc/lang/eo/adminplugins.txt index 769a8c538..bb7e7829b 100644 --- a/inc/lang/eo/adminplugins.txt +++ b/inc/lang/eo/adminplugins.txt @@ -1 +1 @@ -===== Eksteraj kromaĵoj =====
\ No newline at end of file +===== Aldonaj kromaĵoj =====
\ No newline at end of file diff --git a/inc/lang/eo/denied.txt b/inc/lang/eo/denied.txt index 3cd6c76bf..e0abba12c 100644 --- a/inc/lang/eo/denied.txt +++ b/inc/lang/eo/denied.txt @@ -1,4 +1,4 @@ ====== Aliro malpermesita ====== -Vi ne havas sufiĉajn rajtojn rigardi ĉi tiujn paĝojn. Eble vi forgesis identiĝi. +Vi ne havas sufiĉajn rajtojn daŭrigi. diff --git a/inc/lang/eo/diff.txt b/inc/lang/eo/diff.txt index 5829a7db1..3c9db61c8 100644 --- a/inc/lang/eo/diff.txt +++ b/inc/lang/eo/diff.txt @@ -1,4 +1,4 @@ ====== Diferencoj ====== -Ĉi tie vi povas vidi diferencojn inter la aktuala versio kaj la elektita revizio de la paĝo. +Tio montras diferencojn inter du versioj de la paĝo. diff --git a/inc/lang/eo/draft.txt b/inc/lang/eo/draft.txt index 32ddc83f6..57526f3b5 100644 --- a/inc/lang/eo/draft.txt +++ b/inc/lang/eo/draft.txt @@ -1,5 +1,5 @@ ====== Skiza dosiero troviĝis ====== -Via lasta sekcio de redakto en tiu ĉi paĝo ne korekte kompletiĝis. DokuWiki aŭtomate konservis skizon dum vi laboris, kiun vi nun povas uzi por daŭrigi vian redaktadon. Sube vi povas vidi la datumaron, kiu konserviĝis el via lasta sekcio. +Via lasta redaktosesio en tiu ĉi paĝo ne ĝuste kompletiĝis. DokuWiki aŭtomate konservis skizon dum vi laboris, kiun vi nun povas uzi por daŭrigi vian redaktadon. Sube vi povas vidi la datumaron, kiu konserviĝis el via lasta sesio. Bonvolu decidi ĉu vi volas //restarigi// vian perditan redakton, //forigi// la aŭtomate konservitan skizon aŭ //rezigni// pri la redakta procezo. diff --git a/inc/lang/eo/edit.txt b/inc/lang/eo/edit.txt index 29b3382c5..ccc8a613d 100644 --- a/inc/lang/eo/edit.txt +++ b/inc/lang/eo/edit.txt @@ -1 +1 @@ -Redaktu paĝon kaj poste premu butonon titolitan '"Konservi'". Bonvolu tralegi la [[wiki:syntax|vikian sintakson]] por kompreni kiel vi povas krei paĝojn. Bonvolu redakti nur se vi planas **plibonigi** la enhavon de la paĝo. Se vi volas nur testi ion, bonvolu uzi specialan paĝon: [[wiki:playground|ludejo]]. +Redaktu paĝon kaj poste premu butonon titolitan '"Konservi'". Bonvolu tralegi la [[wiki:syntax|vikian sintakson]] pri la formatigo. Bonvolu redakti **nur**, se vi povas **plibonigi** la enhavon de la paĝo. Se vi volas nur testi ion, bonvolu uzi specialan paĝon: [[playground:playground|sablokesto]]. diff --git a/inc/lang/eo/editrev.txt b/inc/lang/eo/editrev.txt index 1640baa91..2e1406b0f 100644 --- a/inc/lang/eo/editrev.txt +++ b/inc/lang/eo/editrev.txt @@ -1,2 +1,2 @@ -**Vi laboras kun malnova revizio de la dokumento!** Se vi konservos ĝin, kreiĝos nova kuranta versio kun la sama enhavo. +**Vi laboras kun malnova revizio de la dokumento!** Se vi konservos ĝin, kreiĝos nova kuranta versio kun tiu enhavo. ---- diff --git a/inc/lang/eo/jquery.ui.datepicker.js b/inc/lang/eo/jquery.ui.datepicker.js new file mode 100644 index 000000000..ebbb7238b --- /dev/null +++ b/inc/lang/eo/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Esperanto initialisation for the jQuery UI date picker plugin. */ +/* Written by Olivier M. (olivierweb@ifrance.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['eo'] = { + closeText: 'Fermi', + prevText: '<Anta', + nextText: 'Sekv>', + currentText: 'Nuna', + monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio', + 'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aŭg','Sep','Okt','Nov','Dec'], + dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'], + dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'], + weekHeader: 'Sb', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['eo']); + +return datepicker.regional['eo']; + +})); diff --git a/inc/lang/eo/lang.php b/inc/lang/eo/lang.php index a543b2571..0cb84a2de 100644 --- a/inc/lang/eo/lang.php +++ b/inc/lang/eo/lang.php @@ -37,13 +37,13 @@ $lang['btn_secedit'] = 'Redakti'; $lang['btn_login'] = 'Ensaluti'; $lang['btn_logout'] = 'Elsaluti'; $lang['btn_admin'] = 'Administri'; -$lang['btn_update'] = 'Ĝisdatigi'; +$lang['btn_update'] = 'Aktualigi'; $lang['btn_delete'] = 'Forigi'; $lang['btn_back'] = 'Retroiri'; $lang['btn_backlink'] = 'Retroligoj'; $lang['btn_backtomedia'] = 'Retroiri al elekto de dosiero'; $lang['btn_subscribe'] = 'Aliĝi al paĝaj modifoj'; -$lang['btn_profile'] = 'Ĝisdatigi profilon'; +$lang['btn_profile'] = 'Aktualigi profilon'; $lang['btn_reset'] = 'Rekomenci'; $lang['btn_resendpwd'] = 'Sendi novan pasvorton'; $lang['btn_draft'] = 'Redakti skizon'; @@ -53,8 +53,10 @@ $lang['btn_revert'] = 'Restarigi'; $lang['btn_register'] = 'Registriĝi'; $lang['btn_apply'] = 'Apliki'; $lang['btn_media'] = 'Medio-administrilo'; -$lang['btn_deleteuser'] = 'Forigi mian aliĝon'; -$lang['loggedinas'] = 'Ensalutinta kiel'; +$lang['btn_deleteuser'] = 'Forigi mian konton'; +$lang['btn_img_backto'] = 'Iri reen al %s'; +$lang['btn_mediaManager'] = 'Rigardi en aŭdvidaĵ-administrilo'; +$lang['loggedinas'] = 'Ensalutinta kiel:'; $lang['user'] = 'Uzant-nomo'; $lang['pass'] = 'Pasvorto'; $lang['newpass'] = 'Nova pasvorto'; @@ -69,6 +71,7 @@ $lang['badpassconfirm'] = 'Pardonu, la pasvorto malĝustis'; $lang['minoredit'] = 'Etaj modifoj'; $lang['draftdate'] = 'Lasta konservo de la skizo:'; $lang['nosecedit'] = 'La paĝo ŝanĝiĝis intertempe, sekcio-informo estis malĝisdata, tial la tuta paĝo estas reŝargita.'; +$lang['searchcreatepage'] = 'Se vi ne trovis tion, kion vi serĉis, vi povas krei novan paĝon kun necesa nomo per la koresponda butono.'; $lang['regmissing'] = 'Pardonu, vi devas plenigi ĉiujn kampojn.'; $lang['reguexists'] = 'Pardonu, ĉi tiu uzanto-nomo jam ekzistas.'; $lang['regsuccess'] = 'La uzanto kreiĝis kaj la pasvorto sendiĝis per retpoŝto.'; @@ -81,7 +84,7 @@ $lang['reghere'] = 'Se vi ne havas konton, vi povas akiri ĝin'; $lang['profna'] = 'Tiu ĉi vikio ne ebligas modifon en la profiloj.'; $lang['profnochange'] = 'Neniu ŝanĝo, nenio farinda.'; $lang['profnoempty'] = 'Malplena nomo aŭ retadreso ne estas permesata.'; -$lang['profchanged'] = 'La profilo de la uzanto sukcese ĝisdatiĝis.'; +$lang['profchanged'] = 'La profilo de la uzanto sukcese aktualiĝis.'; $lang['profnodelete'] = 'Tiu ĉi vikio ne subtenas forigo de uzantoj'; $lang['profdeleteuser'] = 'Forigi aliĝon'; $lang['profdeleted'] = 'Via uzant-aliĝo estis forigata de tiu ĉi vikio'; @@ -99,12 +102,12 @@ $lang['license'] = 'Krom kie rekte indikite, enhavo de tiu ĉi vik $lang['licenseok'] = 'Rimarku: redaktante tiun ĉi paĝon vi konsentas publikigi vian enhavon laŭ la jena permesilo:'; $lang['searchmedia'] = 'Serĉi dosiernomon:'; $lang['searchmedia_in'] = 'Serĉi en %s'; -$lang['txt_upload'] = 'Elektu dosieron por alŝuti'; -$lang['txt_filename'] = 'Alŝuti kiel (laŭvole)'; +$lang['txt_upload'] = 'Elektu dosieron por alŝuti:'; +$lang['txt_filename'] = 'Alŝuti kiel (laŭvole):'; $lang['txt_overwrt'] = 'Anstataŭigi ekzistantan dosieron'; $lang['maxuploadsize'] = 'Alŝuto maks. %s po dosiero.'; -$lang['lockedby'] = 'Nune ŝlosita de'; -$lang['lockexpire'] = 'Ŝlosado ĉesos en'; +$lang['lockedby'] = 'Nune ŝlosita de:'; +$lang['lockexpire'] = 'Ŝlosado ĉesos je:'; $lang['js']['willexpire'] = 'Vi povos redakti ĉi tiun paĝon post unu minuto.\nSe vi volas nuligi tempokontrolon de la ŝlosado, premu la butonon "Antaŭrigardi".'; $lang['js']['notsavedyet'] = 'Ne konservitaj modifoj perdiĝos. Ĉu vi certe volas daŭrigi la procezon?'; @@ -184,10 +187,15 @@ $lang['difflink'] = 'Ligilo al kompara rigardo'; $lang['diff_type'] = 'Rigardi malsamojn:'; $lang['diff_inline'] = 'Samlinie'; $lang['diff_side'] = 'Apude'; +$lang['diffprevrev'] = 'Antaŭa revizio'; +$lang['diffnextrev'] = 'Sekva revizio'; +$lang['difflastrev'] = 'Lasta revizio'; +$lang['diffbothprevrev'] = 'Sur ambaŭ flankoj antaŭa revizio'; +$lang['diffbothnextrev'] = 'Sur ambaŭ flankoj sekva revizio'; $lang['line'] = 'Linio'; -$lang['breadcrumb'] = 'Paŝoj'; -$lang['youarehere'] = 'Vi estas ĉi tie'; -$lang['lastmod'] = 'Lastaj ŝanĝoj'; +$lang['breadcrumb'] = 'Paŝoj:'; +$lang['youarehere'] = 'Vi estas ĉi tie:'; +$lang['lastmod'] = 'Lastaj ŝanĝoj:'; $lang['by'] = 'de'; $lang['deleted'] = 'forigita'; $lang['created'] = 'kreita'; @@ -240,20 +248,18 @@ $lang['admin_register'] = 'Aldoni novan uzanton'; $lang['metaedit'] = 'Redakti metadatumaron'; $lang['metasaveerr'] = 'La konservo de metadatumaro malsukcesis'; $lang['metasaveok'] = 'La metadatumaro konserviĝis'; -$lang['img_backto'] = 'Iri reen al'; -$lang['img_title'] = 'Titolo'; -$lang['img_caption'] = 'Priskribo'; -$lang['img_date'] = 'Dato'; -$lang['img_fname'] = 'Dosiernomo'; -$lang['img_fsize'] = 'Grandeco'; -$lang['img_artist'] = 'Fotisto'; -$lang['img_copyr'] = 'Kopirajtoj'; -$lang['img_format'] = 'Formato'; -$lang['img_camera'] = 'Kamerao'; -$lang['img_keywords'] = 'Ŝlosilvortoj'; -$lang['img_width'] = 'Larĝeco'; -$lang['img_height'] = 'Alteco'; -$lang['img_manager'] = 'Rigardi en aŭdvidaĵ-administrilo'; +$lang['img_title'] = 'Titolo:'; +$lang['img_caption'] = 'Priskribo:'; +$lang['img_date'] = 'Dato:'; +$lang['img_fname'] = 'Dosiernomo:'; +$lang['img_fsize'] = 'Grandeco:'; +$lang['img_artist'] = 'Fotisto:'; +$lang['img_copyr'] = 'Kopirajtoj:'; +$lang['img_format'] = 'Formato:'; +$lang['img_camera'] = 'Kamerao:'; +$lang['img_keywords'] = 'Ŝlosilvortoj:'; +$lang['img_width'] = 'Larĝeco:'; +$lang['img_height'] = 'Alteco:'; $lang['subscr_subscribe_success'] = 'Aldonis %s al la abonlisto por %s'; $lang['subscr_subscribe_error'] = 'Eraro dum aldono de %s al la abonlisto por %s'; $lang['subscr_subscribe_noaddress'] = 'Ne estas adreso ligita al via ensaluto, ne eblas aldoni vin al la abonlisto'; @@ -293,6 +299,7 @@ $lang['i_policy'] = 'Komenca ACL-a agordo'; $lang['i_pol0'] = 'Malferma Vikio (legi, skribi, alŝuti povas ĉiuj)'; $lang['i_pol1'] = 'Publika Vikio (legi povas ĉiuj, skribi kaj alŝuti povas registritaj uzantoj)'; $lang['i_pol2'] = 'Ferma Vikio (legi, skribi, alŝuti nur povas registritaj uzantoj)'; +$lang['i_allowreg'] = 'Permesi al uzantoj registri sin mem'; $lang['i_retry'] = 'Reprovi'; $lang['i_license'] = 'Bonvolu elekti la permesilon, sub kiun vi volas meti vian enhavon:'; $lang['i_license_none'] = 'Ne montri licencinformojn'; diff --git a/inc/lang/eo/searchpage.txt b/inc/lang/eo/searchpage.txt index a940c503d..bdefe7b59 100644 --- a/inc/lang/eo/searchpage.txt +++ b/inc/lang/eo/searchpage.txt @@ -1,5 +1,5 @@ ====== Serĉo ====== -Sube estas rezultoj de serĉo en la retejo.\\ Se vi ne trovis tion, kion vi serĉis, vi povas krei novan paĝon kun necesa nomo per la koresponda butono. +Sube estas rezultoj de serĉo en la retejo.\\ @CREATEPAGEINFO@ ===== Rezultoj ===== diff --git a/inc/lang/es/denied.txt b/inc/lang/es/denied.txt index d7b37404b..02a76a8cf 100644 --- a/inc/lang/es/denied.txt +++ b/inc/lang/es/denied.txt @@ -1,3 +1,4 @@ ====== Permiso Denegado ====== -Lo siento, no tienes suficientes permisos para continuar. ¿Quizás has olvidado identificarte?
\ No newline at end of file +Lo siento, no tienes suficientes permisos para continuar. + diff --git a/inc/lang/es/edit.txt b/inc/lang/es/edit.txt index 55c3c1dc5..4ed253bb3 100644 --- a/inc/lang/es/edit.txt +++ b/inc/lang/es/edit.txt @@ -1,2 +1,2 @@ -Edita la página y pulsa ''Guardar''. Mira [[wiki:syntax]] para sintaxis Wiki. Por favor edita la página solo si puedes **mejorarla**. Si quieres testear algunas cosas aprende a dar tus primeros pasos en el [[playground:playground]]. +Edita la página y pulsa ''Guardar''. Vaya a [[wiki:syntax]] para ver la sintaxis del Wiki. Por favor edite la página solo si puedes **mejorarla**. Si quieres probar algo relacionado a la sintaxis, aprende a dar tus primeros pasos en el [[playground:playground]]. diff --git a/inc/lang/es/jquery.ui.datepicker.js b/inc/lang/es/jquery.ui.datepicker.js new file mode 100644 index 000000000..c51475e30 --- /dev/null +++ b/inc/lang/es/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['es'] = { + closeText: 'Cerrar', + prevText: '<Ant', + nextText: 'Sig>', + currentText: 'Hoy', + monthNames: ['enero','febrero','marzo','abril','mayo','junio', + 'julio','agosto','septiembre','octubre','noviembre','diciembre'], + monthNamesShort: ['ene','feb','mar','abr','may','jun', + 'jul','ago','sep','oct','nov','dic'], + dayNames: ['domingo','lunes','martes','miércoles','jueves','viernes','sábado'], + dayNamesShort: ['dom','lun','mar','mié','jue','vie','sáb'], + dayNamesMin: ['D','L','M','X','J','V','S'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['es']); + +return datepicker.regional['es']; + +})); diff --git a/inc/lang/es/lang.php b/inc/lang/es/lang.php index 216093f6c..865110ab9 100644 --- a/inc/lang/es/lang.php +++ b/inc/lang/es/lang.php @@ -31,6 +31,13 @@ * @author r0sk <r0sk10@gmail.com> * @author monica <may.dorado@gmail.com> * @author Antonio Bueno <atnbueno@gmail.com> + * @author Juan De La Cruz <juann.dlc@gmail.com> + * @author Fernando <fdiezala@gmail.com> + * @author Eloy <ej.perezgomez@gmail.com> + * @author Antonio Castilla <antoniocastilla@trazoide.com> + * @author Jonathan Hernández <me@jhalicea.com> + * @author pokesakura <pokesakura@gmail.com> + * @author Álvaro Iradier <airadier@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -40,13 +47,13 @@ $lang['singlequoteopening'] = '‘'; $lang['singlequoteclosing'] = '’'; $lang['apostrophe'] = '’'; $lang['btn_edit'] = 'Editar esta página'; -$lang['btn_source'] = 'Ver fuente'; +$lang['btn_source'] = 'Ver la fuente de esta página'; $lang['btn_show'] = 'Ver página'; $lang['btn_create'] = 'Crear esta página'; $lang['btn_search'] = 'Buscar'; $lang['btn_save'] = 'Guardar'; $lang['btn_preview'] = 'Previsualización'; -$lang['btn_top'] = 'Ir hasta arriba'; +$lang['btn_top'] = 'Volver arriba'; $lang['btn_newer'] = '<< más reciente'; $lang['btn_older'] = 'menos reciente >>'; $lang['btn_revs'] = 'Revisiones antiguas'; @@ -73,9 +80,11 @@ $lang['btn_draftdel'] = 'Eliminar borrador'; $lang['btn_revert'] = 'Restaurar'; $lang['btn_register'] = 'Registrarse'; $lang['btn_apply'] = 'Aplicar'; -$lang['btn_media'] = 'Gestor de ficheros'; +$lang['btn_media'] = 'Administrador de Ficheros'; $lang['btn_deleteuser'] = 'Elimina Mi Cuenta'; -$lang['loggedinas'] = 'Conectado como '; +$lang['btn_img_backto'] = 'Volver a %s'; +$lang['btn_mediaManager'] = 'Ver en el administrador de ficheros'; +$lang['loggedinas'] = 'Conectado como:'; $lang['user'] = 'Usuario'; $lang['pass'] = 'Contraseña'; $lang['newpass'] = 'Nueva contraseña'; @@ -90,6 +99,7 @@ $lang['badpassconfirm'] = 'Lo siento, la contraseña es errónea'; $lang['minoredit'] = 'Cambios menores'; $lang['draftdate'] = 'Borrador guardado automáticamente:'; $lang['nosecedit'] = 'La página ha cambiado en el lapso, la información de sección estaba anticuada, en su lugar se cargó la página completa.'; +$lang['searchcreatepage'] = 'Si no has encontrado lo que buscabas, puedes crear una nueva página con tu consulta utilizando el botón \'\'Crea esta página\'\'.'; $lang['regmissing'] = 'Lo siento, tienes que completar todos los campos.'; $lang['reguexists'] = 'Lo siento, ya existe un usuario con este nombre.'; $lang['regsuccess'] = 'El usuario ha sido creado y la contraseña se ha enviado por correo.'; @@ -116,16 +126,16 @@ $lang['resendpwdnouser'] = 'Lo siento, no se encuentra este usuario en nue $lang['resendpwdbadauth'] = 'Lo siento, este código de autenticación no es válido. Asegúrate de haber usado el enlace de confirmación entero.'; $lang['resendpwdconfirm'] = 'Un enlace para confirmación ha sido enviado por correo electrónico.'; $lang['resendpwdsuccess'] = 'Tu nueva contraseña ha sido enviada por correo electrónico.'; -$lang['license'] = 'Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia:'; +$lang['license'] = 'Excepto donde se indique lo contrario, el contenido de este wiki esta bajo la siguiente licencia:'; $lang['licenseok'] = 'Nota: Al editar esta página, estás de acuerdo en autorizar su contenido bajo la siguiente licencia:'; $lang['searchmedia'] = 'Buscar archivo:'; $lang['searchmedia_in'] = 'Buscar en %s'; -$lang['txt_upload'] = 'Selecciona el archivo a subir'; -$lang['txt_filename'] = 'Subir como (opcional)'; +$lang['txt_upload'] = 'Selecciona el archivo a subir:'; +$lang['txt_filename'] = 'Subir como (opcional):'; $lang['txt_overwrt'] = 'Sobreescribir archivo existente'; $lang['maxuploadsize'] = 'Peso máximo de %s por archivo'; -$lang['lockedby'] = 'Actualmente bloqueado por'; -$lang['lockexpire'] = 'El bloqueo expira en'; +$lang['lockedby'] = 'Actualmente bloqueado por:'; +$lang['lockexpire'] = 'El bloqueo expira en:'; $lang['js']['willexpire'] = 'El bloqueo para la edición de esta página expira en un minuto.\nPAra prevenir conflictos uso el botón Previsualizar para restaurar el contador de bloqueo.'; $lang['js']['notsavedyet'] = 'Los cambios que no se han guardado se perderán. ¿Realmente quieres continuar?'; @@ -206,10 +216,15 @@ $lang['difflink'] = 'Enlace a la vista de comparación'; $lang['diff_type'] = 'Ver diferencias'; $lang['diff_inline'] = 'En línea'; $lang['diff_side'] = 'Lado a lado'; +$lang['diffprevrev'] = 'Revisión previa'; +$lang['diffnextrev'] = 'Próxima revisión'; +$lang['difflastrev'] = 'Última revisión'; +$lang['diffbothprevrev'] = 'Ambos lados, revisión anterior'; +$lang['diffbothnextrev'] = 'Ambos lados, revisión siguiente'; $lang['line'] = 'Línea'; -$lang['breadcrumb'] = 'Traza'; -$lang['youarehere'] = 'Estás aquí'; -$lang['lastmod'] = 'Última modificación'; +$lang['breadcrumb'] = 'Traza:'; +$lang['youarehere'] = 'Estás aquí:'; +$lang['lastmod'] = 'Última modificación:'; $lang['by'] = 'por'; $lang['deleted'] = 'borrado'; $lang['created'] = 'creado'; @@ -262,20 +277,18 @@ $lang['admin_register'] = 'Añadir nuevo usuario'; $lang['metaedit'] = 'Editar metadatos'; $lang['metasaveerr'] = 'La escritura de los metadatos ha fallado'; $lang['metasaveok'] = 'Los metadatos han sido guardados'; -$lang['img_backto'] = 'Volver a'; -$lang['img_title'] = 'Título'; -$lang['img_caption'] = 'Epígrafe'; -$lang['img_date'] = 'Fecha'; -$lang['img_fname'] = 'Nombre de fichero'; -$lang['img_fsize'] = 'Tamaño'; -$lang['img_artist'] = 'Fotógrafo'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Formato'; -$lang['img_camera'] = 'Cámara'; -$lang['img_keywords'] = 'Palabras claves'; -$lang['img_width'] = 'Ancho'; -$lang['img_height'] = 'Alto'; -$lang['img_manager'] = 'Ver en el Administrador de medios'; +$lang['img_title'] = 'Título:'; +$lang['img_caption'] = 'Información: '; +$lang['img_date'] = 'Fecha:'; +$lang['img_fname'] = 'Nombre del archivo:'; +$lang['img_fsize'] = 'Tamaño:'; +$lang['img_artist'] = 'Fotógrafo:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Formato:'; +$lang['img_camera'] = 'Cámara:'; +$lang['img_keywords'] = 'Palabras claves:'; +$lang['img_width'] = 'Ancho:'; +$lang['img_height'] = 'Alto:'; $lang['subscr_subscribe_success'] = 'Se agregó %s a las listas de suscripción para %s'; $lang['subscr_subscribe_error'] = 'Error al agregar %s a las listas de suscripción para %s'; $lang['subscr_subscribe_noaddress'] = 'No hay dirección asociada con tu registro, no se puede agregarte a la lista de suscripción'; @@ -303,6 +316,7 @@ $lang['i_problems'] = 'El instalador encontró algunos problemas, se $lang['i_modified'] = 'Por razones de seguridad este script sólo funcionará con una instalación nueva y no modificada de Dokuwiki. Usted debe extraer nuevamente los ficheros del paquete bajado, o bien consultar las <a href="http://dokuwiki.org/install">instrucciones de instalación de Dokuwiki</a> completas.'; $lang['i_funcna'] = 'La función de PHP <code>%s</code> no está disponible. ¿Tal vez su proveedor de hosting la ha deshabilitado por alguna razón?'; $lang['i_phpver'] = 'Su versión de PHP <code>%s</code> es menor que la necesaria <code>%s</code>. Es necesario que actualice su instalación de PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload se debe deshabilitar en php.ini para que funcione DokuWiki.'; $lang['i_permfail'] = 'DokuWili no puede escribir <code>%s</code>. ¡Es necesario establecer correctamente los permisos de este directorio!'; $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.'; @@ -321,13 +335,13 @@ $lang['i_license_none'] = 'No mostrar ninguna información sobre licencia $lang['i_pop_field'] = 'Por favor, ayúdanos a mejorar la experiencia de DokuWiki:'; $lang['i_pop_label'] = 'Una vez al mes, enviar información anónima de uso de datos a los desarrolladores de DokuWiki'; $lang['recent_global'] = 'Actualmente estás viendo los cambios dentro del namespace <b>%s</b>. También puedes <a href="%s">ver los cambios recientes en el wiki completo</a>.'; -$lang['years'] = '%d años atrás'; -$lang['months'] = '%d meses atrás'; -$lang['weeks'] = '%d semanas atrás'; -$lang['days'] = '%d días atrás'; -$lang['hours'] = '%d horas atrás'; -$lang['minutes'] = '%d minutos atrás'; -$lang['seconds'] = '%d segundos atrás'; +$lang['years'] = 'hace %d años'; +$lang['months'] = 'hace %d meses'; +$lang['weeks'] = 'hace %d semanas'; +$lang['days'] = 'hace %d días'; +$lang['hours'] = 'hace %d horas'; +$lang['minutes'] = 'hace %d minutos'; +$lang['seconds'] = 'hace %d segundos'; $lang['wordblock'] = 'Sus cambios no se han guardado porque contienen textos bloqueados (spam).'; $lang['media_uploadtab'] = 'Cargar'; $lang['media_searchtab'] = 'Buscar'; @@ -356,3 +370,4 @@ $lang['currentns'] = 'Espacio de nombres actual'; $lang['searchresult'] = 'Resultado de la búsqueda'; $lang['plainhtml'] = 'HTML sencillo'; $lang['wikimarkup'] = 'Etiquetado Wiki'; +$lang['page_nonexist_rev'] = 'La página no existía en %s. Por tanto fue creada en <a href="%s">%s</a>.'; diff --git a/inc/lang/es/searchpage.txt b/inc/lang/es/searchpage.txt index 47a1a90dd..819815b15 100644 --- a/inc/lang/es/searchpage.txt +++ b/inc/lang/es/searchpage.txt @@ -1,5 +1,5 @@ ====== Búsqueda ====== -Puedes encontrar los resultados de tu búsqueda abajo. Si no has encontrado lo que buscabas, puedes crear una nueva página con tu consulta utilizando el botón ''Crea esta página''. +Puedes encontrar los resultados de tu búsqueda abajo. @CREATEPAGEINFO@ ===== Resultados =====
\ No newline at end of file diff --git a/inc/lang/es/uploadmail.txt b/inc/lang/es/uploadmail.txt index 9d2f980d3..cf70d00d4 100644 --- a/inc/lang/es/uploadmail.txt +++ b/inc/lang/es/uploadmail.txt @@ -1,6 +1,7 @@ -Se ha subido un fichero a tu DokuWuki. Estos son los detalles: +Se ha subido un fichero a tu DokuWiki. Estos son los detalles: Archivo : @MEDIA@ +Ultima revisión: @OLD@ Fecha : @DATE@ Navegador : @BROWSER@ Dirección IP : @IPADDRESS@ diff --git a/inc/lang/et/adminplugins.txt b/inc/lang/et/adminplugins.txt new file mode 100644 index 000000000..ee3ffb0a7 --- /dev/null +++ b/inc/lang/et/adminplugins.txt @@ -0,0 +1 @@ +===== Täiendavad laiendused =====
\ No newline at end of file diff --git a/inc/lang/et/denied.txt b/inc/lang/et/denied.txt index bb564ac57..093ccf4a8 100644 --- a/inc/lang/et/denied.txt +++ b/inc/lang/et/denied.txt @@ -1,3 +1,4 @@ ====== Sul pole ligipääsuluba ====== -Kahju küll, aga sinu tublidusest ei piisa, et edasi liikuda, selleks on vastavaid õigusi vaja. +Kahju küll, aga sinu tublidusest ei piisa, et edasi liikuda. + diff --git a/inc/lang/et/index.txt b/inc/lang/et/index.txt index 8d2e25a68..fec211d9b 100644 --- a/inc/lang/et/index.txt +++ b/inc/lang/et/index.txt @@ -1,3 +1,3 @@ ====== Sisukord ====== -See siin on nimekiri kõigist saadaval olevatest lehtedest järjestatud [[doku>namespaces|alajaotuste]] järgi. +Alloleavs on loetletud kõik saada olevaist leheküljed, mis on järjestatud [[doku>namespaces|nimeruumi]]de alusel. diff --git a/inc/lang/et/jquery.ui.datepicker.js b/inc/lang/et/jquery.ui.datepicker.js new file mode 100644 index 000000000..2a5721252 --- /dev/null +++ b/inc/lang/et/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Estonian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['et'] = { + closeText: 'Sulge', + prevText: 'Eelnev', + nextText: 'Järgnev', + currentText: 'Täna', + monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni', + 'Juuli','August','September','Oktoober','November','Detsember'], + monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni', + 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'], + dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'], + dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'], + dayNamesMin: ['P','E','T','K','N','R','L'], + weekHeader: 'näd', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['et']); + +return datepicker.regional['et']; + +})); diff --git a/inc/lang/et/lang.php b/inc/lang/et/lang.php index cc736db4d..d3c510c43 100644 --- a/inc/lang/et/lang.php +++ b/inc/lang/et/lang.php @@ -1,13 +1,15 @@ <?php + /** - * Estonian language file - * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * * @author Oliver S6ro <seem.iges@mail.ee> * @author Aari Juhanson <aari@vmg.vil.ee> * @author Kaiko Kaur <kaiko@kultuur.edu.ee> * @author kristian.kankainen@kuu.la * @author Rivo Zängov <eraser@eraser.ee> + * @author Janar Leas <janarleas@gmail.com> + * @author Janar Leas <janar.leas@eesti.ee> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -43,12 +45,16 @@ $lang['btn_backtomedia'] = 'Tagasi faili valikusse'; $lang['btn_subscribe'] = 'Jälgi seda lehte (teated meilile)'; $lang['btn_profile'] = 'Minu info'; $lang['btn_reset'] = 'Taasta'; +$lang['btn_resendpwd'] = 'Sea uus salasõna'; $lang['btn_draft'] = 'Toimeta mustandit'; $lang['btn_recover'] = 'Taata mustand'; $lang['btn_draftdel'] = 'Kustuta mustand'; $lang['btn_revert'] = 'Taasta'; $lang['btn_register'] = 'Registreeri uus kasutaja'; -$lang['loggedinas'] = 'Logis sisse kui'; +$lang['btn_apply'] = 'Kinnita'; +$lang['btn_media'] = 'Meedia haldur'; +$lang['btn_deleteuser'] = 'Eemalda minu konto'; +$lang['loggedinas'] = 'Logis sisse kui:'; $lang['user'] = 'Kasutaja'; $lang['pass'] = 'Parool'; $lang['newpass'] = 'Uus parool'; @@ -59,8 +65,11 @@ $lang['fullname'] = 'Täielik nimi'; $lang['email'] = 'E-post'; $lang['profile'] = 'Kasutaja info'; $lang['badlogin'] = 'Oops, Sinu kasutajanimi või parool oli vale.'; +$lang['badpassconfirm'] = 'Väär salasõna'; $lang['minoredit'] = 'Ebaolulised muudatused'; $lang['draftdate'] = 'Mustand automaatselt salvestatud'; +$lang['nosecedit'] = 'Leht on vahepeal muutunud, jaotiste teave osutus aegunuks sestap laeti tervelehekülg.'; +$lang['searchcreatepage'] = "Kui Sa otsitavat ei leidnud võid tekitada oma otsingu nimelise uue lehe kasutades ''Toimeta seda lehte'' nuppu."; $lang['regmissing'] = 'Kõik väljad tuleb ära täita.'; $lang['reguexists'] = 'Tegelikult on sellise nimega kasutaja juba olemas.'; $lang['regsuccess'] = 'Kasutaja sai tehtud. Parool saadeti Sulle e-posti aadressil.'; @@ -76,21 +85,30 @@ $lang['profna'] = 'Viki ei toeta profiili muudatusi'; $lang['profnochange'] = 'Muutused puuduvad.'; $lang['profnoempty'] = 'Tühi nimi ega meiliaadress pole lubatud.'; $lang['profchanged'] = 'Kasutaja info edukalt muudetud'; +$lang['profnodelete'] = 'See wiki ei toeta kasutajate kustutamist'; +$lang['profdeleteuser'] = 'Kustuta konto'; +$lang['profdeleted'] = 'Sinu kasutajakonto on sellest wikist kustutatud'; +$lang['profconfdelete'] = 'Soovin sellest wikist oma konnto eemaldada. <br/> See tegevus on taastamatu.'; +$lang['profconfdeletemissing'] = 'Kinnituse valikkast märkimata.'; $lang['pwdforget'] = 'Unustasid parooli? Tee uus'; $lang['resendna'] = 'See wiki ei toeta parooli taassaatmist.'; +$lang['resendpwd'] = 'Sea uus salasõna'; $lang['resendpwdmissing'] = 'Khmm... Sa pead täitma kõik väljad.'; $lang['resendpwdnouser'] = 'Aga sellist kasutajat ei ole.'; $lang['resendpwdbadauth'] = 'See autentimiskood ei ole õige. Kontrolli, et kopeerisid terve lingi.'; $lang['resendpwdconfirm'] = 'Kinnituslink saadeti meilile.'; $lang['resendpwdsuccess'] = 'Uus parool saadeti Sinu meilile.'; +$lang['license'] = 'Kus pole öeldud teisiti, kehtib selle wiki sisule järgmine leping:'; +$lang['licenseok'] = 'Teadmiseks: Toimetades seda lehte, nõustud avaldama oma sisu järgmise lepingu alusel:'; $lang['searchmedia'] = 'Otsi failinime:'; $lang['searchmedia_in'] = 'Otsi %s'; -$lang['txt_upload'] = 'Vali fail, mida üles laadida'; -$lang['txt_filename'] = 'Siseta oma Wikinimi (soovituslik)'; +$lang['txt_upload'] = 'Vali fail, mida üles laadida:'; +$lang['txt_filename'] = 'Siseta oma Wikinimi (soovituslik):'; $lang['txt_overwrt'] = 'Kirjutan olemasoleva faili üle'; -$lang['lockedby'] = 'Praegu on selle lukustanud'; -$lang['lockexpire'] = 'Lukustus aegub'; -$lang['js']['willexpire'] = 'Teie lukustus selle lehe toimetamisele aegub umbes minuti pärast.\nIgasugu probleemide vältimiseks kasuta eelvaate nuppu, et lukustusarvesti taas tööle panna.'; +$lang['maxuploadsize'] = 'Üleslaadimiseks lubatu enim %s faili kohta.'; +$lang['lockedby'] = 'Praegu on selle lukustanud:'; +$lang['lockexpire'] = 'Lukustus aegub:'; +$lang['js']['willexpire'] = 'Teie lukustus selle lehe toimetamisele aegub umbes minuti pärast.\nIgasugu probleemide vältimiseks kasuta eelvaate nuppu, et lukustusarvesti taas tööle panna.'; $lang['js']['notsavedyet'] = 'Sul on seal salvestamata muudatusi, mis kohe kõige kaduva teed lähevad. Kas Sa ikka tahad edasi liikuda?'; $lang['js']['searchmedia'] = 'Otsi faile'; @@ -122,6 +140,17 @@ Siiski võid kopeerida ja asetada lingi.'; $lang['js']['linkwiz'] = 'Lingi nõustaja'; $lang['js']['linkto'] = 'Lingi:'; $lang['js']['del_confirm'] = 'Kas kustutame selle kirje?'; +$lang['js']['restore_confirm'] = 'Tõesti taastad selle järgu?'; +$lang['js']['media_diff'] = 'Vaatle erisusi:'; +$lang['js']['media_diff_both'] = 'Kõrvuti'; +$lang['js']['media_diff_opacity'] = 'Kuma läbi'; +$lang['js']['media_diff_portions'] = 'Puhasta'; +$lang['js']['media_select'] = 'Vali failid…'; +$lang['js']['media_upload_btn'] = 'Lae üles'; +$lang['js']['media_done_btn'] = 'Valmis'; +$lang['js']['media_drop'] = 'Üleslaadimiseks viska failid siia'; +$lang['js']['media_cancel'] = 'eemalda'; +$lang['js']['media_overwrt'] = 'Asenda olemasolevad failid'; $lang['rssfailed'] = 'Sinu soovitud info ammutamisel tekkis viga: '; $lang['nothingfound'] = 'Oops, aga mitte muhvigi ei leitud.'; $lang['mediaselect'] = 'Hunnik faile'; @@ -131,6 +160,8 @@ $lang['uploadfail'] = 'Üleslaadimine läks nässu. Äkki pole Sa sel $lang['uploadwrong'] = 'Ei saa Sa midagi üles laadida. Oops, aga seda tüüpi faili sul lihtsalt ei lubata üles laadida'; $lang['uploadexist'] = 'Fail on juba olemas. Midagi ei muudetud.'; $lang['uploadbadcontent'] = 'Üles laaditu ei sobinud %s faililaiendiga.'; +$lang['uploadspam'] = 'Üleslaadimine tõrjuti rämpssisu vältija poolt.'; +$lang['uploadxss'] = 'Üleslaadimine tõrjuti kahtlase sisu võimaluse tõttu'; $lang['uploadsize'] = 'Üles laaditud fail on liiga suur (maksimaalne suurus on %s).'; $lang['deletesucc'] = 'Fail nimega "%s" sai kustutatud.'; $lang['deletefail'] = 'Faili nimega "%s" ei kustutatud (kontrolli õigusi).'; @@ -141,7 +172,7 @@ $lang['accessdenied'] = 'Ligipääs keelatud.'; $lang['mediausage'] = 'Kasuta järgmist kirjapilti sellele failile viitamaks:'; $lang['mediaview'] = 'Vaata faili algsel kujul.'; $lang['mediaroot'] = 'juur'; -$lang['mediaupload'] = 'Lae fail sellesse nimeruumi (kataloogi). Et tekitada veel alam nimeruum kasuta koolonit Wiki nimes.'; +$lang['mediaupload'] = 'Lae fail sellesse nimeruumi (kataloogi). Loomaks täiendavaid alam-nimeruume, kasuta wiki-nime ja nimeruumide eraldamiseks koolonit.'; $lang['mediaextchange'] = 'Faili laiend .%s-st %s-ks!'; $lang['reference'] = 'Viited'; $lang['ref_inuse'] = 'Seda faili ei saa kustutada, sest teda kasutavad järgmised lehed:'; @@ -155,20 +186,34 @@ $lang['diff'] = 'Näita erinevusi hetkel kehtiva versiooniga'; $lang['diff2'] = 'Näita valitud versioonide erinevusi'; $lang['difflink'] = 'Lõlita võrdlemise vaatele'; $lang['diff_type'] = 'Vaata erinevusi:'; +$lang['diff_inline'] = 'Jooksvalt'; $lang['diff_side'] = 'Kõrvuti'; $lang['line'] = 'Rida'; -$lang['breadcrumb'] = 'Käidud rada'; -$lang['youarehere'] = 'Sa oled siin'; -$lang['lastmod'] = 'Viimati muutnud'; +$lang['breadcrumb'] = 'Käidud rada:'; +$lang['youarehere'] = 'Sa oled siin:'; +$lang['lastmod'] = 'Viimati muutnud:'; $lang['by'] = 'persoon'; $lang['deleted'] = 'eemaldatud'; $lang['created'] = 'tekitatud'; $lang['restored'] = 'vana versioon taastatud (%s)'; $lang['external_edit'] = 'väline muutmine'; $lang['summary'] = 'kokkuvõte muudatustest'; +$lang['noflash'] = 'Sele sisu vaatamisesks on vajalik <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Laiendus</a>.'; +$lang['tools'] = 'Tööriistad'; +$lang['user_tools'] = 'Kasutaja tarvikud'; +$lang['site_tools'] = 'Lehe tööriistad'; +$lang['page_tools'] = 'Lehekülje tarvikud'; +$lang['skip_to_content'] = 'mine sisule'; +$lang['sidebar'] = 'Külgriba'; $lang['mail_newpage'] = 'leht lisatud:'; $lang['mail_changed'] = 'leht muudetud'; +$lang['mail_subscribe_list'] = 'muutunud leheküljed nimeruumis:'; $lang['mail_new_user'] = 'Uus kasutaja:'; +$lang['mail_upload'] = 'üles laetud fail:'; +$lang['changes_type'] = 'Näita mmutuseid'; +$lang['pages_changes'] = 'Leheküljed'; +$lang['media_changes'] = 'Meedia failid'; +$lang['both_changes'] = 'Mõlemid, leheküljed ja meedia failid'; $lang['qb_bold'] = 'Rasvane kiri'; $lang['qb_italic'] = 'Kaldkiri'; $lang['qb_underl'] = 'Alajoonega kiri'; @@ -193,22 +238,42 @@ $lang['qb_media'] = 'Lisa pilte ja muid faile'; $lang['qb_sig'] = 'Lisa allkiri!'; $lang['qb_smileys'] = 'Emotikonid'; $lang['qb_chars'] = 'Erisümbolid'; +$lang['upperns'] = 'mine ülemisse nimeruumi'; $lang['admin_register'] = 'Lisa kasutaja'; $lang['metaedit'] = 'Muuda lisainfot'; $lang['metasaveerr'] = 'Lisainfo salvestamine läks untsu.'; $lang['metasaveok'] = 'Lisainfo salvestatud'; -$lang['img_backto'] = 'Tagasi'; -$lang['img_title'] = 'Tiitel'; -$lang['img_caption'] = 'Kirjeldus'; -$lang['img_date'] = 'Kuupäev'; -$lang['img_fname'] = 'Faili nimi'; -$lang['img_fsize'] = 'Suurus'; -$lang['img_artist'] = 'Autor'; -$lang['img_copyr'] = 'Autoriõigused'; -$lang['img_format'] = 'Formaat'; -$lang['img_camera'] = 'Kaamera'; -$lang['img_keywords'] = 'Võtmesõnad'; +$lang['btn_img_backto'] = 'Tagasi %s'; +$lang['img_title'] = 'Tiitel:'; +$lang['img_caption'] = 'Kirjeldus:'; +$lang['img_date'] = 'Kuupäev:'; +$lang['img_fname'] = 'Faili nimi:'; +$lang['img_fsize'] = 'Suurus:'; +$lang['img_artist'] = 'Autor:'; +$lang['img_copyr'] = 'Autoriõigused:'; +$lang['img_format'] = 'Formaat:'; +$lang['img_camera'] = 'Kaamera:'; +$lang['img_keywords'] = 'Võtmesõnad:'; +$lang['img_width'] = 'Laius:'; +$lang['img_height'] = 'Kõrgus:'; +$lang['btn_mediaManager'] = 'Näita meediahalduris'; +$lang['subscr_subscribe_success'] = '%s lisati %s tellijaks'; +$lang['subscr_subscribe_error'] = 'Viga %s lisamisel %s tellijaks'; +$lang['subscr_subscribe_noaddress'] = 'Sinu kasutajaga pole seotud ühtegi aadressi, seega ei saa sind tellijaks lisada'; +$lang['subscr_unsubscribe_success'] = '%s eemaldati %s tellijatest'; +$lang['subscr_unsubscribe_error'] = 'Viga %s eemaldamisel %s tellijatest'; +$lang['subscr_already_subscribed'] = '%s on juba %s tellija'; +$lang['subscr_not_subscribed'] = '%s pole %s tellija'; +$lang['subscr_m_not_subscribed'] = 'Sina pole hetkel selle lehekülje ega nimeruumi tellija.'; +$lang['subscr_m_new_header'] = 'Lisa tellimus'; +$lang['subscr_m_current_header'] = 'Hetkel tellitud'; +$lang['subscr_m_unsubscribe'] = 'Eemalda tellimus'; +$lang['subscr_m_subscribe'] = 'Telli'; +$lang['subscr_style_every'] = 'igast toimetamisest teavitab ekiri'; +$lang['subscr_style_digest'] = 'kokkuvõte ekirjaga toimetamistest igal leheküljel (iga %.2f päeva järel)'; +$lang['subscr_style_list'] = 'Peale viimast ekirja (iga %.2f päeva järel) toimetaud lehekülgede loend.'; $lang['authtempfail'] = 'Kasutajate autentimine on ajutiselt rivist väljas. Kui see olukord mõne aja jooksul ei parane, siis teavita sellest serveri haldajat.'; +$lang['authpwdexpire'] = 'Sinu salasõna aegub %päeva pärast, võiksid seda peatselt muuta.'; $lang['i_chooselang'] = 'Vali keel'; $lang['i_installer'] = 'DokuWiki paigaldaja'; $lang['i_wikiname'] = 'Wiki nimi'; @@ -218,9 +283,11 @@ $lang['i_problems'] = 'Paigaldaja leidis mõned vead, mis on allpool $lang['i_modified'] = 'Õnnetuste vältimiseks läheb see skript käima ainult värskelt paigaldatud ja muutmata Dokuwiki peal. Sa peaksid ilmselt kogu koodi uuesti lahti pakkima. Vaata ka <a href="http://dokuwiki.org/install">Dokuwiki installeerimis juhendit</a>'; $lang['i_funcna'] = 'PHP funktsiooni <code>%s</code> ei ole olemas.võibolla sinu serveri hooldaja on selle mingil põhjusel keelanud?'; +$lang['i_phpver'] = 'Sinu PHP versioon <code>%s</code> on vanem nõutavast <code>%s</code>. Pead oma paigaldatud PHP-d uuendama.'; $lang['i_permfail'] = 'Dokuwiki ei saa kirjutada faili <code>%s</code>. Kontrolli serveris failide õigused üle.'; $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_badhash'] = 'Tundmatu või muutunud dokuwiki.php (hash=<code>%s</code>)'; $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?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.'; @@ -228,4 +295,45 @@ $lang['i_policy'] = 'Wiki õiguste algne poliitika'; $lang['i_pol0'] = 'Avatud (lugemine, kirjutamine ja üleslaadimine kõigile lubatud)'; $lang['i_pol1'] = 'Avalikuks lugemiseks (lugeda saavad kõik, kirjutada ja üles laadida vaid registreeritud kasutajad)'; $lang['i_pol2'] = 'Suletud (kõik õigused, kaasaarvatud lugemine on lubatud vaid registreeritud kasutajatele)'; +$lang['i_allowreg'] = 'Luba kasutajail endid ise arvele võtta'; $lang['i_retry'] = 'Proovi uuesti'; +$lang['i_license'] = 'Vali leping, mille alusel wiki sisu avaldatakse:'; +$lang['i_license_none'] = 'Ära näita mingit lepingu teavet'; +$lang['i_pop_field'] = 'Aitake meil täiendada DokuWiki kasutuskogemsut:'; +$lang['i_pop_label'] = 'Kord kuus, saada DokuWiki arendajatele anonüümseid kasutus andmeid.'; +$lang['recent_global'] = 'Uurid hetkel nimeruumi <b>%s</b> muudatusi. Võid uurida ka <a href="%s">kogu selle wiki</a> muudatusi.'; +$lang['years'] = '%d aasta eest'; +$lang['months'] = '%d kuu eest'; +$lang['weeks'] = '%d nädala eest'; +$lang['days'] = '%d päeva eest'; +$lang['hours'] = '%d tunni eest'; +$lang['minutes'] = '%d minuti eest'; +$lang['seconds'] = '%d sekundi eest'; +$lang['wordblock'] = 'Sinu toimetus jäeti muutmata tõrjutud teksti tõttu (rämpspost?).'; +$lang['media_uploadtab'] = 'Lae-↑ '; +$lang['media_searchtab'] = 'Otsi'; +$lang['media_file'] = 'Fail'; +$lang['media_viewtab'] = 'Vaata'; +$lang['media_edittab'] = 'Toimeta'; +$lang['media_historytab'] = 'Ajalugu'; +$lang['media_list_thumbs'] = 'Pisipildid'; +$lang['media_list_rows'] = 'Ridu'; +$lang['media_sort_name'] = 'Nimi'; +$lang['media_sort_date'] = 'Kuupäev'; +$lang['media_namespaces'] = 'Vali nimeruum'; +$lang['media_files'] = 'Failid %s-is'; +$lang['media_upload'] = 'Lae %s-ssi'; +$lang['media_search'] = 'Leia %s-st'; +$lang['media_view'] = '%s'; +$lang['media_viewold'] = '%s asub %s-s'; +$lang['media_edit'] = 'Muuda %s-i'; +$lang['media_history'] = '%s ajalugu'; +$lang['media_meta_edited'] = 'toimetati päiseteavet'; +$lang['media_perm_read'] = 'Sul pole piisavaid õigusi failide vaatamiseks'; +$lang['media_perm_upload'] = 'Sul pole piisavaid õigusi failide üleslaadimiseks'; +$lang['media_update'] = 'Lea üles uus järk'; +$lang['media_restore'] = 'Ennista sellele järgule'; +$lang['currentns'] = 'Hetke nimeruum'; +$lang['searchresult'] = 'Otsingu tulemus'; +$lang['plainhtml'] = 'Liht-HTML'; +$lang['wikimarkup'] = 'Wiki märgistus'; diff --git a/inc/lang/et/resetpwd.txt b/inc/lang/et/resetpwd.txt new file mode 100644 index 000000000..3a802986f --- /dev/null +++ b/inc/lang/et/resetpwd.txt @@ -0,0 +1,3 @@ +====== Sea uus salasõna ====== + +Sisesta oma selle wiki kasutajale uus salasõna
\ No newline at end of file diff --git a/inc/lang/et/searchpage.txt b/inc/lang/et/searchpage.txt index bbc86b637..6ba57324a 100644 --- a/inc/lang/et/searchpage.txt +++ b/inc/lang/et/searchpage.txt @@ -1,5 +1,5 @@ ====== Otsi ====== -Leiad vasted oma otsingule. Kui Sa otsitavat ei leidnud võid tekitada oma otsingu nimelise uue lehe kasutades ''Toimeta seda lehte'' nuppu. +Leiad vasted oma otsingule. @CREATEPAGEINFO@ ===== Vasted ===== diff --git a/inc/lang/et/subscr_digest.txt b/inc/lang/et/subscr_digest.txt new file mode 100644 index 000000000..7446fd9f4 --- /dev/null +++ b/inc/lang/et/subscr_digest.txt @@ -0,0 +1,21 @@ +Tere! + +Wiki-s @TITLE@ toimetati lehekülge @PAGE@. + +Muudatustest lähemalt: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Endine: @OLDPAGE@ +Uus: @NEWPAGE@ + +Lehekülje teavituste katkestamiseks, sisene wiki-sse aadressil @DOKUWIKIURL@ +ja mine: +@SUBSCRIBE@ +ning loobu lehekülje ja/või nimeruumi muudatuste teavitustest. + +-- +Selle e-kirja lõi DokuWiki aadressilt +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/et/subscr_form.txt b/inc/lang/et/subscr_form.txt new file mode 100644 index 000000000..61a005b47 --- /dev/null +++ b/inc/lang/et/subscr_form.txt @@ -0,0 +1,3 @@ +====== Tellimuste haldus ====== + +See lehekülg lubab sul hallata oma tellimusi antud leheküljele ja nimeruumile.
\ No newline at end of file diff --git a/inc/lang/et/subscr_list.txt b/inc/lang/et/subscr_list.txt new file mode 100644 index 000000000..0629651b7 --- /dev/null +++ b/inc/lang/et/subscr_list.txt @@ -0,0 +1,19 @@ +Tere! + +Wiki-s @TITLE@ toimetati nimeruumi @PAGE@. +Muudatustest lähemalt: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- +Endine: @OLDPAGE@ +Uus: @NEWPAGE@ + +Lehekülje teavituste katkestamiseks, sisene wiki-sse aadressil @DOKUWIKIURL@ +ja mine: +@SUBSCRIBE@ +ning loobu lehekülje ja/või nimeruumi muudatuste teavitustest. + +-- +Selle e-kirja lõi DokuWiki aadressilt +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/et/subscr_single.txt b/inc/lang/et/subscr_single.txt new file mode 100644 index 000000000..fff069f65 --- /dev/null +++ b/inc/lang/et/subscr_single.txt @@ -0,0 +1,23 @@ +Tere! + +Wiki-s @TITLE@ toimetati lehekülge @PAGE@. +Muudatustest lähemalt: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Kuupäev : @DATE@ +Kasutaja : @USER@ +Kokkuvõte: @SUMMARY@ +Endine: @OLDPAGE@ +Uus: @NEWPAGE@ + +Lehekülje teavituste katkestamiseks, sisene wiki-sse aadressil @DOKUWIKIURL@ +ja mine: +@SUBSCRIBE@ +ning loobu lehekülje ja/või nimeruumi muudatuste teavitustest. + +-- +Selle e-kirja lõi DokuWiki aadressilt +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/et/uploadmail.txt b/inc/lang/et/uploadmail.txt new file mode 100644 index 000000000..2d3a6aa7e --- /dev/null +++ b/inc/lang/et/uploadmail.txt @@ -0,0 +1,16 @@ +Sinu DokuWiki-sse lisati fail. +Lähemalt: + + Fail : @MEDIA@ + Endine : @OLD@ + Kuupäev : @DATE@ + Veebilehitseja : @BROWSER@ + IP-aadress : @IPADDRESS@ + Hostinimi : @HOSTNAME@ + Suurus : @SIZE@ + MIME liik : @MIME@ + Kasutaja : @ USER@ + +-- +Selle e-kirja lõi DokuWiki aadressilt +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/eu/denied.txt b/inc/lang/eu/denied.txt index 257076a3d..869c4c7d8 100644 --- a/inc/lang/eu/denied.txt +++ b/inc/lang/eu/denied.txt @@ -1,3 +1,4 @@ ====== Ez duzu baimenik ====== -Barkatu, ez duzu baimenik orri hau ikusteko. Agian sesioa hastea ahaztu zaizu?
\ No newline at end of file +Barkatu, ez duzu baimenik orri hau ikusteko. + diff --git a/inc/lang/eu/jquery.ui.datepicker.js b/inc/lang/eu/jquery.ui.datepicker.js new file mode 100644 index 000000000..25b95981f --- /dev/null +++ b/inc/lang/eu/jquery.ui.datepicker.js @@ -0,0 +1,36 @@ +/* Karrikas-ek itzulia (karrikas@karrikas.com) */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['eu'] = { + closeText: 'Egina', + prevText: '<Aur', + nextText: 'Hur>', + currentText: 'Gaur', + monthNames: ['urtarrila','otsaila','martxoa','apirila','maiatza','ekaina', + 'uztaila','abuztua','iraila','urria','azaroa','abendua'], + monthNamesShort: ['urt.','ots.','mar.','api.','mai.','eka.', + 'uzt.','abu.','ira.','urr.','aza.','abe.'], + dayNames: ['igandea','astelehena','asteartea','asteazkena','osteguna','ostirala','larunbata'], + dayNamesShort: ['ig.','al.','ar.','az.','og.','ol.','lr.'], + dayNamesMin: ['ig','al','ar','az','og','ol','lr'], + weekHeader: 'As', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['eu']); + +return datepicker.regional['eu']; + +})); diff --git a/inc/lang/eu/lang.php b/inc/lang/eu/lang.php index c7e7ead9a..fcf45b946 100644 --- a/inc/lang/eu/lang.php +++ b/inc/lang/eu/lang.php @@ -1,11 +1,12 @@ <?php + /** - * Basque language file - * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * * @author Xabi Ezpeleta <xezpeleta@mendikute.com> * @author Inko Illarramendi <inko.i.a@gmail.com> * @author Zigor Astarbe <astarbe@gmail.com> + * @author Yadav Gowda <yadav.gowda@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -49,7 +50,10 @@ $lang['btn_revert'] = 'Berrezarri'; $lang['btn_register'] = 'Erregistratu'; $lang['btn_apply'] = 'Baieztatu'; $lang['btn_media'] = 'Media Kudeatzailea'; -$lang['loggedinas'] = 'Erabiltzailea'; +$lang['btn_deleteuser'] = 'Nire kontua kendu'; +$lang['btn_img_backto'] = 'Atzera hona %s'; +$lang['btn_mediaManager'] = 'Media kudeatzailean ikusi'; +$lang['loggedinas'] = 'Erabiltzailea:'; $lang['user'] = 'Erabiltzailea'; $lang['pass'] = 'Pasahitza'; $lang['newpass'] = 'Pasahitz berria'; @@ -63,6 +67,7 @@ $lang['badlogin'] = 'Barkatu, prozesuak huts egin du; saiatu berriz $lang['minoredit'] = 'Aldaketa Txikiak'; $lang['draftdate'] = 'Zirriborroa automatikoki gorde da hemen:'; $lang['nosecedit'] = 'Orria aldatua izan da bitartean, info atala zaharkituta geratu da, orri osoa kargatu da horren ordez.'; +$lang['searchcreatepage'] = 'Bilatzen zabiltzana aurkitu ez baduzu, zuk zeuk sortu dezakezu orri berri bat bilaketa ostean \'\'Sortu orri hau\'\' erabiliz.'; $lang['regmissing'] = 'Barkatu, hutsune guztiak bete behar dituzu.'; $lang['reguexists'] = 'Barkatu, izen bereko erabiltzailea existitzen da.'; $lang['regsuccess'] = 'Erabiltzailea sortu da. Pasahitza mailez bidaliko zaizu.'; @@ -76,6 +81,7 @@ $lang['profna'] = 'Wiki honek ez du profilaren aldaketa ahalbidet $lang['profnochange'] = 'Aldaketarik ez, ez dago egiteko ezer.'; $lang['profnoempty'] = 'Izen edota e-posta hutsa ez dago onartua.'; $lang['profchanged'] = 'Erabiltzaile profila arrakastaz eguneratua.'; +$lang['profdeleteuser'] = 'Kontua ezabatu'; $lang['pwdforget'] = 'Pasahitza ahaztu duzu? Eskuratu berri bat'; $lang['resendna'] = 'Wiki honek ez du pasahitz berbidalketa onartzen.'; $lang['resendpwd'] = '-entzat pasahitza berria ezarri'; @@ -88,8 +94,8 @@ $lang['license'] = 'Besterik esan ezean, wiki hontako edukia ondor $lang['licenseok'] = 'Oharra: Orri hau editatzean, zure edukia ondorengo lizentziapean argitaratzea onartzen duzu: '; $lang['searchmedia'] = 'Bilatu fitxategi izena:'; $lang['searchmedia_in'] = 'Bilatu %s-n'; -$lang['txt_upload'] = 'Ireki nahi den fitxategia aukeratu'; -$lang['txt_filename'] = 'Idatzi wikiname-a (aukerazkoa)'; +$lang['txt_upload'] = 'Ireki nahi den fitxategia aukeratu:'; +$lang['txt_filename'] = 'Idatzi wikiname-a (aukerazkoa):'; $lang['txt_overwrt'] = 'Oraingo fitxategiaren gainean idatzi'; $lang['lockedby'] = 'Momentu honetan blokeatzen:'; $lang['lockexpire'] = 'Blokeaketa iraungitzen da:'; @@ -172,9 +178,9 @@ $lang['diff_type'] = 'Ikusi diferentziak:'; $lang['diff_inline'] = 'Lerro tartean'; $lang['diff_side'] = 'Ondoz ondo'; $lang['line'] = 'Marra'; -$lang['breadcrumb'] = 'Traza'; -$lang['youarehere'] = 'Hemen zaude'; -$lang['lastmod'] = 'Azken aldaketa'; +$lang['breadcrumb'] = 'Traza:'; +$lang['youarehere'] = 'Hemen zaude:'; +$lang['lastmod'] = 'Azken aldaketa:'; $lang['by'] = 'egilea:'; $lang['deleted'] = 'ezabatua'; $lang['created'] = 'sortua'; @@ -227,20 +233,18 @@ $lang['admin_register'] = 'Erabiltzaile berria gehitu'; $lang['metaedit'] = 'Metadatua Aldatu'; $lang['metasaveerr'] = 'Metadatuaren idazketak huts egin du'; $lang['metasaveok'] = 'Metadatua gordea'; -$lang['img_backto'] = 'Atzera hona'; -$lang['img_title'] = 'Izenburua'; -$lang['img_caption'] = 'Epigrafea'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Fitxategi izena'; -$lang['img_fsize'] = 'Tamaina'; -$lang['img_artist'] = 'Artista'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Formatua'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Hitz-gakoak'; -$lang['img_width'] = 'Zabalera'; -$lang['img_height'] = 'Altuera'; -$lang['img_manager'] = 'Media kudeatzailean ikusi'; +$lang['img_title'] = 'Izenburua:'; +$lang['img_caption'] = 'Epigrafea:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Fitxategi izena:'; +$lang['img_fsize'] = 'Tamaina:'; +$lang['img_artist'] = 'Artista:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Formatua:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Hitz-gakoak:'; +$lang['img_width'] = 'Zabalera:'; +$lang['img_height'] = 'Altuera:'; $lang['subscr_subscribe_success'] = '%s gehitua %s-ren harpidetza zerrendara'; $lang['subscr_subscribe_error'] = 'Errorea %s gehitzen %s-ren harpidetza zerrendara'; $lang['subscr_subscribe_noaddress'] = 'Ez dago helbiderik zure login-arekin lotuta, ezin zara harpidetza zerrendara gehitua izan.'; diff --git a/inc/lang/eu/searchpage.txt b/inc/lang/eu/searchpage.txt index 2a487a3bb..c632305b9 100644 --- a/inc/lang/eu/searchpage.txt +++ b/inc/lang/eu/searchpage.txt @@ -1,5 +1,5 @@ ====== Bilaketa ====== -Emaitzak ondorengo aurkiketan bilatu ditzakezu. Bilatzen zabiltzana aurkitu ez baduzu, zuk zeuk sortu dezakezu orri berri bat bilaketa ostean ''Sortu orri hau'' erabiliz. +Emaitzak ondorengo aurkiketan bilatu ditzakezu. @CREATEPAGEINFO@ ===== Bilaketa emaitzak: ===== diff --git a/inc/lang/fa/denied.txt b/inc/lang/fa/denied.txt index 827f73e2b..4bffa0f3c 100644 --- a/inc/lang/fa/denied.txt +++ b/inc/lang/fa/denied.txt @@ -1,3 +1,4 @@ ====== دسترسی ممکن نیست ====== -شرمنده، شما اجازهی دسترسی ب این صفحه را ندارید. ممکن است فراموش کرده باشید که وارد سایت شوید!
\ No newline at end of file +شرمنده، شما اجازهی دسترسی ب این صفحه را ندارید. + diff --git a/inc/lang/fa/index.txt b/inc/lang/fa/index.txt index 89ed74b7d..993c8d164 100644 --- a/inc/lang/fa/index.txt +++ b/inc/lang/fa/index.txt @@ -1,3 +1,3 @@ -====== فهرست ====== +====== نقشهی سایت ====== -این صفحه فهرست تمامی صفحات بر اساس [[doku>namespaces|فضاینامها]] است.
\ No newline at end of file +این صفحه حاوی فهرست تمامی صفحات موجود به ترتیب [[doku>namespaces|فضاینامها]] است.
\ No newline at end of file diff --git a/inc/lang/fa/jquery.ui.datepicker.js b/inc/lang/fa/jquery.ui.datepicker.js new file mode 100644 index 000000000..8ffd66411 --- /dev/null +++ b/inc/lang/fa/jquery.ui.datepicker.js @@ -0,0 +1,73 @@ +/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */ +/* Javad Mowlanezhad -- jmowla@gmail.com */ +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['fa'] = { + closeText: 'بستن', + prevText: '<قبلی', + nextText: 'بعدی>', + currentText: 'امروز', + monthNames: [ + 'فروردين', + 'ارديبهشت', + 'خرداد', + 'تير', + 'مرداد', + 'شهريور', + 'مهر', + 'آبان', + 'آذر', + 'دی', + 'بهمن', + 'اسفند' + ], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + dayNames: [ + 'يکشنبه', + 'دوشنبه', + 'سهشنبه', + 'چهارشنبه', + 'پنجشنبه', + 'جمعه', + 'شنبه' + ], + dayNamesShort: [ + 'ی', + 'د', + 'س', + 'چ', + 'پ', + 'ج', + 'ش' + ], + dayNamesMin: [ + 'ی', + 'د', + 'س', + 'چ', + 'پ', + 'ج', + 'ش' + ], + weekHeader: 'هف', + dateFormat: 'yy/mm/dd', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['fa']); + +return datepicker.regional['fa']; + +})); diff --git a/inc/lang/fa/lang.php b/inc/lang/fa/lang.php index 6cb5164d8..25de5c92e 100644 --- a/inc/lang/fa/lang.php +++ b/inc/lang/fa/lang.php @@ -10,6 +10,11 @@ * @author Milad DZand <M.DastanZand@gmail.com> * @author AmirH Hassaneini <mytechmix@gmail.com> * @author mehrdad <mehrdad.jafari.bojd@gmail.com> + * @author reza_khn <reza_khn@yahoo.com> + * @author Hamid <zarrabi@sharif.edu> + * @author Mohamad Mehdi Habibi <habibi.esf@gmail.com> + * @author Mohammad Sadegh <msdn2013@gmail.com> + * @author Omid Hezaveh <hezpublic@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'rtl'; @@ -37,30 +42,32 @@ $lang['btn_secedit'] = 'ویرایش'; $lang['btn_login'] = 'ورود به سیستم'; $lang['btn_logout'] = 'خروج از سیستم'; $lang['btn_admin'] = 'مدیر'; -$lang['btn_update'] = 'به روز رسانی'; +$lang['btn_update'] = 'بهروزرسانی'; $lang['btn_delete'] = 'حذف'; $lang['btn_back'] = 'عقب'; $lang['btn_backlink'] = 'پیوندهای به این صفحه'; $lang['btn_backtomedia'] = 'بازگشت به انتخاب فایل'; $lang['btn_subscribe'] = 'عضویت در تغییرات صفحه'; -$lang['btn_profile'] = 'به روز رسانی پروفایل'; +$lang['btn_profile'] = 'بهروزرسانی پروفایل'; $lang['btn_reset'] = 'بازنشاندن'; -$lang['btn_resendpwd'] = 'تعیین کلمه عبور جدید'; +$lang['btn_resendpwd'] = 'تعیین گذرواژهی جدید'; $lang['btn_draft'] = 'ویرایش پیشنویس'; $lang['btn_recover'] = 'بازیابی پیشنویس'; $lang['btn_draftdel'] = 'حذف پیشنویس'; $lang['btn_revert'] = 'بازیابی'; -$lang['btn_register'] = 'یک حساب جدید بسازید'; -$lang['btn_apply'] = 'اعمال کن'; -$lang['btn_media'] = 'مدیریت محتوای چند رسانه ای'; -$lang['btn_deleteuser'] = 'حذف حساب کاربری خود'; -$lang['loggedinas'] = 'به عنوان کاربر روبرو وارد شدهاید:'; -$lang['user'] = 'نام کاربری:'; -$lang['pass'] = 'گذرواژهی شما'; +$lang['btn_register'] = 'ثبت نام'; +$lang['btn_apply'] = 'اعمال'; +$lang['btn_media'] = 'مدیریت رسانهها'; +$lang['btn_deleteuser'] = 'حساب کاربری مرا حذف کن'; +$lang['btn_img_backto'] = 'بازگشت به %s'; +$lang['btn_mediaManager'] = 'مشاهده در مدیریت رسانهها'; +$lang['loggedinas'] = 'به این عنوان وارد شدهاید:'; +$lang['user'] = 'نام کاربری'; +$lang['pass'] = 'گذرواژه'; $lang['newpass'] = 'گذروازهی جدید'; -$lang['oldpass'] = 'گذرواژهی پیشین'; -$lang['passchk'] = 'گذرواژه را دوباره وارد کنید'; -$lang['remember'] = 'گذرواژه را به یاد بسپار.'; +$lang['oldpass'] = 'گذرواژهی فعلی را تایید کنید'; +$lang['passchk'] = 'یک بار دیگر'; +$lang['remember'] = 'مرا به خاطر بسپار.'; $lang['fullname'] = '*نام واقعی شما'; $lang['email'] = 'ایمیل شما*'; $lang['profile'] = 'پروفایل کاربر'; @@ -69,6 +76,7 @@ $lang['badpassconfirm'] = 'متاسفم ، رمز عبور اشتباه $lang['minoredit'] = 'این ویرایش خُرد است'; $lang['draftdate'] = 'ذخیره خودکار پیشنویس'; $lang['nosecedit'] = 'این صفحه در این میان تغییر کرده است، اطلاعات بخش قدیمی شده است، در عوض محتوای کل نمایش داده میشود.'; +$lang['searchcreatepage'] = 'اگر به نتیجهی مطلوبی نرسیدهاید، میتوانید صفحهی مورد نظر را ایجاد کنید.'; $lang['regmissing'] = 'متاسفم، شما باید همه قسمتها را پر کنید.'; $lang['reguexists'] = 'نام کاربریای که وارد کردید قبلن استفاده شده است. خواهشمندیم یک نام دیگر انتخاب کنید.'; $lang['regsuccess'] = 'کاربر ساخته شد و گذرواژه به صورت ایمیل ارسال گردید.'; @@ -84,6 +92,9 @@ $lang['profnoempty'] = 'نام و آدرس ایمیل باید پر ش $lang['profchanged'] = 'پروفایل کاربر با موفقیت به روز شد'; $lang['profnodelete'] = 'ویکی توانایی پشتیبانی از حذف کاربران را ندارد'; $lang['profdeleteuser'] = 'حذف حساب کاربری'; +$lang['profdeleted'] = 'حساب کاربری شما حذف گردیده است.'; +$lang['profconfdelete'] = 'میخواهم حساب کاربری من از این ویکی حذف شود. <br/> این عمل قابل برگشت نیست.'; +$lang['profconfdeletemissing'] = 'جعبهی تأیید تیک نخورده است'; $lang['pwdforget'] = 'گذرواژهی خود را فراموش کردهاید؟ جدید دریافت کنید'; $lang['resendna'] = 'این ویکی ارسال مجدد گذرواژه را پشتیبانی نمیکند'; $lang['resendpwd'] = 'تعیین کلمه عبور جدید برای '; @@ -96,12 +107,12 @@ $lang['license'] = 'به جز مواردی که ذکر میشو $lang['licenseok'] = 'توجه: با ویرایش این صفحه، شما مجوز زیر را تایید میکنید:'; $lang['searchmedia'] = 'نام فایل برای جستجو:'; $lang['searchmedia_in'] = 'جستجو در %s'; -$lang['txt_upload'] = 'فایل را برای ارسال انتخاب کنید'; -$lang['txt_filename'] = 'ارسال به صورت (اختیاری)'; +$lang['txt_upload'] = 'فایل را برای ارسال انتخاب کنید:'; +$lang['txt_filename'] = 'ارسال به صورت (اختیاری):'; $lang['txt_overwrt'] = 'بر روی فایل موجود بنویس'; $lang['maxuploadsize'] = 'حداکثر %s برای هر فایل مجاز است.'; -$lang['lockedby'] = 'در حال حاضر قفل شده است'; -$lang['lockexpire'] = 'قفل منقضی شده است'; +$lang['lockedby'] = 'در حال حاضر قفل شده است:'; +$lang['lockexpire'] = 'قفل منقضی شده است:'; $lang['js']['willexpire'] = 'حالت قفل شما مدتی است منقضی شده است \n برای جلوگیری از تداخل دکمهی پیشنمایش را برای صفر شدن ساعت قفل بزنید.'; $lang['js']['notsavedyet'] = 'تغییرات ذخیره شده از بین خواهد رفت. میخواهید ادامه دهید؟'; @@ -133,9 +144,9 @@ $lang['js']['nosmblinks'] = 'پیوند به Windows share فقط در ای شما میتوانید پیوندها رو کپی کنید.'; $lang['js']['linkwiz'] = 'ویزارد پیوند'; $lang['js']['linkto'] = 'پیوند به:'; -$lang['js']['del_confirm'] = 'واقعن تصمیم به حذف این موارد دارید؟'; -$lang['js']['restore_confirm'] = 'آیا مطمئن هستید که می خواهید این نسخه را بازیابی کنید؟'; -$lang['js']['media_diff'] = 'تفاوت ها را ببینید : '; +$lang['js']['del_confirm'] = 'واقعا تصمیم به حذف این موارد دارید؟'; +$lang['js']['restore_confirm'] = 'آیا مطمئن هستید که می خواهید این نگارش را بازیابی کنید؟'; +$lang['js']['media_diff'] = 'تفاوت ها را ببینید: '; $lang['js']['media_diff_both'] = 'پهلو به پهلو'; $lang['js']['media_diff_opacity'] = 'درخشش از'; $lang['js']['media_diff_portions'] = 'کش رفتن'; @@ -182,10 +193,15 @@ $lang['difflink'] = 'پیوند به صفحهی تفاوته $lang['diff_type'] = 'مشاهده تغییرات:'; $lang['diff_inline'] = 'خطی'; $lang['diff_side'] = 'کلی'; +$lang['diffprevrev'] = 'نگارش قبل'; +$lang['diffnextrev'] = 'نگارش بعد'; +$lang['difflastrev'] = 'آخرین نگارش'; +$lang['diffbothprevrev'] = 'نگارش قبل در دو طرف'; +$lang['diffbothnextrev'] = 'نگارش بعد در دو طرف'; $lang['line'] = 'خط'; -$lang['breadcrumb'] = 'ردپا'; -$lang['youarehere'] = 'محل شما'; -$lang['lastmod'] = 'آخرین ویرایش'; +$lang['breadcrumb'] = 'ردپا:'; +$lang['youarehere'] = 'محل شما:'; +$lang['lastmod'] = 'آخرین ویرایش:'; $lang['by'] = 'توسط'; $lang['deleted'] = 'حذف شد'; $lang['created'] = 'ایجاد شد'; @@ -238,20 +254,18 @@ $lang['admin_register'] = 'یک حساب جدید بسازید'; $lang['metaedit'] = 'ویرایش دادههای متا'; $lang['metasaveerr'] = 'نوشتن دادهنما با مشکل مواجه شد'; $lang['metasaveok'] = 'دادهنما ذخیره شد'; -$lang['img_backto'] = 'بازگشت به '; -$lang['img_title'] = 'عنوان تصویر'; -$lang['img_caption'] = 'عنوان'; -$lang['img_date'] = 'تاریخ'; -$lang['img_fname'] = 'نام فایل'; -$lang['img_fsize'] = 'اندازه'; -$lang['img_artist'] = 'عکاس/هنرمند'; -$lang['img_copyr'] = 'دارندهی حق تکثیر'; -$lang['img_format'] = 'فرمت'; -$lang['img_camera'] = 'دوربین'; -$lang['img_keywords'] = 'واژههای کلیدی'; -$lang['img_width'] = 'عرض'; -$lang['img_height'] = 'ارتفاع'; -$lang['img_manager'] = 'دیدن در مدیریت محتوای چند رسانه ای'; +$lang['img_title'] = 'عنوان تصویر:'; +$lang['img_caption'] = 'عنوان:'; +$lang['img_date'] = 'تاریخ:'; +$lang['img_fname'] = 'نام فایل:'; +$lang['img_fsize'] = 'اندازه:'; +$lang['img_artist'] = 'عکاس/هنرمند:'; +$lang['img_copyr'] = 'دارندهی حق تکثیر:'; +$lang['img_format'] = 'فرمت:'; +$lang['img_camera'] = 'دوربین:'; +$lang['img_keywords'] = 'واژههای کلیدی:'; +$lang['img_width'] = 'عرض:'; +$lang['img_height'] = 'ارتفاع:'; $lang['subscr_subscribe_success'] = '%s به لیست آبونه %s افزوده شد'; $lang['subscr_subscribe_error'] = 'اشکال در افزودن %s به لیست آبونه %s'; $lang['subscr_subscribe_noaddress'] = 'هیچ آدرسی برای این عضویت اضافه نشده است، شما نمیتوانید به لیست آبونه اضافه شوید'; @@ -266,6 +280,8 @@ $lang['subscr_m_unsubscribe'] = 'لغو آبونه'; $lang['subscr_m_subscribe'] = 'آبونه شدن'; $lang['subscr_m_receive'] = 'دریافت کردن'; $lang['subscr_style_every'] = 'ارسال راینامه در تمامی تغییرات'; +$lang['subscr_style_digest'] = 'ایمیل خلاصهی تغییرات هر روز (هر %.2f روز)'; +$lang['subscr_style_list'] = 'فهرست صفحات تغییریافته از آخرین ایمیل (هر %.2f روز)'; $lang['authtempfail'] = 'معتبرسازی کابران موقتن مسدود میباشد. اگر این حالت پایدار بود، مدیر ویکی را باخبر سازید.'; $lang['authpwdexpire'] = 'کلمه عبور شما در %d روز منقضی خواهد شد ، شما باید آن را زود تغییر دهید'; $lang['i_chooselang'] = 'انتخاب زبان'; @@ -277,6 +293,7 @@ $lang['i_problems'] = 'نصب کننده با مشکلات زیر م $lang['i_modified'] = 'به دلایل امنیتی، این اسکریپت فقط با نصب تازه و بدون تغییر DokuWiki کار خواهد کرد.شما باید دوباره فایل فشرده را باز کنید <a href="http://dokuwiki.org/install">راهنمای نصب DokuWiki</a> را بررسی کنید.'; $lang['i_funcna'] = 'تابع <code>%s</code> در PHP موجود نیست. ممکن است شرکت خدمات وب شما آن را مسدود کرده باشد.'; $lang['i_phpver'] = 'نگارش پیاچپی <code>%s</code> پایینتر از نگارش مورد نیاز، یعنی <code>%s</code> میباشد. خواهشمندیم به روز رسانی کنید.'; +$lang['i_mbfuncoverload'] = 'برای اجرای دوکوویکی باید mbstring.func_overload را در php.ini غیرفعال کنید.'; $lang['i_permfail'] = 'شاخهی <code>%s</code> قابلیت نوشتن ندارد. شما باید دسترسیهای این شاخه را تنظیم کنید!'; $lang['i_confexists'] = '<code>%s</code> پیشتر موجود است'; $lang['i_writeerr'] = 'توانایی ایجاد <code>%s</code> نیست. شما باید دسترسیهای شاخه یا فایل را بررسی کنید و فایل را به طور دستی ایجاد کنید.'; @@ -288,8 +305,12 @@ $lang['i_policy'] = 'کنترل دسترسیهای اولیه'; $lang['i_pol0'] = 'ویکی باز (همه میتوانند بخوانند، بنویسند و فایل ارسال کنند)'; $lang['i_pol1'] = 'ویکی عمومی (همه میتوانند بخوانند، کاربران ثبت شده میتوانند بنویسند و فایل ارسال کنند)'; $lang['i_pol2'] = 'ویکی بسته (فقط کاربران ثبت شده میتوانند بخوانند، بنویسند و فایل ارسال کنند)'; +$lang['i_allowreg'] = 'اجازه دهید که کاربران خود را ثبت نام کنند'; $lang['i_retry'] = 'تلاش مجدد'; $lang['i_license'] = 'لطفن مجوز این محتوا را وارد کنید:'; +$lang['i_license_none'] = 'هیچ اطلاعات مجوزی را نشان نده'; +$lang['i_pop_field'] = 'لطفا کمک کنید تا تجربهی دوکوویکی را بهبود دهیم.'; +$lang['i_pop_label'] = 'ماهی یک بار، اطلاعات بدوننامی از نحوهی استفاده به توسعهدهندگان دوکوویکی ارسال کن'; $lang['recent_global'] = 'شما هماکنون تغییرات فضاینام <b>%s</b> را مشاهده میکنید. شما همچنین میتوانید <a href="%s">تغییرات اخیر در کل ویکی را مشاهده نمایید</a>.'; $lang['years'] = '%d سال پیش'; $lang['months'] = '%d ماه پیش'; @@ -317,8 +338,12 @@ $lang['media_view'] = '%s'; $lang['media_viewold'] = '%s در %s'; $lang['media_edit'] = '%s ویرایش'; $lang['media_history'] = 'تاریخچه %s'; -$lang['media_meta_edited'] = 'فرا داده ها ویرایش شدند.'; -$lang['media_perm_read'] = 'متاسفانه ، شما حق خواندن این فایل ها را ندارید.'; -$lang['media_perm_upload'] = 'متاسفانه ، شما حق آپلود این فایل ها را ندارید.'; -$lang['media_update'] = 'آپلود نسخه جدید'; +$lang['media_meta_edited'] = 'فرادادهها ویرایش شدند.'; +$lang['media_perm_read'] = 'متاسفانه شما حق خواندن این فایلها را ندارید.'; +$lang['media_perm_upload'] = 'متاسفانه شما حق آپلود این فایلها را ندارید.'; +$lang['media_update'] = 'آپلود نسخهی جدید'; $lang['media_restore'] = 'بازیابی این نسخه'; +$lang['currentns'] = 'فضای نام جاری'; +$lang['searchresult'] = 'نتیجهی جستجو'; +$lang['plainhtml'] = 'HTML ساده'; +$lang['wikimarkup'] = 'نشانهگذاری ویکی'; diff --git a/inc/lang/fa/searchpage.txt b/inc/lang/fa/searchpage.txt index 3f0378ed3..f7f1a5309 100644 --- a/inc/lang/fa/searchpage.txt +++ b/inc/lang/fa/searchpage.txt @@ -1,5 +1,5 @@ ====== جستجو ====== -نتایج جستجو در زیر آمده است. اگر به نتیجهی مطلوبی نرسیدهاید، میتوانید صفحهی مورد نظر را ایجاد کنید. +نتایج جستجو در زیر آمده است. @CREATEPAGEINFO@ ===== نتایج =====
\ No newline at end of file diff --git a/inc/lang/fi/denied.txt b/inc/lang/fi/denied.txt index cd31da06b..89ebd4830 100644 --- a/inc/lang/fi/denied.txt +++ b/inc/lang/fi/denied.txt @@ -1,3 +1,4 @@ ====== Lupa evätty ====== -Sinulla ei ole tarpeeksi valtuuksia jatkaa. Ehkä unohdit kirjautua sisään? +Sinulla ei ole tarpeeksi valtuuksia jatkaa. + diff --git a/inc/lang/fi/jquery.ui.datepicker.js b/inc/lang/fi/jquery.ui.datepicker.js new file mode 100644 index 000000000..eac170496 --- /dev/null +++ b/inc/lang/fi/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Finnish initialisation for the jQuery UI date picker plugin. */ +/* Written by Harri Kilpiö (harrikilpio@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['fi'] = { + closeText: 'Sulje', + prevText: '«Edellinen', + nextText: 'Seuraava»', + currentText: 'Tänään', + monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu', + 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'], + monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä', + 'Heinä','Elo','Syys','Loka','Marras','Joulu'], + dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'], + dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'], + dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'], + weekHeader: 'Vk', + dateFormat: 'd.m.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['fi']); + +return datepicker.regional['fi']; + +})); diff --git a/inc/lang/fi/lang.php b/inc/lang/fi/lang.php index feefc3da8..9bf4aad19 100644 --- a/inc/lang/fi/lang.php +++ b/inc/lang/fi/lang.php @@ -9,6 +9,7 @@ * @author Teemu Mattila <ghcsystems@gmail.com> * @author Sami Olmari <sami@olmari.fi> * @author Rami Lehti <rammer@ipi.fi> + * @author Jussi Takala <jussi.takala@live.fi> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -53,7 +54,9 @@ $lang['btn_register'] = 'Rekisteröidy'; $lang['btn_apply'] = 'Toteuta'; $lang['btn_media'] = 'Media manager'; $lang['btn_deleteuser'] = 'Poista tilini'; -$lang['loggedinas'] = 'Kirjautunut nimellä'; +$lang['btn_img_backto'] = 'Takaisin %s'; +$lang['btn_mediaManager'] = 'Näytä mediamanagerissa'; +$lang['loggedinas'] = 'Kirjautunut nimellä:'; $lang['user'] = 'Käyttäjänimi'; $lang['pass'] = 'Salasana'; $lang['newpass'] = 'Uusi salasana'; @@ -68,6 +71,7 @@ $lang['badpassconfirm'] = 'Valitan. Salasana oli väärin'; $lang['minoredit'] = 'Pieni muutos'; $lang['draftdate'] = 'Luonnos tallennettu automaattisesti'; $lang['nosecedit'] = 'Sivu on muuttunut välillä ja kappaleen tiedot olivat vanhentuneet. Koko sivu ladattu.'; +$lang['searchcreatepage'] = 'Jos et löytänyt etsimääsi voit luoda uuden sivun tiedustelusi pohjalta käyttämällä \'\'Muokkaa tätä sivua\'\' -napilla.'; $lang['regmissing'] = 'Kaikki kentät tulee täyttää.'; $lang['reguexists'] = 'Käyttäjä tällä käyttäjänimellä on jo olemassa.'; $lang['regsuccess'] = 'Käyttäjä luotiin ja salasana lähetettiin sähköpostilla.'; @@ -98,12 +102,12 @@ $lang['license'] = 'Jollei muuta ole mainittu, niin sisältö täs $lang['licenseok'] = 'Huom: Muokkaamalla tätä sivua suostut lisensoimaan sisällön seuraavan lisenssin mukaisesti:'; $lang['searchmedia'] = 'Etsi tiedostoa nimeltä:'; $lang['searchmedia_in'] = 'Etsi kohteesta %s'; -$lang['txt_upload'] = 'Valitse tiedosto lähetettäväksi'; -$lang['txt_filename'] = 'Lähetä nimellä (valinnainen)'; +$lang['txt_upload'] = 'Valitse tiedosto lähetettäväksi:'; +$lang['txt_filename'] = 'Lähetä nimellä (valinnainen):'; $lang['txt_overwrt'] = 'Ylikirjoita olemassa oleva'; $lang['maxuploadsize'] = 'Palvelimelle siirto max. %s / tiedosto.'; -$lang['lockedby'] = 'Tällä hetkellä tiedoston on lukinnut'; -$lang['lockexpire'] = 'Lukitus päättyy'; +$lang['lockedby'] = 'Tällä hetkellä tiedoston on lukinnut:'; +$lang['lockexpire'] = 'Lukitus päättyy:'; $lang['js']['willexpire'] = 'Lukituksesi tämän sivun muokkaukseen päättyy minuutin kuluttua.\nRistiriitojen välttämiseksi paina esikatselu-nappia nollataksesi lukitusajan.'; $lang['js']['notsavedyet'] = 'Dokumentissa on tallentamattomia muutoksia, jotka häviävät. Haluatko varmasti jatkaa?'; @@ -184,10 +188,13 @@ $lang['difflink'] = 'Linkki vertailunäkymään'; $lang['diff_type'] = 'Näytä eroavaisuudet:'; $lang['diff_inline'] = 'Sisäkkäin'; $lang['diff_side'] = 'Vierekkäin'; +$lang['diffprevrev'] = 'Edellinen revisio'; +$lang['diffnextrev'] = 'Seuraava revisio'; +$lang['difflastrev'] = 'Viimeisin revisio'; $lang['line'] = 'Rivi'; -$lang['breadcrumb'] = 'Jäljet'; -$lang['youarehere'] = 'Olet täällä'; -$lang['lastmod'] = 'Viimeksi muutettu'; +$lang['breadcrumb'] = 'Jäljet:'; +$lang['youarehere'] = 'Olet täällä:'; +$lang['lastmod'] = 'Viimeksi muutettu:'; $lang['by'] = '/'; $lang['deleted'] = 'poistettu'; $lang['created'] = 'luotu'; @@ -240,20 +247,18 @@ $lang['admin_register'] = 'Lisää uusi käyttäjä'; $lang['metaedit'] = 'Muokkaa metadataa'; $lang['metasaveerr'] = 'Metadatan kirjoittaminen epäonnistui'; $lang['metasaveok'] = 'Metadata tallennettu'; -$lang['img_backto'] = 'Takaisin'; -$lang['img_title'] = 'Otsikko'; -$lang['img_caption'] = 'Kuvateksti'; -$lang['img_date'] = 'Päivämäärä'; -$lang['img_fname'] = 'Tiedoston nimi'; -$lang['img_fsize'] = 'Koko'; -$lang['img_artist'] = 'Kuvaaja'; -$lang['img_copyr'] = 'Tekijänoikeus'; -$lang['img_format'] = 'Formaatti'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Avainsanat'; -$lang['img_width'] = 'Leveys'; -$lang['img_height'] = 'Korkeus'; -$lang['img_manager'] = 'Näytä mediamanagerissa'; +$lang['img_title'] = 'Otsikko:'; +$lang['img_caption'] = 'Kuvateksti:'; +$lang['img_date'] = 'Päivämäärä:'; +$lang['img_fname'] = 'Tiedoston nimi:'; +$lang['img_fsize'] = 'Koko:'; +$lang['img_artist'] = 'Kuvaaja:'; +$lang['img_copyr'] = 'Tekijänoikeus:'; +$lang['img_format'] = 'Formaatti:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Avainsanat:'; +$lang['img_width'] = 'Leveys:'; +$lang['img_height'] = 'Korkeus:'; $lang['subscr_subscribe_success'] = '%s lisätty %s tilauslistalle'; $lang['subscr_subscribe_error'] = 'Virhe lisättäessä %s tilauslistalle %s'; $lang['subscr_subscribe_noaddress'] = 'Login tiedoissasi ei ole sähköpostiosoitetta. Sinua ei voi lisätä tilaukseen'; @@ -281,6 +286,7 @@ $lang['i_problems'] = 'Asennusohjelma löysi alla listattuja ongelmia $lang['i_modified'] = 'Turvallisuussyistä tämä ohjelma toimii vain uusien ja muokkaamattomien Dokuwiki-asennusten kanssa. Pura tiedostot uudestaan asennuspaketista, tai lue <a href="http://dokuwiki.org/install">Dokuwikin asennusohje (englanniksi)</a>'; $lang['i_funcna'] = 'PHP:n funktio <code>%s</code> ei ole käytettävissä. Palveluntarjoajasi on saattanut poistaa sen jostain syystä.'; $lang['i_phpver'] = 'Käyttämäsi PHP-ohjelmiston versio <code>%s</code> on pienempi, kuin tarvitaan <code>%s</code>. PHP-asennuksesi pitää päivittää.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload pitää ottaa pois käytöstä php.ini -tiedostosta käyttääksesi DokuWikiä'; $lang['i_permfail'] = '<code>%s</code> ei ole DokuWikin kirjoitettavissa. Muokkaa hakemiston oikeuksia!'; $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.'; @@ -334,3 +340,4 @@ $lang['currentns'] = 'Nykyinen nimiavaruus'; $lang['searchresult'] = 'Haun tulokset'; $lang['plainhtml'] = 'pelkkä HTML'; $lang['wikimarkup'] = 'Wiki markup'; +$lang['unable_to_parse_date'] = 'Parametrin "%s" jäsennys ei onnistu.'; diff --git a/inc/lang/fi/searchpage.txt b/inc/lang/fi/searchpage.txt index aa9fbf52f..b2ad8cc98 100644 --- a/inc/lang/fi/searchpage.txt +++ b/inc/lang/fi/searchpage.txt @@ -1,5 +1,5 @@ ====== Etsi ====== -Löydät etsinnän tulokset alta. Jos et löytänyt etsimääsi voit luoda uuden sivun tiedustelusi pohjalta käyttämällä ''Muokkaa tätä sivua'' -napilla. +Löydät etsinnän tulokset alta. @CREATEPAGEINFO@ ===== Tulokset ===== diff --git a/inc/lang/fo/denied.txt b/inc/lang/fo/denied.txt index 505b249b4..ecebba88c 100644 --- a/inc/lang/fo/denied.txt +++ b/inc/lang/fo/denied.txt @@ -1,3 +1,4 @@ ====== Atgongd nokta! ====== -Tú hevur ikki rættindi til at halda áfram. Møguliga hevur tú ikki rita inn. +Tú hevur ikki rættindi til at halda áfram. + diff --git a/inc/lang/fo/jquery.ui.datepicker.js b/inc/lang/fo/jquery.ui.datepicker.js new file mode 100644 index 000000000..1754f7be7 --- /dev/null +++ b/inc/lang/fo/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Faroese initialisation for the jQuery UI date picker plugin */ +/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['fo'] = { + closeText: 'Lat aftur', + prevText: '<Fyrra', + nextText: 'Næsta>', + currentText: 'Í dag', + monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'], + dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'], + dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'], + weekHeader: 'Vk', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['fo']); + +return datepicker.regional['fo']; + +})); diff --git a/inc/lang/fo/lang.php b/inc/lang/fo/lang.php index 161e7321a..0aee76e01 100644 --- a/inc/lang/fo/lang.php +++ b/inc/lang/fo/lang.php @@ -45,7 +45,7 @@ $lang['btn_recover'] = 'Endurbygg kladdu'; $lang['btn_draftdel'] = 'Sletta'; $lang['btn_revert'] = 'Endurbygg'; $lang['btn_register'] = 'Melda til'; -$lang['loggedinas'] = 'Ritavur inn sum'; +$lang['loggedinas'] = 'Ritavur inn sum:'; $lang['user'] = 'Brúkaranavn'; $lang['pass'] = 'Loyniorð'; $lang['newpass'] = 'Nýtt loyniorð'; @@ -59,6 +59,7 @@ $lang['badlogin'] = 'Skeivt brúkaranavn ella loyniorð.'; $lang['minoredit'] = 'Smærri broytingar'; $lang['draftdate'] = 'Goym kladdu sett frá'; $lang['nosecedit'] = 'Hendan síðan var broytt undir tilevnan, brotið var ikki rætt dagfest, heintaði fulla síðu í staðin'; +$lang['searchcreatepage'] = "Um úrslitini ikki innihalda tað sum tú leitaði eftir kanst tú upprætta eitt nýtt skjal við sama navni sum leitingin við at trýsta á **''[Upprætta hetta skjal]''** knappin."; $lang['regmissing'] = 'Tú skalt fylla út øll øki.'; $lang['reguexists'] = 'Hetta brúkaranavn er upptiki.'; $lang['regsuccess'] = 'Tú ert nú stovnavur sum brúkari. Títt loyniorð verður sent til tín í einum T-posti.'; @@ -83,11 +84,11 @@ $lang['license'] = 'Um ikki annað er tilskilað, so er tilfar á $lang['licenseok'] = 'Legg til merkis: Við at dagføra hesa síðu samtykkir tú at loyva margfalding av tilfarinum undir fylgjandi treytum:'; $lang['searchmedia'] = 'Leita eftir fíl navn:'; $lang['searchmedia_in'] = 'Leita í %s'; -$lang['txt_upload'] = 'Vel tí fílu sum skal leggjast upp'; -$lang['txt_filename'] = 'Sláa inn wikinavn (valfrítt)'; +$lang['txt_upload'] = 'Vel tí fílu sum skal leggjast upp:'; +$lang['txt_filename'] = 'Sláa inn wikinavn (valfrítt):'; $lang['txt_overwrt'] = 'Yvurskriva verandi fílu'; -$lang['lockedby'] = 'Fyribils læst av'; -$lang['lockexpire'] = 'Lásið ferð úr gildi kl.'; +$lang['lockedby'] = 'Fyribils læst av:'; +$lang['lockexpire'] = 'Lásið ferð úr gildi kl.:'; $lang['js']['willexpire'] = 'Títt lás á hetta skjalið ferð úr gildi um ein minnutt.\nTrýst á Forskoðan-knappin fyri at sleppa undan trupulleikum.'; $lang['js']['notsavedyet'] = 'Tað eru gjørdar broytingar í skjalinum, um tú haldur fram vilja broytingar fara fyri skeytið. Ynskir tú at halda fram?'; @@ -124,9 +125,9 @@ $lang['current'] = 'núverandi'; $lang['yours'] = 'Tín útgáva'; $lang['diff'] = 'vís broytingar í mun til núverandi útgávu'; $lang['line'] = 'Linja'; -$lang['breadcrumb'] = 'Leið'; -$lang['youarehere'] = 'Tú ert her'; -$lang['lastmod'] = 'Seinast broytt'; +$lang['breadcrumb'] = 'Leið:'; +$lang['youarehere'] = 'Tú ert her:'; +$lang['lastmod'] = 'Seinast broytt:'; $lang['by'] = 'av'; $lang['deleted'] = 'strika'; $lang['created'] = 'stovna'; @@ -157,15 +158,15 @@ $lang['admin_register'] = 'Upprætta nýggjan brúkara'; $lang['metaedit'] = 'Rætta metadáta'; $lang['metasaveerr'] = 'Brek við skriving av metadáta'; $lang['metasaveok'] = 'Metadáta goymt'; -$lang['img_backto'] = 'Aftur til'; -$lang['img_title'] = 'Heitið'; -$lang['img_caption'] = 'Myndatekstur'; -$lang['img_date'] = 'Dato'; -$lang['img_fname'] = 'Fílunavn'; -$lang['img_fsize'] = 'Stødd'; -$lang['img_artist'] = 'Myndafólk'; -$lang['img_copyr'] = 'Upphavsrættur'; -$lang['img_format'] = 'Snið'; -$lang['img_camera'] = 'Fototól'; -$lang['img_keywords'] = 'Evnisorð'; +$lang['btn_img_backto'] = 'Aftur til %s'; +$lang['img_title'] = 'Heitið:'; +$lang['img_caption'] = 'Myndatekstur:'; +$lang['img_date'] = 'Dato:'; +$lang['img_fname'] = 'Fílunavn:'; +$lang['img_fsize'] = 'Stødd:'; +$lang['img_artist'] = 'Myndafólk:'; +$lang['img_copyr'] = 'Upphavsrættur:'; +$lang['img_format'] = 'Snið:'; +$lang['img_camera'] = 'Fototól:'; +$lang['img_keywords'] = 'Evnisorð:'; $lang['authtempfail'] = 'Validering av brúkara virkar fyribils ikki. Um hetta er varandi, fá so samband við umboðsstjóran á hesi wiki.'; diff --git a/inc/lang/fo/searchpage.txt b/inc/lang/fo/searchpage.txt index 6304a8901..33bcc3206 100644 --- a/inc/lang/fo/searchpage.txt +++ b/inc/lang/fo/searchpage.txt @@ -1,5 +1,5 @@ ====== Leiting ====== -Tú kanst síggja úrslitini av tíni leiting niðanfyri. Um úrslitini ikki innihalda tað sum tú leitaði eftir kanst tú upprætta eitt nýtt skjal við sama navni sum leitingin við at trýsta á **''[Upprætta hetta skjal]''** knappin. +Tú kanst síggja úrslitini av tíni leiting niðanfyri. @CREATEPAGEINFO@ ===== Leitiúrslit ===== diff --git a/inc/lang/fr/denied.txt b/inc/lang/fr/denied.txt index 20d4d6755..6de193004 100644 --- a/inc/lang/fr/denied.txt +++ b/inc/lang/fr/denied.txt @@ -1,3 +1,4 @@ ====== Autorisation refusée ====== -Désolé, vous n'avez pas les droits pour continuer. Peut-être avez-vous oublié de vous identifier ? +Désolé, vous n'avez pas suffisamment d'autorisations pour poursuivre votre demande. + diff --git a/inc/lang/fr/jquery.ui.datepicker.js b/inc/lang/fr/jquery.ui.datepicker.js new file mode 100644 index 000000000..2f5ff3cbe --- /dev/null +++ b/inc/lang/fr/jquery.ui.datepicker.js @@ -0,0 +1,39 @@ +/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood{at}iinet.com.au), + Stéphane Nahmani (sholby@sholby.net), + Stéphane Raimbault <stephane.raimbault@gmail.com> */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['fr'] = { + closeText: 'Fermer', + prevText: 'Précédent', + nextText: 'Suivant', + currentText: 'Aujourd\'hui', + monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', + 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'], + monthNamesShort: ['janv.', 'févr.', 'mars', 'avril', 'mai', 'juin', + 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'], + dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'], + dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'], + dayNamesMin: ['D','L','M','M','J','V','S'], + weekHeader: 'Sem.', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['fr']); + +return datepicker.regional['fr']; + +})); diff --git a/inc/lang/fr/lang.php b/inc/lang/fr/lang.php index 49f617323..9deff1220 100644 --- a/inc/lang/fr/lang.php +++ b/inc/lang/fr/lang.php @@ -29,6 +29,13 @@ * @author Bruno Veilleux <bruno.vey@gmail.com> * @author Emmanuel <seedfloyd@gmail.com> * @author Jérôme Brandt <jeromebrandt@gmail.com> + * @author Wild <wild.dagger@free.fr> + * @author ggallon <gwenael.gallon@mac.com> + * @author David VANTYGHEM <david.vantyghem@free.fr> + * @author Caillot <remicaillot5@gmail.com> + * @author Schplurtz le Déboulonné <schplurtz@laposte.net> + * @author YoBoY <yoboy@ubuntu-fr.org> + * @author james <j.mccann@celcat.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -49,19 +56,19 @@ $lang['btn_newer'] = '<< Plus récent'; $lang['btn_older'] = 'Moins récent >>'; $lang['btn_revs'] = 'Anciennes révisions'; $lang['btn_recent'] = 'Derniers changements'; -$lang['btn_upload'] = 'Envoyer'; +$lang['btn_upload'] = 'Téléverser'; $lang['btn_cancel'] = 'Annuler'; -$lang['btn_index'] = 'Index'; +$lang['btn_index'] = 'Plan du site'; $lang['btn_secedit'] = 'Modifier'; -$lang['btn_login'] = 'Connexion'; -$lang['btn_logout'] = 'Déconnexion'; +$lang['btn_login'] = 'S\'identifier'; +$lang['btn_logout'] = 'Se déconnecter'; $lang['btn_admin'] = 'Administrer'; $lang['btn_update'] = 'Mettre à jour'; $lang['btn_delete'] = 'Effacer'; $lang['btn_back'] = 'Retour'; -$lang['btn_backlink'] = 'Liens vers cette page'; +$lang['btn_backlink'] = 'Liens de retour'; $lang['btn_backtomedia'] = 'Retour à la sélection du fichier média'; -$lang['btn_subscribe'] = 'S\'abonner à la page'; +$lang['btn_subscribe'] = 'Gérer souscriptions'; $lang['btn_profile'] = 'Mettre à jour le profil'; $lang['btn_reset'] = 'Réinitialiser'; $lang['btn_resendpwd'] = 'Définir un nouveau mot de passe'; @@ -69,11 +76,13 @@ $lang['btn_draft'] = 'Modifier le brouillon'; $lang['btn_recover'] = 'Récupérer le brouillon'; $lang['btn_draftdel'] = 'Effacer le brouillon'; $lang['btn_revert'] = 'Restaurer'; -$lang['btn_register'] = 'S\'enregistrer'; +$lang['btn_register'] = 'Créer un compte'; $lang['btn_apply'] = 'Appliquer'; -$lang['btn_media'] = 'Gestionnaire de médias'; +$lang['btn_media'] = 'Gestionnaire Multimédia'; $lang['btn_deleteuser'] = 'Supprimer mon compte'; -$lang['loggedinas'] = 'Connecté en tant que '; +$lang['btn_img_backto'] = 'Retour vers %s'; +$lang['btn_mediaManager'] = 'Voir dans le gestionnaire de médias'; +$lang['loggedinas'] = 'Connecté en tant que :'; $lang['user'] = 'Utilisateur'; $lang['pass'] = 'Mot de passe'; $lang['newpass'] = 'Nouveau mot de passe'; @@ -83,20 +92,21 @@ $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['badlogin'] = 'Le nom d\'utilisateur ou le mot de passe est incorrect.'; $lang['badpassconfirm'] = 'Désolé, le mot de passe est erroné'; $lang['minoredit'] = 'Modification mineure'; -$lang['draftdate'] = 'Brouillon enregistré de manière automatique le'; +$lang['draftdate'] = 'Brouillon enregistré automatiquement le'; $lang['nosecedit'] = 'La page a changé entre temps, les informations de la section sont obsolètes ; la page complète a été chargée à la place.'; +$lang['searchcreatepage'] = 'Si vous n\'avez pas trouvé ce que vous cherchiez, vous pouvez créer ou modifier la page correspondante à votre requête en cliquant sur le bouton approprié.'; $lang['regmissing'] = 'Désolé, vous devez remplir tous les champs.'; -$lang['reguexists'] = 'Désolé, ce nom d\'utilisateur est déjà utilisé.'; +$lang['reguexists'] = 'Désolé, ce nom d\'utilisateur est déjà pris.'; $lang['regsuccess'] = 'L\'utilisateur a été créé. Le mot de passe a été expédié par courriel.'; $lang['regsuccess2'] = 'L\'utilisateur a été créé.'; -$lang['regmailfail'] = 'Il semble y avoir un problème à l\'envoi du courriel. Contactez l\'administrateur.'; +$lang['regmailfail'] = 'On dirait qu\'il y a eu une erreur lors de l\'envoi du mot de passe de messagerie. Veuillez contacter l\'administrateur !'; $lang['regbadmail'] = 'L\'adresse de courriel semble incorrecte. Si vous pensez que c\'est une erreur, contactez l\'administrateur.'; $lang['regbadpass'] = 'Les deux mots de passe fournis sont différents, veuillez recommencez.'; $lang['regpwmail'] = 'Votre mot de passe DokuWiki'; -$lang['reghere'] = 'Vous n\'avez pas encore de compte ? Enregistrez-vous ici '; +$lang['reghere'] = 'Vous n\'avez pas encore de compte ? Inscrivez-vous'; $lang['profna'] = 'Ce wiki ne permet pas de modifier les profils'; $lang['profnochange'] = 'Pas de modification, rien à faire.'; $lang['profnoempty'] = 'Un nom ou une adresse de courriel vide n\'est pas permis.'; @@ -118,12 +128,12 @@ $lang['license'] = 'Sauf mention contraire, le contenu de ce wiki $lang['licenseok'] = 'Note : En modifiant cette page, vous acceptez que le contenu soit placé sous les termes de la licence suivante :'; $lang['searchmedia'] = 'Chercher le nom de fichier :'; $lang['searchmedia_in'] = 'Chercher dans %s'; -$lang['txt_upload'] = 'Sélectionnez un fichier à envoyer '; -$lang['txt_filename'] = 'Envoyer en tant que (optionnel) '; +$lang['txt_upload'] = 'Sélectionnez un fichier à envoyer:'; +$lang['txt_filename'] = 'Envoyer en tant que (optionnel):'; $lang['txt_overwrt'] = 'Écraser le fichier cible (s\'il existe)'; $lang['maxuploadsize'] = 'Taille d\'envoi maximale : %s par fichier'; -$lang['lockedby'] = 'Actuellement bloqué par'; -$lang['lockexpire'] = 'Le blocage expire à'; +$lang['lockedby'] = 'Actuellement bloqué par:'; +$lang['lockexpire'] = 'Le blocage expire à:'; $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'; @@ -202,10 +212,15 @@ $lang['difflink'] = 'Lien vers cette vue comparative'; $lang['diff_type'] = 'Voir les différences :'; $lang['diff_inline'] = 'Sur une seule ligne'; $lang['diff_side'] = 'Côte à côte'; +$lang['diffprevrev'] = 'Révision précédente'; +$lang['diffnextrev'] = 'Prochaine révision'; +$lang['difflastrev'] = 'Dernière révision'; +$lang['diffbothprevrev'] = 'Les deux révisions précédentes'; +$lang['diffbothnextrev'] = 'Les deux révisions suivantes'; $lang['line'] = 'Ligne'; -$lang['breadcrumb'] = 'Piste'; -$lang['youarehere'] = 'Vous êtes ici'; -$lang['lastmod'] = 'Dernière modification'; +$lang['breadcrumb'] = 'Piste:'; +$lang['youarehere'] = 'Vous êtes ici:'; +$lang['lastmod'] = 'Dernière modification:'; $lang['by'] = 'par'; $lang['deleted'] = 'supprimée'; $lang['created'] = 'créée'; @@ -258,20 +273,18 @@ $lang['admin_register'] = 'Ajouter un nouvel utilisateur'; $lang['metaedit'] = 'Modifier les métadonnées'; $lang['metasaveerr'] = 'Erreur lors de l\'enregistrement des métadonnées'; $lang['metasaveok'] = 'Métadonnées enregistrées'; -$lang['img_backto'] = 'Retour à'; -$lang['img_title'] = 'Titre'; -$lang['img_caption'] = 'Légende'; -$lang['img_date'] = 'Date'; -$lang['img_fname'] = 'Nom de fichier'; -$lang['img_fsize'] = 'Taille'; -$lang['img_artist'] = 'Photographe'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Appareil photo'; -$lang['img_keywords'] = 'Mots-clés'; -$lang['img_width'] = 'Largeur'; -$lang['img_height'] = 'Hauteur'; -$lang['img_manager'] = 'Voir dans le gestionnaire de médias'; +$lang['img_title'] = 'Titre:'; +$lang['img_caption'] = 'Légende:'; +$lang['img_date'] = 'Date:'; +$lang['img_fname'] = 'Nom de fichier:'; +$lang['img_fsize'] = 'Taille:'; +$lang['img_artist'] = 'Photographe:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Appareil photo:'; +$lang['img_keywords'] = 'Mots-clés:'; +$lang['img_width'] = 'Largeur:'; +$lang['img_height'] = 'Hauteur:'; $lang['subscr_subscribe_success'] = '%s a été ajouté à la liste 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'; @@ -299,6 +312,7 @@ $lang['i_problems'] = 'L\'installateur a détecté les problèmes ind $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_mbfuncoverload'] = 'Il faut désactiver mbstring.func_overload dans php.ini pour DokuWiki'; $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 autorisations des répertoires/fichiers et créer le fichier manuellement.'; @@ -348,7 +362,9 @@ $lang['media_perm_read'] = 'Désolé, vous n\'avez pas l\'autorisation de $lang['media_perm_upload'] = 'Désolé, vous n\'avez pas l\'autorisation d\'envoyer des fichiers.'; $lang['media_update'] = 'Envoyer une nouvelle version'; $lang['media_restore'] = 'Restaurer cette version'; -$lang['currentns'] = 'Namespace actuel'; +$lang['currentns'] = 'Catégorie courante'; $lang['searchresult'] = 'Résultat de la recherche'; $lang['plainhtml'] = 'HTML brut'; $lang['wikimarkup'] = 'Wiki balise'; +$lang['page_nonexist_rev'] = 'La page n\'existait pas le %s. Elle a été créée le <a href="%s">%s</a>.'; +$lang['unable_to_parse_date'] = 'Ne peut analyser le paramètre date "%s".'; diff --git a/inc/lang/fr/newpage.txt b/inc/lang/fr/newpage.txt index b23bf4fe4..c649489fa 100644 --- a/inc/lang/fr/newpage.txt +++ b/inc/lang/fr/newpage.txt @@ -1,4 +1,4 @@ ====== Cette page n'existe pas encore ====== -Vous avez suivi un lien vers une page qui n'existe pas encore. Si vos autorisations sont suffisants, vous pouvez la créer en cliquant sur « Créer cette page ». +Vous avez suivi un lien vers une page qui n'existe pas encore. Si vos permissions sont suffisantes, vous pouvez la créer en cliquant sur « Créer cette page ». diff --git a/inc/lang/fr/searchpage.txt b/inc/lang/fr/searchpage.txt index a9bd91608..5577a3a2a 100644 --- a/inc/lang/fr/searchpage.txt +++ b/inc/lang/fr/searchpage.txt @@ -1,5 +1,5 @@ ====== Recherche ====== -Voici les résultats de votre recherche. Si vous n'avez pas trouvé ce que vous cherchiez, vous pouvez créer ou modifier la page correspondante à votre requête en cliquant sur le bouton approprié. +Voici les résultats de votre recherche. @CREATEPAGEINFO@ ===== Résultats ===== diff --git a/inc/lang/fr/subscr_form.txt b/inc/lang/fr/subscr_form.txt index 49c0cf443..d68c05e6a 100644 --- a/inc/lang/fr/subscr_form.txt +++ b/inc/lang/fr/subscr_form.txt @@ -1,3 +1,3 @@ -====== Gestion de l'abonnement ====== +====== Gestion des souscriptions ====== -Cette page vous permet de gérer vos abonnements à la page et à la catégorie courantes
\ No newline at end of file +Cette page vous permet de gérer vos souscriptions pour suivre les modifications sur la page et sur la catégorie courante.
\ No newline at end of file diff --git a/inc/lang/gl/denied.txt b/inc/lang/gl/denied.txt index 69408a4f3..ef37a06f0 100644 --- a/inc/lang/gl/denied.txt +++ b/inc/lang/gl/denied.txt @@ -1,4 +1,4 @@ ====== Permiso Denegado ====== -Sentímolo, mais non tes permisos de abondo para continuares. Pode que esqueceses iniciar a sesión? +Sentímolo, mais non tes permisos de abondo para continuares. diff --git a/inc/lang/gl/jquery.ui.datepicker.js b/inc/lang/gl/jquery.ui.datepicker.js new file mode 100644 index 000000000..ed5b2d2fc --- /dev/null +++ b/inc/lang/gl/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Galician localization for 'UI date picker' jQuery extension. */ +/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['gl'] = { + closeText: 'Pechar', + prevText: '<Ant', + nextText: 'Seg>', + currentText: 'Hoxe', + monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño', + 'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'], + monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ', + 'Xul','Ago','Set','Out','Nov','Dec'], + dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'], + dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'], + dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['gl']); + +return datepicker.regional['gl']; + +})); diff --git a/inc/lang/gl/lang.php b/inc/lang/gl/lang.php index 65967a3b5..82cbbbfab 100644 --- a/inc/lang/gl/lang.php +++ b/inc/lang/gl/lang.php @@ -49,7 +49,7 @@ $lang['btn_revert'] = 'Restaurar'; $lang['btn_register'] = 'Rexístrate'; $lang['btn_apply'] = 'Aplicar'; $lang['btn_media'] = 'Xestor de Arquivos-Media'; -$lang['loggedinas'] = 'Iniciaches sesión como'; +$lang['loggedinas'] = 'Iniciaches sesión como:'; $lang['user'] = 'Nome de Usuario'; $lang['pass'] = 'Contrasinal'; $lang['newpass'] = 'Novo Contrasinal'; @@ -63,6 +63,7 @@ $lang['badlogin'] = 'Sentímolo, mais o nome de usuario ou o contra $lang['minoredit'] = 'Trocos Menores'; $lang['draftdate'] = 'Borrador gardado automaticamente en'; $lang['nosecedit'] = 'A páxina mudou entrementres, a información da sección estaba desfasada polo que se cargou a páxina completa no seu lugar.'; +$lang['searchcreatepage'] = "Se non atopaches o que estabas a procurar, podes crear ou editar a páxina co nome relacionado coa túa procura empregando o botón axeitado."; $lang['regmissing'] = 'Sentímolo, mais tes que cubrir todos os campos.'; $lang['reguexists'] = 'Sentímolo, mais xa existe un usuario con ese nome.'; $lang['regsuccess'] = 'O usuario foi creado e o contrasinal enviado por correo-e.'; @@ -88,12 +89,12 @@ $lang['license'] = 'O contido deste wiki, agás onde se indique o $lang['licenseok'] = 'Nota: Ao editares esta páxina estás a aceptar o licenciamento do contido baixo da seguinte licenza:'; $lang['searchmedia'] = 'Procurar nome de arquivo:'; $lang['searchmedia_in'] = 'Procurar en %s'; -$lang['txt_upload'] = 'Escolle o arquivo para subir'; -$lang['txt_filename'] = 'Subir como (opcional)'; +$lang['txt_upload'] = 'Escolle o arquivo para subir:'; +$lang['txt_filename'] = 'Subir como (opcional):'; $lang['txt_overwrt'] = 'Sobrescribir arquivo existente'; $lang['maxuploadsize'] = 'Subida máxima %s por arquivo.'; -$lang['lockedby'] = 'Bloqueado actualmente por'; -$lang['lockexpire'] = 'O bloqueo remata o'; +$lang['lockedby'] = 'Bloqueado actualmente por:'; +$lang['lockexpire'] = 'O bloqueo remata o:'; $lang['js']['willexpire'] = 'O teu bloqueo para editares esta páxina vai caducar nun minuto.\nPara de evitar conflitos, emprega o botón de previsualización para reiniciares o contador do tempo de bloqueo.'; $lang['js']['notsavedyet'] = 'Perderanse os trocos non gardados. Está certo de quereres continuar?'; @@ -175,9 +176,9 @@ $lang['diff_type'] = 'Ver diferenzas:'; $lang['diff_inline'] = 'Por liña'; $lang['diff_side'] = 'Cara a Cara'; $lang['line'] = 'Liña'; -$lang['breadcrumb'] = 'Trazado'; -$lang['youarehere'] = 'Estás aquí'; -$lang['lastmod'] = 'Última modificación'; +$lang['breadcrumb'] = 'Trazado:'; +$lang['youarehere'] = 'Estás aquí:'; +$lang['lastmod'] = 'Última modificación:'; $lang['by'] = 'por'; $lang['deleted'] = 'eliminado'; $lang['created'] = 'creado'; @@ -230,20 +231,20 @@ $lang['admin_register'] = 'Engadir novo usuario'; $lang['metaedit'] = 'Editar Metadatos'; $lang['metasaveerr'] = 'Non se puideron escribir os metadatos'; $lang['metasaveok'] = 'Metadatos gardados'; -$lang['img_backto'] = 'Volver a'; -$lang['img_title'] = 'Título'; -$lang['img_caption'] = 'Lenda'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Nome de arquivo'; -$lang['img_fsize'] = 'Tamaño'; -$lang['img_artist'] = 'Fotógrafo'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Formato'; -$lang['img_camera'] = 'Cámara'; -$lang['img_keywords'] = 'Verbas chave'; -$lang['img_width'] = 'Ancho'; -$lang['img_height'] = 'Alto'; -$lang['img_manager'] = 'Ver no xestor de arquivos-media'; +$lang['btn_img_backto'] = 'Volver a %s'; +$lang['img_title'] = 'Título:'; +$lang['img_caption'] = 'Lenda:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Nome de arquivo:'; +$lang['img_fsize'] = 'Tamaño:'; +$lang['img_artist'] = 'Fotógrafo:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Formato:'; +$lang['img_camera'] = 'Cámara:'; +$lang['img_keywords'] = 'Verbas chave:'; +$lang['img_width'] = 'Ancho:'; +$lang['img_height'] = 'Alto:'; +$lang['btn_mediaManager'] = 'Ver no xestor de arquivos-media'; $lang['subscr_subscribe_success'] = 'Engadido %s á lista de subscrición para %s'; $lang['subscr_subscribe_error'] = 'Erro ao tentar engadir %s á lista de subscrición para %s'; $lang['subscr_subscribe_noaddress'] = 'Non hai enderezos asociados co teu inicio de sesión, non é posíbel engadirte á lista de subscrición'; diff --git a/inc/lang/gl/searchpage.txt b/inc/lang/gl/searchpage.txt index 227ca5dbc..e37ec4642 100644 --- a/inc/lang/gl/searchpage.txt +++ b/inc/lang/gl/searchpage.txt @@ -1,5 +1,5 @@ ====== Procura ====== -Podes atopar os resultados da túa procura a continuación. Se non atopaches o que estabas a procurar, podes crear ou editar a páxina co nome relacionado coa túa procura empregando o botón axeitado. +Podes atopar os resultados da túa procura a continuación. @CREATEPAGEINFO@ ===== Resultados ===== diff --git a/inc/lang/he/denied.txt b/inc/lang/he/denied.txt index a366fc198..a2e19f3c5 100644 --- a/inc/lang/he/denied.txt +++ b/inc/lang/he/denied.txt @@ -1,3 +1,4 @@ ====== הרשאה נדחתה ====== -אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך. אולי שכחת להיכנס למערכת?
\ No newline at end of file +אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך. + diff --git a/inc/lang/he/jquery.ui.datepicker.js b/inc/lang/he/jquery.ui.datepicker.js new file mode 100644 index 000000000..9b1661352 --- /dev/null +++ b/inc/lang/he/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['he'] = { + closeText: 'סגור', + prevText: '<הקודם', + nextText: 'הבא>', + currentText: 'היום', + monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני', + 'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'], + monthNamesShort: ['ינו','פבר','מרץ','אפר','מאי','יוני', + 'יולי','אוג','ספט','אוק','נוב','דצמ'], + dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'], + dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['he']); + +return datepicker.regional['he']; + +})); diff --git a/inc/lang/he/lang.php b/inc/lang/he/lang.php index 2c4d758ff..5e2ecbdff 100644 --- a/inc/lang/he/lang.php +++ b/inc/lang/he/lang.php @@ -11,6 +11,8 @@ * @author Yaron Shahrabani <sh.yaron@gmail.com> * @author Roy Zahor <roy.zahor@gmail.com> * @author alex <ralexay@gmail.com> + * @author matt carroll <matt.carroll@gmail.com> + * @author tomer <tomercarolldergicz@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'rtl'; @@ -52,8 +54,10 @@ $lang['btn_recover'] = 'שחזור טיוטה'; $lang['btn_draftdel'] = 'מחיקת טיוטה'; $lang['btn_revert'] = 'שחזור'; $lang['btn_register'] = 'הרשמה'; +$lang['btn_apply'] = 'ליישם'; $lang['btn_media'] = 'מנהל המדיה'; -$lang['loggedinas'] = 'נכנסת בשם'; +$lang['btn_deleteuser'] = 'להסיר את החשבון שלי'; +$lang['loggedinas'] = 'נכנסת בשם:'; $lang['user'] = 'שם משתמש'; $lang['pass'] = 'ססמה'; $lang['newpass'] = 'ססמה חדשה'; @@ -68,6 +72,7 @@ $lang['badpassconfirm'] = 'מצטערים, הסיסמה שגויה'; $lang['minoredit'] = 'שינוים מזעריים'; $lang['draftdate'] = 'הטיוטה נשמרה אוטומטית ב־'; $lang['nosecedit'] = 'הדף השתנה בינתיים, הקטע שערכת אינו מעודכן - העמוד כולו נטען במקום זאת.'; +$lang['searchcreatepage'] = 'אם לא נמצאו דפים בחיפוש, לחיצה על הכפתור "עריכה" תיצור דף חדש על שם מילת החיפוש שהוזנה.'; $lang['regmissing'] = 'עליך למלא את כל השדות, עמך הסליחה.'; $lang['reguexists'] = 'משתמש בשם זה כבר נרשם, עמך הסליחה.'; $lang['regsuccess'] = 'ההרשמה הצליחה, המשתמש נרשם והודעה נשלחה בדוא״ל.'; @@ -81,7 +86,11 @@ $lang['profna'] = 'בוויקי הזה לא ניתן לשנות $lang['profnochange'] = 'אין שינויים, הפרופיל לא עודכן'; $lang['profnoempty'] = 'השם וכתובת הדוא״ל לא יכולים להיות ריקים'; $lang['profchanged'] = 'הפרופיל עודכן בהצלחה'; +$lang['profnodelete'] = 'ויקי אינה תומכת במחיקת משתמשים'; $lang['profdeleteuser'] = 'הסר חשבון'; +$lang['profdeleted'] = 'חשבון המשתמש שלך נמחק מויקי זה'; +$lang['profconfdelete'] = 'ברצוני להסיר את החשבון שלי מוויקי זה. <br/> לא ניתן לבטל פעולה זו.'; +$lang['profconfdeletemissing'] = 'תיבת אישור אינו מסומן'; $lang['pwdforget'] = 'שכחת את הססמה שלך? ניתן לקבל חדשה'; $lang['resendna'] = 'הוויקי הזה אינו תומך בחידוש ססמה'; $lang['resendpwd'] = 'הגדר סיסמא חדשה בעבור'; @@ -94,11 +103,12 @@ $lang['license'] = 'למעט מקרים בהם צוין אחרת, $lang['licenseok'] = 'נא לשים לב: עריכת דף זה מהווה הסכמה מצדך להצגת התוכן שהוספת בהתאם הרישיון הבא:'; $lang['searchmedia'] = 'חיפוש שם קובץ:'; $lang['searchmedia_in'] = 'חיפוש תחת %s'; -$lang['txt_upload'] = 'בחירת קובץ להעלות'; -$lang['txt_filename'] = 'העלאה בשם (נתון לבחירה)'; +$lang['txt_upload'] = 'בחירת קובץ להעלות:'; +$lang['txt_filename'] = 'העלאה בשם (נתון לבחירה):'; $lang['txt_overwrt'] = 'שכתוב על קובץ קיים'; -$lang['lockedby'] = 'נעול על ידי'; -$lang['lockexpire'] = 'הנעילה פגה'; +$lang['maxuploadsize'] = 'העלה מקסימום. s% לכל קובץ.'; +$lang['lockedby'] = 'נעול על ידי:'; +$lang['lockexpire'] = 'הנעילה פגה:'; $lang['js']['willexpire'] = 'הנעילה תחלוף עוד זמן קצר. \nלמניעת התנגשויות יש להשתמש בכפתור הרענון מטה כדי לאפס את מד משך הנעילה.'; $lang['js']['notsavedyet'] = 'שינויים שלא נשמרו ילכו לאיבוד.'; $lang['js']['searchmedia'] = 'חיפוש אחר קבצים'; @@ -133,6 +143,8 @@ $lang['js']['del_confirm'] = 'באמת למחוק?'; $lang['js']['restore_confirm'] = 'באמת לשחזר את הגירסא הזאת?'; $lang['js']['media_diff'] = 'הצגת הבדלים:'; $lang['js']['media_diff_both'] = 'זה לצד זה'; +$lang['js']['media_diff_opacity'] = 'ניקוי דרך'; +$lang['js']['media_diff_portions'] = 'לחבוט'; $lang['js']['media_select'] = 'בחר קבצים...'; $lang['js']['media_upload_btn'] = 'העלאה'; $lang['js']['media_done_btn'] = 'בוצע'; @@ -177,9 +189,9 @@ $lang['diff_type'] = 'הצגת הבדלים:'; $lang['diff_inline'] = 'באותה השורה'; $lang['diff_side'] = 'זה לצד זה'; $lang['line'] = 'שורה'; -$lang['breadcrumb'] = 'ביקורים אחרונים'; -$lang['youarehere'] = 'זהו מיקומך'; -$lang['lastmod'] = 'מועד השינוי האחרון'; +$lang['breadcrumb'] = 'ביקורים אחרונים:'; +$lang['youarehere'] = 'זהו מיקומך:'; +$lang['lastmod'] = 'מועד השינוי האחרון:'; $lang['by'] = 'על ידי'; $lang['deleted'] = 'נמחק'; $lang['created'] = 'נוצר'; @@ -193,13 +205,16 @@ $lang['user_tools'] = 'כלים של משתמש'; $lang['site_tools'] = 'כלים של אתר'; $lang['page_tools'] = 'כלים של דף'; $lang['skip_to_content'] = 'עבור לתוכן'; +$lang['sidebar'] = 'הסרגל הצידי'; $lang['mail_newpage'] = 'דף נוסף:'; $lang['mail_changed'] = 'דף שונה:'; $lang['mail_subscribe_list'] = 'דפים שהשתנו במרחב השם:'; $lang['mail_new_user'] = 'משתמש חדש:'; $lang['mail_upload'] = 'קובץ הועלה:'; +$lang['changes_type'] = 'צפו בשינויים של'; $lang['pages_changes'] = 'דפים'; $lang['media_changes'] = 'קבצי מדיה'; +$lang['both_changes'] = 'קבצי מדיה ודפים '; $lang['qb_bold'] = 'טקסט מודגש'; $lang['qb_italic'] = 'טקסט נטוי'; $lang['qb_underl'] = 'טקסט עם קו תחתון'; @@ -229,19 +244,20 @@ $lang['admin_register'] = 'הוספת משתמש חדש'; $lang['metaedit'] = 'עריכת נתוני העל'; $lang['metasaveerr'] = 'אירע כשל בשמירת נתוני העל'; $lang['metasaveok'] = 'נתוני העל נשמרו'; -$lang['img_backto'] = 'חזרה אל'; -$lang['img_title'] = 'שם'; -$lang['img_caption'] = 'כותרת'; -$lang['img_date'] = 'תאריך'; -$lang['img_fname'] = 'שם הקובץ'; -$lang['img_fsize'] = 'גודל'; -$lang['img_artist'] = 'צלם'; -$lang['img_copyr'] = 'זכויות יוצרים'; -$lang['img_format'] = 'מבנה'; -$lang['img_camera'] = 'מצלמה'; -$lang['img_keywords'] = 'מילות מפתח'; -$lang['img_width'] = 'רוחב'; -$lang['img_height'] = 'גובה'; +$lang['btn_img_backto'] = 'חזרה אל %s'; +$lang['img_title'] = 'שם:'; +$lang['img_caption'] = 'כותרת:'; +$lang['img_date'] = 'תאריך:'; +$lang['img_fname'] = 'שם הקובץ:'; +$lang['img_fsize'] = 'גודל:'; +$lang['img_artist'] = 'צלם:'; +$lang['img_copyr'] = 'זכויות יוצרים:'; +$lang['img_format'] = 'מבנה:'; +$lang['img_camera'] = 'מצלמה:'; +$lang['img_keywords'] = 'מילות מפתח:'; +$lang['img_width'] = 'רוחב:'; +$lang['img_height'] = 'גובה:'; +$lang['btn_mediaManager'] = 'צפה במנהל מדיה'; $lang['subscr_subscribe_success'] = '%s נוסף לרשימת המינויים לדף %s'; $lang['subscr_subscribe_error'] = 'אירעה שגיאה בהוספת %s לרשימת המינויים לדף %s'; $lang['subscr_subscribe_noaddress'] = 'אין כתובת המשויכת עם הכניסה שלך, נא ניתן להוסיף אותך לרשימת המינויים'; @@ -259,6 +275,7 @@ $lang['subscr_style_every'] = 'דוא״ל עם כל שינוי'; $lang['subscr_style_digest'] = 'הודעת דוא״ל המציגה את כל השינויים בכל עמוד (בכל %.2f ימים)'; $lang['subscr_style_list'] = 'רשימת השינויים בדפים מאז הודעת הדוא״ל האחרונה (בכל %.2f ימים)'; $lang['authtempfail'] = 'אימות משתמשים אינו זמין כרגע. אם מצב זה נמשך נא ליידע את מנהל הוויקי.'; +$lang['authpwdexpire'] = 'הסיסמה שלך תפוג ב% d ימים, אתה צריך לשנות את זה בקרוב.'; $lang['i_chooselang'] = 'נא לבחור שפה'; $lang['i_installer'] = 'תכנית ההתקנה של DokuWiki'; $lang['i_wikiname'] = 'שם הוויקי'; @@ -269,6 +286,7 @@ $lang['i_modified'] = 'משיקולי אבטחה סקריפט זה י עליך לחלץ שנית את הקבצים מהחבילה שהורדה או להיעזר בדף <a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>'; $lang['i_funcna'] = 'פונקציית ה-PHP‏ <code>%s</code> אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?'; +$lang['i_phpver'] = 'גרסת PHP שלך <code>%s</code> נמוכה מ <code>%s</code> הצורך. אתה צריך לשדרג PHP שלך להתקין.'; $lang['i_permfail'] = '<code>%s</code> אינה ניתנת לכתיבה על ידי DokuWiki. עליך לשנות הרשאות תיקייה זו!'; $lang['i_confexists'] = '<code>%s</code> כבר קיים'; $lang['i_writeerr'] = 'אין אפשרות ליצור את <code>%s</code>. נא לבדוק את הרשאות הקובץ/תיקייה וליצור את הקובץ ידנית.'; @@ -280,8 +298,12 @@ $lang['i_policy'] = 'מדיניות ACL התחלתית'; $lang['i_pol0'] = 'ויקי פתוח (קריאה, כתיבה והעלאה לכולם)'; $lang['i_pol1'] = ' ויקי ציבורי (קריאה לכולם, כתיבה והעלאה למשתמשים רשומים)'; $lang['i_pol2'] = 'ויקי סגור (קריאה, כתיבה והעלאה למשתמשים רשומים בלבד)'; +$lang['i_allowreg'] = 'אפשר למשתמשים לרשום את עצמם'; $lang['i_retry'] = 'ניסיון נוסף'; $lang['i_license'] = 'נא לבחור את הרישיון שיחול על התוכן שבוויקי שלך:'; +$lang['i_license_none'] = 'אל תציג כל מידע רישיון'; +$lang['i_pop_field'] = 'אנא, עזרו לנו לשפר את חווית ה DokuWiki:'; +$lang['i_pop_label'] = 'פעם בחודש, לשלוח את נתוני שימוש אנונימיים למפתחי DokuWiki'; $lang['recent_global'] = 'נכון לעכשיו מתנהל על ידיך מעקב אחר מרחב השם <b>%s</b>. כמו כן, באפשרותך <a href="%s">לצפות בשינויים האחרונים בוויקי כולו</a>.'; $lang['years'] = 'לפני %d שנים'; $lang['months'] = 'לפני %d חודשים'; @@ -291,12 +313,16 @@ $lang['hours'] = 'לפני %d שעות'; $lang['minutes'] = 'לפני %d דקות'; $lang['seconds'] = 'לפני %d שניות'; $lang['wordblock'] = 'השינויים שלך לא נשמרו כיוון שהם מכילים טקסט חסום (ספאם).'; +$lang['media_uploadtab'] = 'להעלות'; $lang['media_searchtab'] = 'חיפוש'; $lang['media_file'] = 'קובץ'; $lang['media_viewtab'] = 'תצוגה'; $lang['media_edittab'] = 'עריכה'; $lang['media_historytab'] = 'היסטוריה'; +$lang['media_list_thumbs'] = 'תמונות ממוזערות'; $lang['media_list_rows'] = 'שורות'; $lang['media_sort_name'] = 'שם'; $lang['media_sort_date'] = 'תאריך'; $lang['media_namespaces'] = 'בחר מרחב שמות'; +$lang['media_files'] = 'קבצים ב s%'; +$lang['media_upload'] = 'להעלות s%'; diff --git a/inc/lang/he/searchpage.txt b/inc/lang/he/searchpage.txt index aed23be24..78839c371 100644 --- a/inc/lang/he/searchpage.txt +++ b/inc/lang/he/searchpage.txt @@ -1,5 +1,5 @@ ====== חיפוש ====== -ניתן לראות את תוצאות החיפוש למטה. אם לא נמצאו דפים בחיפוש, לחיצה על הכפתור "עריכה" תיצור דף חדש על שם מילת החיפוש שהוזנה. +ניתן לראות את תוצאות החיפוש למטה. @CREATEPAGEINFO@ ===== תוצאות =====
\ No newline at end of file diff --git a/inc/lang/hi/jquery.ui.datepicker.js b/inc/lang/hi/jquery.ui.datepicker.js new file mode 100644 index 000000000..f20a900ca --- /dev/null +++ b/inc/lang/hi/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Hindi initialisation for the jQuery UI date picker plugin. */ +/* Written by Michael Dawart. */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['hi'] = { + closeText: 'बंद', + prevText: 'पिछला', + nextText: 'अगला', + currentText: 'आज', + monthNames: ['जनवरी ','फरवरी','मार्च','अप्रेल','मई','जून', + 'जूलाई','अगस्त ','सितम्बर','अक्टूबर','नवम्बर','दिसम्बर'], + monthNamesShort: ['जन', 'फर', 'मार्च', 'अप्रेल', 'मई', 'जून', + 'जूलाई', 'अग', 'सित', 'अक्ट', 'नव', 'दि'], + dayNames: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'], + dayNamesShort: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], + dayNamesMin: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], + weekHeader: 'हफ्ता', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['hi']); + +return datepicker.regional['hi']; + +})); diff --git a/inc/lang/hi/lang.php b/inc/lang/hi/lang.php index 184eeedbc..71795191c 100644 --- a/inc/lang/hi/lang.php +++ b/inc/lang/hi/lang.php @@ -63,11 +63,11 @@ $lang['profna'] = 'यह विकी प्रोफ़ाइ $lang['profnochange'] = 'कोई परिवर्तन नहीं, कुछ नहीं करना |'; $lang['resendpwdmissing'] = 'छमा करें, आपको सारे रिक्त स्थान भरने पड़ेंगे |'; $lang['resendpwdsuccess'] = 'आपका नवगुप्तशब्द ईमेल द्वारा सम्प्रेषित कर दिया गया है |'; -$lang['txt_upload'] = 'अपलोड करने के लिए फ़ाइल चुनें'; -$lang['txt_filename'] = 'के रूप में अपलोड करें (वैकल्पिक)'; +$lang['txt_upload'] = 'अपलोड करने के लिए फ़ाइल चुनें:'; +$lang['txt_filename'] = 'के रूप में अपलोड करें (वैकल्पिक):'; $lang['txt_overwrt'] = 'अधिलेखित उपस्थित फ़ाइल'; -$lang['lockedby'] = 'इस समय तक बंद'; -$lang['lockexpire'] = 'बंद समाप्त होगा'; +$lang['lockedby'] = 'इस समय तक बंद:'; +$lang['lockexpire'] = 'बंद समाप्त होगा:'; $lang['js']['hidedetails'] = 'विवरण छिपाएँ'; $lang['nothingfound'] = 'कुच्छ नहीं मिला |'; $lang['uploadexist'] = 'फ़ाइल पहले से उपस्थित है. कुछ भी नहीं किया |'; @@ -81,8 +81,8 @@ $lang['yours'] = 'आपका संस्करणः'; $lang['diff'] = 'वर्तमान संशोधन में मतभेद दिखाइये |'; $lang['diff2'] = 'चयनित संशोधन के बीच में मतभेद दिखाइये |'; $lang['line'] = 'रेखा'; -$lang['youarehere'] = 'आप यहाँ हैं |'; -$lang['lastmod'] = 'अंतिम बार संशोधित'; +$lang['youarehere'] = 'आप यहाँ हैं |:'; +$lang['lastmod'] = 'अंतिम बार संशोधित:'; $lang['by'] = 'के द्वारा'; $lang['deleted'] = 'हटाया'; $lang['created'] = 'निर्मित'; @@ -103,14 +103,14 @@ $lang['qb_extlink'] = 'बाह्य कड़ी'; $lang['qb_hr'] = 'खड़ी रेखा'; $lang['qb_sig'] = 'हस्ताक्षर डालें'; $lang['admin_register'] = 'नया उपयोगकर्ता जोड़ें'; -$lang['img_backto'] = 'वापस जाना'; -$lang['img_title'] = 'शीर्षक'; -$lang['img_caption'] = 'सहशीर्षक'; -$lang['img_date'] = 'तिथि'; -$lang['img_fsize'] = 'आकार'; -$lang['img_artist'] = 'फोटोग्राफर'; -$lang['img_format'] = 'प्रारूप'; -$lang['img_camera'] = 'कैमरा'; +$lang['btn_img_backto'] = 'वापस जाना %s'; +$lang['img_title'] = 'शीर्षक:'; +$lang['img_caption'] = 'सहशीर्षक:'; +$lang['img_date'] = 'तिथि:'; +$lang['img_fsize'] = 'आकार:'; +$lang['img_artist'] = 'फोटोग्राफर:'; +$lang['img_format'] = 'प्रारूप:'; +$lang['img_camera'] = 'कैमरा:'; $lang['i_chooselang'] = 'अपनी भाषा चुनें'; $lang['i_installer'] = 'डोकुविकी इंस्टॉलर'; $lang['i_wikiname'] = 'विकी का नाम'; diff --git a/inc/lang/hr/adminplugins.txt b/inc/lang/hr/adminplugins.txt new file mode 100644 index 000000000..5a7656d27 --- /dev/null +++ b/inc/lang/hr/adminplugins.txt @@ -0,0 +1 @@ +===== Dodatni dodatci =====
\ No newline at end of file diff --git a/inc/lang/hr/backlinks.txt b/inc/lang/hr/backlinks.txt index e7115a6b6..a78b9213e 100644 --- a/inc/lang/hr/backlinks.txt +++ b/inc/lang/hr/backlinks.txt @@ -1,3 +1,3 @@ -====== Linkovi na stranicu ====== +====== Veze na stranicu ====== -Slijedi spisak svih dokumenata koji imaju link na trenutni. +Slijedi spisak svih stanica koje imaju vezu na trenutnu stranicu. diff --git a/inc/lang/hr/denied.txt b/inc/lang/hr/denied.txt index 216eea582..172b0fc92 100644 --- a/inc/lang/hr/denied.txt +++ b/inc/lang/hr/denied.txt @@ -2,4 +2,3 @@ Nemate autorizaciju. -Niste li se možda zaboravili prijaviti u aplikaciju? diff --git a/inc/lang/hr/draft.txt b/inc/lang/hr/draft.txt new file mode 100644 index 000000000..2e6e08429 --- /dev/null +++ b/inc/lang/hr/draft.txt @@ -0,0 +1,4 @@ +====== Nađena neuspjelo uređivanje stranice ====== + +Vaše zadnje uređivanje ove stranice nije završilo uredno. DokuWiki je automatski snimio kopiju tijekom rada koju sada možete iskoristiti da nastavite uređivanje. Niže možete vidjeti sadržaj koji je snimljen pri vašem zadnjem uređivanju. +Molimo odlučite da li želite //vratiti// ili //obrisati// snimljeni sadržaj pri vašem zadnjem neuspjelom uređivanju, ili pak želite //odustati// od uređivanja. diff --git a/inc/lang/hr/edit.txt b/inc/lang/hr/edit.txt index 8cd57d524..bce1abeea 100644 --- a/inc/lang/hr/edit.txt +++ b/inc/lang/hr/edit.txt @@ -1 +1 @@ -Nakon što ste napravili sve potrebne promjene - odaberite ''Snimi'' za snimanje dokumenta. +Uredite stranicu i pritisnite "Snimi". Pogledajte [[wiki:syntax]] za Wiki sintaksu. Molimo izmijenite samo ako možete unaprijediti sadržaj. Ako trebate testirati ili naučiti kako se nešto radi, molimo koristite za to namijenjene stranice kao što je [[playground:playground|igraonica]]. diff --git a/inc/lang/hr/index.txt b/inc/lang/hr/index.txt index 9c30a805c..4395994c4 100644 --- a/inc/lang/hr/index.txt +++ b/inc/lang/hr/index.txt @@ -1 +1,3 @@ -====== Indeks ====== +====== Mapa stranica ====== + +Ovo je mapa svih dostupnih stranica poredanih po [[doku>namespaces|imenskom prostoru]]. diff --git a/inc/lang/hr/jquery.ui.datepicker.js b/inc/lang/hr/jquery.ui.datepicker.js new file mode 100644 index 000000000..e8b0414b5 --- /dev/null +++ b/inc/lang/hr/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Croatian i18n for the jQuery UI date picker plugin. */ +/* Written by Vjekoslav Nesek. */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['hr'] = { + closeText: 'Zatvori', + prevText: '<', + nextText: '>', + currentText: 'Danas', + monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj', + 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'], + monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip', + 'Srp','Kol','Ruj','Lis','Stu','Pro'], + dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'], + weekHeader: 'Tje', + dateFormat: 'dd.mm.yy.', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['hr']); + +return datepicker.regional['hr']; + +})); diff --git a/inc/lang/hr/lang.php b/inc/lang/hr/lang.php index f19610827..6e4e48e36 100644 --- a/inc/lang/hr/lang.php +++ b/inc/lang/hr/lang.php @@ -1,12 +1,13 @@ <?php + /** - * croatian language file - * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * * @author Tomo Krajina <aaa@puzz.info> * @author Branko Rihtman <theney@gmail.com> * @author Dražen Odobašić <dodobasic@gmail.com> * @author Dejan Igrec dejan.igrec@gmail.com + * @author Davor Turkalj <turki.bsc@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -15,52 +16,60 @@ $lang['doublequoteclosing'] = '”'; $lang['singlequoteopening'] = '‘'; $lang['singlequoteclosing'] = '’'; $lang['apostrophe'] = '\''; -$lang['btn_edit'] = 'Izmijeni dokument'; -$lang['btn_source'] = 'Prikaži kod dokumenta'; +$lang['btn_edit'] = 'Izmijeni stranicu'; +$lang['btn_source'] = 'Prikaži kod stranice'; $lang['btn_show'] = 'Prikaži dokument'; -$lang['btn_create'] = 'Novi dokument'; +$lang['btn_create'] = 'Stvori ovu stranicu'; $lang['btn_search'] = 'Pretraži'; $lang['btn_save'] = 'Spremi'; $lang['btn_preview'] = 'Prikaži'; $lang['btn_top'] = 'Na vrh'; $lang['btn_newer'] = '<< noviji'; $lang['btn_older'] = 'stariji >>'; -$lang['btn_revs'] = 'Stare inačice'; +$lang['btn_revs'] = 'Stare promjene'; $lang['btn_recent'] = 'Nedavne izmjene'; -$lang['btn_upload'] = 'Postavi'; +$lang['btn_upload'] = 'Učitaj'; $lang['btn_cancel'] = 'Odustani'; -$lang['btn_index'] = 'Indeks'; -$lang['btn_secedit'] = 'Izmjeni'; +$lang['btn_index'] = 'Mapa lokacije'; +$lang['btn_secedit'] = 'Uredi'; $lang['btn_login'] = 'Prijavi se'; $lang['btn_logout'] = 'Odjavi se'; $lang['btn_admin'] = 'Administriranje'; -$lang['btn_update'] = 'Ažuriraj'; +$lang['btn_update'] = 'Dopuni'; $lang['btn_delete'] = 'Obriši'; -$lang['btn_back'] = 'Povratak'; +$lang['btn_back'] = 'Nazad'; $lang['btn_backlink'] = 'Povratni linkovi'; -$lang['btn_backtomedia'] = 'Povratak na Mediafile izbornik'; -$lang['btn_subscribe'] = 'Pretplati se na promjene dokumenta'; -$lang['btn_profile'] = 'Ažuriraj profil'; -$lang['btn_reset'] = 'Poništi promjene'; +$lang['btn_backtomedia'] = 'Natrag na odabir datoteka'; +$lang['btn_subscribe'] = 'Uređivanje pretplata'; +$lang['btn_profile'] = 'Dopuni profil'; +$lang['btn_reset'] = 'Poništi'; +$lang['btn_resendpwd'] = 'Postavi novu lozinku'; $lang['btn_draft'] = 'Uredi nacrt dokumenta'; -$lang['btn_recover'] = 'Vrati prijašnji nacrt dokumenta'; -$lang['btn_draftdel'] = 'Obriši nacrt dokumenta'; +$lang['btn_recover'] = 'Vrati nacrt stranice'; +$lang['btn_draftdel'] = 'Obriši nacrt stranice'; $lang['btn_revert'] = 'Vrati'; $lang['btn_register'] = 'Registracija'; -$lang['loggedinas'] = 'Prijavljen kao'; +$lang['btn_apply'] = 'Primjeni'; +$lang['btn_media'] = 'Upravitelj datoteka'; +$lang['btn_deleteuser'] = 'Ukloni mog korisnika'; +$lang['btn_img_backto'] = 'Povratak na %s'; +$lang['btn_mediaManager'] = 'Pogledaj u upravitelju datoteka'; +$lang['loggedinas'] = 'Prijavljen kao:'; $lang['user'] = 'Korisničko ime'; $lang['pass'] = 'Lozinka'; $lang['newpass'] = 'Nova lozinka'; $lang['oldpass'] = 'Potvrdi trenutnu lozinku'; -$lang['passchk'] = 'Ponoviti'; +$lang['passchk'] = 'još jednom'; $lang['remember'] = 'Zapamti me'; $lang['fullname'] = 'Ime i prezime'; -$lang['email'] = 'Email'; +$lang['email'] = 'E-pošta'; $lang['profile'] = 'Korisnički profil'; -$lang['badlogin'] = 'Ne ispravno korisničko ime ili lozinka.'; +$lang['badlogin'] = 'Neispravno korisničko ime ili lozinka.'; +$lang['badpassconfirm'] = 'Nažalost, lozinka nije ispravna'; $lang['minoredit'] = 'Manje izmjene'; -$lang['draftdate'] = 'Nacrt dokumenta je automatski spremljen u '; +$lang['draftdate'] = 'Nacrt promjena automatski spremljen u'; $lang['nosecedit'] = 'Stranica se u međuvremenu promijenila. Informacija o odjeljku je ostarila pa je učitana kompletna stranica.'; +$lang['searchcreatepage'] = 'Ako ne možete naći što tražite, možete urediti ili stvoriti novu stranicu s odgovarajućim alatom.'; $lang['regmissing'] = 'Morate popuniti sva polja.'; $lang['reguexists'] = 'Korisnik s tim korisničkim imenom već postoji.'; $lang['regsuccess'] = 'Korisnik je uspješno stvoren i poslana je lozinka emailom.'; @@ -72,25 +81,32 @@ $lang['regpwmail'] = 'Vaša DokuWiki lozinka'; $lang['reghere'] = 'Još uvijek nemate korisnički račun? Registrirajte se.'; $lang['profna'] = 'Ovaj wiki ne dopušta izmjene korisničkog profila.'; $lang['profnochange'] = 'Nema izmjena.'; -$lang['profnoempty'] = 'Prazno korisničko ime ili email nisu dopušteni.'; +$lang['profnoempty'] = 'Prazno korisničko ime ili e-pošta nisu dopušteni.'; $lang['profchanged'] = 'Korisnički profil je uspješno izmijenjen.'; +$lang['profnodelete'] = 'Ovaj wiki ne podržava brisanje korisnika'; +$lang['profdeleteuser'] = 'Obriši korisnika'; +$lang['profdeleted'] = 'Vaš korisnik je obrisan s ovog wiki-a'; +$lang['profconfdelete'] = 'Želim ukloniti mojeg korisnika s ovog wiki-a. <br/> Ova akcija se ne može poništiti.'; +$lang['profconfdeletemissing'] = 'Kvačica za potvrdu nije označena'; $lang['pwdforget'] = 'Izgubili ste lozinku? Zatražite novu'; -$lang['resendna'] = 'Ovaj wiki ne podržava ponovno slanje lozinke emailom.'; +$lang['resendna'] = 'Ovaj wiki ne podržava ponovno slanje lozinke e-poštom.'; +$lang['resendpwd'] = 'Postavi novu lozinku za'; $lang['resendpwdmissing'] = 'Ispunite sva polja.'; $lang['resendpwdnouser'] = 'Nije moguće pronaći korisnika.'; $lang['resendpwdbadauth'] = 'Neispravan autorizacijski kod. Provjerite da li ste koristili potpun potvrdni link.'; -$lang['resendpwdconfirm'] = 'Potvrdni link je poslan emailom.'; -$lang['resendpwdsuccess'] = 'Nova lozinka je poslana emailom.'; +$lang['resendpwdconfirm'] = 'Potvrdni link je poslan e-poštom.'; +$lang['resendpwdsuccess'] = 'Nova lozinka je poslana e-poštom.'; $lang['license'] = 'Osim na mjestima gdje je naznačeno drugačije, sadržaj ovog wikija je licenciran sljedećom licencom:'; $lang['licenseok'] = 'Pažnja: promjenom ovog dokumenta pristajete licencirati sadržaj sljedećom licencom: '; $lang['searchmedia'] = 'Traži naziv datoteke:'; $lang['searchmedia_in'] = 'Traži u %s'; -$lang['txt_upload'] = 'Odaberite datoteku za postavljanje'; -$lang['txt_filename'] = 'Postaviti kao (nije obavezno)'; +$lang['txt_upload'] = 'Odaberite datoteku za učitavanje:'; +$lang['txt_filename'] = 'Učitaj kao (nije obavezno):'; $lang['txt_overwrt'] = 'Prepiši postojeću datoteku'; -$lang['lockedby'] = 'Zaključao'; -$lang['lockexpire'] = 'Zaključano do'; -$lang['js']['willexpire'] = 'Dokument kojeg mijenjate će biti zaključan još 1 minutu.\n Ukoliko želite i dalje raditi izmjene na dokumentu - kliknite na "Pregled".'; +$lang['maxuploadsize'] = 'Moguće je učitati maks. %s po datoteci.'; +$lang['lockedby'] = 'Trenutno zaključao:'; +$lang['lockexpire'] = 'Zaključano do:'; +$lang['js']['willexpire'] = 'Dokument kojeg mijenjate će biti zaključan još 1 minutu.\n Ukoliko želite i dalje raditi izmjene na dokumentu - kliknite na "Pregled".'; $lang['js']['notsavedyet'] = 'Vaše izmjene će se izgubiti. Želite li nastaviti?'; $lang['js']['searchmedia'] = 'Traži datoteke'; @@ -121,18 +137,29 @@ $lang['js']['nosmblinks'] = 'Linkovi na dijeljene Windows mape rade samo s $lang['js']['linkwiz'] = 'Čarobnjak za poveznice'; $lang['js']['linkto'] = 'Poveznica na:'; $lang['js']['del_confirm'] = 'Zbilja želite obrisati odabrane stavke?'; +$lang['js']['restore_confirm'] = 'Zaista želite vratiti ovu verziju?'; +$lang['js']['media_diff'] = 'Pogledaj razlike:'; +$lang['js']['media_diff_both'] = 'Usporedni prikaz'; +$lang['js']['media_diff_opacity'] = 'Sjaj kroz'; +$lang['js']['media_diff_portions'] = 'Pomakni'; +$lang['js']['media_select'] = 'Odaberi datoteke ...'; +$lang['js']['media_upload_btn'] = 'Učitavanje'; +$lang['js']['media_done_btn'] = 'Gotovo'; +$lang['js']['media_drop'] = 'Ovdje spusti datoteke za učitavanje'; +$lang['js']['media_cancel'] = 'ukloni'; +$lang['js']['media_overwrt'] = 'Prepiši preko postojeće datoteke'; $lang['rssfailed'] = 'Došlo je do greške prilikom preuzimanja feed-a: '; $lang['nothingfound'] = 'Traženi dokumetni nisu pronađeni.'; -$lang['mediaselect'] = 'Mediafile datoteke'; -$lang['fileupload'] = 'Mediafile postavljanje'; -$lang['uploadsucc'] = 'Postavljanje uspješno'; -$lang['uploadfail'] = 'Neuspješno postavljanje. Možda dozvole na poslužitelju nisu ispravne?'; -$lang['uploadwrong'] = 'Postavljanje nije dopušteno. Nastavak datoteke je zabranjen!'; +$lang['mediaselect'] = 'Datoteke'; +$lang['fileupload'] = 'Učitavanje datoteka'; +$lang['uploadsucc'] = 'Učitavanje uspješno'; +$lang['uploadfail'] = 'Neuspješno učitavanje. Možda dozvole na poslužitelju nisu ispravne?'; +$lang['uploadwrong'] = 'Učitavanje nije dopušteno. Nastavak datoteke je zabranjen!'; $lang['uploadexist'] = 'Datoteka već postoji.'; -$lang['uploadbadcontent'] = 'Postavljeni sadržaj ne odgovara ekstenziji %s datoteke.'; -$lang['uploadspam'] = 'Postavljanje je blokirano spam crnom listom.'; -$lang['uploadxss'] = 'Postavljanje je blokirano zbog mogućeg zlonamjernog sadržaja.'; -$lang['uploadsize'] = 'Postavljena datoteka je prevelika (max. %s)'; +$lang['uploadbadcontent'] = 'Učitani sadržaj ne odgovara ekstenziji %s datoteke.'; +$lang['uploadspam'] = 'Učitavanje je spriječeno od spam crne liste.'; +$lang['uploadxss'] = 'Učitavanje je spriječeno zbog mogućeg zlonamjernog sadržaja.'; +$lang['uploadsize'] = 'Učitana datoteka je prevelika (max. %s)'; $lang['deletesucc'] = 'Datoteka "%s" je obrisana.'; $lang['deletefail'] = '"%s" se ne može obrisati - provjerite dozvole na poslužitelju.'; $lang['mediainuse'] = 'Datoteka "%s" nije obrisana - još uvijek se koristi.'; @@ -140,10 +167,10 @@ $lang['namespaces'] = 'Imenski prostori'; $lang['mediafiles'] = 'Datoteke u'; $lang['accessdenied'] = 'Nemate potrebne dozvole za pregled ove stranice.'; $lang['mediausage'] = 'Koristi sljedeću sintaksu za referenciranje ove datoteke:'; -$lang['mediaview'] = 'Pregledaj originalnu datoteku'; +$lang['mediaview'] = 'Vidi izvornu datoteku'; $lang['mediaroot'] = 'root'; $lang['mediaupload'] = 'Postavi datoteku u odabrani imenski prostor. Podimenski prostori se stvaraju dodavanjem istih kao prefiks naziva datoteke u "Postavi kao" polju, tako da se odvoje dvotočkama.'; -$lang['mediaextchange'] = 'Ekstenzija datoteke promijenjena iz .%s u .%s!'; +$lang['mediaextchange'] = 'Nastavak datoteke promijenjen iz .%s u .%s!'; $lang['reference'] = 'Reference za'; $lang['ref_inuse'] = 'Datoteka se ne može obrisati jer se još uvijek koristi u sljedećim dokumentima:'; $lang['ref_hidden'] = 'Neke reference se nalaze na dokumentima koje nemate dozvolu čitati'; @@ -152,51 +179,66 @@ $lang['quickhits'] = 'Pronađeno po nazivima dokumenata'; $lang['toc'] = 'Sadržaj'; $lang['current'] = 'trenutno'; $lang['yours'] = 'Vaša inačica'; -$lang['diff'] = 'Prikaži razlike u odnosu na trenutnu inačicu'; -$lang['diff2'] = 'Pokaži razlike između odabranih inačica'; -$lang['difflink'] = 'Poveznica na ovaj prikaz usporedbe'; -$lang['diff_type'] = 'Razlike u prikazu:'; +$lang['diff'] = 'Prikaži razlike u odnosu na zadnje stanje'; +$lang['diff2'] = 'Pokaži razlike između odabranih izmjena'; +$lang['difflink'] = 'Poveznica na ovu usporedbu'; +$lang['diff_type'] = 'Vidi razlike:'; $lang['diff_inline'] = 'U istoj razini'; $lang['diff_side'] = 'Usporedo'; +$lang['diffprevrev'] = 'Starija izmjena'; +$lang['diffnextrev'] = 'Novija izmjena'; +$lang['difflastrev'] = 'Zadnja izmjena'; +$lang['diffbothprevrev'] = 'Starije izmjene na obje strane'; +$lang['diffbothnextrev'] = 'Novije izmjene na obje strane'; $lang['line'] = 'Redak'; -$lang['breadcrumb'] = 'Putanja'; -$lang['youarehere'] = 'Vi ste ovdje'; -$lang['lastmod'] = 'Zadnja izmjena'; +$lang['breadcrumb'] = 'Zadnje viđeno:'; +$lang['youarehere'] = 'Vi ste ovdje:'; +$lang['lastmod'] = 'Zadnja izmjena:'; $lang['by'] = 'od'; $lang['deleted'] = 'obrisano'; $lang['created'] = 'stvoreno'; -$lang['restored'] = 'vraćena prijašnja inačica (%s)'; +$lang['restored'] = 'vraćeno na prijašnju izmjenu (%s)'; $lang['external_edit'] = 'vanjsko uređivanje'; $lang['summary'] = 'Sažetak izmjena'; $lang['noflash'] = 'Za prikazivanje ovog sadržaja potreban je <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>'; $lang['download'] = 'Preuzmi isječak'; +$lang['tools'] = 'Alati'; +$lang['user_tools'] = 'Korisnički alati'; +$lang['site_tools'] = 'Site alati'; +$lang['page_tools'] = 'Stranični alati'; +$lang['skip_to_content'] = 'preskoči na sadržaj'; +$lang['sidebar'] = 'Bočna traka'; $lang['mail_newpage'] = 'stranica dodana:'; $lang['mail_changed'] = 'stranica izmjenjena:'; $lang['mail_subscribe_list'] = 'stranice promijenjene u imenskom prostoru:'; $lang['mail_new_user'] = 'novi korisnik:'; -$lang['mail_upload'] = 'datoteka postavljena:'; +$lang['mail_upload'] = 'datoteka učitana:'; +$lang['changes_type'] = 'Vidi promjene od'; +$lang['pages_changes'] = 'Stranice'; +$lang['media_changes'] = 'Datoteke'; +$lang['both_changes'] = 'Zajedno stranice i datoteke'; $lang['qb_bold'] = 'Podebljani tekst'; $lang['qb_italic'] = 'Ukošeni tekst'; $lang['qb_underl'] = 'Podcrtani tekst'; $lang['qb_code'] = 'Kod'; $lang['qb_strike'] = 'Precrtani tekst'; -$lang['qb_h1'] = 'Naslov - razina 1'; -$lang['qb_h2'] = 'Naslov - razina 2'; -$lang['qb_h3'] = 'Naslov - razina 3'; -$lang['qb_h4'] = 'Naslov - razina 4'; -$lang['qb_h5'] = 'Naslov - razina 5'; +$lang['qb_h1'] = 'Naslov 1. razine'; +$lang['qb_h2'] = 'Naslov 2. razine'; +$lang['qb_h3'] = 'Naslov 3. razine'; +$lang['qb_h4'] = 'Naslov 4. razine'; +$lang['qb_h5'] = 'Naslov 5. razine'; $lang['qb_h'] = 'Naslov'; $lang['qb_hs'] = 'Odaberite naslov'; $lang['qb_hplus'] = 'Naslov više razine'; $lang['qb_hminus'] = 'Naslov niže razine'; $lang['qb_hequal'] = 'Naslov iste razine'; -$lang['qb_link'] = 'Interni link'; -$lang['qb_extlink'] = 'Vanjski link'; +$lang['qb_link'] = 'Interna poveznica'; +$lang['qb_extlink'] = 'Vanjska poveznica'; $lang['qb_hr'] = 'Vodoravna crta'; -$lang['qb_ol'] = 'Pobrojana lista'; -$lang['qb_ul'] = 'Lista'; -$lang['qb_media'] = 'Dodaj slike i ostale datoteke'; -$lang['qb_sig'] = 'Potpis'; +$lang['qb_ol'] = 'Element brojane liste'; +$lang['qb_ul'] = 'Element obične liste'; +$lang['qb_media'] = 'Dodaj slike i ostale datoteke (prikaz u novom prozoru)'; +$lang['qb_sig'] = 'Ubaci potpis'; $lang['qb_smileys'] = 'Smiješkići'; $lang['qb_chars'] = 'Posebni znakovi'; $lang['upperns'] = 'Skoči u nadređeni imenski prostor'; @@ -204,17 +246,18 @@ $lang['admin_register'] = 'Dodaj novog korisnika'; $lang['metaedit'] = 'Uredi metapodatake'; $lang['metasaveerr'] = 'Neuspješno zapisivanje metapodataka'; $lang['metasaveok'] = 'Spremljeni metapdaci'; -$lang['img_backto'] = 'Povratak na'; -$lang['img_title'] = 'Naziv'; -$lang['img_caption'] = 'Naslov'; -$lang['img_date'] = 'Datum'; -$lang['img_fname'] = 'Ime datoteke'; -$lang['img_fsize'] = 'Veličina'; -$lang['img_artist'] = 'Fotograf'; -$lang['img_copyr'] = 'Autorsko pravo'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Ključne riječi'; +$lang['img_title'] = 'Naziv:'; +$lang['img_caption'] = 'Naslov:'; +$lang['img_date'] = 'Datum:'; +$lang['img_fname'] = 'Ime datoteke:'; +$lang['img_fsize'] = 'Veličina:'; +$lang['img_artist'] = 'Fotograf:'; +$lang['img_copyr'] = 'Autorsko pravo:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Ključne riječi:'; +$lang['img_width'] = 'Širina:'; +$lang['img_height'] = 'Visina:'; $lang['subscr_subscribe_success'] = 'Dodan %s u listu pretplatnika za %s'; $lang['subscr_subscribe_error'] = 'Greška kod dodavanja %s u listu pretplatnika za %s'; $lang['subscr_subscribe_noaddress'] = 'Ne postoji adresa povezana sa vašim podacima za prijavu, stoga ne možete biti dodani u listu pretplatnika'; @@ -227,20 +270,23 @@ $lang['subscr_m_new_header'] = 'Dodaj pretplatu'; $lang['subscr_m_current_header'] = 'Trenutne pretplate'; $lang['subscr_m_unsubscribe'] = 'Odjavi pretplatu'; $lang['subscr_m_subscribe'] = 'Pretplati se'; -$lang['subscr_m_receive'] = 'Primaj'; -$lang['subscr_style_every'] = 'email za svaku promjenu'; -$lang['subscr_style_digest'] = 'email s kratakim prikazom promjena za svaku stranicu (svaka %.2f dana)'; -$lang['subscr_style_list'] = 'listu promijenjenih stranica od zadnjeg primljenog email-a (svaka %.2f dana)'; +$lang['subscr_m_receive'] = 'Primi'; +$lang['subscr_style_every'] = 'e-pošta za svaku promjenu'; +$lang['subscr_style_digest'] = 'e-pošta s kratakim prikazom promjena za svaku stranicu (svaka %.2f dana)'; +$lang['subscr_style_list'] = 'listu promijenjenih stranica od zadnje primljene e-pošte (svaka %.2f dana)'; $lang['authtempfail'] = 'Autentifikacija korisnika je privremeno nedostupna. Molimo Vas da kontaktirate administratora.'; +$lang['authpwdexpire'] = 'Vaša lozinka će isteći za %d dana, trebate ju promijeniti.'; $lang['i_chooselang'] = 'Izaberite vaš jezik'; -$lang['i_installer'] = 'DokuWiki instalacija'; +$lang['i_installer'] = 'DokuWiki postavljanje'; $lang['i_wikiname'] = 'Naziv Wikija'; $lang['i_enableacl'] = 'Omogući ACL (preporučeno)'; $lang['i_superuser'] = 'Superkorisnik'; $lang['i_problems'] = 'Instalacija je pronašla probleme koji su naznačeni ispod. Nije moguće nastaviti dok se ti problemi ne riješe.'; -$lang['i_modified'] = 'Zbog sigurnosnih razlog, ova skripta ce raditi samo sa novim i nepromijenjenim instalacijama dokuWikija. Preporucujemo da ili re-ekstraktirate fajlove iz downloadovanog paketa ili konsultujete pune a href="http://dokuwiki.org/install">Instrukcije za instalaciju Dokuwikija</a>'; +$lang['i_modified'] = 'Zbog sigurnosnih razlog, ova skripta raditi će samo sa novim i neizmijenjenim DokuWiki instalacijama. + Molimo ponovno prekopirajte datoteke iz preuzetoga paketa ili pogledajte detaljno <a href="http://dokuwiki.org/install">Uputstvo za postavljanje DokuWiki-a</a>'; $lang['i_funcna'] = 'PHP funkcija <code>%s</code> nije dostupna. Možda ju je vaš pružatelj hostinga onemogućio iz nekog razloga?'; $lang['i_phpver'] = 'Vaša PHP verzija <code>%s</code> je niža od potrebne <code>%s</code>. Trebate nadograditi vašu PHP instalaciju.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload mora biti onemogućena u php.ini da bi ste pokrenuli DokuWiki.'; $lang['i_permfail'] = '<code>%s</code> nema dozvolu pisanja od strane DokuWiki. Trebate podesiti dozvole pristupa tom direktoriju.'; $lang['i_confexists'] = '<code>%s</code> već postoji'; $lang['i_writeerr'] = 'Ne može se kreirati <code>%s</code>. Trebate provjeriti dozvole direktorija/datoteke i kreirati dokument ručno.'; @@ -252,8 +298,12 @@ $lang['i_policy'] = 'Inicijalna ACL politika'; $lang['i_pol0'] = 'Otvoreni Wiki (čitanje, pisanje, učitavanje za sve)'; $lang['i_pol1'] = 'Javni Wiki (čitanje za sve, pisanje i učitavanje za registrirane korisnike)'; $lang['i_pol2'] = 'Zatvoreni Wiki (čitanje, pisanje, učitavanje samo za registrirane korisnike)'; +$lang['i_allowreg'] = 'Dopusti da korisnici sami sebe registriraju'; $lang['i_retry'] = 'Pokušaj ponovo'; $lang['i_license'] = 'Molim odaberite licencu pod kojom želite postavljati vaš sadržaj:'; +$lang['i_license_none'] = 'Ne prikazuj nikakve licenčne informacije.'; +$lang['i_pop_field'] = 'Molimo, pomozite na da unaprijedimo DokuWiki:'; +$lang['i_pop_label'] = 'Jednom na mjesec, pošalji anonimne podatke o korištenju DokuWiki razvojnom timu'; $lang['recent_global'] = 'Trenutno gledate promjene unutar <b>%s</b> imenskog prostora. Također možete <a href="%s">vidjeti zadnje promjene cijelog wiki-a</a>'; $lang['years'] = '%d godina prije'; $lang['months'] = '%d mjeseci prije'; @@ -263,3 +313,32 @@ $lang['hours'] = '%d sati prije'; $lang['minutes'] = '%d minuta prije'; $lang['seconds'] = '%d sekundi prije'; $lang['wordblock'] = 'Vaša promjena nije spremljena jer sadrži blokirani tekst (spam).'; +$lang['media_uploadtab'] = 'Učitavanje'; +$lang['media_searchtab'] = 'Traženje'; +$lang['media_file'] = 'Datoteka'; +$lang['media_viewtab'] = 'Pogled'; +$lang['media_edittab'] = 'Uredi'; +$lang['media_historytab'] = 'Povijest'; +$lang['media_list_thumbs'] = 'Ikone'; +$lang['media_list_rows'] = 'Redovi'; +$lang['media_sort_name'] = 'Naziv'; +$lang['media_sort_date'] = 'Datum'; +$lang['media_namespaces'] = 'Odaberi imenski prostor'; +$lang['media_files'] = 'Datoteke u %s'; +$lang['media_upload'] = 'Učitaj u %s'; +$lang['media_search'] = 'Potraži u %s'; +$lang['media_view'] = '%s'; +$lang['media_viewold'] = '%s na %s'; +$lang['media_edit'] = 'Uredi %s'; +$lang['media_history'] = 'Povijest %s'; +$lang['media_meta_edited'] = 'meta podaci uređeni'; +$lang['media_perm_read'] = 'Nažalost, nemate prava za čitanje datoteka.'; +$lang['media_perm_upload'] = 'Nažalost, nemate prava za učitavanje datoteka.'; +$lang['media_update'] = 'Učitaj novu verziju'; +$lang['media_restore'] = 'Vrati ovu verziju'; +$lang['currentns'] = 'Tekući imenički prostor'; +$lang['searchresult'] = 'Rezultati pretraživanja'; +$lang['plainhtml'] = 'Čisti HTML'; +$lang['wikimarkup'] = 'Wiki kod'; +$lang['page_nonexist_rev'] = 'Stranica ne postoji na %s. Ona je naknadno napravljena na <a href="%s">%s</a>.'; +$lang['unable_to_parse_date'] = 'Ne mogu analizirati parametar "%s".'; diff --git a/inc/lang/hr/pwconfirm.txt b/inc/lang/hr/pwconfirm.txt new file mode 100644 index 000000000..b2d9fa3ad --- /dev/null +++ b/inc/lang/hr/pwconfirm.txt @@ -0,0 +1,13 @@ +Pozdrav @FULLNAME@! + +Netko je zatražio novu lozinku za vašu @TITLE@ prijavu na @DOKUWIKIURL@. + +Ako to niste bili Vi, molimo da samo ignorirate ovu poruku. + +Da bi ste potvrdili da ste to ipak bili Vi, molimo slijedite link u nastavku: + +@CONFIRM@ + +-- +Ova poruka je generirana od strane DokuWiki dostupnog na +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/hr/registermail.txt b/inc/lang/hr/registermail.txt new file mode 100644 index 000000000..ceaf3fb83 --- /dev/null +++ b/inc/lang/hr/registermail.txt @@ -0,0 +1,14 @@ +Novi korisnik je registriran. Ovdje su detalji: + +Korisničko ime : @NEWUSER@ +Puno ime : @NEWNAME@ +e-pošta : @NEWEMAIL@ + +Datum : @DATE@ +Preglednik : @BROWSER@ +IP-Adresa : @IPADDRESS@ +Računalo : @HOSTNAME@ + +-- +Ova poruka je generirana od strane DokuWiki dostupnog na +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/hr/resetpwd.txt b/inc/lang/hr/resetpwd.txt new file mode 100644 index 000000000..8d92e51d2 --- /dev/null +++ b/inc/lang/hr/resetpwd.txt @@ -0,0 +1,3 @@ +====== Postavi novu lozinku ====== + +Molimo unesite novu lozinku za Vašu korisničku prijavu na ovom wiki-u.
\ No newline at end of file diff --git a/inc/lang/hr/revisions.txt b/inc/lang/hr/revisions.txt index d224a56f3..67d4cb89f 100644 --- a/inc/lang/hr/revisions.txt +++ b/inc/lang/hr/revisions.txt @@ -1,3 +1,3 @@ ====== Stare verzije ====== -Slijedi spisak starih verzija za traženi dokument. +Slijedi spisak starih verzija za traženi dokument. Da bi ste se vratili na neku od njih, odaberite ju, pritisnite Uređivanje i snimite ju. diff --git a/inc/lang/hr/searchpage.txt b/inc/lang/hr/searchpage.txt index 91d9f9c0a..90d2ffdf4 100644 --- a/inc/lang/hr/searchpage.txt +++ b/inc/lang/hr/searchpage.txt @@ -1 +1,5 @@ -====== Rezultati pretraživanja ====== +====== Pretraživanja ====== + +Možete naći rezultat vaše pretrage u nastavku. @CREATEPAGEINFO@ + +====== Rezultati ====== diff --git a/inc/lang/hr/showrev.txt b/inc/lang/hr/showrev.txt index aba2c0db0..86c1a0295 100644 --- a/inc/lang/hr/showrev.txt +++ b/inc/lang/hr/showrev.txt @@ -1,2 +1,2 @@ -**Ovo je stara verzija dokumenta!** +**Ovo je stara izmjena dokumenta!** ---- diff --git a/inc/lang/hr/subscr_digest.txt b/inc/lang/hr/subscr_digest.txt new file mode 100644 index 000000000..fad158d76 --- /dev/null +++ b/inc/lang/hr/subscr_digest.txt @@ -0,0 +1,19 @@ +Pozdrav ! + +Stranica @PAGE@ u @TITLE@ wiki-u je promijenjena. +Ovdje su promjene: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Stara verzija: @OLDPAGE@ +Nova verzija: @NEWPAGE@ + +Da poništite obavijesti o izmjenama prijavite se na wiki @DOKUWIKIURL@ i zatim posjetite +@SUBSCRIBE@ +i odjavite se s promjena na stranici i/ili imeničkom prostoru. + +-- +Ova poruka je generirana od strane DokuWiki dostupnog na +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/hr/subscr_form.txt b/inc/lang/hr/subscr_form.txt new file mode 100644 index 000000000..95b2cd03e --- /dev/null +++ b/inc/lang/hr/subscr_form.txt @@ -0,0 +1,3 @@ +====== Uređivanje pretplata ====== + +Ova stranica omogućuje Vam da uredite svoju pretplatu na promjene za tekuću stranicu ili imenički prostor.
\ No newline at end of file diff --git a/inc/lang/hr/subscr_list.txt b/inc/lang/hr/subscr_list.txt new file mode 100644 index 000000000..611c76938 --- /dev/null +++ b/inc/lang/hr/subscr_list.txt @@ -0,0 +1,15 @@ +Pozdrav ! + +Stranice u imeničkom prostoru @PAGE@ na @TITLE@ wiki-u su izmijenjene. Ovo su izmijenjene stranice: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Da poništite obavijesti o izmjenama prijavite se na wiki @DOKUWIKIURL@ i zatim posjetite +@SUBSCRIBE@ +i odjavite se s promjena na stranici i/ili imeničkom prostoru. + +-- +Ova poruka je generirana od strane DokuWiki dostupnog na +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/hr/subscr_single.txt b/inc/lang/hr/subscr_single.txt new file mode 100644 index 000000000..18f66901c --- /dev/null +++ b/inc/lang/hr/subscr_single.txt @@ -0,0 +1,22 @@ +Pozdrav ! + +Stranica @PAGE@ na @TITLE@ wiki-u je izmijenjena. +Ovo su promjene: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Datum : @DATE@ +Korisnik: @USER@ +Sažetak izmjena: @SUMMARY@ +Stara verzija: @OLDPAGE@ +Nova verzija : @NEWPAGE@ + +Da poništite obavijesti o izmjenama prijavite se na wiki @DOKUWIKIURL@ i zatim posjetite +@SUBSCRIBE@ +i odjavite se s promjena na stranici i/ili imeničkom prostoru. + +-- +Ova poruka je generirana od strane DokuWiki dostupnog na +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/hr/uploadmail.txt b/inc/lang/hr/uploadmail.txt new file mode 100644 index 000000000..5b18b2ba3 --- /dev/null +++ b/inc/lang/hr/uploadmail.txt @@ -0,0 +1,15 @@ +Datoteka je učitana na Vaš DokuWiki. Ovdje su detalji: + +Datoteka : @MEDIA@ +Stara verzija: @OLD@ +Datum : @DATE@ +Preglednik : @BROWSER@ +IP-Adresa : @IPADDRESS@ +Računalo : @HOSTNAME@ +Veličina : @SIZE@ +MIME Tip : @MIME@ +Korisnik : @USER@ + +-- +Ova poruka je generirana od strane DokuWiki dostupnog na +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/hu-formal/admin.txt b/inc/lang/hu-formal/admin.txt new file mode 100644 index 000000000..b661bfb17 --- /dev/null +++ b/inc/lang/hu-formal/admin.txt @@ -0,0 +1,3 @@ +===== Beállítások ===== + +Alább találja a DokuWiki-ben elérhető beállítási lehetőségek listáját.
\ No newline at end of file diff --git a/inc/lang/hu-formal/adminplugins.txt b/inc/lang/hu-formal/adminplugins.txt new file mode 100644 index 000000000..b077521fb --- /dev/null +++ b/inc/lang/hu-formal/adminplugins.txt @@ -0,0 +1 @@ +===== További bővítmények =====
\ No newline at end of file diff --git a/inc/lang/hu-formal/backlinks.txt b/inc/lang/hu-formal/backlinks.txt new file mode 100644 index 000000000..437eb2e25 --- /dev/null +++ b/inc/lang/hu-formal/backlinks.txt @@ -0,0 +1,3 @@ +====== Hivatkozások ====== + +Mindazon oldalak listája, amelyek az aktuális oldalra hivatkoznak.
\ No newline at end of file diff --git a/inc/lang/hu-formal/conflict.txt b/inc/lang/hu-formal/conflict.txt new file mode 100644 index 000000000..6718d67e6 --- /dev/null +++ b/inc/lang/hu-formal/conflict.txt @@ -0,0 +1,5 @@ +====== Újabb változat érhető el ====== + +Az Ön által szerkesztett oldalnak már egy újabb változata érhető el. Ez akkor fordulhat elő, ha egy másik felhasználó módosította a dokumtemot, mialatt Ön is szerkesztette azt. + +Vizsgálja meg az alább látható eltéréseket, majd döntse el, melyik változatot tartja meg. Ha a "Mentés" gombot választja, az Ön verziója mentődik el. Kattintson a "Mégsem" gombra a jelenlegi változat megtartásához.
\ No newline at end of file diff --git a/inc/lang/hu-formal/denied.txt b/inc/lang/hu-formal/denied.txt new file mode 100644 index 000000000..d56a18117 --- /dev/null +++ b/inc/lang/hu-formal/denied.txt @@ -0,0 +1,4 @@ +====== Hozzáférés megtadadva ====== + +Sajnáljuk, de nincs joga a folytatáshoz. + diff --git a/inc/lang/hu-formal/diff.txt b/inc/lang/hu-formal/diff.txt new file mode 100644 index 000000000..f922a504a --- /dev/null +++ b/inc/lang/hu-formal/diff.txt @@ -0,0 +1,3 @@ +====== Eltérések ====== + +Az oldal két változata közötti különbségek az alábbiak.
\ No newline at end of file diff --git a/inc/lang/hu-formal/draft.txt b/inc/lang/hu-formal/draft.txt new file mode 100644 index 000000000..9233eacad --- /dev/null +++ b/inc/lang/hu-formal/draft.txt @@ -0,0 +1,5 @@ +===== Piszkozatot találtam ===== + +Az Ön ezen az oldalon végzett utolsó szerkesztési művelete helytelenül fejeződött be. A DokuWiki automatikusan elmentett egy piszkozatot az Ön munkája során. Alább láthatók az utolsó munkafázis mentett adatai. + +Kérjük, döntse el, hogy //helyreállítja-e// a befejezetlen módosításokat, vagy //törli// az automatikusan mentett piszkozatot, vagy //megszakítja// a szerkesztési folyamatot.
\ No newline at end of file diff --git a/inc/lang/hu-formal/edit.txt b/inc/lang/hu-formal/edit.txt new file mode 100644 index 000000000..08f648ba6 --- /dev/null +++ b/inc/lang/hu-formal/edit.txt @@ -0,0 +1 @@ +Módosítsa az oldalt, majd kattintson a "Mentés" gombra. A wiki-szintaxishoz nézze meg a [[wiki:syntax|szintaxis]] oldalt. Kérjük, csak akkor módosítsa az oldalt, ha **tökéletesíteni**, **javítani** tudja. Amennyiben szeretne kipróbálni ezt-azt, a [[playground:playground|játszótéren]] megtanulhatja az első lépéseket.
\ No newline at end of file diff --git a/inc/lang/hu-formal/editrev.txt b/inc/lang/hu-formal/editrev.txt new file mode 100644 index 000000000..2eca33c7a --- /dev/null +++ b/inc/lang/hu-formal/editrev.txt @@ -0,0 +1,2 @@ +**A dokumentum egy korábbi változatát töltötte be!** Ha az oldalt elmenti, akkor egy új változat jön létre belőle. +----
\ No newline at end of file diff --git a/inc/lang/hu-formal/index.txt b/inc/lang/hu-formal/index.txt new file mode 100644 index 000000000..0f2b18fd2 --- /dev/null +++ b/inc/lang/hu-formal/index.txt @@ -0,0 +1,3 @@ +====== Oldaltérkép (tartalom) ====== + +Az összes elérhető oldal [[doku>namespaces|névterek]] szerint rendezett oldaltérképe.
\ No newline at end of file diff --git a/inc/lang/hu-formal/lang.php b/inc/lang/hu-formal/lang.php new file mode 100644 index 000000000..a98bdc0d3 --- /dev/null +++ b/inc/lang/hu-formal/lang.php @@ -0,0 +1,27 @@ +<?php + +/** + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * + * @author Marina Vladi <deldadam@gmail.com> + */ +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '„'; +$lang['doublequoteclosing'] = '”'; +$lang['singlequoteopening'] = '‚'; +$lang['singlequoteclosing'] = '’'; +$lang['apostrophe'] = '’'; +$lang['btn_edit'] = 'Oldal módosítása'; +$lang['btn_source'] = 'Forrás megtekintése'; +$lang['btn_show'] = 'Oldal megtekintése'; +$lang['btn_create'] = 'Oldal létrehozása'; +$lang['btn_search'] = 'Keresés'; +$lang['btn_save'] = 'Mentés'; +$lang['btn_preview'] = 'Előnézet'; +$lang['btn_top'] = 'Oldal tetejére'; +$lang['btn_newer'] = '<< újabb'; +$lang['btn_older'] = 'régebbi >>'; +$lang['btn_revs'] = 'Korábbi változatok'; +$lang['btn_recent'] = 'Legújabb változások'; +$lang['btn_upload'] = 'Feltöltés'; diff --git a/inc/lang/hu/denied.txt b/inc/lang/hu/denied.txt index 0b06724df..922cbb895 100644 --- a/inc/lang/hu/denied.txt +++ b/inc/lang/hu/denied.txt @@ -1,4 +1,4 @@ ====== Hozzáférés megtagadva ====== -Sajnáljuk, nincs jogod a folytatáshoz. Esetleg elfelejtettél bejelentkezni? +Sajnáljuk, nincs jogod a folytatáshoz. diff --git a/inc/lang/hu/jquery.ui.datepicker.js b/inc/lang/hu/jquery.ui.datepicker.js new file mode 100644 index 000000000..8ea85506e --- /dev/null +++ b/inc/lang/hu/jquery.ui.datepicker.js @@ -0,0 +1,36 @@ +/* Hungarian initialisation for the jQuery UI date picker plugin. */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['hu'] = { + closeText: 'bezár', + prevText: 'vissza', + nextText: 'előre', + currentText: 'ma', + monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', + 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'], + monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún', + 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'], + dayNames: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'], + dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'], + dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'], + weekHeader: 'Hét', + dateFormat: 'yy.mm.dd.', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['hu']); + +return datepicker.regional['hu']; + +})); diff --git a/inc/lang/hu/lang.php b/inc/lang/hu/lang.php index 2622934c2..bdc78f68d 100644 --- a/inc/lang/hu/lang.php +++ b/inc/lang/hu/lang.php @@ -12,6 +12,8 @@ * @author David Szabo <szabo.david@gyumolcstarhely.hu> * @author Marton Sebok <sebokmarton@gmail.com> * @author Serenity87HUN <anikototh87@gmail.com> + * @author Marina Vladi <deldadam@gmail.com> + * @author Mátyás Jani <jzombi@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -56,7 +58,9 @@ $lang['btn_register'] = 'Regisztráció'; $lang['btn_apply'] = 'Alkalmaz'; $lang['btn_media'] = 'Médiakezelő'; $lang['btn_deleteuser'] = 'Felhasználói fiókom eltávolítása'; -$lang['loggedinas'] = 'Belépett felhasználó: '; +$lang['btn_img_backto'] = 'Vissza %s'; +$lang['btn_mediaManager'] = 'Megtekintés a médiakezelőben'; +$lang['loggedinas'] = 'Belépett felhasználó'; $lang['user'] = 'Azonosító'; $lang['pass'] = 'Jelszó'; $lang['newpass'] = 'Új jelszó'; @@ -71,6 +75,7 @@ $lang['badpassconfirm'] = 'Hibás jelszó'; $lang['minoredit'] = 'Apróbb változások'; $lang['draftdate'] = 'Piszkozat elmentve:'; $lang['nosecedit'] = 'Időközben megváltozott az oldal, emiatt a szakasz nem friss. Töltsd újra az egész oldalt!'; +$lang['searchcreatepage'] = "Ha nem találtad meg amit kerestél, akkor létrehozhatsz egy új oldalt a keresésed alapján ''Az oldal szerkesztése'' gombbal."; $lang['regmissing'] = 'Sajnáljuk, az összes mezőt ki kell töltened.'; $lang['reguexists'] = 'Sajnáljuk, ilyen azonosítójú felhasználónk már van.'; $lang['regsuccess'] = 'A felhasználói azonosítót létrehoztuk. A jelszót postáztuk.'; @@ -101,8 +106,8 @@ $lang['license'] = 'Hacsak máshol nincs egyéb rendelkezés, ezen $lang['licenseok'] = 'Megjegyzés: az oldal szerkesztésével elfogadja, hogy a tartalom a következő licenc alatt lesz elérhető:'; $lang['searchmedia'] = 'Keresett fájl neve:'; $lang['searchmedia_in'] = 'Keresés a következőben: %s'; -$lang['txt_upload'] = 'Válaszd ki a feltöltendő fájlt'; -$lang['txt_filename'] = 'Feltöltési név (elhagyható)'; +$lang['txt_upload'] = 'Válaszd ki a feltöltendő fájlt:'; +$lang['txt_filename'] = 'Feltöltési név (elhagyható):'; $lang['txt_overwrt'] = 'Létező fájl felülírása'; $lang['maxuploadsize'] = 'Maximum %s méretű fájlokat tölthetsz fel.'; $lang['lockedby'] = 'Jelenleg zárolta:'; @@ -186,10 +191,15 @@ $lang['difflink'] = 'Összehasonlító nézet linkje'; $lang['diff_type'] = 'Összehasonlítás módja:'; $lang['diff_inline'] = 'Sorok között'; $lang['diff_side'] = 'Egymás mellett'; +$lang['diffprevrev'] = 'Előző változat'; +$lang['diffnextrev'] = 'Következő változat'; +$lang['difflastrev'] = 'Utolsó változat'; +$lang['diffbothprevrev'] = 'Előző változat mindkét oldalon'; +$lang['diffbothnextrev'] = 'Következő változat mindkét oldalon'; $lang['line'] = 'Sor'; -$lang['breadcrumb'] = 'Nyomvonal'; -$lang['youarehere'] = 'Itt vagy'; -$lang['lastmod'] = 'Utolsó módosítás'; +$lang['breadcrumb'] = 'Nyomvonal:'; +$lang['youarehere'] = 'Itt vagy:'; +$lang['lastmod'] = 'Utolsó módosítás:'; $lang['by'] = 'szerkesztette:'; $lang['deleted'] = 'eltávolítva'; $lang['created'] = 'létrehozva'; @@ -242,20 +252,18 @@ $lang['admin_register'] = 'Új felhasználó'; $lang['metaedit'] = 'Metaadatok szerkesztése'; $lang['metasaveerr'] = 'A metaadatok írása nem sikerült'; $lang['metasaveok'] = 'Metaadatok elmentve'; -$lang['img_backto'] = 'Vissza'; -$lang['img_title'] = 'Cím'; -$lang['img_caption'] = 'Képaláírás'; -$lang['img_date'] = 'Dátum'; -$lang['img_fname'] = 'Fájlnév'; -$lang['img_fsize'] = 'Méret'; -$lang['img_artist'] = 'Készítette'; -$lang['img_copyr'] = 'Szerzői jogok'; -$lang['img_format'] = 'Formátum'; -$lang['img_camera'] = 'Fényképezőgép típusa'; -$lang['img_keywords'] = 'Kulcsszavak'; -$lang['img_width'] = 'Szélesség'; -$lang['img_height'] = 'Magasság'; -$lang['img_manager'] = 'Megtekintés a médiakezelőben'; +$lang['img_title'] = 'Cím:'; +$lang['img_caption'] = 'Képaláírás:'; +$lang['img_date'] = 'Dátum:'; +$lang['img_fname'] = 'Fájlnév:'; +$lang['img_fsize'] = 'Méret:'; +$lang['img_artist'] = 'Készítette:'; +$lang['img_copyr'] = 'Szerzői jogok:'; +$lang['img_format'] = 'Formátum:'; +$lang['img_camera'] = 'Fényképezőgép típusa:'; +$lang['img_keywords'] = 'Kulcsszavak:'; +$lang['img_width'] = 'Szélesség:'; +$lang['img_height'] = 'Magasság:'; $lang['subscr_subscribe_success'] = '%s hozzáadva az értesítési listához: %s'; $lang['subscr_subscribe_error'] = 'Hiba történt %s hozzáadásakor az értesítési listához: %s'; $lang['subscr_subscribe_noaddress'] = 'Nincs e-mail cím megadva az adataidnál, így a rendszer nem tudott hozzáadni az értesítési listához'; @@ -295,6 +303,7 @@ $lang['i_policy'] = 'Kezdeti hozzáférési lista házirend'; $lang['i_pol0'] = 'Nyitott wiki (mindenki olvashatja, írhatja és fájlokat tölthet fel)'; $lang['i_pol1'] = 'Publikus wiki (mindenki olvashatja, de csak regisztrált felhasználók írhatják és tölthetnek fel fájlokat)'; $lang['i_pol2'] = 'Zárt wiki (csak regisztrált felhasználók olvashatják, írhatják és tölthetnek fel fájlokat)'; +$lang['i_allowreg'] = 'A felhasználók saját maguk is regisztrálhatnak'; $lang['i_retry'] = 'Újra'; $lang['i_license'] = 'Kérlek, válassz licencet a feltöltött tartalomhoz:'; $lang['i_license_none'] = 'Ne jelenítsen meg licenc információt'; @@ -332,3 +341,7 @@ $lang['media_perm_read'] = 'Sajnáljuk, nincs jogod a fájlok olvasásáho $lang['media_perm_upload'] = 'Sajnáljuk, nincs jogod a feltöltéshez.'; $lang['media_update'] = 'Új verzió feltöltése'; $lang['media_restore'] = 'Ezen verzió visszaállítása'; +$lang['currentns'] = 'Aktuális névtér'; +$lang['searchresult'] = 'Keresés eredménye'; +$lang['plainhtml'] = 'Sima HTML'; +$lang['wikimarkup'] = 'Wiki-jelölőnyelv'; diff --git a/inc/lang/hu/searchpage.txt b/inc/lang/hu/searchpage.txt index ffde87b66..7e186e5cb 100644 --- a/inc/lang/hu/searchpage.txt +++ b/inc/lang/hu/searchpage.txt @@ -1,5 +1,5 @@ ====== Keresés ====== -A keresés eredményét lentebb láthatod. Ha nem találtad meg amit kerestél, akkor létrehozhatsz egy új oldalt a keresésed alapján ''Az oldal szerkesztése'' gombbal. +A keresés eredményét lentebb láthatod. @CREATEPAGEINFO@ ===== Eredmény(ek) =====
\ No newline at end of file diff --git a/inc/lang/ia/denied.txt b/inc/lang/ia/denied.txt index 044e1532d..82f2fc668 100644 --- a/inc/lang/ia/denied.txt +++ b/inc/lang/ia/denied.txt @@ -1,3 +1,4 @@ ====== Permission refusate ====== -Pardono, tu non ha le derectos requisite pro continuar. Pote esser que tu ha oblidate de aperir un session.
\ No newline at end of file +Pardono, tu non ha le derectos requisite pro continuar. + diff --git a/inc/lang/ia/lang.php b/inc/lang/ia/lang.php index 144dfe33b..a533883b6 100644 --- a/inc/lang/ia/lang.php +++ b/inc/lang/ia/lang.php @@ -50,7 +50,7 @@ $lang['btn_recover'] = 'Recuperar version provisori'; $lang['btn_draftdel'] = 'Deler version provisori'; $lang['btn_revert'] = 'Restaurar'; $lang['btn_register'] = 'Crear conto'; -$lang['loggedinas'] = 'Session aperite como'; +$lang['loggedinas'] = 'Session aperite como:'; $lang['user'] = 'Nomine de usator'; $lang['pass'] = 'Contrasigno'; $lang['newpass'] = 'Nove contrasigno'; @@ -64,6 +64,7 @@ $lang['badlogin'] = 'Le nomine de usator o le contrasigno es incorr $lang['minoredit'] = 'Modificationes minor'; $lang['draftdate'] = 'Version provisori automaticamente salveguardate le'; $lang['nosecedit'] = 'Le pagina ha essite modificate intertanto. Le informationes del section es ora obsolete, dunque le pagina complete ha essite cargate in su loco.'; +$lang['searchcreatepage'] = 'Si tu non ha trovate lo que tu cerca, tu pote crear o modificar le pagina nominate secundo tu consulta con le button appropriate.'; $lang['regmissing'] = 'Es necessari completar tote le campos.'; $lang['reguexists'] = 'Regrettabilemente, un usator con iste nomine ja existe.'; $lang['regsuccess'] = 'Le conto ha essite create e le contrasigno ha essite inviate per e-mail.'; @@ -88,11 +89,11 @@ $lang['license'] = 'Excepte ubi indicate alteremente, le contento $lang['licenseok'] = 'Nota ben! Per modificar iste pagina tu accepta que tu contento essera publicate sub le conditiones del licentia sequente:'; $lang['searchmedia'] = 'Cercar file con nomine:'; $lang['searchmedia_in'] = 'Cercar in %s'; -$lang['txt_upload'] = 'Selige le file a incargar'; -$lang['txt_filename'] = 'Incargar como (optional)'; +$lang['txt_upload'] = 'Selige le file a incargar:'; +$lang['txt_filename'] = 'Incargar como (optional):'; $lang['txt_overwrt'] = 'Reimplaciar le file existente'; -$lang['lockedby'] = 'Actualmente serrate per'; -$lang['lockexpire'] = 'Serratura expira le'; +$lang['lockedby'] = 'Actualmente serrate per:'; +$lang['lockexpire'] = 'Serratura expira le:'; $lang['js']['willexpire'] = 'Tu serratura super le modification de iste pagina expirara post un minuta.\nPro evitar conflictos, usa le button Previsualisar pro reinitialisar le timer del serratura.'; $lang['js']['notsavedyet'] = 'Le modificationes non salveguardate essera perdite.\nRealmente continuar?'; $lang['rssfailed'] = 'Un error occurreva durante le obtention de iste syndication:'; @@ -157,9 +158,9 @@ $lang['yours'] = 'Tu version'; $lang['diff'] = 'Monstrar differentias con versiones actual'; $lang['diff2'] = 'Monstrar differentias inter le versiones seligite'; $lang['line'] = 'Linea'; -$lang['breadcrumb'] = 'Tracia'; -$lang['youarehere'] = 'Tu es hic'; -$lang['lastmod'] = 'Ultime modification'; +$lang['breadcrumb'] = 'Tracia:'; +$lang['youarehere'] = 'Tu es hic:'; +$lang['lastmod'] = 'Ultime modification:'; $lang['by'] = 'per'; $lang['deleted'] = 'removite'; $lang['created'] = 'create'; @@ -202,17 +203,17 @@ $lang['admin_register'] = 'Adder nove usator'; $lang['metaedit'] = 'Modificar metadatos'; $lang['metasaveerr'] = 'Scriptura de metadatos fallite'; $lang['metasaveok'] = 'Metadatos salveguardate'; -$lang['img_backto'] = 'Retornar a'; -$lang['img_title'] = 'Titulo'; -$lang['img_caption'] = 'Legenda'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Nomine de file'; -$lang['img_fsize'] = 'Dimension'; -$lang['img_artist'] = 'Photographo'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Formato'; -$lang['img_camera'] = 'Camera'; -$lang['img_keywords'] = 'Parolas-clave'; +$lang['btn_img_backto'] = 'Retornar a %s'; +$lang['img_title'] = 'Titulo:'; +$lang['img_caption'] = 'Legenda:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Nomine de file:'; +$lang['img_fsize'] = 'Dimension:'; +$lang['img_artist'] = 'Photographo:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Formato:'; +$lang['img_camera'] = 'Camera:'; +$lang['img_keywords'] = 'Parolas-clave:'; $lang['subscr_subscribe_success'] = '%s addite al lista de subscription de %s'; $lang['subscr_subscribe_error'] = 'Error durante le addition de %s al lista de subscription de %s'; $lang['subscr_subscribe_noaddress'] = 'Il non ha un adresse associate con tu conto. Tu non pote esser addite al lista de subscription.'; diff --git a/inc/lang/ia/searchpage.txt b/inc/lang/ia/searchpage.txt index c53683371..a8f7fce51 100644 --- a/inc/lang/ia/searchpage.txt +++ b/inc/lang/ia/searchpage.txt @@ -1,5 +1,5 @@ ====== Recerca ====== -Le resultatos de tu recerca se trova hic infra. Si tu non ha trovate lo que tu cerca, tu pote crear o modificar le pagina nominate secundo tu consulta con le button appropriate. +Le resultatos de tu recerca se trova hic infra. @CREATEPAGEINFO@ ===== Resultatos =====
\ No newline at end of file diff --git a/inc/lang/id-ni/lang.php b/inc/lang/id-ni/lang.php index 7a1179326..1ff714f3e 100644 --- a/inc/lang/id-ni/lang.php +++ b/inc/lang/id-ni/lang.php @@ -41,7 +41,7 @@ $lang['btn_reset'] = 'Fawu\'a'; $lang['btn_draft'] = 'Fawu\'a wanura'; $lang['btn_draftdel'] = 'Heta zura'; $lang['btn_register'] = 'Fasura\'ö'; -$lang['loggedinas'] = 'Möi bakha zotöi'; +$lang['loggedinas'] = 'Möi bakha zotöi:'; $lang['user'] = 'Töi'; $lang['pass'] = 'Kode'; $lang['newpass'] = 'Kode sibohou'; @@ -72,6 +72,6 @@ $lang['resendpwdmissing'] = 'Bologö dödöu, si lö tola lö\'ö öfo\'ös $lang['resendpwdnouser'] = 'Bologö dödöu, lö masöndra zangoguna da\'a ba database.'; $lang['resendpwdconfirm'] = 'No tefaohe\'ö link famaduhu\'ö ba imele.'; $lang['resendpwdsuccess'] = 'No tefa\'ohe\'ö kode sibohou ba imele.'; -$lang['txt_upload'] = 'Fili file ni fa\'ohe\'ö'; +$lang['txt_upload'] = 'Fili file ni fa\'ohe\'ö:'; $lang['js']['notsavedyet'] = 'Famawu\'a si lö mu\'irö\'ö taya. \nSinduhu ötohugö?'; $lang['mediaselect'] = 'Media file'; diff --git a/inc/lang/id/adminplugins.txt b/inc/lang/id/adminplugins.txt new file mode 100644 index 000000000..2a91b3d1a --- /dev/null +++ b/inc/lang/id/adminplugins.txt @@ -0,0 +1 @@ +=====Plugin Tambahan=====
\ No newline at end of file diff --git a/inc/lang/id/denied.txt b/inc/lang/id/denied.txt index bad8f24a6..ff09c13c4 100644 --- a/inc/lang/id/denied.txt +++ b/inc/lang/id/denied.txt @@ -1,4 +1,4 @@ ====== Akses Ditolak ====== -Maaf, Anda tidak mempunyai hak akses untuk melanjutkan. Apakah Anda belum login? +Maaf, Anda tidak mempunyai hak akses untuk melanjutkan. diff --git a/inc/lang/id/jquery.ui.datepicker.js b/inc/lang/id/jquery.ui.datepicker.js new file mode 100644 index 000000000..0db693faf --- /dev/null +++ b/inc/lang/id/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['id'] = { + closeText: 'Tutup', + prevText: '<mundur', + nextText: 'maju>', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Maret','April','Mei','Juni', + 'Juli','Agustus','September','Oktober','Nopember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Agus','Sep','Okt','Nop','Des'], + dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'], + dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'], + dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['id']); + +return datepicker.regional['id']; + +})); diff --git a/inc/lang/id/lang.php b/inc/lang/id/lang.php index 3d99c9a22..dc4ca00e0 100644 --- a/inc/lang/id/lang.php +++ b/inc/lang/id/lang.php @@ -7,6 +7,8 @@ * @author Irwan Butar Butar <irwansah.putra@gmail.com> * @author Yustinus Waruwu <juswaruwu@gmail.com> * @author zamroni <therons@ymail.com> + * @author umriya afini <bigdream.power@gmail.com> + * @author Arif Budiman <me@kangarif.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -42,10 +44,18 @@ $lang['btn_backtomedia'] = 'Kembali ke Pilihan Mediafile'; $lang['btn_subscribe'] = 'Ikuti Perubahan'; $lang['btn_profile'] = 'Ubah Profil'; $lang['btn_reset'] = 'Reset'; +$lang['btn_resendpwd'] = 'Atur password baru'; $lang['btn_draft'] = 'Edit draft'; +$lang['btn_recover'] = 'Cadangkan draf'; $lang['btn_draftdel'] = 'Hapus draft'; +$lang['btn_revert'] = 'Kembalikan'; $lang['btn_register'] = 'Daftar'; -$lang['loggedinas'] = 'Login sebagai '; +$lang['btn_apply'] = 'Terapkan'; +$lang['btn_media'] = 'Pengelola Media'; +$lang['btn_deleteuser'] = 'Hapus Akun Saya'; +$lang['btn_img_backto'] = 'Kembali ke %s'; +$lang['btn_mediaManager'] = 'Tampilkan di pengelola media'; +$lang['loggedinas'] = 'Login sebagai :'; $lang['user'] = 'Username'; $lang['pass'] = 'Password'; $lang['newpass'] = 'Password baru'; @@ -56,8 +66,10 @@ $lang['fullname'] = 'Nama lengkap'; $lang['email'] = 'E-Mail'; $lang['profile'] = 'Profil User'; $lang['badlogin'] = 'Maaf, username atau password salah.'; +$lang['badpassconfirm'] = 'Maaf, password salah'; $lang['minoredit'] = 'Perubahan Minor'; $lang['draftdate'] = 'Simpan draft secara otomatis'; +$lang['searchcreatepage'] = 'Jika Anda tidak menemukan apa yang diinginkan, Anda dapat membuat halaman baru, dengan nama sesuai "text pencarian" Anda. Gunakan tombol "Edit halaman ini".'; $lang['regmissing'] = 'Maaf, Anda harus mengisi semua field.'; $lang['reguexists'] = 'Maaf, user dengan user login ini telah ada.'; $lang['regsuccess'] = 'User telah didaftarkan dan password telah dikirim ke email Anda.'; @@ -71,25 +83,71 @@ $lang['profna'] = 'Wiki ini tidak mengijinkan perubahan profil.'; $lang['profnochange'] = 'Tidak ada perubahan.'; $lang['profnoempty'] = 'Mohon mengisikan nama atau alamat email.'; $lang['profchanged'] = 'Profil User berhasil diubah.'; +$lang['profnodelete'] = 'Wiki ini tidak mendukung penghapusan pengguna'; +$lang['profdeleteuser'] = 'Hapus Akun'; +$lang['profdeleted'] = 'Akun anda telah dihapus dari wiki ini'; +$lang['profconfdelete'] = 'Saya berharap menghapus akun saya dari wiki ini. +Aksi ini tidak bisa diselesaikan.'; +$lang['profconfdeletemissing'] = 'Knfirmasi check box tidak tercentang'; $lang['pwdforget'] = 'Lupa Password? Dapatkan yang baru'; $lang['resendna'] = 'Wiki ini tidak mendukung pengiriman ulang password.'; +$lang['resendpwd'] = 'Atur password baru'; $lang['resendpwdmissing'] = 'Maaf, Anda harus mengisikan semua field.'; $lang['resendpwdnouser'] = 'Maaf, user ini tidak ditemukan.'; $lang['resendpwdbadauth'] = 'Maaf, kode autentikasi tidak valid. Pastikan Anda menggunakan keseluruhan link konfirmasi.'; $lang['resendpwdconfirm'] = 'Link konfirmasi telah dikirim melalui email.'; $lang['resendpwdsuccess'] = 'Password baru Anda telah dikirim melalui email.'; -$lang['txt_upload'] = 'File yang akan diupload'; -$lang['txt_filename'] = 'Masukkan nama wiki (opsional)'; +$lang['license'] = 'Kecuali jika dinyatakan lain, konten pada wiki ini dilisensikan dibawah lisensi berikut:'; +$lang['licenseok'] = 'Catatan: Dengan menyunting halaman ini, Anda setuju untuk melisensikan konten Anda dibawah lisensi berikut:'; +$lang['searchmedia'] = 'Cari nama file:'; +$lang['searchmedia_in'] = 'Cari di %s'; +$lang['txt_upload'] = 'File yang akan diupload:'; +$lang['txt_filename'] = 'Masukkan nama wiki (opsional):'; $lang['txt_overwrt'] = 'File yang telah ada akan ditindih'; -$lang['lockedby'] = 'Sedang dikunci oleh'; -$lang['lockexpire'] = 'Penguncian artikel sampai dengan'; +$lang['maxuploadsize'] = 'Unggah maks. %s per berkas'; +$lang['lockedby'] = 'Sedang dikunci oleh:'; +$lang['lockexpire'] = 'Penguncian artikel sampai dengan:'; $lang['js']['willexpire'] = 'Halaman yang sedang Anda kunci akan berakhir dalam waktu kurang lebih satu menit.\nUntuk menghindari konflik, gunakan tombol Preview untuk me-reset timer pengunci.'; $lang['js']['notsavedyet'] = 'Perubahan yang belum disimpan akan hilang.\nYakin akan dilanjutkan?'; +$lang['js']['searchmedia'] = 'Cari file'; $lang['js']['keepopen'] = 'Biarkan window terbuka dalam pemilihan'; $lang['js']['hidedetails'] = 'Sembunyikan detil'; +$lang['js']['mediatitle'] = 'Pengaturan Link'; +$lang['js']['mediadisplay'] = 'Jenis tautan'; +$lang['js']['mediaalign'] = 'Perataan'; +$lang['js']['mediasize'] = 'Ukuran gambar'; +$lang['js']['mediatarget'] = 'Tautan tujuan'; +$lang['js']['mediaclose'] = 'Tutup'; +$lang['js']['mediainsert'] = 'Sisip'; +$lang['js']['mediadisplayimg'] = 'Lihat gambar'; +$lang['js']['mediadisplaylnk'] = 'Lihat hanya link'; +$lang['js']['mediasmall'] = 'Versi kecil'; +$lang['js']['mediamedium'] = 'Versi sedang'; +$lang['js']['medialarge'] = 'Versi besar'; +$lang['js']['mediaoriginal'] = 'Versi asli'; +$lang['js']['medialnk'] = 'Tautan ke halaman rincian'; +$lang['js']['mediadirect'] = 'Tautan langsung ke aslinya'; +$lang['js']['medianolnk'] = 'Tanpa tautan'; +$lang['js']['medianolink'] = 'Jangan tautkan gambar'; +$lang['js']['medialeft'] = 'Rata gambar sebelah kiri'; +$lang['js']['mediaright'] = 'Rata gambar sebelah kanan'; +$lang['js']['mediacenter'] = 'Rata gambar di tengah'; +$lang['js']['medianoalign'] = 'Jangan gunakan perataan'; $lang['js']['nosmblinks'] = 'Link ke share Windows hanya bekerja di Microsoft Internet Explorer. Anda masih dapat mengcopy and paste linknya.'; +$lang['js']['linkwiz'] = 'Wizard Tautan'; +$lang['js']['linkto'] = 'Tautkan ke:'; $lang['js']['del_confirm'] = 'Hapus tulisan ini?'; +$lang['js']['restore_confirm'] = 'Benar-benar ingin mengembalikan versi ini?'; +$lang['js']['media_diff'] = 'Lihat perbedaan:'; +$lang['js']['media_diff_both'] = 'Berdampingan'; +$lang['js']['media_diff_opacity'] = 'Mencolok'; +$lang['js']['media_select'] = 'Pilih file...'; +$lang['js']['media_upload_btn'] = 'Unggah'; +$lang['js']['media_done_btn'] = 'Selesai'; +$lang['js']['media_drop'] = 'Tarik file disini untuk mengunggah'; +$lang['js']['media_cancel'] = 'Buang'; +$lang['js']['media_overwrt'] = 'Timpa berkas yang ada'; $lang['rssfailed'] = 'Error terjadi saat mengambil feed: '; $lang['nothingfound'] = 'Tidak menemukan samasekali.'; $lang['mediaselect'] = 'Pilihan Mediafile'; @@ -101,11 +159,13 @@ $lang['uploadexist'] = 'File telah ada. Tidak mengerjakan apa-apa.'; $lang['uploadbadcontent'] = 'Isi file yang diupload tidak cocok dengan ekstensi file %s.'; $lang['uploadspam'] = 'File yang diupload diblok oleh spam blacklist.'; $lang['uploadxss'] = 'File yang diupload diblok karena kemungkinan isi yang berbahaya.'; +$lang['uploadsize'] = 'File yang diupload terlalu besar. (max.%)'; $lang['deletesucc'] = 'File "%s" telah dihapus.'; $lang['deletefail'] = '"%s" tidak dapat dihapus - cek hak aksesnya.'; $lang['mediainuse'] = 'File "%s" belum dihapus - file ini sedang digunakan.'; $lang['namespaces'] = 'Namespaces'; $lang['mediafiles'] = 'File tersedia didalam'; +$lang['accessdenied'] = 'Anda tidak diperbolehkan melihat halaman ini'; $lang['mediausage'] = 'Gunakan sintaks berikut untuk me-refer ke file ini'; $lang['mediaview'] = 'Tampilkan file asli'; $lang['mediaroot'] = 'root'; @@ -121,20 +181,40 @@ $lang['current'] = 'sekarang'; $lang['yours'] = 'Versi Anda'; $lang['diff'] = 'Tampilkan perbedaan dengan versi sekarang'; $lang['diff2'] = 'Tampilkan perbedaan diantara revisi terpilih'; +$lang['difflink'] = 'Tautan ke tampilan pembanding ini'; +$lang['diff_type'] = 'Tampilkan perbedaan:'; +$lang['diff_inline'] = 'Sebaris'; +$lang['diff_side'] = 'Berdampingan'; +$lang['diffprevrev'] = 'Revisi sebelumnya'; +$lang['diffnextrev'] = 'Revisi selanjutnya'; +$lang['difflastrev'] = 'Revisi terakhir'; $lang['line'] = 'Baris'; -$lang['breadcrumb'] = 'Jejak'; -$lang['youarehere'] = 'Anda disini'; -$lang['lastmod'] = 'Terakhir diubah'; +$lang['breadcrumb'] = 'Jejak:'; +$lang['youarehere'] = 'Anda disini:'; +$lang['lastmod'] = 'Terakhir diubah:'; $lang['by'] = 'oleh'; $lang['deleted'] = 'terhapus'; $lang['created'] = 'dibuat'; $lang['restored'] = 'revisi lama ditampilkan kembali (%s)'; $lang['external_edit'] = 'Perubahan eksternal'; $lang['summary'] = 'Edit summary'; +$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> diperlukan untuk menampilkan konten ini.'; +$lang['download'] = 'Unduh Cuplikan'; +$lang['tools'] = 'Alat'; +$lang['user_tools'] = 'Alat Pengguna'; +$lang['site_tools'] = 'Alat Situs'; +$lang['page_tools'] = 'Alat Halaman'; +$lang['skip_to_content'] = 'lewati ke konten'; +$lang['sidebar'] = 'Bilah Sisi'; $lang['mail_newpage'] = 'Halaman ditambahkan:'; $lang['mail_changed'] = 'Halaman diubah:'; +$lang['mail_subscribe_list'] = 'halaman diubah dalam namespace:'; $lang['mail_new_user'] = 'User baru:'; $lang['mail_upload'] = 'Berkas di-upload:'; +$lang['changes_type'] = 'Tampilkan perubahan'; +$lang['pages_changes'] = 'Halaman'; +$lang['media_changes'] = 'Berkas media'; +$lang['both_changes'] = 'Baik halaman dan berkas media'; $lang['qb_bold'] = 'Tebal'; $lang['qb_italic'] = 'Miring'; $lang['qb_underl'] = 'Garis Bawah'; @@ -145,6 +225,10 @@ $lang['qb_h2'] = 'Level 2 Headline'; $lang['qb_h3'] = 'Level 3 Headline'; $lang['qb_h4'] = 'Level 4 Headline'; $lang['qb_h5'] = 'Level 5 Headline'; +$lang['qb_hs'] = 'Pilih Judul'; +$lang['qb_hplus'] = 'Judul Lebih Atas'; +$lang['qb_hminus'] = 'Judul Lebih Bawah'; +$lang['qb_hequal'] = 'Tingkat Judul yang Sama'; $lang['qb_link'] = 'Link Internal'; $lang['qb_extlink'] = 'Link External'; $lang['qb_hr'] = 'Garis Horisontal'; @@ -154,21 +238,37 @@ $lang['qb_media'] = 'Tambahkan gambar atau file lain'; $lang['qb_sig'] = 'Sisipkan tanda tangan'; $lang['qb_smileys'] = 'Smileys'; $lang['qb_chars'] = 'Karakter Khusus'; +$lang['upperns'] = 'lompat ke namespace induk'; $lang['admin_register'] = 'Tambah user baru'; $lang['metaedit'] = 'Edit Metadata'; $lang['metasaveerr'] = 'Gagal menulis metadata'; $lang['metasaveok'] = 'Metadata tersimpan'; -$lang['img_backto'] = 'Kembali ke'; -$lang['img_title'] = 'Judul'; -$lang['img_caption'] = 'Label'; -$lang['img_date'] = 'Tanggal'; -$lang['img_fname'] = 'Nama file'; -$lang['img_fsize'] = 'Ukuran'; -$lang['img_artist'] = 'Tukang foto'; -$lang['img_copyr'] = 'Hakcipta'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Katakunci'; +$lang['img_title'] = 'Judul:'; +$lang['img_caption'] = 'Label:'; +$lang['img_date'] = 'Tanggal:'; +$lang['img_fname'] = 'Nama file:'; +$lang['img_fsize'] = 'Ukuran:'; +$lang['img_artist'] = 'Tukang foto:'; +$lang['img_copyr'] = 'Hakcipta:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Katakunci:'; +$lang['img_width'] = 'Lebar:'; +$lang['img_height'] = 'Tinggi:'; +$lang['subscr_subscribe_success'] = 'Menambah %s ke senarai langganan untuk %s'; +$lang['subscr_subscribe_error'] = 'Kesalahan menambahkan %s ke senarai langganan untuk %s'; +$lang['subscr_subscribe_noaddress'] = 'Tidak ada alamat yang terkait dengan login Anda, Anda tidak dapat ditambahkan ke senarai langganan'; +$lang['subscr_unsubscribe_success'] = 'Menghapus %s dari senarai langganan untuk %s'; +$lang['subscr_unsubscribe_error'] = 'Kesalahan menghapus %s dari senarai langganan untuk %s'; +$lang['subscr_already_subscribed'] = '%s sudah dilanggankan ke %s'; +$lang['subscr_not_subscribed'] = '%s tidak dilanggankan ke %s'; +$lang['subscr_m_not_subscribed'] = 'Saat ini Anda tidak berlangganan halaman dan namespace saat ini.'; +$lang['subscr_m_new_header'] = 'Tambahkan langganan'; +$lang['subscr_m_current_header'] = 'Langganan saat ini'; +$lang['subscr_m_unsubscribe'] = 'Berhenti berlangganan'; +$lang['subscr_m_subscribe'] = 'Berlangganan'; +$lang['subscr_m_receive'] = 'Menerima'; +$lang['subscr_style_every'] = 'email setiap diubah'; $lang['authtempfail'] = 'Autentikasi user saat ini sedang tidak dapat digunakan. Jika kejadian ini berlanjut, Harap informasikan admin Wiki Anda.'; $lang['i_chooselang'] = 'Pilih bahasa'; $lang['i_installer'] = 'Instalasi DokuWiki'; @@ -189,4 +289,41 @@ $lang['i_policy'] = 'Policy ACL awal'; $lang['i_pol0'] = 'Wiki Terbuka (baca, tulis, upload untuk semua orang)'; $lang['i_pol1'] = 'Wiki Publik (baca untuk semua orang, tulis dan upload untuk pengguna terdaftar)'; $lang['i_pol2'] = 'Wiki Privat (baca, tulis dan upload hanya untuk pengguna terdaftar)'; +$lang['i_allowreg'] = 'Ijinkan pengguna mendaftar sendiri'; $lang['i_retry'] = 'Coba Lagi'; +$lang['i_license'] = 'Silakan pilih lisensi untuk konten Anda:'; +$lang['i_license_none'] = 'Jangan tampilkan semua informasi lisensi'; +$lang['i_pop_field'] = 'Tolong, bantu kami meningkatkan pengalaman DokuWiki:'; +$lang['i_pop_label'] = 'Setiap bulan mengirimkan penggunaan data anonim ke pengembang DokuWiki'; +$lang['years'] = '%d tahun yang lalu'; +$lang['months'] = '%d bulan yang lalu'; +$lang['weeks'] = '%d minggu yang lalu'; +$lang['days'] = '%d hari yang lalu'; +$lang['hours'] = '%d jam yang lalu'; +$lang['minutes'] = '%d menit yang lalu'; +$lang['seconds'] = '%d detik yang lalu'; +$lang['wordblock'] = 'Pengubahan Anda tidak disimpan karena berisi teks yang diblokir (spam).'; +$lang['media_uploadtab'] = 'Unggah'; +$lang['media_searchtab'] = 'Cari'; +$lang['media_file'] = 'Berkas'; +$lang['media_viewtab'] = 'Lihat'; +$lang['media_edittab'] = 'Sunting'; +$lang['media_historytab'] = 'Riwayat'; +$lang['media_list_rows'] = 'Kolom'; +$lang['media_sort_name'] = 'Nama'; +$lang['media_sort_date'] = 'Tanggal'; +$lang['media_namespaces'] = 'Pilih namespace'; +$lang['media_upload'] = 'Unggah ke %s'; +$lang['media_search'] = 'Cari di %s'; +$lang['media_view'] = '%s'; +$lang['media_viewold'] = '%s di %s'; +$lang['media_edit'] = 'Sunting %s'; +$lang['media_history'] = 'Riwayat %s'; +$lang['media_meta_edited'] = 'metadata disunting'; +$lang['media_perm_read'] = 'Maaf, Anda tidak memiliki izin untuk membaca berkas.'; +$lang['media_perm_upload'] = 'Maaf, Anda tidak memiliki izin untuk mengunggah berkas.'; +$lang['media_update'] = 'Unggah versi baru'; +$lang['media_restore'] = 'Kembalikan versi ini'; +$lang['currentns'] = 'Namespace saat ini'; +$lang['searchresult'] = 'Hasil Pencarian'; +$lang['wikimarkup'] = 'Markah Wiki'; diff --git a/inc/lang/id/resetpwd.txt b/inc/lang/id/resetpwd.txt new file mode 100644 index 000000000..6ab26c866 --- /dev/null +++ b/inc/lang/id/resetpwd.txt @@ -0,0 +1,3 @@ +====== Atur sandi baru ====== + +Silakan masukkan sandi baru untuk akun Anda di wiki ini.
\ No newline at end of file diff --git a/inc/lang/id/searchpage.txt b/inc/lang/id/searchpage.txt index c47bed7dc..b3fb56580 100644 --- a/inc/lang/id/searchpage.txt +++ b/inc/lang/id/searchpage.txt @@ -1,5 +1,5 @@ ====== Pencarian ====== -Anda dapat menemukan hasil pencarian dibawah ini. Jika Anda tidak menemukan apa yang diinginkan, Anda dapat membuat halaman baru, dengan nama sesuai "text pencarian" Anda. Gunakan tombol "Edit halaman ini". +Anda dapat menemukan hasil pencarian dibawah ini. @CREATEPAGEINFO@ ===== Hasil Pencarian =====
\ No newline at end of file diff --git a/inc/lang/id/subscr_digest.txt b/inc/lang/id/subscr_digest.txt new file mode 100644 index 000000000..5e1041c04 --- /dev/null +++ b/inc/lang/id/subscr_digest.txt @@ -0,0 +1,17 @@ +Hei! + +Halaman @PAGE@ di wiki @TITLE@ telah disunting. +Berikut perubahannya: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Revisi lama: @OLDPAGE@ + +Revisi baru: @NEWPAGE@ + +Untuk menonaktifkan pemberitahuan ini, masuk ke wiki di @DOKUWIKIURL@ kemudian kunjungi @SUBSCRIBE@ dan halaman batal berlangganan dan/atau namespace yang diubah. + +-- +Email ini dibuat oleh DokuWiki di @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/is/jquery.ui.datepicker.js b/inc/lang/is/jquery.ui.datepicker.js new file mode 100644 index 000000000..16bc79ad8 --- /dev/null +++ b/inc/lang/is/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Icelandic initialisation for the jQuery UI date picker plugin. */ +/* Written by Haukur H. Thorsson (haukur@eskill.is). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['is'] = { + closeText: 'Loka', + prevText: '< Fyrri', + nextText: 'Næsti >', + currentText: 'Í dag', + monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní', + 'Júlí','Ágúst','September','Október','Nóvember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún', + 'Júl','Ágú','Sep','Okt','Nóv','Des'], + dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'], + dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'], + dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'], + weekHeader: 'Vika', + dateFormat: 'dd.mm.yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['is']); + +return datepicker.regional['is']; + +})); diff --git a/inc/lang/is/lang.php b/inc/lang/is/lang.php index fbc7e9049..de1a01ed5 100644 --- a/inc/lang/is/lang.php +++ b/inc/lang/is/lang.php @@ -51,7 +51,7 @@ $lang['btn_recover'] = 'Endurheimta uppkast'; $lang['btn_draftdel'] = 'Eyða uppkasti'; $lang['btn_revert'] = 'Endurheimta'; $lang['btn_register'] = 'Skráning'; -$lang['loggedinas'] = 'Innskráning sem'; +$lang['loggedinas'] = 'Innskráning sem:'; $lang['user'] = 'Notendanafn'; $lang['pass'] = 'Aðgangsorð'; $lang['newpass'] = 'Nýtt aðgangsorð'; @@ -89,11 +89,11 @@ $lang['license'] = 'Nema annað sé tekið fram, efni á þessari $lang['licenseok'] = 'Athugið: Með því að breyta þessari síðu samþykkir þú að leyfisveitandi efni undir eftirfarandi leyfi:'; $lang['searchmedia'] = 'Leit skrárheiti:'; $lang['searchmedia_in'] = 'Leit í %s'; -$lang['txt_upload'] = 'Veldu skrá til innhleðslu'; -$lang['txt_filename'] = 'Innhlaða sem (valfrjálst)'; +$lang['txt_upload'] = 'Veldu skrá til innhleðslu:'; +$lang['txt_filename'] = 'Innhlaða sem (valfrjálst):'; $lang['txt_overwrt'] = 'Skrifa yfir skrá sem þegar er til'; -$lang['lockedby'] = 'Læstur af'; -$lang['lockexpire'] = 'Læsing rennur út eftir'; +$lang['lockedby'] = 'Læstur af:'; +$lang['lockexpire'] = 'Læsing rennur út eftir:'; $lang['nothingfound'] = 'Ekkert fannst'; $lang['mediaselect'] = 'Miðlaskrá'; $lang['fileupload'] = 'Hlaða inn miðlaskrá'; @@ -127,9 +127,9 @@ $lang['yours'] = 'Þín útgáfa'; $lang['diff'] = 'Sýna ágreiningur til núverandi endurskoðun'; $lang['diff2'] = 'Sýna ágreiningur meðal valið endurskoðun'; $lang['line'] = 'Lína'; -$lang['breadcrumb'] = 'Snefill'; -$lang['youarehere'] = 'Þú ert hér'; -$lang['lastmod'] = 'Síðast breytt'; +$lang['breadcrumb'] = 'Snefill:'; +$lang['youarehere'] = 'Þú ert hér:'; +$lang['lastmod'] = 'Síðast breytt:'; $lang['by'] = 'af'; $lang['deleted'] = 'eytt'; $lang['created'] = 'myndað'; @@ -170,15 +170,15 @@ $lang['admin_register'] = 'Setja nýjan notenda inn'; $lang['metaedit'] = 'Breyta lýsigögnum'; $lang['metasaveerr'] = 'Vistun lýsigagna mistókst'; $lang['metasaveok'] = 'Lýsigögn vistuð'; -$lang['img_backto'] = 'Aftur til'; -$lang['img_title'] = 'Heiti'; -$lang['img_caption'] = 'Skýringartexti'; -$lang['img_date'] = 'Dagsetning'; -$lang['img_fname'] = 'Skrárheiti'; -$lang['img_fsize'] = 'Stærð'; -$lang['img_artist'] = 'Myndsmiður'; -$lang['img_copyr'] = 'Útgáfuréttur'; -$lang['img_format'] = 'Forsnið'; -$lang['img_camera'] = 'Myndavél'; -$lang['img_keywords'] = 'Lykilorðir'; +$lang['btn_img_backto'] = 'Aftur til %s'; +$lang['img_title'] = 'Heiti:'; +$lang['img_caption'] = 'Skýringartexti:'; +$lang['img_date'] = 'Dagsetning:'; +$lang['img_fname'] = 'Skrárheiti:'; +$lang['img_fsize'] = 'Stærð:'; +$lang['img_artist'] = 'Myndsmiður:'; +$lang['img_copyr'] = 'Útgáfuréttur:'; +$lang['img_format'] = 'Forsnið:'; +$lang['img_camera'] = 'Myndavél:'; +$lang['img_keywords'] = 'Lykilorðir:'; $lang['i_retry'] = 'Reyna aftur'; diff --git a/inc/lang/it/denied.txt b/inc/lang/it/denied.txt index d21956a5b..577d081ce 100644 --- a/inc/lang/it/denied.txt +++ b/inc/lang/it/denied.txt @@ -1,5 +1,4 @@ ====== Accesso negato ====== -Non hai i diritti per continuare. Forse hai dimenticato di effettuare l'accesso? - +Non hai i diritti per continuare. diff --git a/inc/lang/it/jquery.ui.datepicker.js b/inc/lang/it/jquery.ui.datepicker.js new file mode 100644 index 000000000..4d4d62f9b --- /dev/null +++ b/inc/lang/it/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['it'] = { + closeText: 'Chiudi', + prevText: '<Prec', + nextText: 'Succ>', + currentText: 'Oggi', + monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', + 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'], + monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu', + 'Lug','Ago','Set','Ott','Nov','Dic'], + dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'], + dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'], + dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['it']); + +return datepicker.regional['it']; + +})); diff --git a/inc/lang/it/lang.php b/inc/lang/it/lang.php index a2bde3b60..c6b99d5b5 100644 --- a/inc/lang/it/lang.php +++ b/inc/lang/it/lang.php @@ -17,6 +17,10 @@ * @author snarchio@gmail.com * @author Edmondo Di Tucci <snarchio@gmail.com> * @author Claudio Lanconelli <lancos@libero.it> + * @author Mirko <malisan.mirko@gmail.com> + * @author Francesco <francesco.cavalli@hotmail.com> + * @author Fabio <fabioslurp@yahoo.it> + * @author Torpedo <dgtorpedo@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -61,7 +65,9 @@ $lang['btn_register'] = 'Registrazione'; $lang['btn_apply'] = 'Applica'; $lang['btn_media'] = 'Gestore Media'; $lang['btn_deleteuser'] = 'Rimuovi il mio account'; -$lang['loggedinas'] = 'Collegato come'; +$lang['btn_img_backto'] = 'Torna a %s'; +$lang['btn_mediaManager'] = 'Guarda nel gestore media'; +$lang['loggedinas'] = 'Collegato come:'; $lang['user'] = 'Nome utente'; $lang['pass'] = 'Password'; $lang['newpass'] = 'Nuova password'; @@ -76,6 +82,7 @@ $lang['badpassconfirm'] = 'La password è errata'; $lang['minoredit'] = 'Modifiche minori'; $lang['draftdate'] = 'Bozza salvata in automatico il'; $lang['nosecedit'] = 'La pagina è stata modificata nel frattempo; è impossibile modificare solo la sezione scelta, quindi è stata caricata la pagina intera.'; +$lang['searchcreatepage'] = 'Se non hai trovato quello che cercavi, puoi creare una nuova pagina con questo titolo usando il pulsante \'\'Crea questa pagina\'\'.'; $lang['regmissing'] = 'Devi riempire tutti i campi.'; $lang['reguexists'] = 'Il nome utente inserito esiste già.'; $lang['regsuccess'] = 'L\'utente è stato creato. La password è stata spedita via email.'; @@ -106,12 +113,12 @@ $lang['license'] = 'Ad eccezione da dove è diversamente indicato, $lang['licenseok'] = 'Nota: modificando questa pagina accetti di rilasciare il contenuto sotto la seguente licenza:'; $lang['searchmedia'] = 'Cerca file di nome:'; $lang['searchmedia_in'] = 'Cerca in %s'; -$lang['txt_upload'] = 'Seleziona un file da caricare'; -$lang['txt_filename'] = 'Carica come (opzionale)'; +$lang['txt_upload'] = 'Seleziona un file da caricare:'; +$lang['txt_filename'] = 'Carica come (opzionale):'; $lang['txt_overwrt'] = 'Sovrascrivi file esistente'; $lang['maxuploadsize'] = 'Upload max. %s per ogni file.'; -$lang['lockedby'] = 'Attualmente bloccato da'; -$lang['lockexpire'] = 'Il blocco scade alle'; +$lang['lockedby'] = 'Attualmente bloccato da:'; +$lang['lockexpire'] = 'Il blocco scade alle:'; $lang['js']['willexpire'] = 'Il tuo blocco su questa pagina scadrà tra circa un minuto.\nPer evitare incongruenze usa il pulsante di anteprima per prolungare il periodo di blocco.'; $lang['js']['notsavedyet'] = 'Le modifiche non salvate andranno perse.'; $lang['js']['searchmedia'] = 'Cerca file'; @@ -146,6 +153,8 @@ $lang['js']['del_confirm'] = 'Eliminare veramente questa voce?'; $lang['js']['restore_confirm'] = 'Vuoi davvero ripristinare questa versione?'; $lang['js']['media_diff'] = 'Guarda le differenze:'; $lang['js']['media_diff_both'] = 'Fianco a Fianco'; +$lang['js']['media_diff_opacity'] = 'Trasparire'; +$lang['js']['media_diff_portions'] = 'rubare'; $lang['js']['media_select'] = 'Seleziona files..'; $lang['js']['media_upload_btn'] = 'Upload'; $lang['js']['media_done_btn'] = 'Fatto'; @@ -189,10 +198,15 @@ $lang['difflink'] = 'Link a questa pagina di confronto'; $lang['diff_type'] = 'Guarda le differenze:'; $lang['diff_inline'] = 'In linea'; $lang['diff_side'] = 'Fianco a Fianco'; +$lang['diffprevrev'] = 'Revisione precedente'; +$lang['diffnextrev'] = 'Prossima revisione'; +$lang['difflastrev'] = 'Ultima revisione'; +$lang['diffbothprevrev'] = 'Entrambe le parti precedenti la revisione'; +$lang['diffbothnextrev'] = 'Entrambe le parti successive la revisione'; $lang['line'] = 'Linea'; -$lang['breadcrumb'] = 'Traccia'; -$lang['youarehere'] = 'Ti trovi qui'; -$lang['lastmod'] = 'Ultima modifica'; +$lang['breadcrumb'] = 'Traccia:'; +$lang['youarehere'] = 'Ti trovi qui:'; +$lang['lastmod'] = 'Ultima modifica:'; $lang['by'] = 'da'; $lang['deleted'] = 'eliminata'; $lang['created'] = 'creata'; @@ -245,20 +259,18 @@ $lang['admin_register'] = 'Aggiungi un nuovo utente'; $lang['metaedit'] = 'Modifica metadati'; $lang['metasaveerr'] = 'Scrittura metadati fallita'; $lang['metasaveok'] = 'Metadati salvati'; -$lang['img_backto'] = 'Torna a'; -$lang['img_title'] = 'Titolo'; -$lang['img_caption'] = 'Descrizione'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Nome File'; -$lang['img_fsize'] = 'Dimensione'; -$lang['img_artist'] = 'Autore'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Formato'; -$lang['img_camera'] = 'Camera'; -$lang['img_keywords'] = 'Parole chiave'; -$lang['img_width'] = 'Larghezza'; -$lang['img_height'] = 'Altezza'; -$lang['img_manager'] = 'Guarda nel gestore media'; +$lang['img_title'] = 'Titolo:'; +$lang['img_caption'] = 'Descrizione:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Nome File:'; +$lang['img_fsize'] = 'Dimensione:'; +$lang['img_artist'] = 'Autore:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Formato:'; +$lang['img_camera'] = 'Camera:'; +$lang['img_keywords'] = 'Parole chiave:'; +$lang['img_width'] = 'Larghezza:'; +$lang['img_height'] = 'Altezza:'; $lang['subscr_subscribe_success'] = 'Aggiunto %s alla lista di sottoscrizioni %s'; $lang['subscr_subscribe_error'] = 'Impossibile aggiungere %s alla lista di sottoscrizioni %s'; $lang['subscr_subscribe_noaddress'] = 'Non esiste alcun indirizzo associato al tuo account, non puoi essere aggiunto alla lista di sottoscrizioni'; @@ -288,6 +300,7 @@ Prova a estrarre di nuovo i file dal pacchetto scaricato oppure consulta le <a href="http://dokuwiki.org/install">istruzioni per l\'installazione di Dokuwiki</a>'; $lang['i_funcna'] = 'La funzione PHP <code>%s</code> non è disponibile. Forse è stata disabilitata dal tuo provider per qualche motivo?'; $lang['i_phpver'] = 'La versione di PHP <code>%s</code> è inferiore a quella richiesta <code>%s</code>. Devi aggiornare l\'installazione di PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload deve essere disabilitato in php.ini per eseguire DokuWiki.'; $lang['i_permfail'] = 'DokuWiki non può scrivere <code>%s</code>. E\' necessario correggere i permessi per questa directory!'; $lang['i_confexists'] = '<code>%s</code> esiste già'; $lang['i_writeerr'] = 'Impossibile creare <code>%s</code>. E\' necessario verificare i permessi della directory o del file oppure creare il file manualmente.'; @@ -337,4 +350,7 @@ $lang['media_perm_read'] = 'Spiacente, non hai abbastanza privilegi per le $lang['media_perm_upload'] = 'Spiacente, non hai abbastanza privilegi per caricare files.'; $lang['media_update'] = 'Carica nuova versione'; $lang['media_restore'] = 'Ripristina questa versione'; +$lang['currentns'] = 'Namespace corrente'; $lang['searchresult'] = 'Risultati della ricerca'; +$lang['plainhtml'] = 'HTML'; +$lang['page_nonexist_rev'] = 'Pagina non esistente a %s. E\' stata creata successivamente a <a href="%s">%s</a>.'; diff --git a/inc/lang/it/searchpage.txt b/inc/lang/it/searchpage.txt index 60a019c3e..6f269da01 100644 --- a/inc/lang/it/searchpage.txt +++ b/inc/lang/it/searchpage.txt @@ -1,5 +1,5 @@ ====== Cerca ====== -Questi sono i risultati della ricerca. Se non hai trovato quello che cercavi, puoi creare una nuova pagina con questo titolo usando il pulsante ''Crea questa pagina''. +Questi sono i risultati della ricerca. @CREATEPAGEINFO@ ===== Risultati ===== diff --git a/inc/lang/ja/denied.txt b/inc/lang/ja/denied.txt index d170aebe4..98ccb2f5a 100644 --- a/inc/lang/ja/denied.txt +++ b/inc/lang/ja/denied.txt @@ -1,4 +1,4 @@ ====== アクセスが拒否されました ====== -実行する権限がありません。ログインされているか確認してください。 +実行する権限がありません。 diff --git a/inc/lang/ja/jquery.ui.datepicker.js b/inc/lang/ja/jquery.ui.datepicker.js new file mode 100644 index 000000000..381f41b5d --- /dev/null +++ b/inc/lang/ja/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Japanese initialisation for the jQuery UI date picker plugin. */ +/* Written by Kentaro SATO (kentaro@ranvis.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['ja'] = { + closeText: '閉じる', + prevText: '<前', + nextText: '次>', + currentText: '今日', + monthNames: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthNamesShort: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'], + dayNamesShort: ['日','月','火','水','木','金','土'], + dayNamesMin: ['日','月','火','水','木','金','土'], + weekHeader: '週', + dateFormat: 'yy/mm/dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; +datepicker.setDefaults(datepicker.regional['ja']); + +return datepicker.regional['ja']; + +})); diff --git a/inc/lang/ja/lang.php b/inc/lang/ja/lang.php index 1f53b0a90..3a5f169e7 100644 --- a/inc/lang/ja/lang.php +++ b/inc/lang/ja/lang.php @@ -11,6 +11,7 @@ * @author Satoshi Sahara <sahara.satoshi@gmail.com> * @author Hideaki SAWADA <chuno@live.jp> * @author Hideaki SAWADA <sawadakun@live.jp> + * @author PzF_X <jp_minecraft@yahoo.co.jp> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -55,7 +56,9 @@ $lang['btn_register'] = 'ユーザー登録'; $lang['btn_apply'] = '適用'; $lang['btn_media'] = 'メディアマネージャー'; $lang['btn_deleteuser'] = '自分のアカウントの抹消'; -$lang['loggedinas'] = 'ようこそ'; +$lang['btn_img_backto'] = '戻る %s'; +$lang['btn_mediaManager'] = 'メディアマネージャーで閲覧'; +$lang['loggedinas'] = 'ようこそ:'; $lang['user'] = 'ユーザー名'; $lang['pass'] = 'パスワード'; $lang['newpass'] = '新しいパスワード'; @@ -70,6 +73,7 @@ $lang['badpassconfirm'] = 'パスワードが間違っています。'; $lang['minoredit'] = '小変更'; $lang['draftdate'] = 'ドラフト保存日時:'; $lang['nosecedit'] = 'ページ内容が変更されていますがセクション情報が古いため、代わりにページ全体をロードしました。'; +$lang['searchcreatepage'] = 'もし、探しているものが見つからない場合、 検索キーワードにちなんだ名前の文書を作成もしくは編集を行ってください。'; $lang['regmissing'] = '全ての項目を入力してください。'; $lang['reguexists'] = 'このユーザー名は既に存在しています。'; $lang['regsuccess'] = '新しいユーザーが作成されました。パスワードは登録したメールアドレス宛てに送付されます。'; @@ -100,12 +104,12 @@ $lang['license'] = '特に明示されていない限り、本Wiki $lang['licenseok'] = '注意: 本ページを編集することは、あなたの編集した内容が次のライセンスに従うことに同意したものとみなします:'; $lang['searchmedia'] = '検索ファイル名:'; $lang['searchmedia_in'] = '%s 内を検索'; -$lang['txt_upload'] = 'アップロードするファイルを選んでください。'; -$lang['txt_filename'] = '名前を変更してアップロード(オプション)'; +$lang['txt_upload'] = 'アップロードするファイルを選んでください。:'; +$lang['txt_filename'] = '名前を変更してアップロード(オプション):'; $lang['txt_overwrt'] = '既存のファイルを上書き'; $lang['maxuploadsize'] = 'アップロード上限サイズ %s /ファイル'; -$lang['lockedby'] = 'この文書は次のユーザーによってロックされています'; -$lang['lockexpire'] = 'ロック期限:'; +$lang['lockedby'] = 'この文書は次のユーザーによってロックされています:'; +$lang['lockexpire'] = 'ロック期限::'; $lang['js']['willexpire'] = '編集中の文書はロック期限を過ぎようとしています。このままロックする場合は、一度文書の確認を行って期限をリセットしてください。'; $lang['js']['notsavedyet'] = '変更は保存されません。このまま処理を続けてよろしいですか?'; $lang['js']['searchmedia'] = 'ファイル検索'; @@ -184,10 +188,15 @@ $lang['difflink'] = 'この比較画面にリンクする'; $lang['diff_type'] = '差分の表示方法:'; $lang['diff_inline'] = 'インライン'; $lang['diff_side'] = '横に並べる'; +$lang['diffprevrev'] = '前のリビジョン'; +$lang['diffnextrev'] = '次のリビジョン'; +$lang['difflastrev'] = '最新リビジョン'; +$lang['diffbothprevrev'] = '両方とも前のリビジョン'; +$lang['diffbothnextrev'] = '両方とも次のリビジョン'; $lang['line'] = 'ライン'; -$lang['breadcrumb'] = 'トレース'; -$lang['youarehere'] = '現在位置'; -$lang['lastmod'] = '最終更新'; +$lang['breadcrumb'] = 'トレース:'; +$lang['youarehere'] = '現在位置:'; +$lang['lastmod'] = '最終更新:'; $lang['by'] = 'by'; $lang['deleted'] = '削除'; $lang['created'] = '作成'; @@ -240,20 +249,18 @@ $lang['admin_register'] = '新規ユーザー作成'; $lang['metaedit'] = 'メタデータ編集'; $lang['metasaveerr'] = 'メタデータの書き込みに失敗しました'; $lang['metasaveok'] = 'メタデータは保存されました'; -$lang['img_backto'] = '戻る'; -$lang['img_title'] = 'タイトル'; -$lang['img_caption'] = '見出し'; -$lang['img_date'] = '日付'; -$lang['img_fname'] = 'ファイル名'; -$lang['img_fsize'] = 'サイズ'; -$lang['img_artist'] = '作成者'; -$lang['img_copyr'] = '著作権'; -$lang['img_format'] = 'フォーマット'; -$lang['img_camera'] = '使用カメラ'; -$lang['img_keywords'] = 'キーワード'; -$lang['img_width'] = '幅'; -$lang['img_height'] = '高さ'; -$lang['img_manager'] = 'メディアマネージャーで閲覧'; +$lang['img_title'] = 'タイトル:'; +$lang['img_caption'] = '見出し:'; +$lang['img_date'] = '日付:'; +$lang['img_fname'] = 'ファイル名:'; +$lang['img_fsize'] = 'サイズ:'; +$lang['img_artist'] = '作成者:'; +$lang['img_copyr'] = '著作権:'; +$lang['img_format'] = 'フォーマット:'; +$lang['img_camera'] = '使用カメラ:'; +$lang['img_keywords'] = 'キーワード:'; +$lang['img_width'] = '幅:'; +$lang['img_height'] = '高さ:'; $lang['subscr_subscribe_success'] = '%sが%sの購読リストに登録されました。'; $lang['subscr_subscribe_error'] = '%sを%sの購読リストへの追加に失敗しました。'; $lang['subscr_subscribe_noaddress'] = 'あなたのログインに対応するアドレスがないため、購読リストへ追加することができません。'; @@ -283,6 +290,7 @@ $lang['i_modified'] = 'セキュリティの理由から、新規も <a href="http://dokuwiki.org/install">Dokuwiki インストールガイド</a>を参考にしてインストールしてください。'; $lang['i_funcna'] = 'PHPの関数 <code>%s</code> が使用できません。ホスティング会社が何らかの理由で無効にしている可能性があります。'; $lang['i_phpver'] = 'PHPのバージョン <code>%s</code> が必要なバージョン <code>%s</code> より以前のものです。PHPのアップグレードが必要です。'; +$lang['i_mbfuncoverload'] = 'DokuWiki を実行する php.ini ファイルの mbstring.func_overload は無効にして下さい。'; $lang['i_permfail'] = '<code>%s</code> に書き込みできません。このディレクトリの権限を確認して下さい。'; $lang['i_confexists'] = '<code>%s</code> は既に存在します'; $lang['i_writeerr'] = '<code>%s</code> を作成できません。ディレクトリとファイルの権限を確認し、それらを手動で作成する必要があります。'; @@ -336,3 +344,5 @@ $lang['currentns'] = '現在の名前空間'; $lang['searchresult'] = '検索結果'; $lang['plainhtml'] = 'プレーンHTML'; $lang['wikimarkup'] = 'Wikiマークアップ'; +$lang['page_nonexist_rev'] = '指定ページ %s はありません。このリンク <a href="%s">%s</a> から作成できます。'; +$lang['unable_to_parse_date'] = 'パラメータ "%s" を処理できません。'; diff --git a/inc/lang/ja/searchpage.txt b/inc/lang/ja/searchpage.txt index af312728b..80b0950c6 100644 --- a/inc/lang/ja/searchpage.txt +++ b/inc/lang/ja/searchpage.txt @@ -1,5 +1,5 @@ ====== 検索 ====== -以下に検索結果を表示します。もし、探しているものが見つからない場合、 検索キーワードにちなんだ名前の文書を作成もしくは編集を行ってください。 +以下に検索結果を表示します。@CREATEPAGEINFO@ ===== 結果 ===== diff --git a/inc/lang/ka/admin.txt b/inc/lang/ka/admin.txt new file mode 100644 index 000000000..97072a449 --- /dev/null +++ b/inc/lang/ka/admin.txt @@ -0,0 +1,4 @@ +====== მართვა ====== + +ქვემოთ თქვენ ხედავთ ადმინისტრაციული ოპერაციების სიას «დოკუვიკიში». + diff --git a/inc/lang/ka/adminplugins.txt b/inc/lang/ka/adminplugins.txt new file mode 100644 index 000000000..011bfeb62 --- /dev/null +++ b/inc/lang/ka/adminplugins.txt @@ -0,0 +1 @@ +===== დამატებითი პლაგინები =====
\ No newline at end of file diff --git a/inc/lang/ka/backlinks.txt b/inc/lang/ka/backlinks.txt new file mode 100644 index 000000000..7b54797c7 --- /dev/null +++ b/inc/lang/ka/backlinks.txt @@ -0,0 +1,4 @@ +====== გადმომისამართება ====== + +გვერდები რომლებიც ანიშნებენ ამ გვერდზე. + diff --git a/inc/lang/ka/conflict.txt b/inc/lang/ka/conflict.txt new file mode 100644 index 000000000..1b1eb0482 --- /dev/null +++ b/inc/lang/ka/conflict.txt @@ -0,0 +1,5 @@ +====== გამოვიდა უფრო ახალი ვერსია ====== + +არსებობს დოკუმენტის უფრო ახალი ვერსია, რომელიც თქვენ დაარედაქტირეთ. ეს ხდება მაშინ, როდესაც სხვა მომხმარებელი არედაქტირებს დოკუმენტს, სანამ თქვენ აკეთებდით იგივეს. + +ყურადღებით დააკვირდით ქვემოთ მოყვანილ განსხვავებებს, და გადაწყვიტეთ რომელი ვერსია სჯობს. თუ შენახვას დააჭერთ, თქვენი ვერსია შეინახება.
\ No newline at end of file diff --git a/inc/lang/ka/denied.txt b/inc/lang/ka/denied.txt new file mode 100644 index 000000000..bb8910472 --- /dev/null +++ b/inc/lang/ka/denied.txt @@ -0,0 +1,3 @@ +====== მიუწვდომელია ====== + +თქვენ არ გაქვთ საკმარისი უფლებები. იქნებ ავტორიზაცია დაგავიწყდათ? diff --git a/inc/lang/ka/diff.txt b/inc/lang/ka/diff.txt new file mode 100644 index 000000000..c635e45f4 --- /dev/null +++ b/inc/lang/ka/diff.txt @@ -0,0 +1,3 @@ +====== განსხვავებები ====== +ქვემოთ მოყვანილაი განსხვავებები მსგავს გვერდებს შორის. + diff --git a/inc/lang/ka/draft.txt b/inc/lang/ka/draft.txt new file mode 100644 index 000000000..f3356ddb5 --- /dev/null +++ b/inc/lang/ka/draft.txt @@ -0,0 +1,3 @@ +====== ნაპოვნია ჩანაწერი ====== + +გვერდის რედაქტირება არ იყო დამთავრებული.
\ No newline at end of file diff --git a/inc/lang/ka/edit.txt b/inc/lang/ka/edit.txt new file mode 100644 index 000000000..3fffceb0c --- /dev/null +++ b/inc/lang/ka/edit.txt @@ -0,0 +1,2 @@ +დაარედაქტირეთ გვერდი და დააჭირეთ «შენახვას». წაიკითხეთ [[wiki:syntax|FAQ]] ვიკის სინტაქსისთან გასაცნობად. დაარედაქტირეთ გვერდი მხოლოდ იმ შემთხვევაში თუ აპირებთ გვერდის გაუმჯობესებას. თუ თქვენ რამის დატესტვა გინდათ, გამოიყენეთ სპეციალური გვერდი. + diff --git a/inc/lang/ka/editrev.txt b/inc/lang/ka/editrev.txt new file mode 100644 index 000000000..17ccff57f --- /dev/null +++ b/inc/lang/ka/editrev.txt @@ -0,0 +1,2 @@ +**თქვენ ატვირთეთ დოკუმენტის ძველი ვერსია** მისი შენახვით თქვენ შექმნით ახალ ვერსიას იგივე შიგთავსით. +---- diff --git a/inc/lang/ka/index.txt b/inc/lang/ka/index.txt new file mode 100644 index 000000000..7daef7fb6 --- /dev/null +++ b/inc/lang/ka/index.txt @@ -0,0 +1 @@ +====== სტატიები ====== აქ ნაჩვენებია ყველა სტატია
\ No newline at end of file diff --git a/inc/lang/ka/lang.php b/inc/lang/ka/lang.php new file mode 100644 index 000000000..28ca11e45 --- /dev/null +++ b/inc/lang/ka/lang.php @@ -0,0 +1,326 @@ +<?php + +/** + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * + * @author Luka Lejava <luka.lejava@gmail.com> + */ +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '“'; +$lang['doublequoteclosing'] = '”'; +$lang['singlequoteopening'] = '‘'; +$lang['singlequoteclosing'] = '’'; +$lang['apostrophe'] = '’'; +$lang['btn_edit'] = 'დაარედაქტირეთ ეს გვერდი'; +$lang['btn_source'] = 'მაჩვენე გვერდის კოდი'; +$lang['btn_show'] = 'გვერდის ჩვენება'; +$lang['btn_create'] = 'გვერდის შექმნა'; +$lang['btn_search'] = 'ძიება'; +$lang['btn_save'] = 'შენახვა'; +$lang['btn_preview'] = 'ჩვენება'; +$lang['btn_top'] = 'მაღლა'; +$lang['btn_newer'] = '<< მეტი '; +$lang['btn_older'] = 'ნაკლები >>'; +$lang['btn_revs'] = 'ძველი ვერსიები'; +$lang['btn_recent'] = 'ბოლო ცვლილებები'; +$lang['btn_upload'] = 'ატვირთვა'; +$lang['btn_cancel'] = 'შეწყვეტა'; +$lang['btn_index'] = 'სტატიები'; +$lang['btn_secedit'] = 'რედაქტირება'; +$lang['btn_login'] = 'შესვლა'; +$lang['btn_logout'] = 'გამოსვლა'; +$lang['btn_admin'] = 'ადმინი'; +$lang['btn_update'] = 'განახლება'; +$lang['btn_delete'] = 'წაშლა'; +$lang['btn_back'] = 'უკან'; +$lang['btn_backlink'] = 'გადმომისამართებული ბმულები'; +$lang['btn_backtomedia'] = 'მედიაფაილების არჩევა'; +$lang['btn_subscribe'] = 'Manage Subscriptions'; +$lang['btn_profile'] = 'პროფილის განახლება'; +$lang['btn_reset'] = 'წაშლა'; +$lang['btn_resendpwd'] = 'ახალი პაროლის დაყენება'; +$lang['btn_draft'] = 'ჩანაწერის წაშლა'; +$lang['btn_recover'] = 'ჩანაწერის აღდგენა'; +$lang['btn_draftdel'] = 'ჩანაწერის წაშლა'; +$lang['btn_revert'] = 'აღდგენა'; +$lang['btn_register'] = 'რეგისტრაცია'; +$lang['btn_apply'] = 'ცადე'; +$lang['btn_media'] = 'მედია ფაილების მართვა'; +$lang['btn_deleteuser'] = 'ჩემი ექაუნთის წაშლა'; +$lang['btn_img_backto'] = 'უკან %'; +$lang['btn_mediaManager'] = 'მედია ფაილების მმართველში გახსნა'; +$lang['loggedinas'] = 'შესული ხართ როგორც:'; +$lang['user'] = 'ლოგინი'; +$lang['pass'] = 'პაროლი'; +$lang['newpass'] = 'ახალი პაროლი'; +$lang['oldpass'] = 'დაადასტურეთ პაროლი'; +$lang['passchk'] = 'კიდევ ერთხელ'; +$lang['remember'] = 'დამიმახსოვრე'; +$lang['fullname'] = 'ნამდვილი სახელი'; +$lang['email'] = 'ფოსტა'; +$lang['profile'] = 'მომხმარებლის პროფილი'; +$lang['badlogin'] = 'ლოგინი ან პაროლი არასწორია'; +$lang['badpassconfirm'] = 'პაროლი არასწორია'; +$lang['minoredit'] = 'ცვლილებები'; +$lang['draftdate'] = 'ჩანაწერების ავტომატური შენახვა ჩართულია'; +$lang['nosecedit'] = 'გვერდს ვადა გაუვიდა'; +$lang['regmissing'] = 'ყველა ველი შეავსეთ'; +$lang['reguexists'] = 'მსგავსი ლოგინი უკვე არსებობს'; +$lang['regsuccess'] = 'მომხმარებელი შექმნილია, პაროლი გამოგზავნილია'; +$lang['regsuccess2'] = 'მომხმარებელი შექმნილია'; +$lang['regmailfail'] = 'დაფიქსირდა შეცდომა'; +$lang['regbadmail'] = 'ფოსტა არასწორია'; +$lang['regbadpass'] = 'პაროლი განსხვავებულია'; +$lang['regpwmail'] = 'თვენი DokuWiki პაროლი'; +$lang['reghere'] = 'დარეგისტრირდი'; +$lang['profna'] = 'არ შეგიძლიათ პროფილის რედაქტირება'; +$lang['profnochange'] = 'ცვლილებები არ არის'; +$lang['profnoempty'] = 'ცარიელი სახელი ან ფოსტა დაუშვებელია'; +$lang['profchanged'] = 'პროფილი განახლდა'; +$lang['profnodelete'] = 'მომხმარებლის წაშლა შეუძლებელია'; +$lang['profdeleteuser'] = 'პროფილის წაშლა'; +$lang['profdeleted'] = 'პროფილი წაიშალა'; +$lang['profconfdelete'] = 'მე მსურს პროფილის წაშლა. <br/> თქვენ აღარ გექნებათ საშუალება აღადგინოთ პროფილი.'; +$lang['profconfdeletemissing'] = 'დადასტურების ველი ცარიელია'; +$lang['pwdforget'] = 'დაგავიწყდა პაროლი? აღადგინე'; +$lang['resendna'] = 'პაროლის აღდგენა შეუძლებელია'; +$lang['resendpwd'] = 'ახალი პაროლი'; +$lang['resendpwdmissing'] = 'უნდა შეავსოთ ყველა ველი'; +$lang['resendpwdnouser'] = 'მსგავსი ლოგინი დარეგისტრირებული არ არის'; +$lang['resendpwdbadauth'] = 'კოდი არასწორია'; +$lang['resendpwdconfirm'] = 'აღსადგენი ბმული გამოგზავნილია'; +$lang['resendpwdsuccess'] = 'ახალი პაროლი გამოგზავნილია'; +$lang['license'] = 'ვიკი ლიცენზირებულია: '; +$lang['licenseok'] = 'ამ გვერდის რედაქტირებით თვენ ეთანხმებით ლიცენზიას:'; +$lang['searchmedia'] = 'საძებო სახელი:'; +$lang['searchmedia_in'] = 'ძებნა %-ში'; +$lang['txt_upload'] = 'აირჩიეთ ასატვირთი ფაილი:'; +$lang['txt_filename'] = 'ატვირთვა როგორც (არჩევითი):'; +$lang['txt_overwrt'] = 'გადაწერა ზემოდან'; +$lang['maxuploadsize'] = 'მაქსიმალური ზომა %'; +$lang['lockedby'] = 'დაბლოკილია:'; +$lang['lockexpire'] = 'განიბლოკება:'; +$lang['js']['willexpire'] = 'გვერდი განიბლოკება 1 წუთში'; +$lang['js']['notsavedyet'] = 'შეუნახავი მონაცემები წაიშლება'; +$lang['js']['searchmedia'] = 'ძებნა'; +$lang['js']['keepopen'] = 'დატოვეთ ღია'; +$lang['js']['hidedetails'] = 'დეტალების დამალვა'; +$lang['js']['mediatitle'] = 'ინსტრუმენტები'; +$lang['js']['mediadisplay'] = 'ბმულის ტიპი'; +$lang['js']['mediaalign'] = 'Alignment'; +$lang['js']['mediasize'] = 'სურათის ზომა'; +$lang['js']['mediatarget'] = 'მიზნის ბმული'; +$lang['js']['mediaclose'] = 'დახურვა'; +$lang['js']['mediainsert'] = 'ჩასმა'; +$lang['js']['mediadisplayimg'] = 'სურათის ნახვა'; +$lang['js']['mediadisplaylnk'] = 'მაჩვენე მხოლოდ ბმული'; +$lang['js']['mediasmall'] = 'მცირე ვერსია'; +$lang['js']['mediamedium'] = 'საშუალო ვერსია'; +$lang['js']['medialarge'] = 'ვრცელი ვერსია'; +$lang['js']['mediaoriginal'] = 'ორიგინალი ვერსია'; +$lang['js']['medialnk'] = 'დაწვრილებით'; +$lang['js']['mediadirect'] = 'ორიგინალი'; +$lang['js']['medianolnk'] = 'ბმული არ არის'; +$lang['js']['medianolink'] = 'არ დალინკოთ სურათი'; +$lang['js']['medialeft'] = 'მარცხვნივ განათავსეთ სურათი'; +$lang['js']['mediaright'] = 'მარჯვნივ განათავსეთ სურათი'; +$lang['js']['mediacenter'] = 'შუაში განათავსეთ სურათი'; +$lang['js']['medianoalign'] = 'Use no align.'; +$lang['js']['nosmblinks'] = 'ეს ფუქნცია მუშაობს მხოლოდ Internet Explorer-ზე'; +$lang['js']['linkwiz'] = 'ბმული'; +$lang['js']['linkto'] = 'ბმული'; +$lang['js']['del_confirm'] = 'დარწმუნებული ხართ რომ წაშლა გინდათ?'; +$lang['js']['restore_confirm'] = 'დარწმუნებული ხართ რომ აღდგენა გინდათ?'; +$lang['js']['media_diff'] = 'განსხვავებების ჩვენება'; +$lang['js']['media_diff_both'] = 'გვერდიგვერდ'; +$lang['js']['media_diff_opacity'] = 'Shine-through'; +$lang['js']['media_diff_portions'] = 'Swipe +'; +$lang['js']['media_select'] = 'არჩეული ფაილები'; +$lang['js']['media_upload_btn'] = 'ატვირთვა'; +$lang['js']['media_done_btn'] = 'მზადაა'; +$lang['js']['media_drop'] = 'ჩაყარეთ ასატვირთი ფაილები'; +$lang['js']['media_cancel'] = 'წაშლა'; +$lang['js']['media_overwrt'] = 'გადაწერა ზემოდან'; +$lang['rssfailed'] = 'დაფიქსირდა შეცდომა:'; +$lang['nothingfound'] = 'ნაპოვნი არ არის'; +$lang['mediaselect'] = 'მედია ფაილები'; +$lang['fileupload'] = 'მედია ფაილების ატვირთვა'; +$lang['uploadsucc'] = 'ატვირთვა დასრულებულია'; +$lang['uploadfail'] = 'შეფერხება ატვირთვისას'; +$lang['uploadwrong'] = 'ატვირთვა შეუძლებელია'; +$lang['uploadexist'] = 'ფაილი უკვე არსებობს'; +$lang['uploadbadcontent'] = 'ატვირთული ფაილები არ ემთხვევა '; +$lang['uploadspam'] = 'ატვირთვა დაბლოკილია სპამბლოკერის მიერ'; +$lang['uploadxss'] = 'ატვირთვა დაბლოკილია'; +$lang['uploadsize'] = 'ასატვირთი ფაილი ზედმეტად დიდია'; +$lang['deletesucc'] = '% ფაილები წაიშალა'; +$lang['deletefail'] = '% ვერ მოიძებნა'; +$lang['mediainuse'] = 'ფაილის % ვერ წაიშალა, რადგან გამოყენებაშია'; +$lang['namespaces'] = 'Namespaces'; +$lang['mediafiles'] = 'არსებული ფაილები'; +$lang['accessdenied'] = 'თქვენ არ შეგიძლიათ გვერდის ნახვა'; +$lang['mediausage'] = 'Use the following syntax to reference this file:'; +$lang['mediaview'] = 'ორიგინალი ფაილის ჩვენება'; +$lang['mediaroot'] = 'root'; +$lang['mediaupload'] = 'Upload a file to the current namespace here. To create subnamespaces, prepend them to your filename separated by colons after you selected the files. Files can also be selected by drag and drop.'; +$lang['mediaextchange'] = 'Filextension changed from .%s to .%s!'; +$lang['reference'] = 'References for'; +$lang['ref_inuse'] = 'ფაილი წაშლა შეუძლებელია, გამოიყენება აქ:'; +$lang['ref_hidden'] = 'ზოგიერთი ბლოკის წაკითხვის უფლება არ გაქვთ'; +$lang['hits'] = 'Hits'; +$lang['quickhits'] = 'მსგავსი სახელები'; +$lang['toc'] = 'Table of Contents'; +$lang['current'] = 'ახლანდელი'; +$lang['yours'] = 'თვენი ვერსია'; +$lang['diff'] = 'ვერსიების განსხვავება'; +$lang['diff2'] = 'განსხვავებები'; +$lang['difflink'] = 'Link to this comparison view'; +$lang['diff_type'] = 'განსხვავებების ჩვენება'; +$lang['diff_inline'] = 'Inline'; +$lang['diff_side'] = 'გვერდიგვერდ'; +$lang['diffprevrev'] = 'წინა ვერსია'; +$lang['diffnextrev'] = 'შემდეგი ვერსია'; +$lang['difflastrev'] = 'ბოლო ვერსია'; +$lang['diffbothprevrev'] = 'Both sides previous revision'; +$lang['diffbothnextrev'] = 'Both sides next revision'; +$lang['line'] = 'ზოლი'; +$lang['breadcrumb'] = 'Trace:'; +$lang['youarehere'] = 'თვენ ხართ აქ:'; +$lang['lastmod'] = 'ბოლოს მოდიფიცირებული:'; +$lang['deleted'] = 'წაშლილია'; +$lang['created'] = 'შექმნილია'; +$lang['restored'] = 'ძველი ვერსია აღდგენილია %'; +$lang['external_edit'] = 'რედაქტირება'; +$lang['summary'] = 'Edit summary'; +$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">საჭიროა Adobe Flash Plugin</a>'; +$lang['download'] = 'Snippet-ის გადმოწერა'; +$lang['tools'] = 'ინსტრუმენტები'; +$lang['user_tools'] = 'მომხმარებლის ინსტრუმენტები'; +$lang['site_tools'] = 'საიტის ინსტრუმენტები'; +$lang['page_tools'] = 'გვერდის ინსტრუმენტები'; +$lang['skip_to_content'] = 'მასალა'; +$lang['sidebar'] = 'გვერდითი პანელი'; +$lang['mail_newpage'] = 'გვერდი დამატებულია:'; +$lang['mail_changed'] = 'გვერდი შეცვლილია:'; +$lang['mail_subscribe_list'] = 'გვერდში შეცვლილია namespace-ები:'; +$lang['mail_new_user'] = 'ახალი მომხმარებელი'; +$lang['mail_upload'] = 'ფაილი ატვირთულია'; +$lang['changes_type'] = 'ცვლილებები'; +$lang['pages_changes'] = 'გვერდები'; +$lang['media_changes'] = 'მედია ფაილები'; +$lang['both_changes'] = 'გვერდები და მედია ფაილები'; +$lang['qb_bold'] = 'Bold Text'; +$lang['qb_italic'] = 'Italic Text'; +$lang['qb_underl'] = 'Underlined Text'; +$lang['qb_code'] = 'Monospaced Text'; +$lang['qb_strike'] = 'Strike-through Text'; +$lang['qb_h1'] = 'Level 1 სათაური'; +$lang['qb_h2'] = 'Level 2 სათაური'; +$lang['qb_h3'] = 'Level 3 სათაური'; +$lang['qb_h4'] = 'Level 4 სათაური'; +$lang['qb_h5'] = 'Level 5 სათაური'; +$lang['qb_h'] = 'სათაური'; +$lang['qb_hs'] = 'სათაურის არჩევა'; +$lang['qb_hplus'] = 'Higher სათაური'; +$lang['qb_hminus'] = 'Lower სათაური'; +$lang['qb_hequal'] = 'Same Level სათაური'; +$lang['qb_link'] = 'Internal Link'; +$lang['qb_extlink'] = 'External Link'; +$lang['qb_hr'] = 'Horizontal Rule'; +$lang['qb_ol'] = 'შეკვეთილი ბოლო მასალა'; +$lang['qb_ul'] = 'Unordered List Item'; +$lang['qb_media'] = 'ნახატების და სხვა ფაიელბის დამატება'; +$lang['qb_sig'] = 'ხელმოწერა'; +$lang['qb_smileys'] = 'სმაილები'; +$lang['qb_chars'] = 'Special Chars'; +$lang['upperns'] = 'jump to parent namespace'; +$lang['admin_register'] = 'ახალი მომხმარებლის დამატება'; +$lang['metaedit'] = 'Edit Metadata'; +$lang['metasaveerr'] = 'Writing metadata failed'; +$lang['metasaveok'] = 'Metadata saved'; +$lang['img_title'] = 'სათაური:'; +$lang['img_caption'] = 'Caption:'; +$lang['img_date'] = 'თარიღი:'; +$lang['img_fname'] = 'ფაილის სახელი:'; +$lang['img_fsize'] = 'ზომა:'; +$lang['img_artist'] = 'ფოტოგრაფი:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'ფორმატი:'; +$lang['img_camera'] = 'კამერა:'; +$lang['img_keywords'] = 'Keywords:'; +$lang['img_width'] = 'სიგანე:'; +$lang['img_height'] = 'სიმაღლე:'; +$lang['subscr_subscribe_success'] = 'Added %s to subscription list for %s'; +$lang['subscr_subscribe_error'] = 'Error adding %s to subscription list for %s'; +$lang['subscr_subscribe_noaddress'] = 'There is no address associated with your login, you cannot be added to the subscription list'; +$lang['subscr_unsubscribe_success'] = 'Removed %s from subscription list for %s'; +$lang['subscr_unsubscribe_error'] = 'Error removing %s from subscription list for %s'; +$lang['subscr_already_subscribed'] = '%s is already subscribed to %s'; +$lang['subscr_not_subscribed'] = '%s is not subscribed to %s'; +$lang['subscr_m_not_subscribed'] = 'You are currently not subscribed to the current page or namespace.'; +$lang['subscr_m_new_header'] = 'Add subscription'; +$lang['subscr_m_current_header'] = 'Current subscriptions'; +$lang['subscr_m_unsubscribe'] = 'Unsubscribe'; +$lang['subscr_m_subscribe'] = 'Subscribe'; +$lang['subscr_m_receive'] = 'მიღება'; +$lang['subscr_style_every'] = 'ფოსტა ყოველ ცვლილებაზე'; +$lang['subscr_style_digest'] = 'ფოსტა ყოველი გვერდის შეცვლაზე '; +$lang['subscr_style_list'] = 'ფოსტა ყოველი გვერდის შეცვლაზე '; +$lang['authtempfail'] = 'User authentication is temporarily unavailable. If this situation persists, please inform your Wiki Admin.'; +$lang['authpwdexpire'] = 'თქვენს პაროლს ვადა გაუვა %d დღეში, მალე შეცვლა მოგიწევთ.'; +$lang['i_chooselang'] = 'ენსი არჩევა'; +$lang['i_installer'] = 'DokuWiki დამყენებელი'; +$lang['i_wikiname'] = 'Wiki სახელი'; +$lang['i_enableacl'] = 'Enable ACL (recommended)'; +$lang['i_superuser'] = 'ადმინი'; +$lang['i_problems'] = 'შეასწორეთ შეცდომები'; +$lang['i_modified'] = 'For security reasons this script will only work with a new and unmodified Dokuwiki installation. You should either re-extract the files from the downloaded package or consult the complete <a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>'; +$lang['i_funcna'] = 'PHP function <code>%s</code> is not available. Maybe your hosting provider disabled it for some reason?'; +$lang['i_phpver'] = 'Your PHP version <code>%s</code> is lower than the needed <code>%s</code>. You need to upgrade your PHP install.'; +$lang['i_permfail'] = '<code>%s</code> is not writable by DokuWiki. You need to fix the permission settings of this directory!'; +$lang['i_confexists'] = '<code>%s</code> already exists'; +$lang['i_writeerr'] = 'Unable to create <code>%s</code>. You will need to check directory/file permissions and create the file manually.'; +$lang['i_badhash'] = 'unrecognised or modified dokuwiki.php (hash=<code>%s</code>)'; +$lang['i_badval'] = '<code>%s</code> - illegal or empty value'; +$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?id=wiki:welcome">your new DokuWiki</a>.'; +$lang['i_policy'] = 'Initial ACL policy'; +$lang['i_pol0'] = 'ღია ვიკი (წაკითხვა, დაწერა და ატვირთვა შეუძლია ნებისმიერს)'; +$lang['i_pol1'] = 'თავისუფალი ვიკი (წაკითხვა შეუძლია ყველას, დაწერა და ატვირთვა - რეგისტრირებულს)'; +$lang['i_pol2'] = 'დახურული ვიკი (წაკითხვა, დაწერა და ატვირთვა შეუძლიათ მხოლოდ რეგისტრირებულებს)'; +$lang['i_allowreg'] = 'რეგისტრაციის გახსნა'; +$lang['i_retry'] = 'თავიდან ცდა'; +$lang['i_license'] = 'აირჩიეთ ლიცენზია'; +$lang['i_license_none'] = 'არ აჩვენოთ ლიცენზიის ინფორმაცია'; +$lang['i_pop_field'] = 'დაგვეხმარეთ DokuWiki-ს აგუმჯობესებაში'; +$lang['i_pop_label'] = 'თვეში ერთელ ინფორმაციის DokuWiki-ის ადმინისტრაციისთვის გაგზავნა'; +$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 წლის უკან'; +$lang['months'] = '%d თვის უკან'; +$lang['weeks'] = '%d კვირის უკან'; +$lang['days'] = '%d დღის წინ'; +$lang['hours'] = '%d საათის წინ'; +$lang['minutes'] = '%d წუთის წინ'; +$lang['seconds'] = '%d წამის წინ'; +$lang['wordblock'] = 'თქვენი ცვლილებები არ შეინახა, რადგან შეიცავს სპამს'; +$lang['media_uploadtab'] = 'ატვირთვა'; +$lang['media_searchtab'] = 'ძებნა'; +$lang['media_file'] = 'ფაილი'; +$lang['media_viewtab'] = 'ჩვენება'; +$lang['media_edittab'] = 'რედაქტირება'; +$lang['media_historytab'] = 'ისტორია'; +$lang['media_list_thumbs'] = 'Thumbnails'; +$lang['media_list_rows'] = 'Rows'; +$lang['media_sort_name'] = 'სახელი'; +$lang['media_sort_date'] = 'თარიღი'; +$lang['media_namespaces'] = 'Choose namespace'; +$lang['media_files'] = 'ფაილები %s'; +$lang['media_upload'] = 'ატვირთვა %s'; +$lang['media_search'] = 'ძებნა %s'; +$lang['media_view'] = '%s'; +$lang['media_viewold'] = '%s at %s'; +$lang['media_edit'] = 'რედაქტირება %s'; +$lang['media_history'] = 'ისტორია %s'; +$lang['media_meta_edited'] = 'metadata edited'; +$lang['media_perm_read'] = 'თვენ არ გაქვთ უფლება წაიკითხოთ ეს მასალა'; diff --git a/inc/lang/kk/jquery.ui.datepicker.js b/inc/lang/kk/jquery.ui.datepicker.js new file mode 100644 index 000000000..e85fd8354 --- /dev/null +++ b/inc/lang/kk/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['kk'] = { + closeText: 'Жабу', + prevText: '<Алдыңғы', + nextText: 'Келесі>', + currentText: 'Бүгін', + monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым', + 'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'], + monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау', + 'Шіл','Там','Қыр','Қаз','Қар','Жел'], + dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'], + dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'], + dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'], + weekHeader: 'Не', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['kk']); + +return datepicker.regional['kk']; + +})); diff --git a/inc/lang/kk/lang.php b/inc/lang/kk/lang.php index 37b0f462b..74afa24e5 100644 --- a/inc/lang/kk/lang.php +++ b/inc/lang/kk/lang.php @@ -45,7 +45,7 @@ $lang['btn_draftdel'] = 'Шимайды өшіру'; $lang['btn_revert'] = 'Қалпына келтіру'; $lang['btn_register'] = 'Тіркеу'; $lang['btn_apply'] = 'Қолдану/Енгізу'; -$lang['loggedinas'] = 'түпнұсқамен кірген'; +$lang['loggedinas'] = 'түпнұсқамен кірген:'; $lang['user'] = 'Түпнұсқа'; $lang['pass'] = 'Құпиясөз'; $lang['newpass'] = 'Жаңа құпиясөз'; @@ -83,11 +83,11 @@ $lang['license'] = 'Басқаша көрсетілген болм $lang['licenseok'] = 'Ескерту: бұл бетті өңдеуіңізбен мазмұныңыз келесі лицензия бойынша беруге келесесіз:'; $lang['searchmedia'] = 'Іздеу файлдың атауы:'; $lang['searchmedia_in'] = '%s-мен іздеу:'; -$lang['txt_upload'] = 'Еңгізетін файлды таңдау'; -$lang['txt_filename'] = 'Келесідей еңгізу (қалауынша)'; +$lang['txt_upload'] = 'Еңгізетін файлды таңдау:'; +$lang['txt_filename'] = 'Келесідей еңгізу (қалауынша):'; $lang['txt_overwrt'] = 'Бар файлды қайта жазу'; -$lang['lockedby'] = 'Осы уақытта тойтарылған'; -$lang['lockexpire'] = 'Тойтару келесі уақытта бітеді'; +$lang['lockedby'] = 'Осы уақытта тойтарылған:'; +$lang['lockexpire'] = 'Тойтару келесі уақытта бітеді:'; $lang['js']['willexpire'] = 'Бұл бетті түзеу тойтаруыңыз бір минутта бітеді. Қақтығыс болмау және тойтару таймерді түсіру үшін қарап шығу пернені басыңыз.'; $lang['js']['notsavedyet'] = 'Сақталмаған өзгерістер жоғалатын болады.'; $lang['js']['searchmedia'] = 'Файлдарды іздеу'; @@ -123,8 +123,8 @@ $lang['yours'] = 'Сендердің болжамыңыз'; $lang['created'] = 'ЖасалFан'; $lang['mail_new_user'] = 'Жаңа пайдаланушы'; $lang['qb_chars'] = 'Арнайы белгiлер'; -$lang['img_backto'] = 'Қайта оралу'; -$lang['img_format'] = 'Формат'; -$lang['img_camera'] = 'Камера'; +$lang['btn_img_backto'] = 'Қайта оралу %s'; +$lang['img_format'] = 'Формат:'; +$lang['img_camera'] = 'Камера:'; $lang['i_chooselang'] = 'Тіл таңдау'; $lang['i_retry'] = 'Қайталау'; diff --git a/inc/lang/km/denied.txt b/inc/lang/km/denied.txt index 58b10ee86..be0371498 100644 --- a/inc/lang/km/denied.txt +++ b/inc/lang/km/denied.txt @@ -1,3 +1,4 @@ ====== បដិសេធអនុញ្ញាត ====== + សូមទុស អ្នកគ្មានអនុញ្ញាតទៅបណ្តទេ។ diff --git a/inc/lang/km/jquery.ui.datepicker.js b/inc/lang/km/jquery.ui.datepicker.js new file mode 100644 index 000000000..599a47713 --- /dev/null +++ b/inc/lang/km/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Khmer initialisation for the jQuery calendar extension. */ +/* Written by Chandara Om (chandara.teacher@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['km'] = { + closeText: 'ធ្វើរួច', + prevText: 'មុន', + nextText: 'បន្ទាប់', + currentText: 'ថ្ងៃនេះ', + monthNames: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា', + 'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'], + monthNamesShort: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា', + 'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'], + dayNames: ['អាទិត្យ', 'ចន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'], + dayNamesShort: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'], + dayNamesMin: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'], + weekHeader: 'សប្ដាហ៍', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['km']); + +return datepicker.regional['km']; + +})); diff --git a/inc/lang/km/lang.php b/inc/lang/km/lang.php index 4800b6c23..749fa419c 100644 --- a/inc/lang/km/lang.php +++ b/inc/lang/km/lang.php @@ -43,7 +43,7 @@ $lang['btn_recover'] = 'ស្រោះគំរោងឡើង'; $lang['btn_draftdel'] = 'លុបគំរោង'; $lang['btn_register'] = 'ចុះឈ្មោះ';//'Register'; -$lang['loggedinas'] = 'អ្នកប្រើ'; +$lang['loggedinas'] = 'អ្នកប្រើ:'; $lang['user'] = 'នាមបម្រើ'; $lang['pass'] = 'ពាក្សសម្ងត់'; $lang['newpass'] = 'ពាក្សសម្ងាត់ថ្មី'; @@ -80,11 +80,11 @@ $lang['resendpwdbadauth'] = 'សុំអាទោស រហស្សលេ $lang['resendpwdconfirm'] ='ខ្សែបន្ត'; $lang['resendpwdsuccess'] = 'ពាក្សសម្ងាតអ្នកបានផ្ញើហើយ។'; -$lang['txt_upload'] = 'ជ្រើសឯកសារដែលរុញឡើង'; -$lang['txt_filename'] = 'រុញឡើងជា (ស្រេចចិត្ត)'; +$lang['txt_upload'] = 'ជ្រើសឯកសារដែលរុញឡើង:'; +$lang['txt_filename'] = 'រុញឡើងជា (ស្រេចចិត្ត):'; $lang['txt_overwrt'] = 'កត់ពីលើ';//'Overwrite existing file'; -$lang['lockedby'] = 'ឥឡូវនេះចកជាប់'; -$lang['lockexpire'] = 'សោជាប់ផុតកំណត់ម៉ោង'; +$lang['lockedby'] = 'ឥឡូវនេះចកជាប់:'; +$lang['lockexpire'] = 'សោជាប់ផុតកំណត់ម៉ោង:'; $lang['js']['willexpire'] = 'សោអ្នកចំពោះកែតម្រូវទំព័រនេះ ហួសពែលក្នុងមួយនាទី។\nកុំឲ្យមានជម្លោះ ប្រើ «បង្ហាញ» ទៅកំណត់ឡើងវិញ។'; $lang['js']['notsavedyet'] = 'កម្រែមិនទានរុក្សាទកត្រូវបោះបង់។\nបន្តទៅទាឬទេ?'; @@ -125,9 +125,9 @@ $lang['current'] = 'ឥឡៅវ'; $lang['yours'] = 'តំណែអ្នាក'; $lang['diff'] = 'បង្ហាងអសទិសភាពជាមួយតំណែឥឡូវ '; $lang['line'] = 'ខ្សែ'; -$lang['breadcrumb'] = 'ដាន'; -$lang['youarehere'] = 'ដាន'; -$lang['lastmod'] = 'ពេលកែចុងក្រោយ'; +$lang['breadcrumb'] = 'ដាន:'; +$lang['youarehere'] = 'ដាន:'; +$lang['lastmod'] = 'ពេលកែចុងក្រោយ:'; $lang['by'] = 'និពន្ឋដោយ'; $lang['deleted'] = 'យកចេញ'; $lang['created'] = 'បង្កើត'; @@ -165,17 +165,17 @@ $lang['admin_register']= 'តែមអ្នកប្រើ';//'Add new user'; $lang['metaedit'] = 'កែទិន្នន័យអរូប';//'Edit Metadata'; $lang['metasaveerr'] = 'ពំអាចកត់រទិន្នន័យអរូប';//'Writing metadata failed'; $lang['metasaveok'] = 'ទិន្នន័យអរូប'; -$lang['img_backto'] = 'ថយក្រោយ'; -$lang['img_title'] = 'អភិធេយ្យ'; -$lang['img_caption'] = 'ចំណងជើង'; -$lang['img_date'] = 'ថ្ងៃខែ';//'Date'; -$lang['img_fname'] = 'ឈ្មោះឯកសារ'; -$lang['img_fsize'] = 'ទំហំ';//'Size'; -$lang['img_artist'] = 'អ្នកថតរូប'; -$lang['img_copyr'] = 'រក្សាសិទ្ធិ'; -$lang['img_format'] = 'ធុនប្រភេទ'; -$lang['img_camera'] = 'គ្រឿងថត'; -$lang['img_keywords']= 'មេពាក្ស';//'Keywords'; +$lang['btn_img_backto'] = 'ថយក្រោយ%s'; +$lang['img_title'] = 'អភិធេយ្យ:'; +$lang['img_caption'] = 'ចំណងជើង:'; +$lang['img_date'] = 'ថ្ងៃខែ:';//'Date'; +$lang['img_fname'] = 'ឈ្មោះឯកសារ:'; +$lang['img_fsize'] = 'ទំហំ:';//'Size'; +$lang['img_artist'] = 'អ្នកថតរូប:'; +$lang['img_copyr'] = 'រក្សាសិទ្ធិ:'; +$lang['img_format'] = 'ធុនប្រភេទ:'; +$lang['img_camera'] = 'គ្រឿងថត:'; +$lang['img_keywords']= 'មេពាក្ស:';//'Keywords'; /* auth.class language support */ $lang['authtempfail'] = 'ការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវឥតដំនេ។ ប្រើ ....'; diff --git a/inc/lang/ko/denied.txt b/inc/lang/ko/denied.txt index cf0b294a4..a4b94be65 100644 --- a/inc/lang/ko/denied.txt +++ b/inc/lang/ko/denied.txt @@ -1,3 +1,4 @@ ====== 권한 거절 ====== -죄송하지만 계속할 수 있는 권한이 없습니다. 로그인을 잊으셨나요?
\ No newline at end of file +죄송하지만 계속할 수 있는 권한이 없습니다. + diff --git a/inc/lang/ko/install.html b/inc/lang/ko/install.html index 886ed2d30..ecc0d3caa 100644 --- a/inc/lang/ko/install.html +++ b/inc/lang/ko/install.html @@ -1,10 +1,22 @@ -<p>이 페이지는 <a href="http://dokuwiki.org">Dokuwiki</a> 설치와 환경 설정을 도와줍니다. -설치 과정에 대한 더 자세한 정보는 <a href="http://dokuwiki.org/ko:installer">관련 문서</a>를 참고하시기 바랍니다.</p> +<p>이 페이지는 <a href="http://dokuwiki.org">도쿠위키</a>의 첫 +설치와 환경 설정을 도와줍니다. 이 설치 프로그램에 대한 자세한 정보는 +<a href="http://dokuwiki.org/ko:installer">설명문 페이지</a>에서 +볼 수 있습니다.</p> -<p>DokuWiki는 위키 문서와 문서와 관련된 정보(예를 들어 그림, 검색 색인, 이전 판 문서)를 저장하기 위해 일반적인 텍스트 파일을 사용합니다. 정상적으로 DokuWiki를 사용하려면 이 파일을 담고 있는 디렉토리에 대한 쓰기 권한을 가지고 있어야 합니다. -현재 설치 과정 중에는 디렉토리 권한 설정이 불가능합니다. 보통 직접 셸 명령어를 사용하거나, 호스팅을 사용한다면 FTP나 호스팅 제어판(예를 들어 CPanel)을 사용해서 설정해야 합니다.</p> +<p>도쿠위키는 위키 문서와 해당 문서와 관련된 정보(예를 들어 그림, +검색 색인, 이전 판 문서 등)를 저장하기 위해 일반적인 텍스트 파일을 +사용합니다. 성공적으로 작동하려면 도쿠위키는 이 파일을 담고 +있는 디렉토리에 대한 쓰기 권한이 <strong>있어야</strong> 합니다. +이 설치 프로그램은 디렉토리 권한을 설정할 수 없습니다. 보통 +직접 명령 셸에 수행하거나 호스팅을 사용한다면, FTP나 호스팅 +제어판(예를 들어 CPanel)을 통해 수행해야 합니다.</p> -<p>현재 설치 과정중에 관리자로 로그인 후 DokuWiki의 관리 메뉴(플러그인 설치, 사용자 관리, 위키 문서 접근 권한 관리, 옵션 설정)를 가능하게 <acronym title="접근 제어 목록">ACL</acronym>에 대한 환경 설정을 수행합니다. -DokuWiki가 동작하는데 필요한 사항은 아니지만, 어쨌든 더 쉽게 관리자가 관리할 수 있도록 해줍니다.</p> +<p>이 설치 프로그램은 관리자로 로그인하고 나서 플러그인 설치, 사용자 관리, +위키 문서로의 접근 관리와 환경 설정을 바꾸기 위한 도쿠위키의 관리 메뉴에 +접근할 수 있는, <acronym title="access control list; 접근 제어 목록">ACL</acronym>에 +대한 도쿠위키 환경을 설정합니다. 도쿠위키가 작동하는데 필요하지 않지만, +도쿠위키를 쉽게 관리할 수 있도록 해줍니다.</p> -<p>숙련된 사용자나 특별한 설치 과정이 필요한 경우에는 <a href="http://dokuwiki.org/ko:install">설치 과정</a>과 <a href="http://dokuwiki.org/ko:config">환경 설정</a> 링크를 참고하시기 바랍니다.</p>
\ No newline at end of file +<p>숙련된 사용자나 특수한 설치가 필요한 사용자에게 자세한 내용은 +<a href="http://dokuwiki.org/ko:install">설치 지침</a>과 +<a href="http://dokuwiki.org/ko:config">환경 설정</a> 링크를 사용해야 합니다.</p> diff --git a/inc/lang/ko/jquery.ui.datepicker.js b/inc/lang/ko/jquery.ui.datepicker.js new file mode 100644 index 000000000..991b5727e --- /dev/null +++ b/inc/lang/ko/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com), Edited by Genie. */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['ko'] = { + closeText: '닫기', + prevText: '이전달', + nextText: '다음달', + currentText: '오늘', + monthNames: ['1월','2월','3월','4월','5월','6월', + '7월','8월','9월','10월','11월','12월'], + monthNamesShort: ['1월','2월','3월','4월','5월','6월', + '7월','8월','9월','10월','11월','12월'], + dayNames: ['일요일','월요일','화요일','수요일','목요일','금요일','토요일'], + dayNamesShort: ['일','월','화','수','목','금','토'], + dayNamesMin: ['일','월','화','수','목','금','토'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '년'}; +datepicker.setDefaults(datepicker.regional['ko']); + +return datepicker.regional['ko']; + +})); diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php index 266ff01e5..877c43de3 100644 --- a/inc/lang/ko/lang.php +++ b/inc/lang/ko/lang.php @@ -12,6 +12,7 @@ * @author Myeongjin <aranet100@gmail.com> * @author Gerrit Uitslag <klapinklapin@gmail.com> * @author Garam <rowain8@gmail.com> + * @author Young gon Cha <garmede@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -45,7 +46,7 @@ $lang['btn_back'] = '뒤로'; $lang['btn_backlink'] = '백링크'; $lang['btn_backtomedia'] = '미디어 파일 선택으로 돌아가기'; $lang['btn_subscribe'] = '구독 관리'; -$lang['btn_profile'] = '개인 정보 바꾸기'; +$lang['btn_profile'] = '프로필 바꾸기'; $lang['btn_reset'] = '재설정'; $lang['btn_resendpwd'] = '새 비밀번호 설정'; $lang['btn_draft'] = '초안 편집'; @@ -54,42 +55,45 @@ $lang['btn_draftdel'] = '초안 삭제'; $lang['btn_revert'] = '되돌리기'; $lang['btn_register'] = '등록'; $lang['btn_apply'] = '적용'; -$lang['btn_media'] = '미디어 관리'; +$lang['btn_media'] = '미디어 관리자'; $lang['btn_deleteuser'] = '내 계정 제거'; -$lang['loggedinas'] = '로그인한 사용자'; +$lang['btn_img_backto'] = '%s(으)로 돌아가기'; +$lang['btn_mediaManager'] = '미디어 관리자에서 보기'; +$lang['loggedinas'] = '로그인한 사용자:'; $lang['user'] = '사용자 이름'; $lang['pass'] = '비밀번호'; $lang['newpass'] = '새 비밀번호'; $lang['oldpass'] = '현재 비밀번호 확인'; -$lang['passchk'] = '비밀번호 다시 확인'; +$lang['passchk'] = '다시 확인'; $lang['remember'] = '기억하기'; $lang['fullname'] = '실명'; $lang['email'] = '이메일'; -$lang['profile'] = '개인 정보'; +$lang['profile'] = '사용자 프로필'; $lang['badlogin'] = '죄송하지만 사용자 이름이나 비밀번호가 잘못되었습니다.'; $lang['badpassconfirm'] = '죄송하지만 비밀번호가 잘못되었습니다'; $lang['minoredit'] = '사소한 바뀜'; $lang['draftdate'] = '초안 자동 저장 시간'; $lang['nosecedit'] = '한 동안 문서가 바뀌었으며, 문단 정보가 오래되어 문서 전체를 대신 열었습니다.'; +$lang['searchcreatepage'] = '만약 원하는 문서를 찾지 못했다면, \'\'문서 만들기\'\'나 \'\'문서 편집\'\'을 사용해 검색어와 같은 이름의 문서를 만들거나 편집할 수 있습니다.'; $lang['regmissing'] = '죄송하지만 모든 필드를 채워야 합니다.'; $lang['reguexists'] = '죄송하지만 같은 이름을 사용하는 사용자가 있습니다.'; $lang['regsuccess'] = '사용자를 만들었으며 비밀번호는 이메일로 보냈습니다.'; $lang['regsuccess2'] = '사용자를 만들었습니다.'; -$lang['regmailfail'] = '비밀번호를 이메일로 보내는 동안 오류가 발생했습니다. 관리자에게 문의하세요!'; -$lang['regbadmail'] = '주어진 이메일 주소가 잘못되었습니다 - 오류라고 생각하면 관리자에게 문의하세요'; -$lang['regbadpass'] = '새 비밀번호가 같지 않습니다. 다시 입력하세요.'; +$lang['regmailfail'] = '비밀번호를 이메일로 보내는 동안 오류가 발생했습니다. 관리자에게 문의해주세요!'; +$lang['regbadmail'] = '주어진 이메일 주소가 잘못되었습니다 - 오류라고 생각하면 관리자에게 문의해주세요'; +$lang['regbadpass'] = '두 주어진 비밀번호가 같지 않습니다. 다시 입력하세요.'; $lang['regpwmail'] = '도쿠위키 비밀번호'; -$lang['reghere'] = '계정이 없나요? 계정을 등록할 수 있습니다'; -$lang['profna'] = '이 위키는 개인 정보 수정을 할 수 없습니다'; +$lang['reghere'] = '계정이 없나요? 계정을 등록하세요'; +$lang['profna'] = '이 위키는 프로필 수정을 할 수 없습니다'; $lang['profnochange'] = '바뀐 내용이 없습니다.'; -$lang['profnoempty'] = '이름이나 이메일 주소가 비었습니다.'; -$lang['profchanged'] = '개인 정보가 성공적으로 바뀌었습니다.'; +$lang['profnoempty'] = '빈 이름이나 이메일 주소는 허용하지 않습니다.'; +$lang['profchanged'] = '프로필이 성공적으로 바뀌었습니다.'; $lang['profnodelete'] = '이 위키는 사용자 삭제를 지원하지 않습니다'; $lang['profdeleteuser'] = '계정 삭제'; $lang['profdeleted'] = '당신의 사용자 계정이 이 위키에서 삭제되었습니다'; $lang['profconfdelete'] = '이 위키에서 내 계정을 제거하고 싶습니다. <br/> 이 행동은 되돌릴 수 없습니다.'; $lang['profconfdeletemissing'] = '선택하지 않은 확인 상자를 확인'; -$lang['pwdforget'] = '비밀번호를 잊으셨나요? 비밀번호를 재설정할 수 있습니다'; +$lang['pwdforget'] = '비밀번호를 잊으셨나요? 비밀번호를 재설정하세요'; $lang['resendna'] = '이 위키는 비밀번호 재설정을 지원하지 않습니다.'; $lang['resendpwd'] = '다음으로 새 비밀번호 보내기'; $lang['resendpwdmissing'] = '죄송하지만 모든 필드를 채워야 합니다.'; @@ -101,19 +105,19 @@ $lang['license'] = '별도로 명시하지 않을 경우, 이 위 $lang['licenseok'] = '참고: 이 문서를 편집하면 내용은 다음 라이선스에 따라 배포하는 데 동의합니다:'; $lang['searchmedia'] = '파일 이름 검색:'; $lang['searchmedia_in'] = '%s에서 검색'; -$lang['txt_upload'] = '올릴 파일 선택'; -$lang['txt_filename'] = '올릴 파일 이름 (선택 사항)'; +$lang['txt_upload'] = '올릴 파일 선택:'; +$lang['txt_filename'] = '올릴 파일 이름 (선택 사항):'; $lang['txt_overwrt'] = '기존 파일에 덮어쓰기'; $lang['maxuploadsize'] = '최대 올리기 용량. 파일당 %s입니다.'; -$lang['lockedby'] = '현재 잠겨진 사용자'; -$lang['lockexpire'] = '잠금 해제 시간'; +$lang['lockedby'] = '현재 잠겨진 사용자:'; +$lang['lockexpire'] = '잠금 해제 시간:'; $lang['js']['willexpire'] = '잠시 후 편집 잠금이 해제됩니다.\n편집 충돌을 피하려면 미리 보기를 눌러 잠금 시간을 다시 설정하세요.'; $lang['js']['notsavedyet'] = '저장하지 않은 바뀜이 사라집니다.'; $lang['js']['searchmedia'] = '파일 검색'; -$lang['js']['keepopen'] = '선택할 때 창을 열어 놓기'; +$lang['js']['keepopen'] = '선택할 때 열어 놓은 창을 유지하기'; $lang['js']['hidedetails'] = '자세한 정보 숨기기'; $lang['js']['mediatitle'] = '링크 설정'; -$lang['js']['mediadisplay'] = '링크 형태'; +$lang['js']['mediadisplay'] = '링크 유형'; $lang['js']['mediaalign'] = '배치'; $lang['js']['mediasize'] = '그림 크기'; $lang['js']['mediatarget'] = '링크 목표'; @@ -133,7 +137,7 @@ $lang['js']['medialeft'] = '왼쪽으로 그림 배치'; $lang['js']['mediaright'] = '오른쪽으로 그림 배치'; $lang['js']['mediacenter'] = '가운데으로 그림 배치'; $lang['js']['medianoalign'] = '배치하지 않음'; -$lang['js']['nosmblinks'] = '윈도우 공유 파일과의 연결은 마이크로소프트 인터넷 익스플로러에서만 동작합니다.\n그러나 링크를 복사하거나 붙여넣기를 할 수 있습니다.'; +$lang['js']['nosmblinks'] = 'Windows 공유 파일과의 연결은 Microsoft Internet Explorer에서만 동작합니다.\n그러나 링크를 복사하거나 붙여넣기를 할 수 있습니다.'; $lang['js']['linkwiz'] = '링크 마법사'; $lang['js']['linkto'] = '다음으로 연결:'; $lang['js']['del_confirm'] = '정말 선택된 항목을 삭제하겠습니까?'; @@ -171,7 +175,7 @@ $lang['mediaview'] = '원본 파일 보기'; $lang['mediaroot'] = '루트'; $lang['mediaupload'] = '파일을 현재 이름공간으로 올립니다. 하위 이름공간으로 만들려면 선택한 파일 이름 앞에 쌍점(:)으로 구분되는 이름을 붙이면 됩니다. 파일을 드래그 앤 드롭해 선택할 수 있습니다.'; $lang['mediaextchange'] = '파일 확장자가 .%s에서 .%s(으)로 바뀌었습니다!'; -$lang['reference'] = '참고'; +$lang['reference'] = '다음을 참조'; $lang['ref_inuse'] = '다음 문서에서 아직 사용 중이므로 파일을 삭제할 수 없습니다:'; $lang['ref_hidden'] = '문서의 일부 참고는 읽을 수 있는 권한이 없습니다'; $lang['hits'] = '조회 수'; @@ -185,13 +189,18 @@ $lang['difflink'] = '차이 보기로 링크'; $lang['diff_type'] = '차이 보기:'; $lang['diff_inline'] = '직렬 방식'; $lang['diff_side'] = '다중 창 방식'; +$lang['diffprevrev'] = '이전 판'; +$lang['diffnextrev'] = '다음 판'; +$lang['difflastrev'] = '마지막 판'; +$lang['diffbothprevrev'] = '양쪽 이전 판'; +$lang['diffbothnextrev'] = '양쪽 다음 판'; $lang['line'] = '줄'; -$lang['breadcrumb'] = '추적'; -$lang['youarehere'] = '현재 위치'; -$lang['lastmod'] = '마지막으로 수정됨'; +$lang['breadcrumb'] = '추적:'; +$lang['youarehere'] = '현재 위치:'; +$lang['lastmod'] = '마지막으로 수정됨:'; $lang['by'] = '저자'; $lang['deleted'] = '제거됨'; -$lang['created'] = '새로 만듦'; +$lang['created'] = '만듦'; $lang['restored'] = '이전 판으로 되돌림 (%s)'; $lang['external_edit'] = '바깥 편집'; $lang['summary'] = '편집 요약'; @@ -232,7 +241,7 @@ $lang['qb_extlink'] = '바깥 링크'; $lang['qb_hr'] = '가로줄'; $lang['qb_ol'] = '순서 있는 목록'; $lang['qb_ul'] = '순서 없는 목록'; -$lang['qb_media'] = '그림과 기타 파일 추가 (새 창에서 열림)'; +$lang['qb_media'] = '그림과 다른 파일 추가 (새 창에서 열림)'; $lang['qb_sig'] = '서명 넣기'; $lang['qb_smileys'] = '이모티콘'; $lang['qb_chars'] = '특수 문자'; @@ -241,20 +250,18 @@ $lang['admin_register'] = '새 사용자 추가'; $lang['metaedit'] = '메타데이터 편집'; $lang['metasaveerr'] = '메타데이터 쓰기 실패'; $lang['metasaveok'] = '메타데이터 저장됨'; -$lang['img_backto'] = '뒤로'; -$lang['img_title'] = '제목'; -$lang['img_caption'] = '설명'; -$lang['img_date'] = '날짜'; -$lang['img_fname'] = '파일 이름'; -$lang['img_fsize'] = '크기'; -$lang['img_artist'] = '촬영자'; -$lang['img_copyr'] = '저작권'; -$lang['img_format'] = '포맷'; -$lang['img_camera'] = '카메라'; -$lang['img_keywords'] = '키워드'; -$lang['img_width'] = '너비'; -$lang['img_height'] = '높이'; -$lang['img_manager'] = '미디어 관리자에서 보기'; +$lang['img_title'] = '제목:'; +$lang['img_caption'] = '설명:'; +$lang['img_date'] = '날짜:'; +$lang['img_fname'] = '파일 이름:'; +$lang['img_fsize'] = '크기:'; +$lang['img_artist'] = '촬영자:'; +$lang['img_copyr'] = '저작권:'; +$lang['img_format'] = '포맷:'; +$lang['img_camera'] = '카메라:'; +$lang['img_keywords'] = '키워드:'; +$lang['img_width'] = '너비:'; +$lang['img_height'] = '높이:'; $lang['subscr_subscribe_success'] = '%s 사용자가 %s 구독 목록에 추가했습니다'; $lang['subscr_subscribe_error'] = '%s 사용자가 %s 구독 목록에 추가하는데 실패했습니다'; $lang['subscr_subscribe_noaddress'] = '로그인으로 연결된 주소가 없기 때문에 구독 목록에 추가할 수 없습니다'; @@ -274,22 +281,25 @@ $lang['subscr_style_list'] = '마지막 이메일 이후 바뀐 문서의 $lang['authtempfail'] = '사용자 인증을 일시적으로 사용할 수 없습니다. 만약 계속해서 문제가 발생한다면 위키 관리자에게 문의하시기 바랍니다.'; $lang['authpwdexpire'] = '비밀번호를 바꾼지 %d일이 지났으며, 비밀번호를 곧 바꿔야 합니다.'; $lang['i_chooselang'] = '사용할 언어를 선택하세요'; -$lang['i_installer'] = '도쿠위키 설치'; +$lang['i_installer'] = '도쿠위키 설치 관리자'; $lang['i_wikiname'] = '위키 이름'; $lang['i_enableacl'] = 'ACL 활성화 (권장)'; $lang['i_superuser'] = '슈퍼 사용자'; -$lang['i_problems'] = '설치하는 동안 아래와 같은 문제가 발생했습니다. 문제를 해결한 후 설치를 계속할 수 있습니다.'; +$lang['i_problems'] = '설치 관리자가 아래에 나와 있는 몇 가지 문제를 찾았습니다. 문제를 해결하지 전까지 설치를 계속할 수 없습니다.'; $lang['i_modified'] = '보안 상의 이유로 이 스크립트는 수정되지 않은 새 도쿠위키 설치에서만 동작됩니다. 다운로드한 압축 패키지를 다시 설치하거나 <a href="http://dokuwiki.org/ko:install">도쿠위키 설치 과정</a>을 참고해서 설치하세요.'; $lang['i_funcna'] = '<code>%s</code> PHP 함수를 사용할 수 없습니다. 호스트 제공자가 어떤 이유에서인지 막아 놓았을지 모릅니다.'; $lang['i_phpver'] = 'PHP <code>%s</code> 버전은 필요한 <code>%s</code> 버전보다 오래되었습니다. PHP를 업그레이드할 필요가 있습니다.'; +$lang['i_mbfuncoverload'] = '도쿠위키를 실행하려면 mbstring.func_overload를 php.ini에서 비활성화해야 합니다.'; $lang['i_permfail'] = '<code>%s</code>는 도쿠위키가 쓰기 가능 권한이 없습니다. 먼저 이 디렉터리에 쓰기 권한이 설정되어야 합니다!'; $lang['i_confexists'] = '<code>%s</code>(은)는 이미 존재합니다'; $lang['i_writeerr'] = '<code>%s</code>(을)를 만들 수 없습니다. 먼저 디렉터리/파일 권한을 확인하고 파일을 수동으로 만드세요.'; $lang['i_badhash'] = 'dokuwiki.php를 인식할 수 없거나 원본 파일이 아닙니다 (해시=<code>%s</code>)'; $lang['i_badval'] = '<code>%s</code> - 잘못되었거나 빈 값입니다'; -$lang['i_success'] = '환경 설정이 성공적으로 끝났습니다. 지금 install.php를 지워도 상관없습니다. <a href="doku.php?id=wiki:welcome">새 도쿠위키</a>로 들어가세요.'; -$lang['i_failure'] = '환경 설정 파일에 쓰는 도중에 오류가 발생했습니다. <a href="doku.php?id=wiki:welcome">새 도쿠위키</a>를 사용하기 전에 수동으로 문제를 해결해야 합니다.'; +$lang['i_success'] = '환경 설정이 성공적으로 끝났습니다. 지금 install.php를 지워도 상관없습니다. +<a href="doku.php?id=wiki:welcome">새 도쿠위키</a>로 들어가세요.'; +$lang['i_failure'] = '환경 설정 파일에 쓰는 도중에 오류가 발생했습니다. +<a href="doku.php?id=wiki:welcome">새 도쿠위키</a>를 사용하기 전에 수동으로 문제를 해결해야 합니다.'; $lang['i_policy'] = '초기 ACL 정책'; $lang['i_pol0'] = '열린 위키 (누구나 읽기, 쓰기, 올리기가 가능합니다)'; $lang['i_pol1'] = '공개 위키 (누구나 읽을 수 있지만, 등록된 사용자만 쓰기와 올리기가 가능합니다)'; @@ -302,7 +312,7 @@ $lang['i_pop_field'] = '도쿠위키 경험을 개선하는 데 도움 $lang['i_pop_label'] = '한 달에 한 번씩, 도쿠위키 개발자에게 익명의 사용 데이터를 보냅니다'; $lang['recent_global'] = '현재 <b>%s</b> 이름공간을 구독 중입니다. <a href="%s">전체 위키의 최근 바뀜도 볼 수</a> 있습니다.'; $lang['years'] = '%d년 전'; -$lang['months'] = '%d달 전'; +$lang['months'] = '%d개월 전'; $lang['weeks'] = '%d주 전'; $lang['days'] = '%d일 전'; $lang['hours'] = '%d시간 전'; @@ -336,3 +346,5 @@ $lang['currentns'] = '현재 이름공간'; $lang['searchresult'] = '검색 결과'; $lang['plainhtml'] = '일반 HTML'; $lang['wikimarkup'] = '위키 문법'; +$lang['page_nonexist_rev'] = '문서가 %s에 존재하지 않았습니다. 그 뒤로 <a href="%s">%s</a>에 만들어졌습니다.'; +$lang['unable_to_parse_date'] = '"%s" 변수에서 구문 분석할 수 없습니다.'; diff --git a/inc/lang/ko/searchpage.txt b/inc/lang/ko/searchpage.txt index 2313f0bb0..6aa1c89af 100644 --- a/inc/lang/ko/searchpage.txt +++ b/inc/lang/ko/searchpage.txt @@ -1,5 +1,5 @@ ====== 검색 ====== -아래에서 검색 결과를 찾을 수 있습니다. 만약 원하는 문서를 찾지 못했다면, "문서 만들기"나 "문서 편집"을 사용해 검색어와 같은 이름의 문서를 만들거나 편집할 수 있습니다. +아래에서 검색 결과를 찾을 수 있습니다. @CREATEPAGEINFO@ -===== 결과 =====
\ No newline at end of file +===== 결과 ===== diff --git a/inc/lang/ko/subscr_digest.txt b/inc/lang/ko/subscr_digest.txt index 0f03e51a3..d1f2d4b99 100644 --- a/inc/lang/ko/subscr_digest.txt +++ b/inc/lang/ko/subscr_digest.txt @@ -11,7 +11,7 @@ 새 판: @NEWPAGE@ -문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤 +문서 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤 @SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요. -- diff --git a/inc/lang/ko/updateprofile.txt b/inc/lang/ko/updateprofile.txt index 80545e9bf..055272e9d 100644 --- a/inc/lang/ko/updateprofile.txt +++ b/inc/lang/ko/updateprofile.txt @@ -1,3 +1,3 @@ -====== 개인 정보 바꾸기 ====== +====== 계정 프로필 바꾸기 ====== 바꾸고 싶은 항목을 입력하세요. 사용자 이름은 바꿀 수 없습니다.
\ No newline at end of file diff --git a/inc/lang/ku/denied.txt b/inc/lang/ku/denied.txt index 3ac72820c..34cb8456a 100644 --- a/inc/lang/ku/denied.txt +++ b/inc/lang/ku/denied.txt @@ -1,4 +1,4 @@ ====== Permission Denied ====== -Sorry, you don't have enough rights to continue. Perhaps you forgot to login? +Sorry, you don't have enough rights to continue. diff --git a/inc/lang/ku/lang.php b/inc/lang/ku/lang.php index b6287806d..a3c91eee8 100644 --- a/inc/lang/ku/lang.php +++ b/inc/lang/ku/lang.php @@ -35,7 +35,7 @@ $lang['btn_backtomedia'] = 'Back to Mediafile Selection'; $lang['btn_subscribe'] = 'Subscribe Changes'; $lang['btn_register'] = 'Register'; -$lang['loggedinas'] = 'Logged in as'; +$lang['loggedinas'] = 'Logged in as:'; $lang['user'] = 'Username'; $lang['pass'] = 'Password'; $lang['passchk'] = 'once again'; @@ -89,8 +89,8 @@ $lang['current'] = 'current'; $lang['yours'] = 'Your Version'; $lang['diff'] = 'show differences to current version'; $lang['line'] = 'Rêz'; -$lang['breadcrumb'] = 'Şop'; -$lang['lastmod'] = 'Guherandina dawî'; +$lang['breadcrumb'] = 'Şop:'; +$lang['lastmod'] = 'Guherandina dawî:'; $lang['by'] = 'by'; $lang['deleted'] = 'hat jê birin'; $lang['created'] = 'hat afirandin'; @@ -127,16 +127,17 @@ $lang['admin_register']= 'Add new user...'; $lang['metaedit'] = 'Edit Metadata'; $lang['metasaveerr'] = 'Writing metadata failed'; $lang['metasaveok'] = 'Metadata saved'; -$lang['img_backto'] = 'Back to'; -$lang['img_title'] = 'Title'; -$lang['img_caption'] = 'Caption'; -$lang['img_date'] = 'Date'; -$lang['img_fname'] = 'Filename'; -$lang['img_fsize'] = 'Size'; -$lang['img_artist'] = 'Photographer'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Camera'; -$lang['img_keywords']= 'Keywords'; +$lang['btn_img_backto'] = 'Back to %s'; +$lang['img_title'] = 'Title:'; +$lang['img_caption'] = 'Caption:'; +$lang['img_date'] = 'Date:'; +$lang['img_fname'] = 'Filename:'; +$lang['img_fsize'] = 'Size:'; +$lang['img_artist'] = 'Photographer:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Camera:'; +$lang['img_keywords']= 'Keywords:'; +$lang['searchcreatepage'] = "Heke tiştek nehatibe dîtin, tu dikarî dest bi nivîsandina rûpelekê nû bikî. Ji bo vê, ''Vê rûpelê biguherîne'' bitikîne."; //Setup VIM: ex: et ts=2 : diff --git a/inc/lang/ku/searchpage.txt b/inc/lang/ku/searchpage.txt index 6646228d5..f762b9873 100644 --- a/inc/lang/ku/searchpage.txt +++ b/inc/lang/ku/searchpage.txt @@ -1,5 +1,5 @@ ====== Lêbigere ====== -Jêr encamên lêgerandina te tên nîşan dan. Heke tiştek nehatibe dîtin, tu dikarî dest bi nivîsandina rûpelekê nû bikî. Ji bo vê, ''Vê rûpelê biguherîne'' bitikîne. +Jêr encamên lêgerandina te tên nîşan dan. @CREATEPAGEINFO@ ===== Encam =====
\ No newline at end of file diff --git a/inc/lang/la/denied.txt b/inc/lang/la/denied.txt index fdb62f53e..1cdaf05c9 100644 --- a/inc/lang/la/denied.txt +++ b/inc/lang/la/denied.txt @@ -1,3 +1,4 @@ ====== Ad hanc paginam accedere non potes ====== -Ad hanc paginam accedere non potes: antea in conuentum ineas, deinde rursum temptas
\ No newline at end of file +Ad hanc paginam accedere non potes: antea in conuentum ineas. + diff --git a/inc/lang/la/lang.php b/inc/lang/la/lang.php index c71a71bdd..66cd13967 100644 --- a/inc/lang/la/lang.php +++ b/inc/lang/la/lang.php @@ -90,8 +90,8 @@ $lang['searchmedia_in'] = 'Quaere "%s":'; $lang['txt_upload'] = 'Eligere documenta oneranda:'; $lang['txt_filename'] = 'Onerare (optio):'; $lang['txt_overwrt'] = 'Documento ueteri imponere:'; -$lang['lockedby'] = 'Nunc hoc intercludit'; -$lang['lockexpire'] = 'Hoc apertum'; +$lang['lockedby'] = 'Nunc hoc intercludit:'; +$lang['lockexpire'] = 'Hoc apertum:'; $lang['js']['willexpire'] = 'Interclusio paginae recensendae uno minuto finita est.\nUt errores uites, \'praeuisio\' preme ut interclusionem ripristines.'; $lang['js']['notsavedyet'] = 'Res non seruatae amissurae sunt.'; $lang['js']['searchmedia'] = 'Quaere inter documenta'; @@ -202,17 +202,17 @@ $lang['admin_register'] = 'Nouom Sodalem creare'; $lang['metaedit'] = 'Res codicis mutare'; $lang['metasaveerr'] = 'Res codicis non scribitur.'; $lang['metasaveok'] = 'Res codicis seruatae.'; -$lang['img_backto'] = 'Redere ad'; -$lang['img_title'] = 'Titulus'; -$lang['img_caption'] = 'Descriptio'; -$lang['img_date'] = 'Dies'; -$lang['img_fname'] = 'Titulus documenti'; -$lang['img_fsize'] = 'Pondus'; -$lang['img_artist'] = 'Imaginum exprimitor\trix'; -$lang['img_copyr'] = 'Iura exemplarium'; -$lang['img_format'] = 'Forma'; -$lang['img_camera'] = 'Cella'; -$lang['img_keywords'] = 'Verba claues'; +$lang['btn_img_backto'] = 'Redere ad %s'; +$lang['img_title'] = 'Titulus:'; +$lang['img_caption'] = 'Descriptio:'; +$lang['img_date'] = 'Dies:'; +$lang['img_fname'] = 'Titulus documenti:'; +$lang['img_fsize'] = 'Pondus:'; +$lang['img_artist'] = 'Imaginum exprimitor\trix:'; +$lang['img_copyr'] = 'Iura exemplarium:'; +$lang['img_format'] = 'Forma:'; +$lang['img_camera'] = 'Cella:'; +$lang['img_keywords'] = 'Verba claues:'; $lang['subscr_subscribe_success'] = '%s additur indici subscriptionis quod %s'; $lang['subscr_subscribe_error'] = '%s non additur indici subscriptionis quod %s'; $lang['subscr_subscribe_noaddress'] = 'Cursus interretialis tuus deest, sic in indice subscriptionis non scribi potes'; diff --git a/inc/lang/la/searchpage.txt b/inc/lang/la/searchpage.txt index 8e929110d..75fd7cd5b 100644 --- a/inc/lang/la/searchpage.txt +++ b/inc/lang/la/searchpage.txt @@ -1,5 +1,5 @@ ====== Quaerere ====== -Responsiones in hac pagina uidere potes. +Responsiones in hac pagina uidere potes. @CREATEPAGEINFO@ ===== Responsiones =====
\ No newline at end of file diff --git a/inc/lang/lb/denied.txt b/inc/lang/lb/denied.txt index 487bf2198..1a7fd8f52 100644 --- a/inc/lang/lb/denied.txt +++ b/inc/lang/lb/denied.txt @@ -1,3 +1,4 @@ ======Erlaabnis verweigert====== -Et deet mer leed, du hues net genuch Rechter fir weiderzefueren. Hues de vläicht vergiess dech anzeloggen? +Et deet mer leed, du hues net genuch Rechter fir weiderzefueren. + diff --git a/inc/lang/lb/jquery.ui.datepicker.js b/inc/lang/lb/jquery.ui.datepicker.js new file mode 100644 index 000000000..4f2e414be --- /dev/null +++ b/inc/lang/lb/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Luxembourgish initialisation for the jQuery UI date picker plugin. */ +/* Written by Michel Weimerskirch <michel@weimerskirch.net> */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['lb'] = { + closeText: 'Fäerdeg', + prevText: 'Zréck', + nextText: 'Weider', + currentText: 'Haut', + monthNames: ['Januar','Februar','Mäerz','Abrëll','Mee','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun', + 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], + dayNames: ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'], + dayNamesShort: ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'], + dayNamesMin: ['So','Mé','Dë','Më','Do','Fr','Sa'], + weekHeader: 'W', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['lb']); + +return datepicker.regional['lb']; + +})); diff --git a/inc/lang/lb/lang.php b/inc/lang/lb/lang.php index 55113745a..1090878e2 100644 --- a/inc/lang/lb/lang.php +++ b/inc/lang/lb/lang.php @@ -41,7 +41,7 @@ $lang['btn_draft'] = 'Entworf änneren'; $lang['btn_recover'] = 'Entworf zeréckhuelen'; $lang['btn_draftdel'] = 'Entworf läschen'; $lang['btn_register'] = 'Registréieren'; -$lang['loggedinas'] = 'Ageloggt als'; +$lang['loggedinas'] = 'Ageloggt als:'; $lang['user'] = 'Benotzernumm'; $lang['pass'] = 'Passwuert'; $lang['newpass'] = 'Nei Passwuert'; @@ -55,6 +55,7 @@ $lang['badlogin'] = 'Entschëllegt, de Benotzernumm oder d\'Passwue $lang['minoredit'] = 'Kleng Ännerungen'; $lang['draftdate'] = 'Entworf automatesch gespäichert den'; $lang['nosecedit'] = 'D\'Säit gouf an Zwëschenzäit g\'ännert, Sektiounsinfo veralt. Ganz Säit gouf aplaz gelueden.'; +$lang['searchcreatepage'] = 'Wanns de net fënns wats de gesicht hues kanns de eng nei Säit mam Numm vun denger Sich uleeën.'; $lang['regmissing'] = 'Du muss all d\'Felder ausfëllen.'; $lang['reguexists'] = 'Et get schonn e Benotzer mat deem Numm.'; $lang['regsuccess'] = 'De Benotzer gouf erstallt an d\'Passwuert via Email geschéckt.'; @@ -77,11 +78,11 @@ $lang['resendpwdconfirm'] = 'De Konfirmatiounslink gouf iwwer Email gesché $lang['resendpwdsuccess'] = 'Däi nei Passwuert gouf iwwer Email geschéckt.'; $lang['license'] = 'Wann näischt anescht do steet, ass den Inhalt vun dësem Wiki ënner folgender Lizenz:'; $lang['licenseok'] = 'Pass op: Wanns de dës Säit änners, bass de dermat averstan dass den Inhalt ënner folgender Lizenz lizenzéiert gëtt:'; -$lang['txt_upload'] = 'Wiel eng Datei fir eropzelueden'; -$lang['txt_filename'] = 'Eroplueden als (optional)'; +$lang['txt_upload'] = 'Wiel eng Datei fir eropzelueden:'; +$lang['txt_filename'] = 'Eroplueden als (optional):'; $lang['txt_overwrt'] = 'Bestehend Datei iwwerschreiwen'; -$lang['lockedby'] = 'Am Moment gespaart vun'; -$lang['lockexpire'] = 'D\'Spär leeft of ëm'; +$lang['lockedby'] = 'Am Moment gespaart vun:'; +$lang['lockexpire'] = 'D\'Spär leeft of ëm:'; $lang['js']['willexpire'] = 'Deng Spär fir d\'Säit ze änneren leeft an enger Minutt of.\nFir Konflikter ze verhënneren, dréck op Kucken ouni ofzespäicheren.'; $lang['js']['notsavedyet'] = 'Net gespäicher Ännerunge gi verluer.\nWierklech weiderfueren?'; $lang['rssfailed'] = 'Et ass e Feeler virkomm beim erofluede vun dësem Feed: '; @@ -118,9 +119,9 @@ $lang['yours'] = 'Deng Versioun'; $lang['diff'] = 'Weis d\'Ënnerscheeder zuer aktueller Versioun'; $lang['diff2'] = 'Weis d\'Ënnerscheeder zwescht den ausgewielte Versiounen'; $lang['line'] = 'Linn'; -$lang['breadcrumb'] = 'Spuer'; -$lang['youarehere'] = 'Du bass hei'; -$lang['lastmod'] = 'Fir d\'lescht g\'ännert'; +$lang['breadcrumb'] = 'Spuer:'; +$lang['youarehere'] = 'Du bass hei:'; +$lang['lastmod'] = 'Fir d\'lescht g\'ännert:'; $lang['by'] = 'vun'; $lang['deleted'] = 'geläscht'; $lang['created'] = 'erstallt'; @@ -162,17 +163,17 @@ $lang['admin_register'] = 'Neie Benotzer bäisetzen'; $lang['metaedit'] = 'Metadaten änneren'; $lang['metasaveerr'] = 'Feeler beim Schreiwe vun de Metadaten'; $lang['metasaveok'] = 'Metadate gespäichert'; -$lang['img_backto'] = 'Zeréck op'; -$lang['img_title'] = 'Titel'; -$lang['img_caption'] = 'Beschreiwung'; -$lang['img_date'] = 'Datum'; -$lang['img_fname'] = 'Dateinumm'; -$lang['img_fsize'] = 'Gréisst'; -$lang['img_artist'] = 'Fotograf'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Schlësselwieder'; +$lang['btn_img_backto'] = 'Zeréck op %s'; +$lang['img_title'] = 'Titel:'; +$lang['img_caption'] = 'Beschreiwung:'; +$lang['img_date'] = 'Datum:'; +$lang['img_fname'] = 'Dateinumm:'; +$lang['img_fsize'] = 'Gréisst:'; +$lang['img_artist'] = 'Fotograf:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Schlësselwieder:'; $lang['authtempfail'] = 'D\'Benotzerautentifikatioun ass de Moment net verfügbar. Wann dës Situatioun unhält, dann informéier w.e.g. de Wiki Admin.'; $lang['i_chooselang'] = 'Wiel deng Sprooch'; $lang['i_installer'] = 'DokuWiki Installer'; diff --git a/inc/lang/lb/searchpage.txt b/inc/lang/lb/searchpage.txt index 5e15a2c60..9f4e5475e 100644 --- a/inc/lang/lb/searchpage.txt +++ b/inc/lang/lb/searchpage.txt @@ -1,5 +1,5 @@ ======Sich====== -Hei ënnendrënner sinn d'Resultater vun der Sich. Wanns de net fënns wats de gesicht hues kanns de eng nei Säit mam Numm vun denger Sich uleeën. +Hei ënnendrënner sinn d'Resultater vun der Sich. @CREATEPAGEINFO@ =====Resultater=====
\ No newline at end of file diff --git a/inc/lang/lt/denied.txt b/inc/lang/lt/denied.txt index c25fb5f0c..9a8544694 100644 --- a/inc/lang/lt/denied.txt +++ b/inc/lang/lt/denied.txt @@ -1,4 +1,4 @@ ====== Priėjimas uždraustas ====== -Jūs neturite reikiamų teisių, kad galėtumėte tęsti. Turbūt pamiršote prisijungti :-). +Jūs neturite reikiamų teisių, kad galėtumėte tęsti. diff --git a/inc/lang/lt/jquery.ui.datepicker.js b/inc/lang/lt/jquery.ui.datepicker.js new file mode 100644 index 000000000..60ccbefe7 --- /dev/null +++ b/inc/lang/lt/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas@avalon.lt> */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['lt'] = { + closeText: 'Uždaryti', + prevText: '<Atgal', + nextText: 'Pirmyn>', + currentText: 'Šiandien', + monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', + 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'], + monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir', + 'Lie','Rugp','Rugs','Spa','Lap','Gru'], + dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'], + dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'], + dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'], + weekHeader: 'SAV', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['lt']); + +return datepicker.regional['lt']; + +})); diff --git a/inc/lang/lt/lang.php b/inc/lang/lt/lang.php index c38ea8838..d53a117f4 100644 --- a/inc/lang/lt/lang.php +++ b/inc/lang/lt/lang.php @@ -46,7 +46,7 @@ $lang['btn_draft'] = 'Redaguoti juodraštį'; $lang['btn_recover'] = 'Atkurti juodraštį'; $lang['btn_draftdel'] = 'Šalinti juodraštį'; $lang['btn_register'] = 'Registruotis'; -$lang['loggedinas'] = 'Prisijungęs kaip'; +$lang['loggedinas'] = 'Prisijungęs kaip:'; $lang['user'] = 'Vartotojo vardas'; $lang['pass'] = 'Slaptažodis'; $lang['newpass'] = 'Naujas slaptažodis'; @@ -60,6 +60,7 @@ $lang['badlogin'] = 'Nurodėte blogą vartotojo vardą arba slapta $lang['minoredit'] = 'Nedidelis pataisymas'; $lang['draftdate'] = 'Juodraštis automatiškai išsaugotas'; $lang['nosecedit'] = 'Puslapis buvo kažkieno pataisytas, teksto dalies informacija tapo pasenusi, todėl pakrautas visas puslapis.'; +$lang['searchcreatepage'] = 'Jeigu neradote to, ko ieškojote, galite sukurti naują puslapį šiuo pavadinimu paspausdami "Redaguoti šį puslapį".'; $lang['regmissing'] = 'Turite užpildyti visus laukus.'; $lang['reguexists'] = 'Vartotojas su pasirinktu prisijungimo vardu jau egzistuoja.'; $lang['regsuccess'] = 'Vartotojas sukurtas, slaptažodis išsiųstas el. paštu.'; @@ -82,11 +83,11 @@ $lang['resendpwdconfirm'] = 'Patvirtinimo nuoroda išsiųsta el. paštu.'; $lang['resendpwdsuccess'] = 'Jūsų naujas slaptažodis buvo išsiųstas el. paštu.'; $lang['license'] = 'Jei nenurodyta kitaip, šio wiki turinys ginamas tokia licencija:'; $lang['licenseok'] = 'Pastaba: Redaguodami šį puslapį jūs sutinkate jog jūsų turinys atitinka licencijavima pagal šią licenciją'; -$lang['txt_upload'] = 'Išsirinkite atsiunčiamą bylą'; -$lang['txt_filename'] = 'Įveskite wikivardą (nebūtina)'; +$lang['txt_upload'] = 'Išsirinkite atsiunčiamą bylą:'; +$lang['txt_filename'] = 'Įveskite wikivardą (nebūtina):'; $lang['txt_overwrt'] = 'Perrašyti egzistuojančią bylą'; -$lang['lockedby'] = 'Užrakintas vartotojo'; -$lang['lockexpire'] = 'Užraktas bus nuimtas'; +$lang['lockedby'] = 'Užrakintas vartotojo:'; +$lang['lockexpire'] = 'Užraktas bus nuimtas:'; $lang['js']['willexpire'] = 'Šio puslapio redagavimo užrakto galiojimo laikas baigsis po minutės.\nNorėdami išvengti nesklandumų naudokite peržiūros mygtuką ir užraktas atsinaujins.'; $lang['js']['notsavedyet'] = 'Pakeitimai nebus išsaugoti.\nTikrai tęsti?'; $lang['rssfailed'] = 'Siunčiant šį feed\'ą įvyko klaida: '; @@ -125,9 +126,9 @@ $lang['yours'] = 'Jūsų versija'; $lang['diff'] = 'rodyti skirtumus tarp šios ir esamos versijos'; $lang['diff2'] = 'Parodyti skirtumus tarp pasirinktų versijų'; $lang['line'] = 'Linija'; -$lang['breadcrumb'] = 'Kelias'; -$lang['youarehere'] = 'Jūs esate čia'; -$lang['lastmod'] = 'Keista'; +$lang['breadcrumb'] = 'Kelias:'; +$lang['youarehere'] = 'Jūs esate čia:'; +$lang['lastmod'] = 'Keista:'; $lang['by'] = 'vartotojo'; $lang['deleted'] = 'ištrintas'; $lang['created'] = 'sukurtas'; @@ -163,17 +164,17 @@ $lang['admin_register'] = 'Sukurti naują vartotoją'; $lang['metaedit'] = 'Redaguoti metaduomenis'; $lang['metasaveerr'] = 'Nepavyko išsaugoti metaduomenų'; $lang['metasaveok'] = 'Metaduomenys išsaugoti'; -$lang['img_backto'] = 'Atgal į'; -$lang['img_title'] = 'Pavadinimas'; -$lang['img_caption'] = 'Antraštė'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Bylos pavadinimas'; -$lang['img_fsize'] = 'Dydis'; -$lang['img_artist'] = 'Fotografas'; -$lang['img_copyr'] = 'Autorinės teisės'; -$lang['img_format'] = 'Formatas'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Raktiniai žodžiai'; +$lang['btn_img_backto'] = 'Atgal į %s'; +$lang['img_title'] = 'Pavadinimas:'; +$lang['img_caption'] = 'Antraštė:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Bylos pavadinimas:'; +$lang['img_fsize'] = 'Dydis:'; +$lang['img_artist'] = 'Fotografas:'; +$lang['img_copyr'] = 'Autorinės teisės:'; +$lang['img_format'] = 'Formatas:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Raktiniai žodžiai:'; $lang['authtempfail'] = 'Vartotojo tapatumo nustatymas laikinai nepasiekiamas. Jei ši situacija kartojasi, tai praneškite savo administratoriui.'; $lang['i_chooselang'] = 'Pasirinkite kalbą'; $lang['i_installer'] = 'DokuWiki Instaliatorius'; diff --git a/inc/lang/lt/searchpage.txt b/inc/lang/lt/searchpage.txt index a83a6a58a..f03f5f17b 100644 --- a/inc/lang/lt/searchpage.txt +++ b/inc/lang/lt/searchpage.txt @@ -1,5 +1,5 @@ ====== Paieška ====== -Žemiau matote Jūsų atliktos paieškos rezultatus. Jeigu neradote to, ko ieškojote, galite sukurti naują puslapį šiuo pavadinimu paspausdami "Redaguoti šį puslapį". +Žemiau matote Jūsų atliktos paieškos rezultatus. @CREATEPAGEINFO@ ===== Rezultatai =====
\ No newline at end of file diff --git a/inc/lang/lv/denied.txt b/inc/lang/lv/denied.txt index c7df462c8..6733fb2e9 100644 --- a/inc/lang/lv/denied.txt +++ b/inc/lang/lv/denied.txt @@ -1,6 +1,4 @@ ====== Piekļuve aizliegta ====== -Atvaino, tev nav tiesību turpināt. Varbūt aizmirsi ielogoties? - - +Atvaino, tev nav tiesību turpināt. diff --git a/inc/lang/lv/jquery.ui.datepicker.js b/inc/lang/lv/jquery.ui.datepicker.js new file mode 100644 index 000000000..b9e288535 --- /dev/null +++ b/inc/lang/lv/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['lv'] = { + closeText: 'Aizvērt', + prevText: 'Iepr.', + nextText: 'Nāk.', + currentText: 'Šodien', + monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs', + 'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn', + 'Jūl','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'], + dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'], + dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'], + weekHeader: 'Ned.', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['lv']); + +return datepicker.regional['lv']; + +})); diff --git a/inc/lang/lv/lang.php b/inc/lang/lv/lang.php index 898125d60..ddc97fa89 100644 --- a/inc/lang/lv/lang.php +++ b/inc/lang/lv/lang.php @@ -1,8 +1,8 @@ <?php + /** - * latvian language file - * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * * @author Aivars Miška <allefm@gmail.com> */ $lang['encoding'] = 'utf-8'; @@ -47,7 +47,10 @@ $lang['btn_revert'] = 'Atjaunot'; $lang['btn_register'] = 'Reģistrēties'; $lang['btn_apply'] = 'Labi'; $lang['btn_media'] = 'Mēdiju pārvaldnieks'; -$lang['loggedinas'] = 'Pieteicies kā'; +$lang['btn_deleteuser'] = 'Dzēst manu kontu'; +$lang['btn_img_backto'] = 'Atpakaļ uz %s'; +$lang['btn_mediaManager'] = 'Skatīt mēdiju pārvaldniekā'; +$lang['loggedinas'] = 'Pieteicies kā:'; $lang['user'] = 'Lietotājvārds'; $lang['pass'] = 'Parole'; $lang['newpass'] = 'Jaunā parole'; @@ -58,9 +61,11 @@ $lang['fullname'] = 'Pilns vārds'; $lang['email'] = 'E-pasts'; $lang['profile'] = 'Lietotāja vārds'; $lang['badlogin'] = 'Atvaino, lietotājvārds vai parole aplama.'; +$lang['badpassconfirm'] = 'Atvaino, aplama parole'; $lang['minoredit'] = 'Sīki labojumi'; $lang['draftdate'] = 'Melnraksts automātiski saglabāts'; $lang['nosecedit'] = 'Lapa pa šo laiku ir mainījusies, sekcijas informācija novecojusi. Ielādēta lapas pilnās versija.'; +$lang['searchcreatepage'] = 'Ja neatradi meklēto, nospiežot pogu "Labot lapu", vari izveidot jaunu lapu ar tevis meklētajiem atslēgvārdiem nosaukumā.'; $lang['regmissing'] = 'Atvaino, jāaizpilda visas ailes.'; $lang['reguexists'] = 'Atvaino, tāds lietotājs jau ir.'; $lang['regsuccess'] = 'Lietotājs izveidots. Parole nosūtīta pa pastu.'; @@ -74,6 +79,11 @@ $lang['profna'] = 'Labot profilu nav iespējams'; $lang['profnochange'] = 'Izmaiņu nav. Nav, ko darīt.'; $lang['profnoempty'] = 'Bez vārda vai e-pasta adreses nevar.'; $lang['profchanged'] = 'Profils veiksmīgi izlabots.'; +$lang['profnodelete'] = 'Šajā viki lietotājus izdzēst nevar'; +$lang['profdeleteuser'] = 'Dzēst kontu'; +$lang['profdeleted'] = 'Jūsu lietotāja konts ir izdzēsts'; +$lang['profconfdelete'] = 'Es vēlos dzēst savu kontu no viki. <br/> Šo darbību vairs nevarēs atsaukt.'; +$lang['profconfdeletemissing'] = 'Nav atzīmēta apstiprinājuma rūtiņa.'; $lang['pwdforget'] = 'Aizmirsi paroli? Saņem jaunu'; $lang['resendna'] = 'Paroļu izsūtīšanu nepiedāvāju.'; $lang['resendpwd'] = 'Uzstādīt jaunu paroli lietotājam'; @@ -86,12 +96,12 @@ $lang['license'] = 'Ja nav norādīts citādi, viki saturs pieejam $lang['licenseok'] = 'Ievēro: Labojot lapu, tu piekrīti šādiem licenzes noteikumiem.'; $lang['searchmedia'] = 'Meklētais faila vārds: '; $lang['searchmedia_in'] = 'Meklēt iekš %s'; -$lang['txt_upload'] = 'Norādi augšupielādējamo failu'; -$lang['txt_filename'] = 'Ievadi vikivārdu (nav obligāts)'; +$lang['txt_upload'] = 'Norādi augšupielādējamo failu:'; +$lang['txt_filename'] = 'Ievadi vikivārdu (nav obligāts):'; $lang['txt_overwrt'] = 'Aizstāt esošo failu'; $lang['maxuploadsize'] = 'Augšuplādējamā faila ierobežojums: %s.'; -$lang['lockedby'] = 'Patlaban bloķējis '; -$lang['lockexpire'] = 'Bloķējums beigsies '; +$lang['lockedby'] = 'Patlaban bloķējis :'; +$lang['lockexpire'] = 'Bloķējums beigsies :'; $lang['js']['willexpire'] = 'Tavs bloķējums uz šo lapu pēc minūtes beigsies.\nLai izvairītos no konflikta, nospied Iepriekšapskata pogu\n un bloķējuma laiku sāks skaitīt no jauna.'; $lang['js']['notsavedyet'] = 'Veiktas bet nav saglabātas izmaiņas. Vai tiešām tās nevajag?'; @@ -172,10 +182,15 @@ $lang['difflink'] = 'Saite uz salīdzināšanas skatu.'; $lang['diff_type'] = 'Skatīt atšķirības:'; $lang['diff_inline'] = 'Iekļauti'; $lang['diff_side'] = 'Blakus'; +$lang['diffprevrev'] = 'Iepriekšējā versija'; +$lang['diffnextrev'] = 'Nākamā versija'; +$lang['difflastrev'] = 'Jaunākā versija'; +$lang['diffbothprevrev'] = 'Abās pusēs iepriekšējo versiju'; +$lang['diffbothnextrev'] = 'Abās pusēs nākamo versiju'; $lang['line'] = 'Rinda'; -$lang['breadcrumb'] = 'Apmeklēts'; -$lang['youarehere'] = 'Tu atrodies šeit'; -$lang['lastmod'] = 'Labota'; +$lang['breadcrumb'] = 'Apmeklēts:'; +$lang['youarehere'] = 'Tu atrodies šeit:'; +$lang['lastmod'] = 'Labota:'; $lang['by'] = ', labojis'; $lang['deleted'] = 'dzēsts'; $lang['created'] = 'izveidots'; @@ -228,20 +243,18 @@ $lang['admin_register'] = 'Pievienot jaunu lietotāju'; $lang['metaedit'] = 'Labot metadatus'; $lang['metasaveerr'] = 'Metadati nav saglabāti'; $lang['metasaveok'] = 'Metadati saglabāti'; -$lang['img_backto'] = 'Atpakaļ uz'; -$lang['img_title'] = 'Virsraksts'; -$lang['img_caption'] = 'Apraksts'; -$lang['img_date'] = 'Datums'; -$lang['img_fname'] = 'Faila vārds'; -$lang['img_fsize'] = 'Izmērs'; -$lang['img_artist'] = 'Fotogrāfs'; -$lang['img_copyr'] = 'Autortiesības'; -$lang['img_format'] = 'Formāts'; -$lang['img_camera'] = 'Fotoaparāts'; -$lang['img_keywords'] = 'Atslēgvārdi'; -$lang['img_width'] = 'Platums'; -$lang['img_height'] = 'Augstums'; -$lang['img_manager'] = 'Skatīt mēdiju pārvaldniekā'; +$lang['img_title'] = 'Virsraksts:'; +$lang['img_caption'] = 'Apraksts:'; +$lang['img_date'] = 'Datums:'; +$lang['img_fname'] = 'Faila vārds:'; +$lang['img_fsize'] = 'Izmērs:'; +$lang['img_artist'] = 'Fotogrāfs:'; +$lang['img_copyr'] = 'Autortiesības:'; +$lang['img_format'] = 'Formāts:'; +$lang['img_camera'] = 'Fotoaparāts:'; +$lang['img_keywords'] = 'Atslēgvārdi:'; +$lang['img_width'] = 'Platums:'; +$lang['img_height'] = 'Augstums:'; $lang['subscr_subscribe_success'] = '%s pievienots %s abonēšanas sarakstam'; $lang['subscr_subscribe_error'] = 'Kļūme pievienojot %s %s abonēšanas sarakstam.'; $lang['subscr_subscribe_noaddress'] = 'Nav zināma jūsu e-pasta adrese, tāpēc nevarat abonēt.'; @@ -270,6 +283,7 @@ $lang['i_modified'] = 'Drošības nolūkos šis skripts darbosies tik Vai nu no jauna jāatarhivē faili no lejupielādētās pakas vai jāraugās pēc padoma pilnā Dokuwiki instalācijas instrukcijā <a href="http://dokuwiki.org/install"></a>'; $lang['i_funcna'] = 'PHP funkcija <code>%s</code> nav pieejama. Varbūt jūsu servera īpašnieks to kāda iemesla dēļ atslēdzis?'; $lang['i_phpver'] = 'Jūsu PHP versija <code>%s</code> ir par vecu. Vajag versiju <code>%s</code>. Atjaunojiet savu PHP instalāciju.'; +$lang['i_mbfuncoverload'] = 'Lai darbinātu DokuWiki, php.ini failā ir jāatspējo mbstring.func_overload.'; $lang['i_permfail'] = 'Dokuwiki nevar ierakstīt <code>%s</code>. Jālabo direktorijas tiesības!'; $lang['i_confexists'] = '<code>%s</code> jau ir'; $lang['i_writeerr'] = 'Nevar izveidot <code>%s</code>. Jāpārbauda direktorijas/faila tiesības un fails jāizveido pašam.'; @@ -281,6 +295,7 @@ $lang['i_policy'] = 'Sākotnējā ACL politika'; $lang['i_pol0'] = 'Atvērts Wiki (raksta, lasa un augšupielādē ikviens)'; $lang['i_pol1'] = 'Publisks Wiki (lasa ikviens, raksta un augšupielādē reģistrēti lietotāji)'; $lang['i_pol2'] = 'Slēgts Wiki (raksta, lasa un augšupielādē tikai reģistrēti lietotāji)'; +$lang['i_allowreg'] = 'Atļaut lietotājiem reģistrēties.'; $lang['i_retry'] = 'Atkārtot'; $lang['i_license'] = 'Ar kādu licenci saturs tiks publicēts:'; $lang['i_license_none'] = 'Nerādīt nekādu licences informāciju'; @@ -318,3 +333,7 @@ $lang['media_perm_read'] = 'Atvainojiet, jums nav tiesību skatīt failus. $lang['media_perm_upload'] = 'Atvainojiet, jums nav tiesību augšupielādēt. '; $lang['media_update'] = 'Augšupielādēt jaunu versiju'; $lang['media_restore'] = 'Atjaunot šo versiju'; +$lang['currentns'] = 'Pašreizējā sadaļa'; +$lang['searchresult'] = 'Meklēšanas rezultāti'; +$lang['plainhtml'] = 'Tīrs HTML'; +$lang['wikimarkup'] = 'Viki iezīmēšana valoda'; diff --git a/inc/lang/lv/searchpage.txt b/inc/lang/lv/searchpage.txt index 22eb55f04..a67f9f166 100644 --- a/inc/lang/lv/searchpage.txt +++ b/inc/lang/lv/searchpage.txt @@ -1,4 +1,5 @@ ====== Meklēšana ====== -Te vari redzēt meklēšanas rezultātus. Ja neatradi meklēto, nospiežot pogu "Labot lapu", vari izveidot jaunu lapu ar tevis meklētajiem atslēgvārdiem nosaukumā. +Te vari redzēt meklēšanas rezultātus. @CREATEPAGEINFO@ + ===== Atrasts ===== diff --git a/inc/lang/mg/denied.txt b/inc/lang/mg/denied.txt index edf20f1a1..d6d2b814e 100644 --- a/inc/lang/mg/denied.txt +++ b/inc/lang/mg/denied.txt @@ -1,4 +1,4 @@ ====== Tsy tafiditra ====== -Miala tsiny fa tsy manana alalana hanohizana mankany ianao. Angamba hadinonao ny niditra. +Miala tsiny fa tsy manana alalana hanohizana mankany ianao. diff --git a/inc/lang/mg/lang.php b/inc/lang/mg/lang.php index c5ed669a9..b6e0cc6e0 100644 --- a/inc/lang/mg/lang.php +++ b/inc/lang/mg/lang.php @@ -49,11 +49,11 @@ $lang['regbadpass'] = 'Tsy mitovy ny alahidy roa nomenao, avereno indray.'; $lang['regpwmail'] = 'Ny alahidy Wiki-nao'; $lang['reghere'] = 'Mbola tsy manana kaonty ianao? Manaova vaovao'; -$lang['txt_upload'] = 'Misafidiana rakitra halefa'; -$lang['txt_filename'] = 'Ampidiro ny anaran\'ny wiki (tsy voatery)'; +$lang['txt_upload'] = 'Misafidiana rakitra halefa:'; +$lang['txt_filename'] = 'Ampidiro ny anaran\'ny wiki (tsy voatery):'; $lang['txt_overwrt'] = 'Fafana izay rakitra efa misy?'; -$lang['lockedby'] = 'Mbola voahidin\'i'; -$lang['lockexpire'] = 'Afaka ny hidy amin\'ny'; +$lang['lockedby'] = 'Mbola voahidin\'i:'; +$lang['lockexpire'] = 'Afaka ny hidy amin\'ny:'; $lang['js']['willexpire'] = 'Efa ho lany fotoana afaka iray minitra ny hidy ahafahanao manova ny pejy.\nMba hialana amin\'ny conflit dia ampiasao ny bokotra topi-maso hamerenana ny timer-n\'ny hidy.'; $lang['js']['notsavedyet'] = 'Misy fiovana tsy voarakitra, ho very izany ireo.\nAzo antoka fa hotohizana?'; @@ -83,7 +83,7 @@ $lang['current'] = 'current'; $lang['yours'] = 'Kinova-nao'; $lang['diff'] = 'Asehoy ny tsy fitoviana amin\'ny kinova amin\'izao'; $lang['line'] = 'Andalana'; -$lang['breadcrumb'] = 'Taiza ianao'; +$lang['breadcrumb'] = 'Taiza ianao:'; $lang['lastmod'] = 'Novaina farany:'; $lang['by'] = '/'; $lang['deleted'] = 'voafafa'; @@ -117,5 +117,5 @@ $lang['qb_sig'] = 'Manisy sonia'; $lang['js']['del_confirm']= 'Hofafana ilay andalana?'; $lang['admin_register']= 'Ampio mpampiasa vaovao...'; - +$lang['searchcreatepage'] = "Raha tsy nahita izay notadiavinao ianao, dia afaka mamorona pejy vaovao avy amin'ny teny nanaovanao fikarohana; Ampiasao ny bokotra ''Hanova ny pejy''."; //Setup VIM: ex: et ts=2 : diff --git a/inc/lang/mg/searchpage.txt b/inc/lang/mg/searchpage.txt index 68c6271df..ef3ed8b19 100644 --- a/inc/lang/mg/searchpage.txt +++ b/inc/lang/mg/searchpage.txt @@ -2,6 +2,6 @@ Ireto ambany ireto ny valin'ny fikarohanao. -Raha tsy nahita izay notadiavinao ianao, dia afaka mamorona pejy vaovao avy amin'ny teny nanaovanao fikarohana; Ampiasao ny bokotra ''Hanova ny pejy''. +@CREATEPAGEINFO@ ===== Vokatry ny fikarohana =====
\ No newline at end of file diff --git a/inc/lang/mk/jquery.ui.datepicker.js b/inc/lang/mk/jquery.ui.datepicker.js new file mode 100644 index 000000000..15942e281 --- /dev/null +++ b/inc/lang/mk/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Macedonian i18n for the jQuery UI date picker plugin. */ +/* Written by Stojce Slavkovski. */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['mk'] = { + closeText: 'Затвори', + prevText: '<', + nextText: '>', + currentText: 'Денес', + monthNames: ['Јануари','Февруари','Март','Април','Мај','Јуни', + 'Јули','Август','Септември','Октомври','Ноември','Декември'], + monthNamesShort: ['Јан','Фев','Мар','Апр','Мај','Јун', + 'Јул','Авг','Сеп','Окт','Ное','Дек'], + dayNames: ['Недела','Понеделник','Вторник','Среда','Четврток','Петок','Сабота'], + dayNamesShort: ['Нед','Пон','Вто','Сре','Чет','Пет','Саб'], + dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Са'], + weekHeader: 'Сед', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['mk']); + +return datepicker.regional['mk']; + +})); diff --git a/inc/lang/mk/lang.php b/inc/lang/mk/lang.php index 2b2c9fb7f..ddfae15c4 100644 --- a/inc/lang/mk/lang.php +++ b/inc/lang/mk/lang.php @@ -47,7 +47,7 @@ $lang['btn_recover'] = 'Поврати скица'; $lang['btn_draftdel'] = 'Избриши скица'; $lang['btn_revert'] = 'Обнови'; $lang['btn_register'] = 'Регистрирај се'; -$lang['loggedinas'] = 'Најавен/а како'; +$lang['loggedinas'] = 'Најавен/а како:'; $lang['user'] = 'Корисничко име'; $lang['pass'] = 'Лозинка'; $lang['newpass'] = 'Нова лозинка'; @@ -85,11 +85,11 @@ $lang['license'] = 'Освен каде што е наведено $lang['licenseok'] = 'Забелешка: со уредување на оваа страница се согласувате да ја лиценцирате вашата содржина под следнава лиценца:'; $lang['searchmedia'] = 'Барај име на датотека:'; $lang['searchmedia_in'] = 'Барај во %s'; -$lang['txt_upload'] = 'Избери датотека за качување'; -$lang['txt_filename'] = 'Качи како (неморално)'; +$lang['txt_upload'] = 'Избери датотека за качување:'; +$lang['txt_filename'] = 'Качи како (неморално):'; $lang['txt_overwrt'] = 'Пребриши ја веќе постоечката датотека'; -$lang['lockedby'] = 'Моментално заклучена од'; -$lang['lockexpire'] = 'Клучот истекува на'; +$lang['lockedby'] = 'Моментално заклучена од:'; +$lang['lockexpire'] = 'Клучот истекува на:'; $lang['js']['willexpire'] = 'Вашиот клуч за уредување на оваа страница ќе истече за една минута.\nЗа да избегнете конфликти и да го ресетирате бројачот за време, искористете го копчето за преглед.'; $lang['js']['notsavedyet'] = 'Незачуваните промени ќе бидат изгубени.\nСакате да продолжите?'; $lang['rssfailed'] = 'Се појави грешка при повлекувањето на овој канал:'; @@ -130,9 +130,9 @@ $lang['yours'] = 'Вашата верзија'; $lang['diff'] = 'Прикажи разлики со сегашната верзија'; $lang['diff2'] = 'Прикажи разлики помеѓу избраните ревизии'; $lang['line'] = 'Линија'; -$lang['breadcrumb'] = 'Следи'; -$lang['youarehere'] = 'Вие сте тука'; -$lang['lastmod'] = 'Последно изменета'; +$lang['breadcrumb'] = 'Следи:'; +$lang['youarehere'] = 'Вие сте тука:'; +$lang['lastmod'] = 'Последно изменета:'; $lang['by'] = 'од'; $lang['deleted'] = 'отстранета'; $lang['created'] = 'креирана'; @@ -171,17 +171,17 @@ $lang['admin_register'] = 'Додај нов корисник'; $lang['metaedit'] = 'Уреди мета-податоци'; $lang['metasaveerr'] = 'Запишување на мета-податоците не успеа'; $lang['metasaveok'] = 'Мета-податоците се зачувани'; -$lang['img_backto'] = 'Назад до'; -$lang['img_title'] = 'Насловна линија'; -$lang['img_caption'] = 'Наслов'; -$lang['img_date'] = 'Датум'; -$lang['img_fname'] = 'Име на датотека'; -$lang['img_fsize'] = 'Големина'; -$lang['img_artist'] = 'Фотограф'; -$lang['img_copyr'] = 'Авторско право'; -$lang['img_format'] = 'Формат'; -$lang['img_camera'] = 'Камера'; -$lang['img_keywords'] = 'Клучни зборови'; +$lang['btn_img_backto'] = 'Назад до %s'; +$lang['img_title'] = 'Насловна линија:'; +$lang['img_caption'] = 'Наслов:'; +$lang['img_date'] = 'Датум:'; +$lang['img_fname'] = 'Име на датотека:'; +$lang['img_fsize'] = 'Големина:'; +$lang['img_artist'] = 'Фотограф:'; +$lang['img_copyr'] = 'Авторско право:'; +$lang['img_format'] = 'Формат:'; +$lang['img_camera'] = 'Камера:'; +$lang['img_keywords'] = 'Клучни зборови:'; $lang['subscr_subscribe_success'] = 'Додаден/а е %s во претплатничката листа за %s'; $lang['subscr_subscribe_error'] = 'Грешка при додавањето на %s во претплатничката листа за %s'; $lang['subscr_subscribe_noaddress'] = 'Нема адреса за е-пошта поврзана со Вашата најава, не може да бидете додадени на претплатничката листа'; diff --git a/inc/lang/mr/denied.txt b/inc/lang/mr/denied.txt index 1b499f51d..5415fde04 100644 --- a/inc/lang/mr/denied.txt +++ b/inc/lang/mr/denied.txt @@ -1,3 +1,4 @@ ====== परवानगी नाकारली ====== -क्षमा करा, पण तुम्हाला यापुढे जाण्याचे हक्क नाहीत. कदाचित तुम्ही लॉगिन करायला विसरला आहात ?
\ No newline at end of file +क्षमा करा, पण तुम्हाला यापुढे जाण्याचे हक्क नाहीत. + diff --git a/inc/lang/mr/lang.php b/inc/lang/mr/lang.php index 54b69974d..7ebb14b93 100644 --- a/inc/lang/mr/lang.php +++ b/inc/lang/mr/lang.php @@ -54,7 +54,7 @@ $lang['btn_revert'] = 'पुनर्स्थापन'; $lang['btn_register'] = 'नोंदणी'; $lang['btn_apply'] = 'लागू'; $lang['btn_media'] = 'मिडिया व्यवस्थापक'; -$lang['loggedinas'] = 'लॉगिन नाव'; +$lang['loggedinas'] = 'लॉगिन नाव:'; $lang['user'] = 'वापरकर्ता'; $lang['pass'] = 'परवलीचा शब्द'; $lang['newpass'] = 'नवीन परवलीचा शब्द'; @@ -68,6 +68,7 @@ $lang['badlogin'] = 'माफ़ करा, वापरकर् $lang['minoredit'] = 'छोटे बदल'; $lang['draftdate'] = 'प्रत आपोआप सुरक्षित केल्याची तारीख'; $lang['nosecedit'] = 'मध्यंतरीच्या काळात हे पृष्ठ बदलले आहे.विभागाची माहिती जुनी झाली होती. त्याऐवजी सबंध पृष्ठ परत लोड केले आहे.'; +$lang['searchcreatepage'] = 'जर तुमची शोधत असलेली गोष्ट तुम्हाला सापडली नाही, तर योग्य बटण वापरून तुम्ही शोधत असलेल्या गोष्टीविषयी तुम्ही एखादे पान निर्माण किंवा संपादित करू शकता.'; $lang['regmissing'] = 'कृपया सर्व रकाने भरा.'; $lang['reguexists'] = 'या नावाने सदस्याची नोंदणी झालेली आहे, कृपया दुसरे सदस्य नाव निवडा.'; $lang['regsuccess'] = 'सदस्याची नोंदणी झाली आहे आणि परवलीचा शब्द इमेल केला आहे.'; @@ -93,8 +94,8 @@ $lang['license'] = 'विशिष्ठ नोंद केल $lang['licenseok'] = 'नोंद : हे पृष्ठ संपादित केल्यास तुम्ही तुमचे योगदान खालील लायसन्स अंतर्गत येइल : '; $lang['searchmedia'] = 'फाईल शोधा:'; $lang['searchmedia_in'] = '%s मधे शोधा'; -$lang['txt_upload'] = 'अपलोड करण्याची फाइल निवडा'; -$lang['txt_filename'] = 'अपलोड उर्फ़ ( वैकल्पिक )'; +$lang['txt_upload'] = 'अपलोड करण्याची फाइल निवडा:'; +$lang['txt_filename'] = 'अपलोड उर्फ़ ( वैकल्पिक ):'; $lang['txt_overwrt'] = 'अस्तित्वात असलेल्या फाइलवरच सुरक्षित करा.'; $lang['lockedby'] = 'सध्या लॉक करणारा :'; $lang['lockexpire'] = 'सध्या लॉक करणारा :'; @@ -174,9 +175,9 @@ $lang['diff_type'] = 'फरक बघू:'; $lang['diff_inline'] = 'एका ओळीत'; $lang['diff_side'] = 'बाजूबाजूला'; $lang['line'] = 'ओळ'; -$lang['breadcrumb'] = 'मागमूस'; -$lang['youarehere'] = 'तुम्ही इथे आहात'; -$lang['lastmod'] = 'सर्वात शेवटचा बदल'; +$lang['breadcrumb'] = 'मागमूस:'; +$lang['youarehere'] = 'तुम्ही इथे आहात:'; +$lang['lastmod'] = 'सर्वात शेवटचा बदल:'; $lang['by'] = 'द्वारा'; $lang['deleted'] = 'काढून टाकले'; $lang['created'] = 'निर्माण केले'; @@ -227,20 +228,20 @@ $lang['admin_register'] = 'नवीन सदस्य'; $lang['metaedit'] = 'मेटाडेटा बदला'; $lang['metasaveerr'] = 'मेटाडेटा सुरक्षित झाला नाही'; $lang['metasaveok'] = 'मेटाडेटा सुरक्षित झाला'; -$lang['img_backto'] = 'परत जा'; -$lang['img_title'] = 'नाव'; -$lang['img_caption'] = 'टीप'; -$lang['img_date'] = 'तारीख'; -$lang['img_fname'] = 'फाइल नाव'; -$lang['img_fsize'] = 'साइझ'; -$lang['img_artist'] = 'फोटोग्राफर'; -$lang['img_copyr'] = 'कॉपीराइट'; -$lang['img_format'] = 'प्रकार'; -$lang['img_camera'] = 'कॅमेरा'; -$lang['img_keywords'] = 'मुख्य शब्द'; -$lang['img_width'] = 'रुंदी'; -$lang['img_height'] = 'उंची'; -$lang['img_manager'] = 'मिडिया व्यवस्थापकात बघू'; +$lang['btn_img_backto'] = 'परत जा %s'; +$lang['img_title'] = 'नाव:'; +$lang['img_caption'] = 'टीप:'; +$lang['img_date'] = 'तारीख:'; +$lang['img_fname'] = 'फाइल नाव:'; +$lang['img_fsize'] = 'साइझ:'; +$lang['img_artist'] = 'फोटोग्राफर:'; +$lang['img_copyr'] = 'कॉपीराइट:'; +$lang['img_format'] = 'प्रकार:'; +$lang['img_camera'] = 'कॅमेरा:'; +$lang['img_keywords'] = 'मुख्य शब्द:'; +$lang['img_width'] = 'रुंदी:'; +$lang['img_height'] = 'उंची:'; +$lang['btn_mediaManager'] = 'मिडिया व्यवस्थापकात बघू'; $lang['authtempfail'] = 'सदस्य अधिकृत करण्याची सुविधा सध्या चालू नाही. सतत हा मजकूर दिसल्यास कृपया तुमच्या विकीच्या व्यवस्थापकाशी सम्पर्क साधा.'; $lang['i_chooselang'] = 'तुमची भाषा निवडा'; $lang['i_installer'] = 'डॉक्युविकि इनस्टॉलर'; diff --git a/inc/lang/mr/searchpage.txt b/inc/lang/mr/searchpage.txt index 23e10b1d3..d41954b4a 100644 --- a/inc/lang/mr/searchpage.txt +++ b/inc/lang/mr/searchpage.txt @@ -1,5 +1,5 @@ ====== शोध ====== -तुम्हाला खाली तुमच्या शोधाचे फलित दिसतील. जर तुमची शोधत असलेली गोष्ट तुम्हाला सापडली नाही, तर योग्य बटण वापरून तुम्ही शोधत असलेल्या गोष्टीविषयी तुम्ही एखादे पान निर्माण किंवा संपादित करू शकता. +तुम्हाला खाली तुमच्या शोधाचे फलित दिसतील. @CREATEPAGEINFO@ ====== फलित ======
\ No newline at end of file diff --git a/inc/lang/ms/jquery.ui.datepicker.js b/inc/lang/ms/jquery.ui.datepicker.js new file mode 100644 index 000000000..d452df3ef --- /dev/null +++ b/inc/lang/ms/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Malaysian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['ms'] = { + closeText: 'Tutup', + prevText: '<Sebelum', + nextText: 'Selepas>', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Mac','April','Mei','Jun', + 'Julai','Ogos','September','Oktober','November','Disember'], + monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun', + 'Jul','Ogo','Sep','Okt','Nov','Dis'], + dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'], + dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'], + dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['ms']); + +return datepicker.regional['ms']; + +})); diff --git a/inc/lang/ms/lang.php b/inc/lang/ms/lang.php index 02c0e2c91..303116429 100644 --- a/inc/lang/ms/lang.php +++ b/inc/lang/ms/lang.php @@ -47,7 +47,7 @@ $lang['btn_revert'] = 'Pulihkan'; $lang['btn_register'] = 'Daftaran'; $lang['btn_apply'] = 'Simpan'; $lang['btn_media'] = 'Manager media'; -$lang['loggedinas'] = 'Log masuk sebagai'; +$lang['loggedinas'] = 'Log masuk sebagai:'; $lang['user'] = 'Nama pengguna'; $lang['pass'] = 'Kata laluan'; $lang['newpass'] = 'Kata laluan baru'; @@ -83,10 +83,10 @@ $lang['license'] = 'Selain daripada yang dinyata, isi wiki ini dis $lang['licenseok'] = 'Perhatian: Dengan menyunting halaman ini, anda setuju untuk isi-isi anda dilesen menggunakan lesen berikut:'; $lang['searchmedia'] = 'Cari nama fail:'; $lang['searchmedia_in'] = 'Cari di %s'; -$lang['txt_upload'] = 'Pilih fail untuk diunggah'; -$lang['txt_filename'] = 'Unggah fail dengan nama (tidak wajib)'; +$lang['txt_upload'] = 'Pilih fail untuk diunggah:'; +$lang['txt_filename'] = 'Unggah fail dengan nama (tidak wajib):'; $lang['txt_overwrt'] = 'Timpa fail sekarang'; -$lang['lockedby'] = 'Halaman ini telah di'; +$lang['lockedby'] = 'Halaman ini telah di:'; $lang['fileupload'] = 'Muat naik fail'; $lang['uploadsucc'] = 'Pemuatan naik berjaya'; $lang['uploadfail'] = 'Ralat muat naik'; diff --git a/inc/lang/ne/denied.txt b/inc/lang/ne/denied.txt index ab4bcf290..5c58cde28 100644 --- a/inc/lang/ne/denied.txt +++ b/inc/lang/ne/denied.txt @@ -1,3 +1,4 @@ ====== अनुमति अमान्य ====== -माफ गर्नुहोला तपाईलाई अगाडि बढ्न अनुमति छैन। सम्भवत: तपाईले प्रवेश गर्न भुल्नु भयो।
\ No newline at end of file +माफ गर्नुहोला तपाईलाई अगाडि बढ्न अनुमति छैन। + diff --git a/inc/lang/ne/lang.php b/inc/lang/ne/lang.php index 7fd14d2c5..d4efc89bd 100644 --- a/inc/lang/ne/lang.php +++ b/inc/lang/ne/lang.php @@ -44,7 +44,7 @@ $lang['btn_draft'] = ' ड्राफ्ट सम्पादन $lang['btn_recover'] = 'पहिलेको ड्राफ्ट हासिल गर्नुहोस '; $lang['btn_draftdel'] = ' ड्राफ्ट मेटाउनुहोस् '; $lang['btn_register'] = 'दर्ता गर्नुहोस्'; -$lang['loggedinas'] = 'प्रवेश गर्नुहोस् '; +$lang['loggedinas'] = 'प्रवेश गर्नुहोस् :'; $lang['user'] = 'प्रयोगकर्ता '; $lang['pass'] = 'प्रवेशशव्द'; $lang['newpass'] = 'नयाँ प्रवेशशव्द'; @@ -58,6 +58,7 @@ $lang['badlogin'] = 'माफ गर्नुहोस् , प् $lang['minoredit'] = 'सामान्य परिवर्तन'; $lang['draftdate'] = 'ड्राफ्ट स्वचालित रुपमा वचत भएको'; $lang['nosecedit'] = 'यो पृष्ठ यसै बखतमा परिवर्तन भयो, खण्ड जानकारी अध्यावधिक हुन सकेन र पूरै पृष्ठ लोड भयो । '; +$lang['searchcreatepage'] = 'यदि तपाईले आफुले खोजेको पाउनुभएन भने, तपाईलेको उपयुक्त बटन प्रयोग गरी खोज सँग सम्बन्धित शिर्षकहरु भएका पृष्ठ सृजना या सम्पादन गर्न सक्नुहुन्छ ।'; $lang['regmissing'] = 'माफ गर्नुहोला , सबै ठाउमा भर्नुपर्नेछ ।'; $lang['reguexists'] = 'यो नामको प्रयोगकर्ता पहिले देखि रहेको छ।'; $lang['regsuccess'] = 'यो प्रयोगकर्ता बनाइएको छ र प्रवेशशव्द इमेलमा पठइएको छ।'; @@ -80,10 +81,10 @@ $lang['resendpwdconfirm'] = 'तपाईको इमेलमा कन $lang['resendpwdsuccess'] = 'तपाईको प्रवेशशव्द इमेलबाट पठाइएको छ। '; $lang['license'] = 'खुलाइएको बाहेक, यस विकिका विषयवस्तुहरु निम्त प्रमाण द्वारा प्रमाणिक गरिएको छ।'; $lang['licenseok'] = 'नोट: यस पृष्ठ सम्पादन गरी तपाईले आफ्नो विषयवस्तु तलको प्रमाण पत्र अन्तर्गत प्रमाणिक गर्न राजी हुनु हुनेछ ।'; -$lang['txt_upload'] = 'अपलोड गर्नलाई फाइल छा्न्नुहो्स्'; -$lang['txt_filename'] = 'अर्को रुपमा अपलोड गर्नुहोस् (ऐच्छिक)'; +$lang['txt_upload'] = 'अपलोड गर्नलाई फाइल छा्न्नुहो्स्:'; +$lang['txt_filename'] = 'अर्को रुपमा अपलोड गर्नुहोस् (ऐच्छिक):'; $lang['txt_overwrt'] = 'रहेको उहि नामको फाइललाई मेटाउने'; -$lang['lockedby'] = 'अहिले ताल्चा लगाइएको'; +$lang['lockedby'] = 'अहिले ताल्चा लगाइएको:'; $lang['lockexpire'] = 'ताल्चा अवधि सकिने :'; $lang['js']['willexpire'] = 'तपाईलले यो पृष्ठ सम्पादन गर्न लगाउनु भएको ताल्चाको अवधि एक मिनेट भित्र सकिदै छ। \n द्वन्द हुन नदिन पूर्वरुप वा ताल्चा समय परिवर्तन गर्नुहोस् ।'; $lang['js']['notsavedyet'] = 'तपाईले वचन गर्नु नभएको परिवर्रन हराउने छ। \n साच्चै जारी गर्नुहुन्छ ।'; @@ -123,9 +124,9 @@ $lang['yours'] = 'तपाईको संस्करण'; $lang['diff'] = 'हालको संस्करण सँगको भिन्नता'; $lang['diff2'] = 'रोजिएका संस्करण वीचका भिन्नताहरु '; $lang['line'] = 'हरफ'; -$lang['breadcrumb'] = 'छुट्ट्याउनुहोस् '; -$lang['youarehere'] = 'तपाई यहा हुनुहुन्छ'; -$lang['lastmod'] = 'अन्तिम पटक सच्याइएको'; +$lang['breadcrumb'] = 'छुट्ट्याउनुहोस् :'; +$lang['youarehere'] = 'तपाई यहा हुनुहुन्छ:'; +$lang['lastmod'] = 'अन्तिम पटक सच्याइएको:'; $lang['by'] = 'द्वारा '; $lang['deleted'] = 'हटाइएको'; $lang['created'] = 'निर्माण गरिएको'; @@ -158,17 +159,17 @@ $lang['admin_register'] = 'नयाँ प्रयोगकर्ता $lang['metaedit'] = 'मेटाडेटा सम्पादन गर्नुहोस्'; $lang['metasaveerr'] = 'मेटाडाटा लेखन असफल'; $lang['metasaveok'] = 'मेटाडाटा वचत भयो '; -$lang['img_backto'] = 'फिर्ता'; -$lang['img_title'] = 'शिर्षक'; -$lang['img_caption'] = 'निम्न लेख'; -$lang['img_date'] = 'मिति'; -$lang['img_fname'] = 'फाइलनाम'; -$lang['img_fsize'] = 'आकार'; -$lang['img_artist'] = 'चित्रकार'; -$lang['img_copyr'] = 'सर्वाधिकार'; -$lang['img_format'] = 'ढाचा'; -$lang['img_camera'] = 'क्यामेरा'; -$lang['img_keywords'] = 'खोज शब्द'; +$lang['btn_img_backto'] = 'फिर्ता%s'; +$lang['img_title'] = 'शिर्षक:'; +$lang['img_caption'] = 'निम्न लेख:'; +$lang['img_date'] = 'मिति:'; +$lang['img_fname'] = 'फाइलनाम:'; +$lang['img_fsize'] = 'आकार:'; +$lang['img_artist'] = 'चित्रकार:'; +$lang['img_copyr'] = 'सर्वाधिकार:'; +$lang['img_format'] = 'ढाचा:'; +$lang['img_camera'] = 'क्यामेरा:'; +$lang['img_keywords'] = 'खोज शब्द:'; $lang['authtempfail'] = 'प्रयोगकर्ता प्रामाणिकरण अस्थाइरुपमा अनुपलब्ध छ। यदि यो समस्या रहि रहेमा तपाईको विकि एड्मिनलाई खवर गर्नुहोला ।'; $lang['i_chooselang'] = 'भाषा छान्नुहोस् '; $lang['i_installer'] = 'DokuWiki स्थापक'; diff --git a/inc/lang/ne/searchpage.txt b/inc/lang/ne/searchpage.txt index a8139f0ab..021306b4b 100644 --- a/inc/lang/ne/searchpage.txt +++ b/inc/lang/ne/searchpage.txt @@ -1,3 +1,5 @@ ====== खोज ====== -तपाईले आफ्नो खोजको निम्न नतिजा पाउन सक्नुहुन्छ। यदि तपाईले आफुले खोजेको पाउनुभएन भने, तपाईलेको उपयुक्त बटन प्रयोग गरी खोज सँग सम्बन्धित शिर्षकहरु भएका पृष्ठ सृजना या सम्पादन गर्न सक्नुहुन्छ । + +तपाईले आफ्नो खोजको निम्न नतिजा पाउन सक्नुहुन्छ। @CREATEPAGEINFO@ + ===== नतिजा =====
\ No newline at end of file diff --git a/inc/lang/nl/denied.txt b/inc/lang/nl/denied.txt index 6a8bf773f..a172ddab6 100644 --- a/inc/lang/nl/denied.txt +++ b/inc/lang/nl/denied.txt @@ -1,3 +1,4 @@ ====== Toegang geweigerd ====== -Sorry: je hebt niet voldoende rechten om verder te gaan. Misschien ben je vergeten in te loggen? +Sorry: je hebt niet voldoende rechten om verder te gaan. + diff --git a/inc/lang/nl/edit.txt b/inc/lang/nl/edit.txt index 9718d0900..88a15cfe4 100644 --- a/inc/lang/nl/edit.txt +++ b/inc/lang/nl/edit.txt @@ -1 +1 @@ -Pas de pagina aan en klik op ''Opslaan''. Zie [[wiki:syntax]] voor de Wiki-syntax. Pas de pagina allen aan als hij **verbeterd** kan worden. Als je iets wilt uitproberen kun je spelen in de [[playground:playground|zandbak]]. +Pas de pagina aan en klik op ''Opslaan''. Zie [[wiki:syntax]] voor de Wiki-syntax. Pas de pagina alleen aan als hij **verbeterd** kan worden. Als je iets wilt uitproberen kun je spelen in de [[playground:playground|zandbak]]. diff --git a/inc/lang/nl/jquery.ui.datepicker.js b/inc/lang/nl/jquery.ui.datepicker.js new file mode 100644 index 000000000..9be14bb2a --- /dev/null +++ b/inc/lang/nl/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens <http://mathiasbynens.be/> */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional.nl = { + closeText: 'Sluiten', + prevText: '←', + nextText: '→', + currentText: 'Vandaag', + monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', + 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', + 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'], + dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + weekHeader: 'Wk', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional.nl); + +return datepicker.regional.nl; + +})); diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php index 227448cc9..4c668557d 100644 --- a/inc/lang/nl/lang.php +++ b/inc/lang/nl/lang.php @@ -21,14 +21,18 @@ * @author Gerrit Uitslag <klapinklapin@gmail.com> * @author Klap-in <klapinklapin@gmail.com> * @author Remon <no@email.local> + * @author gicalle <gicalle@hotmail.com> + * @author Rene <wllywlnt@yahoo.com> + * @author Johan Vervloet <johan.vervloet@gmail.com> + * @author Mijndert <mijndert@mijndertstuij.nl> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; -$lang['doublequoteopening'] = '„'; +$lang['doublequoteopening'] = '“'; $lang['doublequoteclosing'] = '”'; -$lang['singlequoteopening'] = '‚'; +$lang['singlequoteopening'] = '‘'; $lang['singlequoteclosing'] = '’'; -$lang['apostrophe'] = '\''; +$lang['apostrophe'] = '’'; $lang['btn_edit'] = 'Pagina aanpassen'; $lang['btn_source'] = 'Toon broncode'; $lang['btn_show'] = 'Toon pagina'; @@ -65,7 +69,9 @@ $lang['btn_register'] = 'Registreren'; $lang['btn_apply'] = 'Toepassen'; $lang['btn_media'] = 'Mediabeheerder'; $lang['btn_deleteuser'] = 'Verwijder mijn account'; -$lang['loggedinas'] = 'Ingelogd als'; +$lang['btn_img_backto'] = 'Terug naar %s'; +$lang['btn_mediaManager'] = 'In mediabeheerder bekijken'; +$lang['loggedinas'] = 'Ingelogd als:'; $lang['user'] = 'Gebruikersnaam'; $lang['pass'] = 'Wachtwoord'; $lang['newpass'] = 'Nieuw wachtwoord'; @@ -80,6 +86,7 @@ $lang['badpassconfirm'] = 'Sorry, het wachtwoord was onjuist'; $lang['minoredit'] = 'Kleine wijziging'; $lang['draftdate'] = 'Concept automatisch opgeslagen op'; $lang['nosecedit'] = 'De pagina is tussentijds veranderd, sectie-informatie was verouderd, volledige pagina geladen.'; +$lang['searchcreatepage'] = 'Niks gevonden? Maak een nieuwe pagina met als naam je zoekopdracht. Klik hiervoor op \'\'Maak deze pagina aan\'\'.'; $lang['regmissing'] = 'Vul alle velden in'; $lang['reguexists'] = 'Er bestaat al een gebruiker met deze loginnaam.'; $lang['regsuccess'] = 'De gebruiker is aangemaakt. Het wachtwoord is per e-mail verzonden.'; @@ -110,12 +117,12 @@ $lang['license'] = 'Tenzij anders vermeld valt de inhoud van deze $lang['licenseok'] = 'Let op: Door deze pagina aan te passen geef je de inhoud vrij onder de volgende licentie:'; $lang['searchmedia'] = 'Bestandsnaam zoeken:'; $lang['searchmedia_in'] = 'Zoek in %s'; -$lang['txt_upload'] = 'Selecteer een bestand om te uploaden'; -$lang['txt_filename'] = 'Vul nieuwe naam in (optioneel)'; +$lang['txt_upload'] = 'Selecteer een bestand om te uploaden:'; +$lang['txt_filename'] = 'Vul nieuwe naam in (optioneel):'; $lang['txt_overwrt'] = 'Overschrijf bestaand bestand'; $lang['maxuploadsize'] = 'Max %s per bestand'; -$lang['lockedby'] = 'Momenteel in gebruik door'; -$lang['lockexpire'] = 'Exclusief gebruiksrecht vervalt op'; +$lang['lockedby'] = 'Momenteel in gebruik door:'; +$lang['lockexpire'] = 'Exclusief gebruiksrecht vervalt op:'; $lang['js']['willexpire'] = 'Je exclusieve gebruiksrecht voor het aanpassen van deze pagina verloopt over een minuut.\nKlik op de Voorbeeld-knop om het exclusieve gebruiksrecht te verlengen.'; $lang['js']['notsavedyet'] = 'Nog niet bewaarde wijzigingen zullen verloren gaan. Weet je zeker dat je wilt doorgaan?'; @@ -196,10 +203,15 @@ $lang['difflink'] = 'Link naar deze vergelijking'; $lang['diff_type'] = 'Bekijk verschillen:'; $lang['diff_inline'] = 'Inline'; $lang['diff_side'] = 'Zij aan zij'; +$lang['diffprevrev'] = 'Vorige revisie'; +$lang['diffnextrev'] = 'Volgende revisie'; +$lang['difflastrev'] = 'Laatste revisie'; +$lang['diffbothprevrev'] = 'Beide kanten vorige revisie'; +$lang['diffbothnextrev'] = 'Beide kanten volgende revisie'; $lang['line'] = 'Regel'; -$lang['breadcrumb'] = 'Spoor'; -$lang['youarehere'] = 'Je bent hier'; -$lang['lastmod'] = 'Laatst gewijzigd'; +$lang['breadcrumb'] = 'Spoor:'; +$lang['youarehere'] = 'Je bent hier:'; +$lang['lastmod'] = 'Laatst gewijzigd:'; $lang['by'] = 'door'; $lang['deleted'] = 'verwijderd'; $lang['created'] = 'aangemaakt'; @@ -252,20 +264,18 @@ $lang['admin_register'] = 'Nieuwe gebruiker toevoegen'; $lang['metaedit'] = 'Metadata wijzigen'; $lang['metasaveerr'] = 'Schrijven van metadata mislukt'; $lang['metasaveok'] = 'Metadata bewaard'; -$lang['img_backto'] = 'Terug naar'; -$lang['img_title'] = 'Titel'; -$lang['img_caption'] = 'Bijschrift'; -$lang['img_date'] = 'Datum'; -$lang['img_fname'] = 'Bestandsnaam'; -$lang['img_fsize'] = 'Grootte'; -$lang['img_artist'] = 'Fotograaf'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Formaat'; -$lang['img_camera'] = 'Camera'; -$lang['img_keywords'] = 'Trefwoorden'; -$lang['img_width'] = 'Breedte'; -$lang['img_height'] = 'Hoogte'; -$lang['img_manager'] = 'In mediabeheerder bekijken'; +$lang['img_title'] = 'Titel:'; +$lang['img_caption'] = 'Bijschrift:'; +$lang['img_date'] = 'Datum:'; +$lang['img_fname'] = 'Bestandsnaam:'; +$lang['img_fsize'] = 'Grootte:'; +$lang['img_artist'] = 'Fotograaf:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Formaat:'; +$lang['img_camera'] = 'Camera:'; +$lang['img_keywords'] = 'Trefwoorden:'; +$lang['img_width'] = 'Breedte:'; +$lang['img_height'] = 'Hoogte:'; $lang['subscr_subscribe_success'] = '%s is ingeschreven voor %s'; $lang['subscr_subscribe_error'] = 'Fout bij inschrijven van %s voor %s'; $lang['subscr_subscribe_noaddress'] = 'Er is geen e-mailadres gekoppeld aan uw account, u kunt daardoor niet worden ingeschreven.'; @@ -293,6 +303,7 @@ $lang['i_problems'] = 'De installer vond problemen, hieronder aangege $lang['i_modified'] = 'Uit veiligheidsoverwegingen werkt dit script alleen met nieuwe en onveranderde DokuWiki-installaties. Pak de bestanden opnieuw uit of raadpleeg de <a href="http://dokuwiki.org/install">Dokuwiki installatie-instructies</a>'; $lang['i_funcna'] = 'PHP functie <code>%s</code> is niet beschikbaar. Wellicht heeft je hosting provider deze uitgeschakeld?'; $lang['i_phpver'] = 'PHP-versie <code>%s</code> is lager dan de vereiste <code>%s</code>. Upgrade PHP.'; +$lang['i_mbfuncoverload'] = 'Om DokuWiki te draaien moet mbstring.func_overload uitgeschakeld zijn in php.ini.'; $lang['i_permfail'] = '<code>%s</code> is niet schrijfbaar voor DokuWiki. Pas de permissie-instellingen van deze directory aan.'; $lang['i_confexists'] = '<code>%s</code> bestaat reeds'; $lang['i_writeerr'] = 'Niet mogelijk om <code>%s</code> aan te maken. Controleer de directory/bestandspermissies en maak het bestand handmatig aan.'; diff --git a/inc/lang/nl/searchpage.txt b/inc/lang/nl/searchpage.txt index 3ace704c8..e03679b2b 100644 --- a/inc/lang/nl/searchpage.txt +++ b/inc/lang/nl/searchpage.txt @@ -1,5 +1,5 @@ ====== Zoeken ====== -Hieronder zijn de resultaten van de zoekopdracht. Niks gevonden? Maak een nieuwe pagina met als naam je zoekopdracht. Klik hiervoor op ''Pagina aanpassen''. +Hieronder zijn de resultaten van de zoekopdracht. @CREATEPAGEINFO@ ===== Resultaten ===== diff --git a/inc/lang/no/denied.txt b/inc/lang/no/denied.txt index 6e7f1f28b..f60f48f6b 100644 --- a/inc/lang/no/denied.txt +++ b/inc/lang/no/denied.txt @@ -1,3 +1,4 @@ ====== Adgang forbudt ====== -Beklager, men du har ikke rettigheter til dette. Kanskje du har glemt å logge inn? +Beklager, men du har ikke rettigheter til dette. + diff --git a/inc/lang/no/jquery.ui.datepicker.js b/inc/lang/no/jquery.ui.datepicker.js new file mode 100644 index 000000000..8917b6a26 --- /dev/null +++ b/inc/lang/no/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ + +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['no'] = { + closeText: 'Lukk', + prevText: '«Forrige', + nextText: 'Neste»', + currentText: 'I dag', + monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'], + monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'], + dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'], + dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'], + dayNamesMin: ['sø','ma','ti','on','to','fr','lø'], + weekHeader: 'Uke', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' +}; +datepicker.setDefaults(datepicker.regional['no']); + +return datepicker.regional['no']; + +})); diff --git a/inc/lang/no/lang.php b/inc/lang/no/lang.php index 3f31f6c73..ecf10ff5b 100644 --- a/inc/lang/no/lang.php +++ b/inc/lang/no/lang.php @@ -20,6 +20,8 @@ * @author Egil Hansen <egil@rosetta.no> * @author Thomas Juberg <Thomas.Juberg@Gmail.com> * @author Boris <boris@newton-media.no> + * @author Christopher Schive <chschive@frisurf.no> + * @author Patrick <spill.p@hotmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -64,7 +66,9 @@ $lang['btn_register'] = 'Registrer deg'; $lang['btn_apply'] = 'Bruk'; $lang['btn_media'] = 'Mediefiler'; $lang['btn_deleteuser'] = 'Fjern min konto'; -$lang['loggedinas'] = 'Innlogget som'; +$lang['btn_img_backto'] = 'Tilbake til %s'; +$lang['btn_mediaManager'] = 'Vis i mediefilbehandler'; +$lang['loggedinas'] = 'Innlogget som:'; $lang['user'] = 'Brukernavn'; $lang['pass'] = 'Passord'; $lang['newpass'] = 'Nytt passord'; @@ -79,6 +83,7 @@ $lang['badpassconfirm'] = 'Beklager, passordet var feil'; $lang['minoredit'] = 'Mindre endringer'; $lang['draftdate'] = 'Kladd autolagret'; $lang['nosecedit'] = 'Siden ble endret i mellomtiden, seksjonsinfo har blitt foreldet - lastet full side istedet.'; +$lang['searchcreatepage'] = 'Hvis du ikke finner det du leter etter, så kan du skape en ny side med samme navn som ditt søk ved å klikke på \'\'**Lag denne siden**\'\'-knappen.'; $lang['regmissing'] = 'Vennligst fyll ut alle felt.'; $lang['reguexists'] = 'Det finnes allerede en konto med dette brukernavnet.'; $lang['regsuccess'] = 'Brukerkonto har blitt laget og passord har blitt sendt via e-post.'; @@ -109,12 +114,12 @@ $lang['license'] = 'Der annet ikke er angitt, er innholdet på den $lang['licenseok'] = 'Merk: Ved å endre på denne siden godtar du at ditt innhold utgis under følgende lisens:'; $lang['searchmedia'] = 'Søk filnavn'; $lang['searchmedia_in'] = 'Søk i %s'; -$lang['txt_upload'] = 'Velg fil som skal lastes opp'; -$lang['txt_filename'] = 'Skriv inn wikinavn (alternativt)'; +$lang['txt_upload'] = 'Velg fil som skal lastes opp:'; +$lang['txt_filename'] = 'Skriv inn wikinavn (alternativt):'; $lang['txt_overwrt'] = 'Overskriv eksisterende fil'; -$lang['maxuploadsize'] = 'Opplast maks % per fil.'; -$lang['lockedby'] = 'Låst av'; -$lang['lockexpire'] = 'Låsingen utløper'; +$lang['maxuploadsize'] = 'Opplast maks %s per fil.'; +$lang['lockedby'] = 'Låst av:'; +$lang['lockexpire'] = 'Låsingen utløper:'; $lang['js']['willexpire'] = 'Din redigeringslås for dette dokumentet kommer snart til å utløpe.\nFor å unngå versjonskonflikter bør du forhåndsvise dokumentet ditt for å forlenge redigeringslåsen.'; $lang['js']['notsavedyet'] = 'Ulagrede endringer vil gå tapt! Vil du fortsette?'; @@ -195,10 +200,15 @@ $lang['difflink'] = 'Lenk til denne sammenligningen'; $lang['diff_type'] = 'Vis forskjeller:'; $lang['diff_inline'] = 'I teksten'; $lang['diff_side'] = 'Side ved side'; +$lang['diffprevrev'] = 'Forrige revisjon'; +$lang['diffnextrev'] = 'Neste revisjon'; +$lang['difflastrev'] = 'Siste revisjon'; +$lang['diffbothprevrev'] = 'Begge sider forrige revisjon'; +$lang['diffbothnextrev'] = 'Begge sider neste revisjon'; $lang['line'] = 'Linje'; -$lang['breadcrumb'] = 'Spor'; -$lang['youarehere'] = 'Du er her'; -$lang['lastmod'] = 'Sist endret'; +$lang['breadcrumb'] = 'Spor:'; +$lang['youarehere'] = 'Du er her:'; +$lang['lastmod'] = 'Sist endret:'; $lang['by'] = 'av'; $lang['deleted'] = 'fjernet'; $lang['created'] = 'opprettet'; @@ -251,20 +261,18 @@ $lang['admin_register'] = 'Legg til ny bruker'; $lang['metaedit'] = 'Rediger metadata'; $lang['metasaveerr'] = 'Skriving av metadata feilet'; $lang['metasaveok'] = 'Metadata lagret'; -$lang['img_backto'] = 'Tilbake til'; -$lang['img_title'] = 'Tittel'; -$lang['img_caption'] = 'Bildetekst'; -$lang['img_date'] = 'Dato'; -$lang['img_fname'] = 'Filnavn'; -$lang['img_fsize'] = 'Størrelse'; -$lang['img_artist'] = 'Fotograf'; -$lang['img_copyr'] = 'Opphavsrett'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Nøkkelord'; -$lang['img_width'] = 'Bredde'; -$lang['img_height'] = 'Høyde'; -$lang['img_manager'] = 'Vis i mediefilbehandler'; +$lang['img_title'] = 'Tittel:'; +$lang['img_caption'] = 'Bildetekst:'; +$lang['img_date'] = 'Dato:'; +$lang['img_fname'] = 'Filnavn:'; +$lang['img_fsize'] = 'Størrelse:'; +$lang['img_artist'] = 'Fotograf:'; +$lang['img_copyr'] = 'Opphavsrett:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Nøkkelord:'; +$lang['img_width'] = 'Bredde:'; +$lang['img_height'] = 'Høyde:'; $lang['subscr_subscribe_success'] = 'La til %s som abonnent på %s'; $lang['subscr_subscribe_error'] = 'Klarte ikke å legge til %s som abonnent på %s'; $lang['subscr_subscribe_noaddress'] = 'Brukeren din er ikke registrert med noen adresse. Du kan derfor ikke legges til som abonnent.'; @@ -348,3 +356,5 @@ $lang['media_restore'] = 'Gjenopprett denne versjonen'; $lang['currentns'] = 'gjeldende navnemellomrom'; $lang['searchresult'] = 'Søk i resultat'; $lang['plainhtml'] = 'Enkel HTML'; +$lang['wikimarkup'] = 'wiki-format'; +$lang['page_nonexist_rev'] = 'Finnes ingen side på %s. Den er derfor laget på <a href="%s">%s</a>'; diff --git a/inc/lang/no/resetpwd.txt b/inc/lang/no/resetpwd.txt new file mode 100644 index 000000000..2da717021 --- /dev/null +++ b/inc/lang/no/resetpwd.txt @@ -0,0 +1,3 @@ +====== Sett nytt passord ====== + +Vennligst skriv inn et nytt passord for din konto i denne wikien.
\ No newline at end of file diff --git a/inc/lang/no/searchpage.txt b/inc/lang/no/searchpage.txt index e94e7895b..2e7b0d887 100644 --- a/inc/lang/no/searchpage.txt +++ b/inc/lang/no/searchpage.txt @@ -1,5 +1,5 @@ ====== Søk ====== -Du ser resultatet av dette søket nedenfor. Hvis du ikke finner det du leter etter, så kan du skape en ny side med samme navn som ditt søk ved å klikke på ''**Lag denne siden**''-knappen. +Du ser resultatet av dette søket nedenfor. @CREATEPAGEINFO@ ===== Resultat ===== diff --git a/inc/lang/pl/denied.txt b/inc/lang/pl/denied.txt index d402463ef..2b268b921 100644 --- a/inc/lang/pl/denied.txt +++ b/inc/lang/pl/denied.txt @@ -1,4 +1,4 @@ ====== Brak dostępu ====== -Nie masz wystarczających uprawnień. Zaloguj się! +Nie masz wystarczających uprawnień. diff --git a/inc/lang/pl/jquery.ui.datepicker.js b/inc/lang/pl/jquery.ui.datepicker.js new file mode 100644 index 000000000..a04de8e8a --- /dev/null +++ b/inc/lang/pl/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['pl'] = { + closeText: 'Zamknij', + prevText: '<Poprzedni', + nextText: 'Następny>', + currentText: 'Dziś', + monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec', + 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'], + monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze', + 'Lip','Sie','Wrz','Pa','Lis','Gru'], + dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'], + dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'], + dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'], + weekHeader: 'Tydz', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['pl']); + +return datepicker.regional['pl']; + +})); diff --git a/inc/lang/pl/lang.php b/inc/lang/pl/lang.php index 142dd3baa..fa70db06c 100644 --- a/inc/lang/pl/lang.php +++ b/inc/lang/pl/lang.php @@ -15,6 +15,9 @@ * @author Begina Felicysym <begina.felicysym@wp.eu> * @author Aoi Karasu <aoikarasu@gmail.com> * @author Tomasz Bosak <bosak.tomasz@gmail.com> + * @author Paweł Jan Czochański <czochanski@gmail.com> + * @author Mati <mackosa@wp.pl> + * @author Maciej Helt <geraldziu@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -59,7 +62,9 @@ $lang['btn_register'] = 'Zarejestruj się!'; $lang['btn_apply'] = 'Zastosuj'; $lang['btn_media'] = 'Menadżer multimediów'; $lang['btn_deleteuser'] = 'Usuń moje konto'; -$lang['loggedinas'] = 'Zalogowany jako'; +$lang['btn_img_backto'] = 'Wróć do %s'; +$lang['btn_mediaManager'] = 'Zobacz w menadżerze multimediów'; +$lang['loggedinas'] = 'Zalogowany jako:'; $lang['user'] = 'Użytkownik'; $lang['pass'] = 'Hasło'; $lang['newpass'] = 'Nowe hasło'; @@ -74,6 +79,7 @@ $lang['badpassconfirm'] = 'Niestety, hasło jest niepoprawne.'; $lang['minoredit'] = 'Mniejsze zmiany'; $lang['draftdate'] = 'Czas zachowania szkicu'; $lang['nosecedit'] = 'Strona została zmodyfikowana, sekcje zostały zmienione. Załadowano całą stronę.'; +$lang['searchcreatepage'] = 'Jeśli nie znaleziono szukanego hasła, możesz utworzyć nową stronę, której tytułem będzie poszukiwane hasło.'; $lang['regmissing'] = 'Wypełnij wszystkie pola.'; $lang['reguexists'] = 'Użytkownik o tej nazwie już istnieje.'; $lang['regsuccess'] = 'Utworzono użytkownika. Hasło zostało przesłane pocztą.'; @@ -104,12 +110,12 @@ $lang['license'] = 'Wszystkie treści w tym wiki, którym nie przy $lang['licenseok'] = 'Uwaga: edytując tę stronę zgadzasz się na publikowanie jej treści pod licencją:'; $lang['searchmedia'] = 'Szukaj pliku o nazwie:'; $lang['searchmedia_in'] = 'Szukaj w %s'; -$lang['txt_upload'] = 'Wybierz plik do wysłania'; -$lang['txt_filename'] = 'Nazwa pliku (opcjonalnie)'; +$lang['txt_upload'] = 'Wybierz plik do wysłania:'; +$lang['txt_filename'] = 'Nazwa pliku (opcjonalnie):'; $lang['txt_overwrt'] = 'Nadpisać istniejący plik?'; $lang['maxuploadsize'] = 'Maksymalny rozmiar wysyłanych danych wynosi %s dla jednego pliku.'; -$lang['lockedby'] = 'Aktualnie zablokowane przez'; -$lang['lockexpire'] = 'Blokada wygasa'; +$lang['lockedby'] = 'Aktualnie zablokowane przez:'; +$lang['lockexpire'] = 'Blokada wygasa:'; $lang['js']['willexpire'] = 'Twoja blokada edycji tej strony wygaśnie w ciągu minuty. \nW celu uniknięcia konfliktów użyj przycisku podglądu aby odnowić blokadę.'; $lang['js']['notsavedyet'] = 'Nie zapisane zmiany zostaną utracone. Czy na pewno kontynuować?'; @@ -190,10 +196,13 @@ $lang['difflink'] = 'Odnośnik do tego porównania'; $lang['diff_type'] = 'Zobacz różnice:'; $lang['diff_inline'] = 'W linii'; $lang['diff_side'] = 'Jeden obok drugiego'; +$lang['diffprevrev'] = 'Poprzednia wersja'; +$lang['diffnextrev'] = 'Nowa wersja'; +$lang['difflastrev'] = 'Ostatnia wersja'; $lang['line'] = 'Linia'; -$lang['breadcrumb'] = 'Ślad'; -$lang['youarehere'] = 'Jesteś tutaj'; -$lang['lastmod'] = 'ostatnio zmienione'; +$lang['breadcrumb'] = 'Ślad:'; +$lang['youarehere'] = 'Jesteś tutaj:'; +$lang['lastmod'] = 'ostatnio zmienione:'; $lang['by'] = 'przez'; $lang['deleted'] = 'usunięto'; $lang['created'] = 'utworzono'; @@ -246,20 +255,18 @@ $lang['admin_register'] = 'Dodawanie użytkownika'; $lang['metaedit'] = 'Edytuj metadane'; $lang['metasaveerr'] = 'Zapis metadanych nie powiódł się'; $lang['metasaveok'] = 'Metadane zapisano'; -$lang['img_backto'] = 'Wróć do'; -$lang['img_title'] = 'Tytuł'; -$lang['img_caption'] = 'Nagłówek'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Nazwa pliku'; -$lang['img_fsize'] = 'Rozmiar'; -$lang['img_artist'] = 'Fotograf'; -$lang['img_copyr'] = 'Prawa autorskie'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Aparat'; -$lang['img_keywords'] = 'Słowa kluczowe'; -$lang['img_width'] = 'Szerokość'; -$lang['img_height'] = 'Wysokość'; -$lang['img_manager'] = 'Zobacz w menadżerze multimediów'; +$lang['img_title'] = 'Tytuł:'; +$lang['img_caption'] = 'Nagłówek:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Nazwa pliku:'; +$lang['img_fsize'] = 'Rozmiar:'; +$lang['img_artist'] = 'Fotograf:'; +$lang['img_copyr'] = 'Prawa autorskie:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Aparat:'; +$lang['img_keywords'] = 'Słowa kluczowe:'; +$lang['img_width'] = 'Szerokość:'; +$lang['img_height'] = 'Wysokość:'; $lang['subscr_subscribe_success'] = 'Dodano %s do listy subskrypcji %s'; $lang['subscr_subscribe_error'] = 'Błąd podczas dodawania %s do listy subskrypcji %s'; $lang['subscr_subscribe_noaddress'] = 'Brak adresu skojarzonego z twoim loginem, nie możesz zostać dodany(a) do listy subskrypcji'; @@ -288,6 +295,7 @@ $lang['i_modified'] = 'Ze względów bezpieczeństwa, ten skrypt dzia Aby uruchomić instalator ponownie, rozpakuj archiwum DokuWiki lub zapoznaj się z <a href="http://dokuwiki.org/install">instrukcją instalacji Dokuwiki</a>'; $lang['i_funcna'] = 'Funkcja PHP <code>%s</code> jest niedostępna.'; $lang['i_phpver'] = 'Wersja PHP <code>%s</code> jest niższa od wymaganej <code>%s</code>. Zaktualizuj instalację PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload musi zostać wyłączone w pliku php.ini aby móc uruchomić DokuWiki.'; $lang['i_permfail'] = 'DokuWiki nie ma prawa zapisu w katalogu <code>%s</code>. Zmień uprawnienia zapisu dla tego katalogu!'; $lang['i_confexists'] = '<code>%s</code> już istnieje'; $lang['i_writeerr'] = 'Nie można utworzyć <code>%s</code>. Sprawdź uprawnienia do katalogu lub pliku i stwórz plik ręcznie.'; @@ -324,7 +332,7 @@ $lang['media_list_thumbs'] = 'Miniatury'; $lang['media_list_rows'] = 'Wiersze'; $lang['media_sort_name'] = 'Nazwa'; $lang['media_sort_date'] = 'Data'; -$lang['media_namespaces'] = 'Wybierz przestrzeń nazw'; +$lang['media_namespaces'] = 'Wybierz katalog'; $lang['media_files'] = 'Pliki w %s'; $lang['media_upload'] = 'Przesyłanie plików na %s'; $lang['media_search'] = 'Znajdź w %s'; @@ -337,6 +345,7 @@ $lang['media_perm_read'] = 'Przepraszamy, nie masz wystarczających uprawn $lang['media_perm_upload'] = 'Przepraszamy, nie masz wystarczających uprawnień do przesyłania plików.'; $lang['media_update'] = 'Prześlij nową wersję'; $lang['media_restore'] = 'Odtwórz tą wersję'; -$lang['currentns'] = 'Obecna przestrzeń nazw.'; +$lang['currentns'] = 'Obecny katalog'; $lang['searchresult'] = 'Wyniki wyszukiwania'; $lang['plainhtml'] = 'Czysty HTML'; +$lang['wikimarkup'] = 'Znaczniki'; diff --git a/inc/lang/pl/searchpage.txt b/inc/lang/pl/searchpage.txt index 61b9ffbf9..442975fe1 100644 --- a/inc/lang/pl/searchpage.txt +++ b/inc/lang/pl/searchpage.txt @@ -1,5 +1,5 @@ ====== Wyszukiwanie ====== -Wyniki wyszukiwania. Jeśli nie znaleziono szukanego hasła, możesz utworzyć nową stronę, której tytułem będzie poszukiwane hasło. +Wyniki wyszukiwania. @CREATEPAGEINFO@ ===== Wyniki ===== diff --git a/inc/lang/pt-br/denied.txt b/inc/lang/pt-br/denied.txt index d7e423f42..9a71df619 100644 --- a/inc/lang/pt-br/denied.txt +++ b/inc/lang/pt-br/denied.txt @@ -1,3 +1,4 @@ ====== Permissão Negada ====== -Desculpe, você não tem permissões suficientes para continuar. Por acaso esqueceu de autenticar-se? +Desculpe, você não tem permissões suficientes para continuar. + diff --git a/inc/lang/pt-br/jquery.ui.datepicker.js b/inc/lang/pt-br/jquery.ui.datepicker.js new file mode 100644 index 000000000..d6bd89907 --- /dev/null +++ b/inc/lang/pt-br/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['pt-BR'] = { + closeText: 'Fechar', + prevText: '<Anterior', + nextText: 'Próximo>', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['pt-BR']); + +return datepicker.regional['pt-BR']; + +})); diff --git a/inc/lang/pt-br/lang.php b/inc/lang/pt-br/lang.php index 6845e792d..be62af6fe 100644 --- a/inc/lang/pt-br/lang.php +++ b/inc/lang/pt-br/lang.php @@ -23,6 +23,7 @@ * @author Leone Lisboa Magevski <leone1983@gmail.com> * @author Dário Estevão <darioems@gmail.com> * @author Juliano Marconi Lanigra <juliano.marconi@gmail.com> + * @author Ednei <leuloch@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -67,7 +68,9 @@ $lang['btn_register'] = 'Cadastre-se'; $lang['btn_apply'] = 'Aplicar'; $lang['btn_media'] = 'Gerenciador de mídias'; $lang['btn_deleteuser'] = 'Remover minha conta'; -$lang['loggedinas'] = 'Identificado(a) como'; +$lang['btn_img_backto'] = 'Voltar para %s'; +$lang['btn_mediaManager'] = 'Ver no gerenciador de mídias'; +$lang['loggedinas'] = 'Identificado(a) como:'; $lang['user'] = 'Nome de usuário'; $lang['pass'] = 'Senha'; $lang['newpass'] = 'Nova senha'; @@ -82,6 +85,7 @@ $lang['badpassconfirm'] = 'Desculpe, mas a senha está errada '; $lang['minoredit'] = 'Alterações mínimas'; $lang['draftdate'] = 'O rascunho foi salvo automaticamente em'; $lang['nosecedit'] = 'A página foi modificada nesse intervalo de tempo. Como a informação da seção estava desatualizada, foi carregada a página inteira.'; +$lang['searchcreatepage'] = 'Se você não encontrou o que está procurando, pode criar ou editar a página com o nome que você especificou, usando o botão apropriado.'; $lang['regmissing'] = 'Desculpe, mas você precisa preencher todos os campos.'; $lang['reguexists'] = 'Desculpe, mas já existe um usuário com esse nome.'; $lang['regsuccess'] = 'O usuário foi criado e a senha enviada para seu e-mail.'; @@ -112,12 +116,12 @@ $lang['license'] = 'Exceto onde for informado ao contrário, o con $lang['licenseok'] = 'Observe: editando esta página você aceita disponibilizar o seu conteúdo sob a seguinte licença:'; $lang['searchmedia'] = 'Buscar arquivo:'; $lang['searchmedia_in'] = 'Buscar em %s'; -$lang['txt_upload'] = 'Selecione o arquivo a ser enviado'; -$lang['txt_filename'] = 'Enviar como (opcional)'; +$lang['txt_upload'] = 'Selecione o arquivo a ser enviado:'; +$lang['txt_filename'] = 'Enviar como (opcional):'; $lang['txt_overwrt'] = 'Substituir o arquivo existente'; $lang['maxuploadsize'] = 'Tamanho máximo de %s por arquivo.'; -$lang['lockedby'] = 'Atualmente bloqueada por'; -$lang['lockexpire'] = 'O bloqueio expira em'; +$lang['lockedby'] = 'Atualmente bloqueada por:'; +$lang['lockexpire'] = 'O bloqueio expira em:'; $lang['js']['willexpire'] = 'O seu bloqueio de edição deste página irá expirar em um minuto.\nPara evitar conflitos de edição, clique no botão de visualização para reiniciar o temporizador de bloqueio.'; $lang['js']['notsavedyet'] = 'As alterações não salvas serão perdidas. Deseja realmente continuar?'; @@ -198,10 +202,15 @@ $lang['difflink'] = 'Link para esta página de comparações'; $lang['diff_type'] = 'Ver as diferenças:'; $lang['diff_inline'] = 'Mescladas'; $lang['diff_side'] = 'Lado a lado'; +$lang['diffprevrev'] = 'Revisão anterior'; +$lang['diffnextrev'] = 'Próxima revisão'; +$lang['difflastrev'] = 'Última revisão'; +$lang['diffbothprevrev'] = 'Ambos lados da revisão anterior'; +$lang['diffbothnextrev'] = 'Ambos lados da revisão seguinte'; $lang['line'] = 'Linha'; -$lang['breadcrumb'] = 'Visitou'; -$lang['youarehere'] = 'Você está aqui'; -$lang['lastmod'] = 'Última modificação'; +$lang['breadcrumb'] = 'Visitou:'; +$lang['youarehere'] = 'Você está aqui:'; +$lang['lastmod'] = 'Última modificação:'; $lang['by'] = 'por'; $lang['deleted'] = 'removida'; $lang['created'] = 'criada'; @@ -254,20 +263,18 @@ $lang['admin_register'] = 'Adicionar novo usuário'; $lang['metaedit'] = 'Editar metadados'; $lang['metasaveerr'] = 'Não foi possível escrever os metadados'; $lang['metasaveok'] = 'Os metadados foram salvos'; -$lang['img_backto'] = 'Voltar para'; -$lang['img_title'] = 'Título'; -$lang['img_caption'] = 'Descrição'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Nome do arquivo'; -$lang['img_fsize'] = 'Tamanho'; -$lang['img_artist'] = 'Fotógrafo'; -$lang['img_copyr'] = 'Direitos autorais'; -$lang['img_format'] = 'Formato'; -$lang['img_camera'] = 'Câmera'; -$lang['img_keywords'] = 'Palavras-chave'; -$lang['img_width'] = 'Largura'; -$lang['img_height'] = 'Altura'; -$lang['img_manager'] = 'Ver no gerenciador de mídias'; +$lang['img_title'] = 'Título:'; +$lang['img_caption'] = 'Descrição:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Nome do arquivo:'; +$lang['img_fsize'] = 'Tamanho:'; +$lang['img_artist'] = 'Fotógrafo:'; +$lang['img_copyr'] = 'Direitos autorais:'; +$lang['img_format'] = 'Formato:'; +$lang['img_camera'] = 'Câmera:'; +$lang['img_keywords'] = 'Palavras-chave:'; +$lang['img_width'] = 'Largura:'; +$lang['img_height'] = 'Altura:'; $lang['subscr_subscribe_success'] = 'Adicionado %s à lista de monitoramentos de %s'; $lang['subscr_subscribe_error'] = 'Ocorreu um erro na adição de %s à lista de monitoramentos de %s'; $lang['subscr_subscribe_noaddress'] = 'Como não há nenhum endereço associado ao seu usuário, você não pode ser adicionado à lista de monitoramento'; @@ -296,6 +303,7 @@ $lang['i_modified'] = 'Por questões de segurança, esse script funci Você pode extrair novamente os arquivos do pacote original ou consultar as <a href="http://dokuwiki.org/install">instruções de instalação do DokuWiki</a>.'; $lang['i_funcna'] = 'A função PHP <code>%s</code> não está disponível. O seu host a mantém desabilitada por algum motivo?'; $lang['i_phpver'] = 'A sua versão do PHP (<code>%s</code>) é inferior à necessária (<code>%s</code>). Você precisa atualizar a sua instalação do PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload precisa ser desabilitado no php.ini para executar o DokuWiki'; $lang['i_permfail'] = 'O DokuWiki não tem permissão de escrita em <code>%s</code>. Você precisa corrigir as configurações de permissão nesse diretório!'; $lang['i_confexists'] = '<code>%s</code> já existe'; $lang['i_writeerr'] = 'Não foi possível criar <code>%s</code>. É necessário checar as permissões de arquivos/diretórios e criar o arquivo manualmente.'; diff --git a/inc/lang/pt-br/searchpage.txt b/inc/lang/pt-br/searchpage.txt index 2fba3afe9..636bfeb7a 100644 --- a/inc/lang/pt-br/searchpage.txt +++ b/inc/lang/pt-br/searchpage.txt @@ -1,5 +1,5 @@ ====== Pesquisa ====== -Você pode encontrar os resultados da sua pesquisa abaixo. Se você não encontrou o que está procurando, pode criar ou editar a página com o nome que você especificou, usando o botão apropriado. +Você pode encontrar os resultados da sua pesquisa abaixo. @CREATEPAGEINFO@ ===== Resultados ===== diff --git a/inc/lang/pt/conflict.txt b/inc/lang/pt/conflict.txt index d2af1fe11..b6d7319b0 100644 --- a/inc/lang/pt/conflict.txt +++ b/inc/lang/pt/conflict.txt @@ -1,9 +1,5 @@ -====== Conflito de Edição ====== +====== Uma versão mais recente existe ====== -**Atenção**: Existe uma versão mais recente do que a versão usada no começo da sua edição. Isto acontece quando outra pessoa editou este documento entretanto e já gravou as alterações efectuadas. +Existe uma versão mais recente do documento editado. Isso acontece quando um outro usuário alterou o documento enquanto você estava editando. -Por favor, examine todas as diferenças mostradas abaixo com atenção, e decida qual a versão que deverá ser tornada a mais actual: * Se escolher <Gravar> a sua versão será sobreposta à versão editada pela outra pessoa, que será perdida. * Se escolher <Cancelar> a versão editada pela outra pessoa será a versão final, e a sua será perdida. - -**Nota**: Sem que efectue a consolidação das alterações de ambas as revisões ao documento irá sempre perder uma das versões. - ----- +Examine cuidadosamente as diferenças mostradas abaixo, em seguida, decida qual versão manter. Se você escolher ''salvar '', sua versão será salva. Clique ''cancelar '' para manter a versão atual. diff --git a/inc/lang/pt/denied.txt b/inc/lang/pt/denied.txt index eb2614387..84c3a9406 100644 --- a/inc/lang/pt/denied.txt +++ b/inc/lang/pt/denied.txt @@ -1,3 +1,4 @@ ====== Permissão Negada ====== -Não possui direitos e permissões suficientes para continuar. Talvez se tenha esquecido de iniciar sessão?
\ No newline at end of file +Desculpe, você não possui direitos e permissões suficientes para continuar. + diff --git a/inc/lang/pt/jquery.ui.datepicker.js b/inc/lang/pt/jquery.ui.datepicker.js new file mode 100644 index 000000000..bb46838e2 --- /dev/null +++ b/inc/lang/pt/jquery.ui.datepicker.js @@ -0,0 +1,36 @@ +/* Portuguese initialisation for the jQuery UI date picker plugin. */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['pt'] = { + closeText: 'Fechar', + prevText: 'Anterior', + nextText: 'Seguinte', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + weekHeader: 'Sem', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['pt']); + +return datepicker.regional['pt']; + +})); diff --git a/inc/lang/pt/lang.php b/inc/lang/pt/lang.php index 46405c444..5d462e198 100644 --- a/inc/lang/pt/lang.php +++ b/inc/lang/pt/lang.php @@ -2,13 +2,16 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) - * + * * @author José Carlos Monteiro <jose.c.monteiro@netcabo.pt> * @author José Monteiro <Jose.Monteiro@DoWeDo-IT.com> * @author Enrico Nicoletto <liverig@gmail.com> * @author Fil <fil@meteopt.com> * @author André Neves <drakferion@gmail.com> * @author José Campos zecarlosdecampos@gmail.com + * @author Murilo <muriloricci@hotmail.com> + * @author Paulo Silva <paulotsilva@yahoo.com> + * @author Guido Salatino <guidorafael23@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -22,12 +25,12 @@ $lang['btn_source'] = 'Ver fonte'; $lang['btn_show'] = 'Ver página'; $lang['btn_create'] = 'Criar página'; $lang['btn_search'] = 'Pesquisar'; -$lang['btn_save'] = 'Gravar'; +$lang['btn_save'] = 'Salvar'; $lang['btn_preview'] = 'Prever'; $lang['btn_top'] = 'Voltar ao topo'; $lang['btn_newer'] = '<< mais recente'; $lang['btn_older'] = 'menos recente >>'; -$lang['btn_revs'] = 'Revisões'; +$lang['btn_revs'] = 'Revisões antigas'; $lang['btn_recent'] = 'Alt. Recentes'; $lang['btn_upload'] = 'Carregar'; $lang['btn_cancel'] = 'Cancelar'; @@ -44,6 +47,7 @@ $lang['btn_backtomedia'] = 'Voltar à Selecção de Media'; $lang['btn_subscribe'] = 'Subscrever Alterações'; $lang['btn_profile'] = 'Actualizar Perfil'; $lang['btn_reset'] = 'Limpar'; +$lang['btn_resendpwd'] = 'Definir nova senha'; $lang['btn_draft'] = 'Editar rascunho'; $lang['btn_recover'] = 'Recuperar rascunho'; $lang['btn_draftdel'] = 'Apagar rascunho'; @@ -52,7 +56,9 @@ $lang['btn_register'] = 'Registar'; $lang['btn_apply'] = 'Aplicar'; $lang['btn_media'] = 'Gestor de Media'; $lang['btn_deleteuser'] = 'Remover a Minha Conta'; -$lang['loggedinas'] = 'Está em sessão como'; +$lang['btn_img_backto'] = 'De volta a %s'; +$lang['btn_mediaManager'] = 'Ver em gestor de media'; +$lang['loggedinas'] = 'Está em sessão como:'; $lang['user'] = 'Utilizador'; $lang['pass'] = 'Senha'; $lang['newpass'] = 'Nova senha'; @@ -63,9 +69,11 @@ $lang['fullname'] = 'Nome completo'; $lang['email'] = 'Email'; $lang['profile'] = 'Perfil do Utilizador'; $lang['badlogin'] = 'O utilizador inválido ou senha inválida.'; +$lang['badpassconfirm'] = 'Infelizmente a palavra-passe não é a correcta'; $lang['minoredit'] = 'Alterações Menores'; $lang['draftdate'] = 'Rascunho automaticamente gravado em'; $lang['nosecedit'] = 'A página foi modificada entretanto. Como a informação da secção estava desactualizada, foi carregada a página inteira.'; +$lang['searchcreatepage'] = 'Se não encontrou o que procurava pode criar uma nova página com o nome da sua pesquisa, usando o botão apropriado.'; $lang['regmissing'] = 'Por favor, preencha todos os campos.'; $lang['reguexists'] = 'Este utilizador já está inscrito. Por favor escolha outro nome de utilizador.'; $lang['regsuccess'] = 'O utilizador foi criado e a senha foi enviada para o endereço de correio electrónico usado na inscrição.'; @@ -82,8 +90,11 @@ $lang['profchanged'] = 'Perfil do utilizador actualizado com sucesso.' $lang['profnodelete'] = 'Esta wiki não suporta remoção de utilizadores'; $lang['profdeleteuser'] = 'Apagar Conta'; $lang['profdeleted'] = 'A sua conta de utilizador foi removida desta wiki'; +$lang['profconfdelete'] = 'Quero remover a minha conta desta wiki. <br/> Esta acção não pode ser anulada.'; +$lang['profconfdeletemissing'] = 'A caixa de confirmação não foi marcada'; $lang['pwdforget'] = 'Esqueceu a sua senha? Pedir nova senha'; $lang['resendna'] = 'Este wiki não suporta reenvio de senhas.'; +$lang['resendpwd'] = 'Definir nova senha para'; $lang['resendpwdmissing'] = 'É preciso preencher todos os campos.'; $lang['resendpwdnouser'] = 'Não foi possível encontrar este utilizador.'; $lang['resendpwdbadauth'] = 'O código de autenticação não é válido. Por favor, assegure-se de que o link de confirmação está completo.'; @@ -93,11 +104,12 @@ $lang['license'] = 'Excepto menção em contrário, o conteúdo ne $lang['licenseok'] = 'Nota: Ao editar esta página você aceita disponibilizar o seu conteúdo sob a seguinte licença:'; $lang['searchmedia'] = 'Procurar nome de ficheiro:'; $lang['searchmedia_in'] = 'Procurar em %s'; -$lang['txt_upload'] = 'Escolha ficheiro para carregar'; -$lang['txt_filename'] = 'Carregar como (opcional)'; +$lang['txt_upload'] = 'Escolha ficheiro para carregar:'; +$lang['txt_filename'] = 'Carregar como (opcional):'; $lang['txt_overwrt'] = 'Escrever por cima do ficheiro já existente'; -$lang['lockedby'] = 'Bloqueado por'; -$lang['lockexpire'] = 'Expira em'; +$lang['maxuploadsize'] = 'Publique max. %s por arquivo.'; +$lang['lockedby'] = 'Bloqueado por:'; +$lang['lockexpire'] = 'Expira em:'; $lang['js']['willexpire'] = 'O bloqueio de edição para este documento irá expirar num minuto.\nPara evitar conflitos use o botão Prever para re-iniciar o temporizador de bloqueio.'; $lang['js']['notsavedyet'] = 'Alterações não gravadas serão perdidas.'; $lang['js']['searchmedia'] = 'Procurar por ficheiros'; @@ -177,10 +189,15 @@ $lang['difflink'] = 'Ligação para esta vista de comparação'; $lang['diff_type'] = 'Ver diferenças'; $lang['diff_inline'] = 'Embutido'; $lang['diff_side'] = 'Lado a lado'; +$lang['diffprevrev'] = 'Revisão anterior'; +$lang['diffnextrev'] = 'Próxima revisão'; +$lang['difflastrev'] = 'Última revisão'; +$lang['diffbothprevrev'] = 'Ambos os lados da revisão anterior'; +$lang['diffbothnextrev'] = 'Ambos os lados da próxima revisão'; $lang['line'] = 'Linha'; -$lang['breadcrumb'] = 'Está em'; -$lang['youarehere'] = 'Está aqui'; -$lang['lastmod'] = 'Esta página foi modificada pela última vez em'; +$lang['breadcrumb'] = 'Está em:'; +$lang['youarehere'] = 'Está aqui:'; +$lang['lastmod'] = 'Esta página foi modificada pela última vez em:'; $lang['by'] = 'por'; $lang['deleted'] = 'Documento automaticamente removido.'; $lang['created'] = 'Criação deste novo documento.'; @@ -233,20 +250,18 @@ $lang['admin_register'] = 'Registar Novo Utilizador'; $lang['metaedit'] = 'Editar Metadata'; $lang['metasaveerr'] = 'Falhou a escrita de Metadata'; $lang['metasaveok'] = 'Metadata gravada'; -$lang['img_backto'] = 'De volta a'; -$lang['img_title'] = 'Título'; -$lang['img_caption'] = 'Legenda'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Ficheiro'; -$lang['img_fsize'] = 'Tamanho'; -$lang['img_artist'] = 'Fotógrafo'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Formato'; -$lang['img_camera'] = 'Câmara'; -$lang['img_keywords'] = 'Palavras-Chave'; -$lang['img_width'] = 'Largura'; -$lang['img_height'] = 'Altura'; -$lang['img_manager'] = 'Ver em gestor de media'; +$lang['img_title'] = 'Título:'; +$lang['img_caption'] = 'Legenda:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Ficheiro:'; +$lang['img_fsize'] = 'Tamanho:'; +$lang['img_artist'] = 'Fotógrafo:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Formato:'; +$lang['img_camera'] = 'Câmara:'; +$lang['img_keywords'] = 'Palavras-Chave:'; +$lang['img_width'] = 'Largura:'; +$lang['img_height'] = 'Altura:'; $lang['subscr_subscribe_success'] = 'Adicionado %s à lista de subscrição para %s'; $lang['subscr_subscribe_error'] = 'Erro ao adicionar %s à lista de subscrição para %s'; $lang['subscr_subscribe_noaddress'] = 'Não existe endereço algum associado com o seu nome de utilizador, não pode ser adicionado à lista de subscrição'; @@ -274,6 +289,7 @@ $lang['i_problems'] = 'O instalador encontrou alguns problemas, indic $lang['i_modified'] = 'Por razões de segurança, este script só funciona em novas e não-modificadas instalações do Dokuwiki. Deve por isso re-extrair os ficheiros do pacote que descarregou ou então deve consultar as completas <a href="http://dokuwiki.org/install">instruções de instalação do Dokuwiki installation instructions</a>'; $lang['i_funcna'] = 'A função PHP <code>%s</code> não está disponível. Terá o serviço de alojamento desactivado-a por alguma razão?'; $lang['i_phpver'] = 'A versão de PHP actual <code>%s</code> é inferior à versão mínima <code>%s</code>. É preciso actualizar a instalação PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload deve ser desabilitada no php.ini para executar DokuWiki.'; $lang['i_permfail'] = '<code>%s</code> não permite que o DokuWiki escreva nela. É preciso corrigir as permissões desta pasta!'; $lang['i_confexists'] = '<code>%s</code> já existe'; $lang['i_writeerr'] = 'Não foi possível criar <code>%s</code>. É preciso verificar as permissões e criar o ficheiro manualmente.'; @@ -285,6 +301,7 @@ $lang['i_policy'] = 'Politica ACL inicial'; $lang['i_pol0'] = 'Wiki Aberto (ler, escrever e carregar para todos)'; $lang['i_pol1'] = 'Wiki Público (ler para todos, escrever e carregar para utilizadores inscritos)'; $lang['i_pol2'] = 'Wiki Fechado (ler, escrever e carregar somente para utilizadores inscritos)'; +$lang['i_allowreg'] = 'Permitir aos utilizadores registarem-se por si próprios'; $lang['i_retry'] = 'Repetir'; $lang['i_license'] = 'Por favor escolha a licença sob a qual quer colocar o seu conteúdo:'; $lang['i_license_none'] = 'Não mostrar nenhuma informação de licença'; @@ -305,13 +322,16 @@ $lang['media_file'] = 'Ficheiro'; $lang['media_viewtab'] = 'Ver'; $lang['media_edittab'] = 'Editar'; $lang['media_historytab'] = 'Histórico'; +$lang['media_list_thumbs'] = 'Miniaturas'; $lang['media_list_rows'] = 'Linhas'; $lang['media_sort_name'] = 'Ordenar por nome'; $lang['media_sort_date'] = 'Ordenar por data'; +$lang['media_namespaces'] = 'Escolha o namespace'; $lang['media_files'] = 'Ficheiros em %s'; $lang['media_upload'] = 'Enviar para o grupo <strong>%s</strong>.'; $lang['media_search'] = 'Procurar no grupo <strong>%s</strong>.'; $lang['media_view'] = '%s'; +$lang['media_viewold'] = '%s em %s'; $lang['media_edit'] = 'Editar %s'; $lang['media_history'] = 'Histórico do %s'; $lang['media_meta_edited'] = 'metadata editada'; @@ -319,3 +339,9 @@ $lang['media_perm_read'] = 'Perdão, não tem permissão para ler ficheiro $lang['media_perm_upload'] = 'Perdão, não tem permissão para enviar ficheiros.'; $lang['media_update'] = 'enviar nova versão'; $lang['media_restore'] = 'Restaurar esta versão'; +$lang['currentns'] = 'Namespace actual'; +$lang['searchresult'] = 'Resultado da pesquisa'; +$lang['plainhtml'] = 'HTML simples'; +$lang['wikimarkup'] = 'Markup de Wiki'; +$lang['page_nonexist_rev'] = 'Página não existia no %s. Posteriormente, foi criado em <a href="%s">% s </a>.'; +$lang['unable_to_parse_date'] = 'Não é possível analisar o parâmetro "%s".'; diff --git a/inc/lang/pt/resetpwd.txt b/inc/lang/pt/resetpwd.txt new file mode 100644 index 000000000..898772a23 --- /dev/null +++ b/inc/lang/pt/resetpwd.txt @@ -0,0 +1,3 @@ +====== Definir nova senha ====== + +Digite uma nova senha para a sua conta nesta wiki.
\ No newline at end of file diff --git a/inc/lang/pt/searchpage.txt b/inc/lang/pt/searchpage.txt index 2239330dd..563ce2834 100644 --- a/inc/lang/pt/searchpage.txt +++ b/inc/lang/pt/searchpage.txt @@ -1,5 +1,5 @@ ====== Pesquisa ====== -Pode encontrar os resultados da sua pesquisa abaixo. Se não encontrou o que procurava pode criar uma nova página com o nome da sua pesquisa, usando o botão apropriado. +Pode encontrar os resultados da sua pesquisa abaixo. @CREATEPAGEINFO@ ===== Resultados ===== diff --git a/inc/lang/ro/admin.txt b/inc/lang/ro/admin.txt index b19a4d804..8c7b3d6bd 100644 --- a/inc/lang/ro/admin.txt +++ b/inc/lang/ro/admin.txt @@ -1,3 +1,3 @@ ====== Administrare ====== -Puteți vedea mai jos o listă cu activitățile administrative disponibile în DokuWiki.
\ No newline at end of file +Poți vedea mai jos o listă cu acțiunile administrative disponibile în DokuWiki. diff --git a/inc/lang/ro/adminplugins.txt b/inc/lang/ro/adminplugins.txt index 6712d8225..121a8fdb6 100644 --- a/inc/lang/ro/adminplugins.txt +++ b/inc/lang/ro/adminplugins.txt @@ -1 +1 @@ -===== Plugin-uri Adiționale =====
\ No newline at end of file +===== Plugin-uri suplimentare ===== diff --git a/inc/lang/ro/backlinks.txt b/inc/lang/ro/backlinks.txt index 3fd5e3415..ae52a105f 100644 --- a/inc/lang/ro/backlinks.txt +++ b/inc/lang/ro/backlinks.txt @@ -1,4 +1,3 @@ ====== Legături înapoi ====== Aceasta e o listă de pagini care au legături către pagina curentă. - diff --git a/inc/lang/ro/conflict.txt b/inc/lang/ro/conflict.txt index 072f574f4..dcac6774a 100644 --- a/inc/lang/ro/conflict.txt +++ b/inc/lang/ro/conflict.txt @@ -1,6 +1,7 @@ ====== Există o nouă versiune ====== -Există o versiune nouă a documentului editat. Aceasta se întîmplă cînd un alt utilizator a schimbat documentul în timp ce îl editezi. - -Examinează diferențele arătate mai jos, apoi ia decizia care versiune o reții. Dacă alegi ''Salvează'', versiunea documentului va fi salvată. Apăsați ''Renunțare'' pentru a menține versiunea curentă. +Există o versiune nouă a paginii editate. Aceasta se întâmplă atunci când +un alt utilizator a modificat pagina în timp ce editai. +Examinează diferențele indicate mai jos, apoi ia decizia care versiune o vei +reține. Dacă alegi ''Salvează'', versiunea paginii va fi salvată. Apasă ''Renunțare'' pentru a menține versiunea curentă. diff --git a/inc/lang/ro/denied.txt b/inc/lang/ro/denied.txt index 430db7610..490233acf 100644 --- a/inc/lang/ro/denied.txt +++ b/inc/lang/ro/denied.txt @@ -1,4 +1,4 @@ -====== Acces Interzis ====== +====== Acces nepermis ====== -Din păcate nu aveți destule drepturi pentru a continua. Poate ați uitat să vă logați? +Din păcate nu ai destule drepturi pentru a continua. diff --git a/inc/lang/ro/diff.txt b/inc/lang/ro/diff.txt index 197244453..4bf6250d9 100644 --- a/inc/lang/ro/diff.txt +++ b/inc/lang/ro/diff.txt @@ -1,4 +1,3 @@ ====== Diferențe ====== -Aceasta arată diferențele dintre revziile selectate și versiunea curentă a paginii. - +Aici sunt prezentate diferențele dintre versiunile selectate și versiunea curentă a paginii. diff --git a/inc/lang/ro/draft.txt b/inc/lang/ro/draft.txt index 74badee8e..550db52ff 100644 --- a/inc/lang/ro/draft.txt +++ b/inc/lang/ro/draft.txt @@ -1,5 +1,8 @@ ====== Fișierul schiță nu a fost găsit ====== -Ultima dvs. sesiune de editare nu s-a finalizat corect. În timpul lucrului, DocuWiki a salvat automat o schiță, pe care o puteți utiliza acum pentru a continua editarea. Mai jos puteți vedea informațiile care s-au salvat de la ultima dvs. sesiune. +Ultima ta sesiune de editare nu s-a finalizat corect. În vreme ce lucrai, +DokuWiki a salvat automat o schiță, pe care o poți utiliza acum pentru a +continua editarea. Mai jos poți vedea informațiile care s-au salvat de la ultima sesiune. -Decideți dacă vreți să //recuperați// sesiunea de editare pierdută, //ștergeți// schița salvată automat sau să //anulați// procesul de editare.
\ No newline at end of file +Decide dacă vrei să //recuperezi// sesiunea de editare pierdută, să //ștergi// +schița salvată automat sau să //anulezi// procesul de editare. diff --git a/inc/lang/ro/edit.txt b/inc/lang/ro/edit.txt index 78761b9c4..cd5aa2e50 100644 --- a/inc/lang/ro/edit.txt +++ b/inc/lang/ro/edit.txt @@ -1,2 +1 @@ -Editează pagina și apasă ''Salvează''. Vezi [[wiki:syntax]] pentru sintaxă. Te rog editează pagina doar pentru a o **îmbunătați**. Dacă vrei să testezi cîteva lucruri, învață sa faci primii pași în [[playground:playground]]. - +Editează pagina și apasă ''Salvează''. Vezi [[wiki:syntax]] pentru sintaxă. Te rog editează pagina doar pentru a o **îmbunătați**. Dacă vrei să testezi câteva lucruri, învață sa faci primii pași în [[playground:playground]]. diff --git a/inc/lang/ro/editrev.txt b/inc/lang/ro/editrev.txt index 290dca496..983cd657d 100644 --- a/inc/lang/ro/editrev.txt +++ b/inc/lang/ro/editrev.txt @@ -1,2 +1,3 @@ -**Ai încărcat o versuine veche a documentului!** Dacă ai salvat-o, vei crea o versiune nouă cu această dată. +**Ai încărcat o versiune anterioră a paginii.** Dacă ai salvat-o, vei crea o +versiune nouă cu aceast conținut. ---- diff --git a/inc/lang/ro/index.txt b/inc/lang/ro/index.txt index 5b88cc03b..1ae5b9ca5 100644 --- a/inc/lang/ro/index.txt +++ b/inc/lang/ro/index.txt @@ -1,4 +1,4 @@ ====== Index ====== -Acesta e un index al tuturor paginilor ordonat după [[doku>namespaces|namespaces]]. - +Acesta e un index al tuturor paginilor ordonat după [[doku>namespaces|spații +de nume]]. diff --git a/inc/lang/ro/install.html b/inc/lang/ro/install.html index 7fdc8fc21..222b86e54 100644 --- a/inc/lang/ro/install.html +++ b/inc/lang/ro/install.html @@ -1,10 +1,10 @@ -<p>Această pagină oferă asistență la instalarea pentru prima dată a <a href="http://dokuwiki.org">Dokuwiki</a>. Mai multe informații privind această instalare găsiți pe <a href="http://dokuwiki.org/installer">pagina de documentație</a>.</p> +<p>Această pagină oferă asistență la instalarea pentru prima dată a <a href="http://dokuwiki.org">Dokuwiki</a>. Mai multe informații privind această instalare găsești în <a href="http://dokuwiki.org/installer">pagina de documentație</a>.</p> -<p>DokuWiki folosește fișiere obișnuite pentru stocarea paginilor wiki și a informaților asociate acestor pagini (de ex. imagini, indecși de căutare, versiuni vechi, etc). Pentru a lucra cu succes, DokuWiki <strong>trebuie</strong> să aibă drepturi de scriere în directoarele ce conțin aceste fișiere. -Acest script de instalare nu poate seta drepturile directoarelor. De regulă, aceasta se face direct, în linie de comandă, sau în cazul găzduirii, prin FTP sau prin panoul de control al gazdei (de ex. cPanel).</p> +<p>DokuWiki folosește fișiere obișnuite pentru stocarea paginilor wiki și a informaților asociate acestor pagini (de ex. imagini, indecși de căutare, versiuni vechi etc.). Pentru a putea fi folosit, DokuWiki <strong>trebuie</strong> să aibă drepturi de scriere în directoarele ce conțin aceste fișiere. +Acest script de instalare nu poate configura drepturile directoarelor. De regulă, aceasta se face direct, în linie de comandă, sau în cazul unoi soluții de hosting, prin FTP sau prin panoul de control al gazdei (de ex. cPanel).</p> -<p>Acest script de instalare va configura DokuWiki pentru <abbr title="access control list">ACL</abbr>, care permite logarea administratorului și accesul la meniul de administrare pentru instalarea plugin-urilor, gestiunea utilizatorilor, a accesului la paginile wiki și modificarea setărilor de configurare. -Nu este necesar pentru ca DokuWiki să funcționeze, însă face mai ușoară administrarea DokuWiki.</p> +<p>Acest script de instalare va configura DokuWiki pentru <abbr title="access control list">ACL</abbr>, care permite autentificarea administratorului și accesul la meniul de administrare pentru instalarea plugin-urilor, gestiunea utilizatorilor, accesului la paginile wiki și modificarea configurației. +Acest script nu este necesar pentru funcționarea DokuWiki, însă ușurează administrarea. -<p>Utilizatorii experimentați sau utilizatorii ce au nevoie de setări speciale ar putea folosi această legătură privind<a href="http://dokuwiki.org/install">instrucțiunile de instalare</a> și <a href="http://dokuwiki.org/config">setările de configurare</a>.</p> +<p>Utilizatorii experimentați sau utilizatorii care au nevoie de o configurație specială pot accesa paginile cu <a href="http://dokuwiki.org/install">instrucțiunile de instalare</a> și <a href="http://dokuwiki.org/config">opțiunile de configurare</a> a DokuWiki.</p> diff --git a/inc/lang/ro/jquery.ui.datepicker.js b/inc/lang/ro/jquery.ui.datepicker.js new file mode 100644 index 000000000..66ee1099f --- /dev/null +++ b/inc/lang/ro/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Romanian initialisation for the jQuery UI date picker plugin. + * + * Written by Edmond L. (ll_edmond@walla.com) + * and Ionut G. Stan (ionut.g.stan@gmail.com) + */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['ro'] = { + closeText: 'Închide', + prevText: '« Luna precedentă', + nextText: 'Luna următoare »', + currentText: 'Azi', + monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie', + 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'], + monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', + 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'], + dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'], + dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'], + weekHeader: 'Săpt', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['ro']); + +return datepicker.regional['ro']; + +})); diff --git a/inc/lang/ro/lang.php b/inc/lang/ro/lang.php index 028c55a20..452a93ed0 100644 --- a/inc/lang/ro/lang.php +++ b/inc/lang/ro/lang.php @@ -1,15 +1,15 @@ <?php + /** - * romanian language file - * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * * @author Tiberiu Micu <tibimicu@gmx.net> * @author Sergiu Baltariu <s_baltariu@yahoo.com> * @author Emanuel-Emeric Andrași <n30@mandrivausers.ro> * @author Emanuel-Emeric Andrași <em.andrasi@mandrivausers.ro> * @author Marius OLAR <olarmariusalex@gmail.com> * @author Marius Olar <olarmariusalex@yahoo.com> - * @author Emanuel-Emeric Andrași <em.andrasi@mandrivausers.ro> + * @author Marian Banica <banica.marian@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -28,7 +28,7 @@ $lang['btn_preview'] = 'Previzualizează'; $lang['btn_top'] = 'La început'; $lang['btn_newer'] = '<< mai recent'; $lang['btn_older'] = 'mai vechi>>'; -$lang['btn_revs'] = 'Versiuni vechi'; +$lang['btn_revs'] = 'Versiuni anterioare'; $lang['btn_recent'] = 'Modificări recente'; $lang['btn_upload'] = 'Upload'; $lang['btn_cancel'] = 'Renunțare'; @@ -53,7 +53,10 @@ $lang['btn_revert'] = 'Revenire'; $lang['btn_register'] = 'Înregistrează'; $lang['btn_apply'] = 'Aplică'; $lang['btn_media'] = 'Administrare media'; -$lang['loggedinas'] = 'Logat ca și'; +$lang['btn_deleteuser'] = 'Sterge-mi contul'; +$lang['btn_img_backto'] = 'Înapoi la %s'; +$lang['btn_mediaManager'] = 'Vizualizează în administratorul media'; +$lang['loggedinas'] = 'Autentificat ca:'; $lang['user'] = 'Utilizator'; $lang['pass'] = 'Parola'; $lang['newpass'] = 'Parola nouă'; @@ -64,23 +67,28 @@ $lang['fullname'] = 'Nume complet'; $lang['email'] = 'E-mail'; $lang['profile'] = 'Profil utilizator'; $lang['badlogin'] = 'Ne pare rău, utilizatorul și/sau parola au fost greșite.'; +$lang['badpassconfirm'] = 'Ne pare rau, parola este gresita'; $lang['minoredit'] = 'Modificare minoră'; $lang['draftdate'] = 'Schiță salvată automat la'; $lang['nosecedit'] = 'Pagina s-a modificat între timp, secțiunea info a expirat, s-a încărcat pagina întreagă în loc.'; +$lang['searchcreatepage'] = 'Dacă nu ai găsit ce ai căutat, poți crea o pagină nouă prin folosirea butonului \'\'Editează această pagină\'\'.'; $lang['regmissing'] = 'Ne pare rău, trebuie să completezi toate cîmpurile.'; $lang['reguexists'] = 'Ne pare rău, un utilizator cu acest nume este deja autentificat.'; $lang['regsuccess'] = 'Utilizatorul a fost creat. Parola a fost trimisă prin e-mail.'; $lang['regsuccess2'] = 'Utilizatorul a fost creat.'; $lang['regmailfail'] = 'Se pare că a fost o eroare la trimiterea parolei prin e-mail. Contactează administratorul!'; -$lang['regbadmail'] = 'Adresa de e-mail este nevalidă - dacă sunteți de părere că este o eroare contactează administratorul.'; -$lang['regbadpass'] = 'Cele două parole furnizate nu sunt identice; încercați din nou.'; +$lang['regbadmail'] = 'Adresa de e-mail este nevalidă - dacă ești de părere că este o eroare contactează administratorul.'; +$lang['regbadpass'] = 'Cele două parole furnizate nu sunt identice; încearcă din nou.'; $lang['regpwmail'] = 'Parola ta DokuWiki'; -$lang['reghere'] = 'Înca nu ai un cont? Fă-ți unul!'; +$lang['reghere'] = 'Încă nu ai un cont? Creează unul!'; $lang['profna'] = 'Acest wiki nu permite modificarea profilului'; $lang['profnochange'] = 'Nici o modificare; nimic de făcut.'; -$lang['profnoempty'] = 'Nu sunt admise numele sau adresa de e-mail necompletate.'; +$lang['profnoempty'] = 'Nu sunt permise numele sau adresa de e-mail necompletate.'; $lang['profchanged'] = 'Profilul de utilizator a fost actualizat cu succes.'; -$lang['pwdforget'] = 'Parola uitată? Obține una nouă!'; +$lang['profnodelete'] = 'Acest wiki nu accepta stergerea conturilor utilizatorilor'; +$lang['profdeleteuser'] = 'Sterge cont'; +$lang['profdeleted'] = 'Contul tau a fost sters de pe acest wiki'; +$lang['pwdforget'] = 'Parolă uitată? Obține una nouă!'; $lang['resendna'] = 'Acest wiki nu permite retrimiterea parolei.'; $lang['resendpwd'] = 'Configurează o parolă nouă pentru'; $lang['resendpwdmissing'] = 'Ne pare rău, trebuie completate toate câmpurile.'; @@ -92,26 +100,26 @@ $lang['license'] = 'Exceptând locurile unde este altfel specifica $lang['licenseok'] = 'Notă: Prin editarea acestei pagini ești de acord să publici conțintul sub următoarea licență:'; $lang['searchmedia'] = 'Caută numele fișierului:'; $lang['searchmedia_in'] = 'Caută în %s'; -$lang['txt_upload'] = 'Selectează fișierul de încărcat'; -$lang['txt_filename'] = 'Încarcă fișierul ca (opțional)'; +$lang['txt_upload'] = 'Selectează fișierul de încărcat:'; +$lang['txt_filename'] = 'Încarcă fișierul ca (opțional):'; $lang['txt_overwrt'] = 'Suprascrie fișierul existent'; -$lang['lockedby'] = 'Momentan blocat de'; -$lang['lockexpire'] = 'Blocarea expiră la'; +$lang['lockedby'] = 'Momentan blocat de:'; +$lang['lockexpire'] = 'Blocarea expiră la:'; $lang['js']['willexpire'] = 'Blocarea pentru editarea paginii expiră intr-un minut.\nPentru a preveni conflictele folosește butonul de previzualizare pentru resetarea blocării.'; $lang['js']['notsavedyet'] = 'Există modificări nesalvate care se vor pierde. Dorești să continui?'; $lang['js']['searchmedia'] = 'Caută fișiere'; $lang['js']['keepopen'] = 'Menține fereastra deschisă la selecție'; $lang['js']['hidedetails'] = 'Ascunde detalii'; -$lang['js']['mediatitle'] = 'Setări link'; -$lang['js']['mediadisplay'] = 'Tip link'; +$lang['js']['mediatitle'] = 'Configurare link'; +$lang['js']['mediadisplay'] = 'Tip de link'; $lang['js']['mediaalign'] = 'Aliniere'; $lang['js']['mediasize'] = 'Mărime imagine'; $lang['js']['mediatarget'] = 'Țintă link'; $lang['js']['mediaclose'] = 'Închide'; $lang['js']['mediainsert'] = 'Inserează'; $lang['js']['mediadisplayimg'] = 'Afișează imaginea'; -$lang['js']['mediadisplaylnk'] = 'Afișează doar linkul'; +$lang['js']['mediadisplaylnk'] = 'Afișează doar link-ul'; $lang['js']['mediasmall'] = 'Versiune mică'; $lang['js']['mediamedium'] = 'Versiune medie'; $lang['js']['medialarge'] = 'Versiune mare'; @@ -133,7 +141,7 @@ $lang['js']['restore_confirm'] = 'Ești sigur de restaurarea acestei versiuni?'; $lang['js']['media_diff'] = 'Arată diferențele:'; $lang['js']['media_diff_both'] = 'Unul lângă altul'; $lang['js']['media_diff_opacity'] = 'Străveziu'; -$lang['js']['media_diff_portions'] = 'Lovește cu putere'; +$lang['js']['media_diff_portions'] = 'Glisează'; $lang['js']['media_select'] = 'Selectează fișierele...'; $lang['js']['media_upload_btn'] = 'Încarcă'; $lang['js']['media_done_btn'] = 'Gata'; @@ -178,9 +186,9 @@ $lang['diff_type'] = 'Vezi diferențe:'; $lang['diff_inline'] = 'Succesiv'; $lang['diff_side'] = 'Alăturate'; $lang['line'] = 'Linia'; -$lang['breadcrumb'] = 'Traseu'; -$lang['youarehere'] = 'Ești aici'; -$lang['lastmod'] = 'Ultima modificare'; +$lang['breadcrumb'] = 'Traseu:'; +$lang['youarehere'] = 'Ești aici:'; +$lang['lastmod'] = 'Ultima modificare:'; $lang['by'] = 'de către'; $lang['deleted'] = 'șters'; $lang['created'] = 'creat'; @@ -232,20 +240,18 @@ $lang['admin_register'] = 'Adaugă utilizator nou'; $lang['metaedit'] = 'Editează metadata'; $lang['metasaveerr'] = 'Scrierea metadatelor a eșuat'; $lang['metasaveok'] = 'Metadatele au fost salvate'; -$lang['img_backto'] = 'Înapoi la'; -$lang['img_title'] = 'Titlu'; -$lang['img_caption'] = 'Legendă'; -$lang['img_date'] = 'Dată'; -$lang['img_fname'] = 'Nume fișier'; -$lang['img_fsize'] = 'Dimensiune'; -$lang['img_artist'] = 'Fotograf'; -$lang['img_copyr'] = 'Drept de autor'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Camera'; -$lang['img_keywords'] = 'Cuvinte cheie'; -$lang['img_width'] = 'Lățime'; -$lang['img_height'] = 'Înălțime'; -$lang['img_manager'] = 'Vizualizează în administratorul media'; +$lang['img_title'] = 'Titlu:'; +$lang['img_caption'] = 'Legendă:'; +$lang['img_date'] = 'Dată:'; +$lang['img_fname'] = 'Nume fișier:'; +$lang['img_fsize'] = 'Dimensiune:'; +$lang['img_artist'] = 'Fotograf:'; +$lang['img_copyr'] = 'Drept de autor:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Camera:'; +$lang['img_keywords'] = 'Cuvinte cheie:'; +$lang['img_width'] = 'Lățime:'; +$lang['img_height'] = 'Înălțime:'; $lang['subscr_subscribe_success'] = 'Adăugat %s la lista de abonare pentru %s'; $lang['subscr_subscribe_error'] = 'Eroare la adăugarea %s la lista de abonare pentru %s'; $lang['subscr_subscribe_noaddress'] = 'Nu există adresă de e-mail asociată autentificării curente, nu poți fi adăugat la lista de abonare'; @@ -283,7 +289,7 @@ $lang['i_success'] = 'Configurarea a fost finalizată cu succes. Acu $lang['i_failure'] = 'Au apărut erori la scrierea fișierelor de configurare. Va trebui să le corectezi manual înainte de a putea folosi <a href="doku.php?id=wiki:welcome">noua ta instanță DokuWiki</a>.'; $lang['i_policy'] = 'Politica ACL (liste de control a accesului) inițială'; $lang['i_pol0'] = 'Wiki deschis (oricine poate citi, scrie și încărca fișiere)'; -$lang['i_pol1'] = 'Wiki public (oricine poate citi, utilizatorii înregistrați pot scrie și încărca fișiere'; +$lang['i_pol1'] = 'Wiki public (oricine poate citi, utilizatorii înregistrați pot scrie și încărca fișiere)'; $lang['i_pol2'] = 'Wiki închis (doar utilizatorii înregistrați pot citi, scrie și încărca fișiere)'; $lang['i_retry'] = 'Încearcă din nou'; $lang['i_license'] = 'Te rugăm să alegi licența sub care dorești să publici conținutul:'; diff --git a/inc/lang/ro/locked.txt b/inc/lang/ro/locked.txt index 8708157ec..d1e80ad40 100644 --- a/inc/lang/ro/locked.txt +++ b/inc/lang/ro/locked.txt @@ -1,3 +1,4 @@ ====== Pagină blocată ====== -Pagina este momentan blocată de alt utilizator. Trebuie să aștepți pînă cînd acest utilizator termină editarea ori expiră blocarea. +Pagina este momentan blocată de alt utilizator. Trebuie să aștepți pînă când +acest utilizator termină editarea sau până când expiră blocarea. diff --git a/inc/lang/ro/login.txt b/inc/lang/ro/login.txt index 81bca6298..7de38f621 100644 --- a/inc/lang/ro/login.txt +++ b/inc/lang/ro/login.txt @@ -1,4 +1,4 @@ -====== Login ====== - -Nu sînteți logat! Introduceți datele de autentificare pentru logare. Trebuie să permiteți cookie-uri pentru logare. +====== Autentificare ====== +Nu ești autentificat! Introdu datele de autentificare. Pentru ca +autentificarea să funcționeze trebuie să fie permise cookie-urile în browser. diff --git a/inc/lang/ro/mailtext.txt b/inc/lang/ro/mailtext.txt index 77aca8c4b..8d20a301d 100644 --- a/inc/lang/ro/mailtext.txt +++ b/inc/lang/ro/mailtext.txt @@ -1,16 +1,17 @@ -A fost adăugată sau schimbată o pagină. Aici sînt detaliile: +Salutare, @FULLNAME@! -Data : @DATE@ -Navigator : @BROWSER@ -Adresa-IP : @IPADDRESS@ -Nume gazdă : @HOSTNAME@ -Versiune veche : @OLDPAGE@ -Versiune nouă : @NEWPAGE@ -Rezumat editare: @SUMMARY@ +A fost adăugată sau modificată o pagină. Aici sunt detaliile: -@DIFF@ +Dată : @DATE@ +Browser : @BROWSER@ +Adresă IP : @IPADDRESS@ +Hostname : @HOSTNAME@ +Versiune anterioară : @OLDPAGE@ +Versiune curentă : @NEWPAGE@ +Sumar editare: @SUMMARY@ +@DIFF@ --- -Mailul a fost generat de DokuWiki la +-- +Acest e-mail a fost generat de DokuWiki la @DOKUWIKIURL@ diff --git a/inc/lang/ro/newpage.txt b/inc/lang/ro/newpage.txt index 886258609..2ef35136e 100644 --- a/inc/lang/ro/newpage.txt +++ b/inc/lang/ro/newpage.txt @@ -1,3 +1,3 @@ -====== Subiectul nu există încă ====== +====== Pagina nu există încă ====== -Ați urmat o legătură către un subiect care nu există. O puteți crea prin apăsarea butonului ''Editează această pagină''. +Ai urmat o legătură către o pagină care nu există. O poti crea prin apăsarea butonului ''Editează această pagină''. diff --git a/inc/lang/ro/norev.txt b/inc/lang/ro/norev.txt index 4a21abcbf..08bbb74dd 100644 --- a/inc/lang/ro/norev.txt +++ b/inc/lang/ro/norev.txt @@ -1,4 +1,4 @@ -====== Nu există versiunea ====== - -Versiunea specificată nu există. Folosește butonul ''Versiuni vechi'' pentru o listă a versiunilor acestui document. +====== Nu există versiunea paginii ====== +Versiunea indicată nu există. Folosește butonul ''Versiuni anterioare'' pentru +o listă a versiunilor acestei pagini. diff --git a/inc/lang/ro/password.txt b/inc/lang/ro/password.txt index a7eb12dd9..eb325204b 100644 --- a/inc/lang/ro/password.txt +++ b/inc/lang/ro/password.txt @@ -1,10 +1,10 @@ -Salut @FULLNAME@! +Salutare, @FULLNAME@! -Aici sînt datele utilizator pentru @TITLE@ la @DOKUWIKIURL@ +Aici se găsesc credențialele de utilizator pentru @TITLE@ la @DOKUWIKIURL@ Login : @LOGIN@ Parola : @PASSWORD@ --- -Mesajul a fost generat de către DokuWiki la +-- +Acest e-mail a fost generat de DokuWiki la @DOKUWIKIURL@ diff --git a/inc/lang/ro/preview.txt b/inc/lang/ro/preview.txt index 1964d7476..c89d19727 100644 --- a/inc/lang/ro/preview.txt +++ b/inc/lang/ro/preview.txt @@ -1,4 +1,3 @@ ====== Previzualizare ====== -Acesta este modul în care va arăta textul. Nu uita: **Nu** e încă **salvat**! - +Acesta este modul în care va arăta textul. Ai în vedere: **Nu** e încă **salvat**! diff --git a/inc/lang/ro/pwconfirm.txt b/inc/lang/ro/pwconfirm.txt index ae2d9f963..0728b2ef0 100644 --- a/inc/lang/ro/pwconfirm.txt +++ b/inc/lang/ro/pwconfirm.txt @@ -1,13 +1,14 @@ -Salut @FULLNAME@! +Salutare, @FULLNAME@! -Cineva a cerut o parolă nouă pentru @TITLE@ pentru conectarea la @DOKUWIKIURL@ +Cineva a cerut o parolă nouă pentru @TITLE@ pentru conectarea la +@DOKUWIKIURL@. -Dacă nu ați solicitat o parolă nouă, ignorați acest email. +Dacă nu ai solicitat o parolă nouă, ignoră acest e-mail. -Pentru a confirma că cererea a fost într-adevăr trimisă de dumneavoastră, folosiți link-ul de mai jos. +Pentru a confirma că cererea a fost într-adevăr trimisă de tine, folosește link-ul de mai jos. @CONFIRM@ -- -Acest mail a fost generat de DocuWiki la -@DOKUWIKIURL@
\ No newline at end of file +Acest e-mail a fost generat de DokuWiki la +@DOKUWIKIURL@ diff --git a/inc/lang/ro/read.txt b/inc/lang/ro/read.txt index 72c33c0c0..442188f21 100644 --- a/inc/lang/ro/read.txt +++ b/inc/lang/ro/read.txt @@ -1,2 +1,2 @@ -Această pagină poate fi doar citită. Poți vedea sursa, dar n-o poți modifica. Consultă administratorul dacă crezi că e ceva în neregulă. - +Această pagină poate fi doar citită. Poți vedea sursa, dar nu poți modifica +pagina. Consultă administratorul dacă ești de părere că ceva este în neregulă. diff --git a/inc/lang/ro/recent.txt b/inc/lang/ro/recent.txt index 8d4aa043a..e92ca8fa7 100644 --- a/inc/lang/ro/recent.txt +++ b/inc/lang/ro/recent.txt @@ -1,5 +1,3 @@ -====== Schimbări recente ====== - -Următoarele pagini au fost schimbate recent. - +====== Modificări recente ====== +Următoarele pagini au fost modificate recent. diff --git a/inc/lang/ro/register.txt b/inc/lang/ro/register.txt index e062a46bc..1a6ef2538 100644 --- a/inc/lang/ro/register.txt +++ b/inc/lang/ro/register.txt @@ -1,3 +1,4 @@ ====== Înregistrează-te ca utilizator nou ====== -Pentru a crea un wiki nou completează mai jos toate informațiile. Asigură-te că ai introdus o adresă de **e-mail validă** unde va fi trimisă noua parolă. Numele de utilizator trebuie de asemenea să fie valid [[doku>pagename|pagename]]. +Pentru a crea un wiki nou completează mai jos toate informațiile. Asigură-te +că ai introdus o adresă de e-mail **validă** unde va fi trimisă noua parolă. Numele de utilizator trebuie de asemenea să fie valid [[doku>pagename|pagename]]. diff --git a/inc/lang/ro/registermail.txt b/inc/lang/ro/registermail.txt index fb754af67..2aab247f7 100644 --- a/inc/lang/ro/registermail.txt +++ b/inc/lang/ro/registermail.txt @@ -1,14 +1,15 @@ -Un nou utilizator s-a înregsitrat. Iată detaliile: +Salutare, @FULLNAME@! -Nume utilizator : @NEWUSER@ +Un nou utilizator s-a înregistrat. Iată detaliile: + +Nume de utilizator : @NEWUSER@ Nume complet : @NEWNAME@ E-mail : @NEWEMAIL@ - -Data : @DATE@ +Dată : @DATE@ Browser : @BROWSER@ Adresă IP : @IPADDRESS@ Hostname : @HOSTNAME@ --- -Acest mail a fost generat automat de către DokuWiki la +-- +Acest e-mail a fost generat de DokuWiki la @DOKUWIKIURL@ diff --git a/inc/lang/ro/resendpwd.txt b/inc/lang/ro/resendpwd.txt index 4a67f9e80..24d995e89 100644 --- a/inc/lang/ro/resendpwd.txt +++ b/inc/lang/ro/resendpwd.txt @@ -1,3 +1,5 @@ ====== Trimite parolă nouă ====== -Introduceți numele de utilizator în formularul de mai jos pentru a solicita o nouă parolă pentru această wiki. Un link de confirmare va fi trimis la adresa de email înregistrată.
\ No newline at end of file +Introduc numele de utilizator în formularul de mai jos pentru a solicita o +nouă parolă pentru aceast wiki. Un link de confirmare va fi trimis la adresa +de e-mail înregistrată. diff --git a/inc/lang/ro/resetpwd.txt b/inc/lang/ro/resetpwd.txt index 2eb8052f1..9cea53c4a 100644 --- a/inc/lang/ro/resetpwd.txt +++ b/inc/lang/ro/resetpwd.txt @@ -1,3 +1,3 @@ -====== Setează parolă nouă ====== +====== Configurează o parolă nouă ====== -Vă rugăm să introduceți o nouă parolă pentru contul dvs. pe acest wiki.
\ No newline at end of file +Te rog să introduci o parolă nouă pentru contul tău de pe acest wiki. diff --git a/inc/lang/ro/revisions.txt b/inc/lang/ro/revisions.txt index d42134c61..7cafaf046 100644 --- a/inc/lang/ro/revisions.txt +++ b/inc/lang/ro/revisions.txt @@ -1,4 +1,5 @@ -====== Versiune veche ====== - -Acestea sînt versiunile vechi ale documentului curent. Pentru revenirea la o versiune mai veche, selecteaz-o de mai jos, clic pe ''Editează această pagină'' și salveaz-o. +====== Versiune anterioară ====== +Acestea sunt versiunile anterioare ale paginii curente. Pentru revenirea la o +versiune anteroară, selectează versiunea de mai jos, clic pe ''Editează +această pagină'' și salvează versiunea. diff --git a/inc/lang/ro/searchpage.txt b/inc/lang/ro/searchpage.txt index 8c78c68c3..d4e3df2ee 100644 --- a/inc/lang/ro/searchpage.txt +++ b/inc/lang/ro/searchpage.txt @@ -1,5 +1,5 @@ ====== Căutare ====== -Rezultatele căutării sînt afisate mai jos. Dacă n-ați găsit ce-ați căutat, puteți creea o pagină nouă după căutare prin folosirea butonului ''Editează această pagină''. +Rezultatele căutării sunt afișate mai jos. @CREATEPAGEINFO@ ===== Rezultate ===== diff --git a/inc/lang/ro/showrev.txt b/inc/lang/ro/showrev.txt index c1d5e545d..4c76fd402 100644 --- a/inc/lang/ro/showrev.txt +++ b/inc/lang/ro/showrev.txt @@ -1,2 +1,2 @@ -**Aceasta e o versiune veche a documentului!** +**Aceasta e o versiune anterioară a paginii.** ---- diff --git a/inc/lang/ro/stopwords.txt b/inc/lang/ro/stopwords.txt index 1f0d9536b..adcd7eff1 100644 --- a/inc/lang/ro/stopwords.txt +++ b/inc/lang/ro/stopwords.txt @@ -1,6 +1,8 @@ # Aceasta este o listă de cuvinte ignorate la indexare, câte un cuvânt pe linie -# Când editați acest fișier, asigurați-vă că folosiți sfârșituri de linie UNIX (o singură linie nouă) -# Nu e nevoie să includeți cuvinte mai scurte de 3 caractere - acestea sunt, oricum, ignorate +# Când editezi acest fișier, asigură-te că folosești sfârșituri de linie UNIX +# (o singură linie nouă). +# Nu e nevoie să incluzi cuvinte mai scurte de 3 caractere - acestea sunt, +# oricum, ignorate. # Această listă se bazează pe cele ce pot fi găsite la http://www.ranks.nl/stopwords/ about are diff --git a/inc/lang/ro/subscr_digest.txt b/inc/lang/ro/subscr_digest.txt index ad0a30708..8b0aac5c4 100644 --- a/inc/lang/ro/subscr_digest.txt +++ b/inc/lang/ro/subscr_digest.txt @@ -1,20 +1,20 @@ -Buna ziua! +Salutare, @FULLNAME@! -Pagina @PAGE@ în @TITLE@ wiki s-a modificat. +Pagina @PAGE@ în @TITLE@ wiki a fost modificată. Acestea sunt modificările: -------------------------------------------------------- @DIFF@ -------------------------------------------------------- -Vechea revizie: @OLDPAGE@ -Noua revizie: @NEWPAGE@ +Versiune anterioară: @OLDPAGE@ +Versiune curentă: @NEWPAGE@ -Pentru a anula notificarea paginii, logați-vă pe wiki la -@DOKUWIKIURL@ apoi navigați la +Pentru a anula notificarea paginii, autentifică-te pe wiki la +@DOKUWIKIURL@ apoi accesează @SUBSCRIBE@ -și dezabonați-vă de la pagină și/sau modificările numelui de spațiu. +și dezabonează-te de la pagină și/sau modificările spațiului de nume. -- -Acest mail a fost generat de DokuWiki la -@DOKUWIKIURL@
\ No newline at end of file +Acest e-mail a fost generat de DokuWiki la +@DOKUWIKIURL@ diff --git a/inc/lang/ro/subscr_form.txt b/inc/lang/ro/subscr_form.txt index e55dfe6cb..c198cafdc 100644 --- a/inc/lang/ro/subscr_form.txt +++ b/inc/lang/ro/subscr_form.txt @@ -1,3 +1,4 @@ ====== Administrarea abonărilor ====== -Această pagină vă permite să vă administrați abonările pentru pagina curentă și numele de spațiu.
\ No newline at end of file +Această pagină îți permite să îți administrăzi abonările pentru pagina curentă +și pentru spațiul de nume. diff --git a/inc/lang/ro/subscr_list.txt b/inc/lang/ro/subscr_list.txt index 1b55ea917..c34334268 100644 --- a/inc/lang/ro/subscr_list.txt +++ b/inc/lang/ro/subscr_list.txt @@ -1,17 +1,17 @@ -Bună ziua! +Salutare, @FULLNAME@! -Paginile din numele de spațiu @PAGE@ al @TITLE@ wiki s-au modificat. -Acestea sunt modificările: +Paginile din spațiul de nume @PAGE@ al @TITLE@ wiki au fost modificate. +Modificările sunt următoarele: -------------------------------------------------------- @DIFF@ -------------------------------------------------------- -Pentru a anula notificarea paginii, logați-vă pe wiki la -@DOKUWIKIURL@ apoi navigați la +Pentru a anula notificarea paginii, autentificcă-te pe wiki la +@DOKUWIKIURL@ apoi accesează @SUBSCRIBE@ -și dezabonați-vă de la pagină și/sau modificările numelui de spațiu. +și dezabonează-te de la pagină și/sau modificările spațiului de nume. -- -Acest mail a fost generat de DokuWiki la -@DOKUWIKIURL@
\ No newline at end of file +Acest e-mail a fost generat de DokuWiki la +@DOKUWIKIURL@ diff --git a/inc/lang/ro/subscr_single.txt b/inc/lang/ro/subscr_single.txt index 006db741d..0fee1a831 100644 --- a/inc/lang/ro/subscr_single.txt +++ b/inc/lang/ro/subscr_single.txt @@ -1,23 +1,23 @@ -Bună ziua! +Salutare, @FULLNAME@! -Pagina @PAGE@ în @TITLE@ wiki s-a modificat. -Acestea sunt modificările: +Pagina @PAGE@ în @TITLE@ wiki a fost modificată. +Modificările sunt următoarele: -------------------------------------------------------- @DIFF@ -------------------------------------------------------- -Data: @DATE@ +Dată: @DATE@ Utilizator: @USER@ Sumarul editării: @SUMMARY@ -Vechea revizie: @OLDPAGE@ -Noua revizie: @NEWPAGE@ +Versiune anterioară: @OLDPAGE@ +Versiune curentă: @NEWPAGE@ -Pentru a anula notificarea paginii, logați-vă pe wiki la -@DOKUWIKIURL@ apoi navigați la +Pentru a anula notificarea paginii, autentificcă-te pe wiki la +@DOKUWIKIURL@ apoi accesează @SUBSCRIBE@ -și dezabonați-vă de la pagină și/sau modificările numelui de spațiu. +și dezabonează-te de la pagină și/sau modificările spațiului de nume. -- -Acest mail a fost generat de DokuWiki la -@DOKUWIKIURL@
\ No newline at end of file +Acest e-mail a fost generat de DokuWiki la +@DOKUWIKIURL@ diff --git a/inc/lang/ro/updateprofile.txt b/inc/lang/ro/updateprofile.txt index f3985a1c6..de43c69cb 100644 --- a/inc/lang/ro/updateprofile.txt +++ b/inc/lang/ro/updateprofile.txt @@ -1,3 +1,4 @@ ====== Actualizare profil utilizator ====== -Trebuie să completați doar câmpurile pe care doriți să le modificați. Nu puteți modifica numele de utilizator.
\ No newline at end of file +Trebuie să completezi doar câmpurile pe care dorești să le modifici. Nu poți +modifica numele de utilizator. diff --git a/inc/lang/ro/uploadmail.txt b/inc/lang/ro/uploadmail.txt index c1e5736e2..81c2828e8 100644 --- a/inc/lang/ro/uploadmail.txt +++ b/inc/lang/ro/uploadmail.txt @@ -1,7 +1,9 @@ -Un fișier a fost încărcat în DocuWiki. Iată detaliile: +Salutare, @FULLNAME@! + +Un fișier a fost încărcat în DokuWiki. Iată detaliile: Fișier : @MEDIA@ -Data : @DATE@ +Dată : @DATE@ Browser : @BROWSER@ Adresă IP : @IPADDRESS@ Hostname : @HOSTNAME@ @@ -10,5 +12,5 @@ MIME Type : @MIME@ Utilizator : @USER@ -- -Acest mail a fost generat automat de către DokuWiki la +Acest e-mail a fost generat de DokuWiki la @DOKUWIKIURL@ diff --git a/inc/lang/ru/admin.txt b/inc/lang/ru/admin.txt index e00daa447..cd609a347 100644 --- a/inc/lang/ru/admin.txt +++ b/inc/lang/ru/admin.txt @@ -1,4 +1,4 @@ ====== Управление ====== -Ниже вы сможете найти список административных операций, доступных в «ДокуВики». +Ниже вы сможете найти список административных операций, доступных в «Докувики». diff --git a/inc/lang/ru/denied.txt b/inc/lang/ru/denied.txt index f7f53ce88..6b7c82511 100644 --- a/inc/lang/ru/denied.txt +++ b/inc/lang/ru/denied.txt @@ -1,3 +1,4 @@ ====== Доступ запрещён ====== -Извините, у вас не хватает прав для этого действия. Может быть вы забыли войти в вики под своим логином? +Извините, у вас не хватает прав для этого действия. + diff --git a/inc/lang/ru/index.txt b/inc/lang/ru/index.txt index fc42f87ff..ab669918a 100644 --- a/inc/lang/ru/index.txt +++ b/inc/lang/ru/index.txt @@ -1,4 +1,4 @@ ====== Содержание ====== -Перед вами список доступных страниц, упорядоченный по ([[doku>namespaces|пространствам имён]]). +Перед вами список доступных страниц, упорядоченный по [[doku>namespaces|пространствам имён]]. diff --git a/inc/lang/ru/jquery.ui.datepicker.js b/inc/lang/ru/jquery.ui.datepicker.js new file mode 100644 index 000000000..c3fda5d59 --- /dev/null +++ b/inc/lang/ru/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['ru'] = { + closeText: 'Закрыть', + prevText: '<Пред', + nextText: 'След>', + currentText: 'Сегодня', + monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь', + 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', + 'Июл','Авг','Сен','Окт','Ноя','Дек'], + dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'], + dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'], + dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], + weekHeader: 'Нед', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['ru']); + +return datepicker.regional['ru']; + +})); diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php index 237b819db..96278d53b 100644 --- a/inc/lang/ru/lang.php +++ b/inc/lang/ru/lang.php @@ -23,6 +23,12 @@ * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua) * @author Pavel <ivanovtsk@mail.ru> * @author Artur <ncuxxx@gmail.com> + * @author Erli Moen <evseev.jr@gmail.com> + * @author Aleksandr Selivanov <alexgearbox@yandex.ru> + * @author Владимир <id37736@yandex.ru> + * @author Igor Degraf <igordegraf@gmail.com> + * @author Type-kun <workwork-1@yandex.ru> + * @author Vitaly Filatenko <kot@hacktest.net> */ $lang['encoding'] = ' utf-8'; $lang['direction'] = 'ltr'; @@ -67,6 +73,8 @@ $lang['btn_register'] = 'Зарегистрироваться'; $lang['btn_apply'] = 'Применить'; $lang['btn_media'] = 'Управление медиафайлами'; $lang['btn_deleteuser'] = 'Удалить мой аккаунт'; +$lang['btn_img_backto'] = 'Вернуться к %s'; +$lang['btn_mediaManager'] = 'Просмотр в «управлении медиафайлами»'; $lang['loggedinas'] = 'Зашли как'; $lang['user'] = 'Логин'; $lang['pass'] = 'Пароль'; @@ -82,6 +90,7 @@ $lang['badpassconfirm'] = 'Простите, пароль неверны $lang['minoredit'] = 'Небольшие изменения'; $lang['draftdate'] = 'Черновик сохранён'; $lang['nosecedit'] = 'За это время страница была изменена и информация о секции устарела. Загружена полная версия страницы.'; +$lang['searchcreatepage'] = 'Если вы не нашли то, что искали, вы можете создать новую страницу с именем, совпадающим с запросом. Чтобы сделать это, просто нажмите на кнопку «Создать страницу».'; $lang['regmissing'] = 'Извините, вам следует заполнить все поля.'; $lang['reguexists'] = 'Извините, пользователь с таким логином уже существует.'; $lang['regsuccess'] = 'Пользователь создан; пароль выслан на адрес электронной почты.'; @@ -89,7 +98,7 @@ $lang['regsuccess2'] = 'Пользователь создан.'; $lang['regmailfail'] = 'Похоже есть проблема с отправкой пароля по почте. Пожалуйста, сообщите об этом администратору.'; $lang['regbadmail'] = 'Данный вами адрес электронной почты выглядит неправильным. Если вы считаете это ошибкой, сообщите администратору.'; $lang['regbadpass'] = 'Два введённых пароля не идентичны. Пожалуйста, попробуйте ещё раз.'; -$lang['regpwmail'] = 'Ваш пароль для системы «ДокуВики»'; +$lang['regpwmail'] = 'Ваш пароль для системы «Докувики»'; $lang['reghere'] = 'У вас ещё нет аккаунта? Зарегистрируйтесь'; $lang['profna'] = 'Данная вики не поддерживает изменение профиля'; $lang['profnochange'] = 'Изменений не было внесено, профиль не обновлён.'; @@ -98,7 +107,7 @@ $lang['profchanged'] = 'Профиль пользователя усп $lang['profnodelete'] = 'Удалённый пользователь не может работать с этим документом'; $lang['profdeleteuser'] = 'Удалить аккаунт'; $lang['profdeleted'] = 'Ваш аккаунт был удален из этой вики'; -$lang['profconfdelete'] = 'Я хочу удалить мой аккаунт из этой вики.<br />Это действие необратимо.'; +$lang['profconfdelete'] = 'Я хочу удалить свой аккаунт из этой вики. <br /> Это действие необратимо.'; $lang['profconfdeletemissing'] = 'Флажок подтверждения не установлен'; $lang['pwdforget'] = 'Забыли пароль? Получите новый'; $lang['resendna'] = 'Данная вики не поддерживает повторную отправку пароля.'; @@ -112,12 +121,12 @@ $lang['license'] = 'За исключением случаев, к $lang['licenseok'] = 'Примечание: редактируя эту страницу, вы соглашаетесь на использование своего вклада на условиях следующей лицензии:'; $lang['searchmedia'] = 'Поиск по имени файла:'; $lang['searchmedia_in'] = 'Поиск в %s'; -$lang['txt_upload'] = 'Выберите файл для загрузки'; -$lang['txt_filename'] = 'Введите имя файла в вики (необязательно)'; +$lang['txt_upload'] = 'Выберите файл для загрузки:'; +$lang['txt_filename'] = 'Введите имя файла в вики (необязательно):'; $lang['txt_overwrt'] = 'Перезаписать существующий файл'; $lang['maxuploadsize'] = 'Максимальный размер загружаемого файла %s'; -$lang['lockedby'] = 'В данный момент заблокирован'; -$lang['lockexpire'] = 'Блокировка истекает в'; +$lang['lockedby'] = 'В данный момент заблокирован:'; +$lang['lockexpire'] = 'Блокировка истекает в:'; $lang['js']['willexpire'] = 'Ваша блокировка этой страницы на редактирование истекает в течение минуты.\nЧтобы предотвратить конфликты используйте кнопку «Просмотр» для сброса таймера блокировки.'; $lang['js']['notsavedyet'] = 'Несохранённые изменения будут потеряны. Вы действительно хотите продолжить?'; $lang['js']['searchmedia'] = 'Поиск файлов'; @@ -144,7 +153,7 @@ $lang['js']['medialeft'] = 'Выровнять изображение по $lang['js']['mediaright'] = 'Выровнять изображение по правому краю.'; $lang['js']['mediacenter'] = 'Выровнять изображение по центру.'; $lang['js']['medianoalign'] = 'Не выравнивать.'; -$lang['js']['nosmblinks'] = 'Ссылка на сетевые каталоги Windows работает только из Интернет Эксплорера. Но вы можете скопировать ссылку.'; +$lang['js']['nosmblinks'] = 'Ссылка на сетевые каталоги Windows работает только из MS Internet Explorer, но вы можете скопировать ссылку.'; $lang['js']['linkwiz'] = 'Мастер ссылок'; $lang['js']['linkto'] = 'Ссылка на:'; $lang['js']['del_confirm'] = 'Вы на самом деле желаете удалить выбранное?'; @@ -170,7 +179,7 @@ $lang['uploadexist'] = 'Файл с таким именем сущес $lang['uploadbadcontent'] = 'Содержание файла не соответствует расширению %s.'; $lang['uploadspam'] = 'Загрузка заблокирована спам-фильтром.'; $lang['uploadxss'] = 'Загрузка заблокирована по соображениям безопасности.'; -$lang['uploadsize'] = 'Загруженный файл был слишком большой. (макс. %s)'; +$lang['uploadsize'] = 'Загруженный файл был слишком большой. (Макс. %s)'; $lang['deletesucc'] = 'Файл «%s» был удалён.'; $lang['deletefail'] = 'Невозможно удалить файл «%s». Проверьте права доступа к файлу.'; $lang['mediainuse'] = 'Файл «%s» не был удалён — файл всё ещё используется.'; @@ -181,7 +190,7 @@ $lang['mediausage'] = 'Для ссылки на этот файл и $lang['mediaview'] = 'Посмотреть исходный файл'; $lang['mediaroot'] = 'корень'; $lang['mediaupload'] = 'Здесь можно загрузить файл в текущий каталог («пространство имён»). Чтобы создать подкаталоги, добавьте их к началу имени файла («Загрузить как»). Имена подкаталогов разделяются двоеточиями. '; -$lang['mediaextchange'] = 'Расширение изменилось: с .%s на .%s!'; +$lang['mediaextchange'] = 'Расширение изменилось с .%s на .%s!'; $lang['reference'] = 'Ссылки для'; $lang['ref_inuse'] = 'Этот файл не может быть удалён, так как он используется на следующих страницах:'; $lang['ref_hidden'] = 'Некоторые ссылки находятся на страницах, на чтение которых у вас нет прав доступа'; @@ -190,20 +199,25 @@ $lang['quickhits'] = 'Соответствия в названиях $lang['toc'] = 'Содержание'; $lang['current'] = 'текущий'; $lang['yours'] = 'Ваша версия'; -$lang['diff'] = 'показать отличия от текущей версии'; +$lang['diff'] = 'Показать отличия от текущей версии'; $lang['diff2'] = 'Показать различия между ревизиями '; $lang['difflink'] = 'Ссылка на это сравнение'; $lang['diff_type'] = 'Посмотреть отличия'; $lang['diff_inline'] = 'встроенный'; $lang['diff_side'] = 'бок о бок'; +$lang['diffprevrev'] = 'Предыдущая версия'; +$lang['diffnextrev'] = 'Следующая версия'; +$lang['difflastrev'] = 'Последняя версия'; +$lang['diffbothprevrev'] = 'Предыдущая версия справа и слева'; +$lang['diffbothnextrev'] = 'Следующая версия справа и слева'; $lang['line'] = 'Строка'; -$lang['breadcrumb'] = 'Вы посетили'; -$lang['youarehere'] = 'Вы находитесь здесь'; -$lang['lastmod'] = 'Последние изменения'; +$lang['breadcrumb'] = 'Вы посетили:'; +$lang['youarehere'] = 'Вы находитесь здесь:'; +$lang['lastmod'] = 'Последние изменения:'; $lang['by'] = ' —'; $lang['deleted'] = 'удалено'; $lang['created'] = 'создано'; -$lang['restored'] = 'старая ревизия восстановлена (%s)'; +$lang['restored'] = 'старая версия восстановлена (%s)'; $lang['external_edit'] = 'внешнее изменение'; $lang['summary'] = 'Сводка изменений'; $lang['noflash'] = 'Для просмотра этого содержимого требуется <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.'; @@ -252,20 +266,18 @@ $lang['admin_register'] = 'Добавить пользователя'; $lang['metaedit'] = 'Править метаданные'; $lang['metasaveerr'] = 'Ошибка записи метаданных'; $lang['metasaveok'] = 'Метаданные сохранены'; -$lang['img_backto'] = 'Вернуться к'; -$lang['img_title'] = 'Название'; -$lang['img_caption'] = 'Подпись'; -$lang['img_date'] = 'Дата'; -$lang['img_fname'] = 'Имя файла'; -$lang['img_fsize'] = 'Размер'; -$lang['img_artist'] = 'Фотограф'; -$lang['img_copyr'] = 'Авторские права'; -$lang['img_format'] = 'Формат'; -$lang['img_camera'] = 'Модель'; -$lang['img_keywords'] = 'Ключевые слова'; -$lang['img_width'] = 'Ширина'; -$lang['img_height'] = 'Высота'; -$lang['img_manager'] = 'Просмотр в «управлении медиафайлами»'; +$lang['img_title'] = 'Название:'; +$lang['img_caption'] = 'Подпись:'; +$lang['img_date'] = 'Дата:'; +$lang['img_fname'] = 'Имя файла:'; +$lang['img_fsize'] = 'Размер:'; +$lang['img_artist'] = 'Фотограф:'; +$lang['img_copyr'] = 'Авторские права:'; +$lang['img_format'] = 'Формат:'; +$lang['img_camera'] = 'Модель:'; +$lang['img_keywords'] = 'Ключевые слова:'; +$lang['img_width'] = 'Ширина:'; +$lang['img_height'] = 'Высота:'; $lang['subscr_subscribe_success'] = 'Добавлен %s в подписку на %s'; $lang['subscr_subscribe_error'] = 'Невозможно добавить %s в подписку на %s'; $lang['subscr_subscribe_noaddress'] = 'Нет адреса электронной почты, сопоставленного с вашей учётной записью. Вы не можете подписаться на рассылку'; @@ -280,44 +292,46 @@ $lang['subscr_m_unsubscribe'] = 'Отменить подписку'; $lang['subscr_m_subscribe'] = 'Подписаться'; $lang['subscr_m_receive'] = 'Получить'; $lang['subscr_style_every'] = 'уведомлять о каждом изменении'; -$lang['subscr_style_digest'] = 'информационное электронное письмо со списком изменений для каждой страницы (каждые %.2f дней)'; -$lang['subscr_style_list'] = 'список изменённых страниц со времени последнего отправленного электронного письма (каждые %.2f дней)'; +$lang['subscr_style_digest'] = 'информационное электронное письмо со списком изменений для каждой страницы (каждые %.2f дн.)'; +$lang['subscr_style_list'] = 'список изменённых страниц со времени последнего отправленного электронного письма (каждые %.2f дн.)'; $lang['authtempfail'] = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом своему администратору вики.'; $lang['authpwdexpire'] = 'Действие вашего пароля истекает через %d дней. Вы должны изменить его как можно скорее'; $lang['i_chooselang'] = 'Выберите свой язык/Choose your language'; -$lang['i_installer'] = 'Установка «ДокуВики»'; +$lang['i_installer'] = 'Установка «Докувики»'; $lang['i_wikiname'] = 'Название вики'; $lang['i_enableacl'] = 'Разрешить ограничение прав доступа (рекомендуется)'; $lang['i_superuser'] = 'Суперпользователь'; $lang['i_problems'] = 'Программа установки столкнулась с проблемами, перечисленными ниже. Чтобы продолжить, вам необходимо их устранить. '; -$lang['i_modified'] = 'Из соображений безопасности эта программа запускается только на новой, неизменённой установке «ДокуВики». +$lang['i_modified'] = 'Из соображений безопасности эта программа запускается только на новой, неизменённой установке «Докувики». Вам нужно либо заново распаковать скачанный пакет установки, либо обратиться к полной - <a href="http://www.dokuwiki.org/install">инструкции по установке «ДокуВики»</a>'; + <a href="http://www.dokuwiki.org/install">инструкции по установке «Докувики»</a>'; $lang['i_funcna'] = 'Функция PHP <code>%s</code> недоступна. Может быть, она по какой-то причине заблокирована вашим хостером?'; $lang['i_phpver'] = 'Ваша версия PHP (<code>%s</code>) ниже требуемой (<code>%s</code>). Вам необходимо обновить установленную версию PHP.'; -$lang['i_permfail'] = '<code>%s</code> недоступна для записи «ДокуВики». Вам необходимо исправить системные права доступа для этой директории!'; +$lang['i_mbfuncoverload'] = 'Для запуска «Докувики» необходимо отключить параметр mbstring.func_overload в php.ini'; +$lang['i_permfail'] = '<code>%s</code> недоступна для записи «Докувики». Вам необходимо исправить системные права доступа для этой директории!'; $lang['i_confexists'] = '<code>%s</code> уже существует'; -$lang['i_writeerr'] = 'Не удалось создать <code>%s</code>. Вам необходимо проверить системные права доступа к файлу/директориям и создать файл вручную. '; +$lang['i_writeerr'] = 'Не удалось создать <code>%s</code>. Вам необходимо проверить системные права доступа к файлу и директориям, и создать файл вручную. '; $lang['i_badhash'] = 'dokuwiki.php не распознан или изменён (хэш=<code>%s</code>)'; $lang['i_badval'] = '<code>%s</code> — недопустимое или пустое значение'; $lang['i_success'] = 'Конфигурация прошла успешно. Теперь вы можете удалить файл install.php. Переходите к - <a href="doku.php?id=wiki:welcome">своей новой «ДокуВики»</a>.'; -$lang['i_failure'] = 'При записи в файлы конфигурации были обнаружены ошибки. Возможно, вам придётся исправить их вручную, прежде чем вы сможете использовать <a href="doku.php?id=wiki:welcome">свою новую «ДокуВики»</a>.'; + <a href="doku.php?id=wiki:welcome">своей новой «Докувики»</a>.'; +$lang['i_failure'] = 'При записи в файлы конфигурации были обнаружены ошибки. Возможно, вам придётся исправить их вручную, прежде чем вы сможете использовать <a href="doku.php?id=wiki:welcome">свою новую «Докувики»</a>.'; $lang['i_policy'] = 'Исходная политика прав доступа'; -$lang['i_pol0'] = 'Открытая вики (чтение, запись, закачка файлов для всех)'; +$lang['i_pol0'] = 'Открытая вики (чтение, запись, загрузка файлов для всех)'; $lang['i_pol1'] = 'Общедоступная вики (чтение для всех, запись и загрузка файлов для зарегистрированных пользователей)'; $lang['i_pol2'] = 'Закрытая вики (чтение, запись и загрузка файлов только для зарегистрированных пользователей)'; +$lang['i_allowreg'] = 'Разрешить пользователям самостоятельно регистрироваться'; $lang['i_retry'] = 'Повторить попытку'; -$lang['i_license'] = 'Пожалуйста, выберите тип лицензии для своей вики:'; -$lang['i_license_none'] = 'Не отображать информацию о лицензионных операциях'; -$lang['i_pop_field'] = 'Пожалуйста, помогите нам улучшить «ДокуВики»:'; -$lang['i_pop_label'] = 'Отправлять раз в месяц анонимную пользовательскую информацию разработчикам «ДокуВики»'; +$lang['i_license'] = 'Пожалуйста, выберите тип лицензии для своей вики'; +$lang['i_license_none'] = 'Не отображать информацию о лицензии'; +$lang['i_pop_field'] = 'Пожалуйста, помогите нам улучшить «Докувики»:'; +$lang['i_pop_label'] = 'Отправлять раз в месяц анонимную пользовательскую информацию разработчикам «Докувики»'; $lang['recent_global'] = 'Вы просматриваете изменения в пространстве имён <b>%s</b>. Вы можете также <a href="%s">просмотреть недавние изменения во всей вики</a>.'; $lang['years'] = '%d лет назад'; -$lang['months'] = '%d месяц(ев) назад'; +$lang['months'] = '%d месяц (-ев) назад'; $lang['weeks'] = '%d недель назад'; $lang['days'] = '%d дней назад'; -$lang['hours'] = '%d час(ов) назад'; +$lang['hours'] = '%d час (-ов) назад'; $lang['minutes'] = '%d минут назад'; $lang['seconds'] = '%d секунд назад'; $lang['wordblock'] = 'Ваши изменения не сохранены, поскольку они содержат блокируемые слова (спам).'; @@ -333,8 +347,8 @@ $lang['media_sort_name'] = 'Сортировка по имени'; $lang['media_sort_date'] = 'Сортировка по дате'; $lang['media_namespaces'] = 'Выберите каталог'; $lang['media_files'] = 'Файлы в %s'; -$lang['media_upload'] = 'Загрузка в пространство имён <strong>%s</strong>.'; -$lang['media_search'] = 'Поиск в пространстве имён <strong>%s</strong>.'; +$lang['media_upload'] = 'Загрузка в пространство имён %s'; +$lang['media_search'] = 'Поиск в пространстве имён %s'; $lang['media_view'] = '%s'; $lang['media_viewold'] = '%s в %s '; @@ -345,3 +359,9 @@ $lang['media_perm_read'] = 'Извините, у вас недостато $lang['media_perm_upload'] = 'Извините, у вас недостаточно прав для загрузки файлов.'; $lang['media_update'] = 'Загрузить новую версию'; $lang['media_restore'] = 'Восстановить эту версию'; +$lang['currentns'] = 'Текущее пространство имён'; +$lang['searchresult'] = 'Результаты поиска'; +$lang['plainhtml'] = 'Простой HTML'; +$lang['wikimarkup'] = 'вики-разметка'; +$lang['page_nonexist_rev'] = 'Эта страница ещё не существовала %s. Она была создана <a href="%s">%s</a>.'; +$lang['unable_to_parse_date'] = 'Невозможно обработать параметр "%s".'; diff --git a/inc/lang/ru/mailtext.txt b/inc/lang/ru/mailtext.txt index 2b3f76bbd..929174910 100644 --- a/inc/lang/ru/mailtext.txt +++ b/inc/lang/ru/mailtext.txt @@ -13,5 +13,5 @@ IP-адрес: @IPADDRESS@ -- -Это письмо было сгенерировано «ДокуВики» по адресу +Это письмо создано «Докувики» с сайта @DOKUWIKIURL@ diff --git a/inc/lang/ru/norev.txt b/inc/lang/ru/norev.txt index 388d6149d..c088d0d5a 100644 --- a/inc/lang/ru/norev.txt +++ b/inc/lang/ru/norev.txt @@ -1,4 +1,3 @@ ====== Такой версии не существует ====== Указанная версия страницы не существует. Нажмите на кнопку «История страницы», чтобы получить список доступных предыдущих версий этого документа. - diff --git a/inc/lang/ru/password.txt b/inc/lang/ru/password.txt index eb100f334..360201bd9 100644 --- a/inc/lang/ru/password.txt +++ b/inc/lang/ru/password.txt @@ -6,5 +6,5 @@ Пароль: @PASSWORD@ -- -Это письмо было сгенерировано «ДокуВики» по адресу +Это письмо создано «Докувики» с сайта @DOKUWIKIURL@ diff --git a/inc/lang/ru/pwconfirm.txt b/inc/lang/ru/pwconfirm.txt index 9c27af752..de31aa9a8 100644 --- a/inc/lang/ru/pwconfirm.txt +++ b/inc/lang/ru/pwconfirm.txt @@ -9,5 +9,5 @@ @CONFIRM@ -- -Это сообщение было сгенерировано «ДокуВики» по адресу +Это письмо создано «Докувики» с сайта @DOKUWIKIURL@ diff --git a/inc/lang/ru/registermail.txt b/inc/lang/ru/registermail.txt index fc862b034..d55296558 100644 --- a/inc/lang/ru/registermail.txt +++ b/inc/lang/ru/registermail.txt @@ -10,5 +10,5 @@ Хост: @HOSTNAME@ -- -Это сообщение было сгенерировано «ДокуВики» по адресу +Это письмо создано «Докувики» с сайта @DOKUWIKIURL@ diff --git a/inc/lang/ru/revisions.txt b/inc/lang/ru/revisions.txt index 55072cd8a..40fbedf0e 100644 --- a/inc/lang/ru/revisions.txt +++ b/inc/lang/ru/revisions.txt @@ -1,3 +1,3 @@ ====== История страницы ====== -Перед вами — история правок текущего документа. Чтобы вернуться к одной из предыдущих версий, выберите нужную, нажмите «Править страницу» и сохраните. +Перед вами история правок текущего документа. Чтобы вернуться к одной из предыдущих версий, выберите нужную, нажмите «Править страницу» и сохраните. diff --git a/inc/lang/ru/searchpage.txt b/inc/lang/ru/searchpage.txt index 04feb21cd..d12a848c6 100644 --- a/inc/lang/ru/searchpage.txt +++ b/inc/lang/ru/searchpage.txt @@ -1,5 +1,5 @@ ====== Поиск ====== -Перед вами результаты поиска. Если вы не нашли то, что искали, вы можете создать новую страницу с именем, совпадающим с запросом. Чтобы сделать это, просто нажмите на кнопку «Создать страницу». +Перед вами результаты поиска. @CREATEPAGEINFO@ ===== Результаты =====
\ No newline at end of file diff --git a/inc/lang/ru/subscr_digest.txt b/inc/lang/ru/subscr_digest.txt index 41774a4e9..ac0fc0528 100644 --- a/inc/lang/ru/subscr_digest.txt +++ b/inc/lang/ru/subscr_digest.txt @@ -15,6 +15,6 @@ @SUBSCRIBE@ и отмените подписку на страницу и/или пространство имен. --- -Это письмо создано «ДокуВики» с сайта +-- +Это письмо создано «Докувики» с сайта @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/ru/subscr_list.txt b/inc/lang/ru/subscr_list.txt index 41e1323bc..984a25eb0 100644 --- a/inc/lang/ru/subscr_list.txt +++ b/inc/lang/ru/subscr_list.txt @@ -12,6 +12,6 @@ @SUBSCRIBE@ и отмените подписку на страницу и/или пространство имён. --- -Это письмо создано «ДокуВики» с сайта +-- +Это письмо создано «Докувики» с сайта @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/ru/subscr_single.txt b/inc/lang/ru/subscr_single.txt index 911a48e96..679ca6fff 100644 --- a/inc/lang/ru/subscr_single.txt +++ b/inc/lang/ru/subscr_single.txt @@ -19,6 +19,6 @@ @SUBSCRIBE@ и отмените подписку на страницу и/или пространство имён. --- -Это письмо создано «ДокуВики» с сайта +-- +Это письмо создано «Докувики» с сайта @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/ru/uploadmail.txt b/inc/lang/ru/uploadmail.txt index f696f2c44..1cc5c6a5a 100644 --- a/inc/lang/ru/uploadmail.txt +++ b/inc/lang/ru/uploadmail.txt @@ -11,5 +11,5 @@ Пользователь: @USER@ -- -Это письмо было сгенерировано «ДокуВики» по адресу +Это письмо создано «Докувики» с сайта @DOKUWIKIURL@ diff --git a/inc/lang/sk/denied.txt b/inc/lang/sk/denied.txt index 6e9c98496..aa6f7b8fb 100644 --- a/inc/lang/sk/denied.txt +++ b/inc/lang/sk/denied.txt @@ -1,3 +1,4 @@ ====== Nepovolená akcia ====== -Prepáčte, ale nemáte dostatočné oprávnenie k tejto činnosti. Možno ste sa zabudli prihlásiť? +Prepáčte, ale nemáte dostatočné oprávnenie k tejto činnosti. + diff --git a/inc/lang/sk/jquery.ui.datepicker.js b/inc/lang/sk/jquery.ui.datepicker.js new file mode 100644 index 000000000..1f924f820 --- /dev/null +++ b/inc/lang/sk/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['sk'] = { + closeText: 'Zavrieť', + prevText: '<Predchádzajúci', + nextText: 'Nasledujúci>', + currentText: 'Dnes', + monthNames: ['január','február','marec','apríl','máj','jún', + 'júl','august','september','október','november','december'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún', + 'Júl','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['nedeľa','pondelok','utorok','streda','štvrtok','piatok','sobota'], + dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'], + dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'], + weekHeader: 'Ty', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['sk']); + +return datepicker.regional['sk']; + +})); diff --git a/inc/lang/sk/lang.php b/inc/lang/sk/lang.php index a5fc47f5f..afbf79503 100644 --- a/inc/lang/sk/lang.php +++ b/inc/lang/sk/lang.php @@ -51,7 +51,7 @@ $lang['btn_register'] = 'Registrovať'; $lang['btn_apply'] = 'Použiť'; $lang['btn_media'] = 'Správa médií'; $lang['btn_deleteuser'] = 'Zrušiť môj účet'; -$lang['loggedinas'] = 'Prihlásený(á) ako'; +$lang['loggedinas'] = 'Prihlásený(á) ako:'; $lang['user'] = 'Užívateľské meno'; $lang['pass'] = 'Heslo'; $lang['newpass'] = 'Nové heslo'; @@ -66,6 +66,7 @@ $lang['badpassconfirm'] = 'Ľutujem, heslo bolo nesprávne.'; $lang['minoredit'] = 'Menšie zmeny'; $lang['draftdate'] = 'Koncept automaticky uložený'; $lang['nosecedit'] = 'Stránka bola medzičasom zmenená, informácie o sekcii sú zastaralé a z tohto dôvodu bola nahraná celá stránka.'; +$lang['searchcreatepage'] = "Pokiaľ ste nenašli, čo hľadáte, skúste požadovanú stránku sami vytvoriť stlačením tlačidla ''Vytvoriť stránku''."; $lang['regmissing'] = 'Musíte vyplniť všetky údaje.'; $lang['reguexists'] = 'Užívateľ s rovnakým menom je už zaregistrovaný.'; $lang['regsuccess'] = 'Užívateľský účet bol vytvorený a heslo zaslané emailom.'; @@ -96,8 +97,8 @@ $lang['license'] = 'Ak nie je uvedené inak, obsah tejto wiki je u $lang['licenseok'] = 'Poznámka: Zmenou tejto stránky súhlasíte s uverejnením obsahu pod nasledujúcou licenciou:'; $lang['searchmedia'] = 'Hľadať meno súboru:'; $lang['searchmedia_in'] = 'Hľadať v %s'; -$lang['txt_upload'] = 'Vyberte súbor ako prílohu'; -$lang['txt_filename'] = 'Uložiť ako (voliteľné)'; +$lang['txt_upload'] = 'Vyberte súbor ako prílohu:'; +$lang['txt_filename'] = 'Uložiť ako (voliteľné):'; $lang['txt_overwrt'] = 'Prepísať existujúci súbor'; $lang['maxuploadsize'] = 'Obmedzenie max. %s na súbor.'; $lang['lockedby'] = 'Práve zamknuté:'; @@ -183,9 +184,9 @@ $lang['diff_type'] = 'Prehľad zmien:'; $lang['diff_inline'] = 'Vnorený'; $lang['diff_side'] = 'Vedľa seba'; $lang['line'] = 'Riadok'; -$lang['breadcrumb'] = 'História'; -$lang['youarehere'] = 'Nachádzate sa'; -$lang['lastmod'] = 'Posledná úprava'; +$lang['breadcrumb'] = 'História:'; +$lang['youarehere'] = 'Nachádzate sa:'; +$lang['lastmod'] = 'Posledná úprava:'; $lang['by'] = 'od'; $lang['deleted'] = 'odstránené'; $lang['created'] = 'vytvorené'; @@ -238,20 +239,20 @@ $lang['admin_register'] = 'Pridaj nového užívateľa'; $lang['metaedit'] = 'Upraviť metainformácie'; $lang['metasaveerr'] = 'Zápis metainformácií zlyhal'; $lang['metasaveok'] = 'Metainformácie uložené'; -$lang['img_backto'] = 'Späť na'; -$lang['img_title'] = 'Titul'; -$lang['img_caption'] = 'Popis'; -$lang['img_date'] = 'Dátum'; -$lang['img_fname'] = 'Názov súboru'; -$lang['img_fsize'] = 'Veľkosť'; -$lang['img_artist'] = 'Fotograf'; -$lang['img_copyr'] = 'Kopírovacie práva'; -$lang['img_format'] = 'Formát'; -$lang['img_camera'] = 'Fotoaparát'; -$lang['img_keywords'] = 'Kľúčové slová'; -$lang['img_width'] = 'Šírka'; -$lang['img_height'] = 'Výška'; -$lang['img_manager'] = 'Prezrieť v správcovi médií'; +$lang['btn_img_backto'] = 'Späť na %s'; +$lang['img_title'] = 'Titul:'; +$lang['img_caption'] = 'Popis:'; +$lang['img_date'] = 'Dátum:'; +$lang['img_fname'] = 'Názov súboru:'; +$lang['img_fsize'] = 'Veľkosť:'; +$lang['img_artist'] = 'Fotograf:'; +$lang['img_copyr'] = 'Kopírovacie práva:'; +$lang['img_format'] = 'Formát:'; +$lang['img_camera'] = 'Fotoaparát:'; +$lang['img_keywords'] = 'Kľúčové slová:'; +$lang['img_width'] = 'Šírka:'; +$lang['img_height'] = 'Výška:'; +$lang['btn_mediaManager'] = 'Prezrieť v správcovi médií'; $lang['subscr_subscribe_success'] = 'Používateľ %s bol pridaný do zoznamu hlásení o zmenách %s'; $lang['subscr_subscribe_error'] = 'Chyba pri pridaní používateľa %s do zoznamu hlásení o zmenách %s'; $lang['subscr_subscribe_noaddress'] = 'Vaše prihlasovacie meno nemá priradenú žiadnu email adresu, nemôžete byť pridaný do zoznamu hlásení o zmenách'; @@ -290,6 +291,7 @@ $lang['i_policy'] = 'Počiatočná ACL politika'; $lang['i_pol0'] = 'Otvorená Wiki (čítanie, zápis a nahrávanie pre každého)'; $lang['i_pol1'] = 'Verejná Wiki (čítanie pre každého, zápis a nahrávanie pre registrovaných užívateľov)'; $lang['i_pol2'] = 'Uzatvorená Wiki (čítanie, zápis a nahrávanie len pre registrovaných užívateľov)'; +$lang['i_allowreg'] = 'Povolenie samostanej registrácie používateľov'; $lang['i_retry'] = 'Skúsiť znovu'; $lang['i_license'] = 'Vyberte licenciu, pod ktorou chcete uložiť váš obsah:'; $lang['i_license_none'] = 'Nezobrazovať žiadne licenčné informácie'; diff --git a/inc/lang/sk/searchpage.txt b/inc/lang/sk/searchpage.txt index 3fdf074b7..3684f1c6c 100644 --- a/inc/lang/sk/searchpage.txt +++ b/inc/lang/sk/searchpage.txt @@ -1,5 +1,5 @@ ====== Vyhľadávanie ====== -Výsledky hľadania môžete vidieť nižšie. Pokiaľ ste nenašli, čo hľadáte, skúste požadovanú stránku sami vytvoriť stlačením tlačidla ''Vytvoriť stránku''. +Výsledky hľadania môžete vidieť nižšie. @CREATEPAGEINFO@ ===== Výsledky ===== diff --git a/inc/lang/sl/denied.txt b/inc/lang/sl/denied.txt index 5b5fd4d3a..206e167bb 100644 --- a/inc/lang/sl/denied.txt +++ b/inc/lang/sl/denied.txt @@ -1,3 +1,4 @@ ====== Ni ustreznih dovoljenj ====== -Za nadaljevanje opravila je treba imeti ustrezna dovoljenja. Ali ste se morda pozabili prijaviti? +Za nadaljevanje opravila je treba imeti ustrezna dovoljenja. + diff --git a/inc/lang/sl/jquery.ui.datepicker.js b/inc/lang/sl/jquery.ui.datepicker.js new file mode 100644 index 000000000..88d7f2b19 --- /dev/null +++ b/inc/lang/sl/jquery.ui.datepicker.js @@ -0,0 +1,38 @@ +/* Slovenian initialisation for the jQuery UI date picker plugin. */ +/* Written by Jaka Jancar (jaka@kubje.org). */ +/* c = č, s = š z = ž C = Č S = Š Z = Ž */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['sl'] = { + closeText: 'Zapri', + prevText: '<Prejšnji', + nextText: 'Naslednji>', + currentText: 'Trenutni', + monthNames: ['Januar','Februar','Marec','April','Maj','Junij', + 'Julij','Avgust','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'], + dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'], + dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'], + weekHeader: 'Teden', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['sl']); + +return datepicker.regional['sl']; + +})); diff --git a/inc/lang/sl/lang.php b/inc/lang/sl/lang.php index 371b6659d..b649d08cb 100644 --- a/inc/lang/sl/lang.php +++ b/inc/lang/sl/lang.php @@ -9,6 +9,8 @@ * @author Gregor Skumavc (grega.skumavc@gmail.com) * @author Matej Urbančič (mateju@svn.gnome.org) * @author Matej Urbančič <mateju@svn.gnome.org> + * @author matej <mateju@svn.gnome.org> + * @author Jernej Vidmar <jernej.vidmar@vidmarboehm.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -53,7 +55,9 @@ $lang['btn_register'] = 'Prijava'; $lang['btn_apply'] = 'Uveljavi'; $lang['btn_media'] = 'Urejevalnik predstavnih vsebin'; $lang['btn_deleteuser'] = 'Odstrani račun'; -$lang['loggedinas'] = 'Prijava kot'; +$lang['btn_img_backto'] = 'Nazaj na %s'; +$lang['btn_mediaManager'] = 'Poglej v urejevalniku predstavnih vsebin'; +$lang['loggedinas'] = 'Prijava kot:'; $lang['user'] = 'Uporabniško ime'; $lang['pass'] = 'Geslo'; $lang['newpass'] = 'Novo geslo'; @@ -68,6 +72,7 @@ $lang['badpassconfirm'] = 'Napaka! Geslo ni pravo.'; $lang['minoredit'] = 'Manjše spremembe'; $lang['draftdate'] = 'Samodejno shranjevanje osnutka je omogočeno'; $lang['nosecedit'] = 'Stran je bila v vmesnem času spremenjena. Podatki strani so bili zastareli, zato se je celotna vsebina naložila znova.'; +$lang['searchcreatepage'] = "V kolikor rezultati niso skladni z zahtevami iskanja, je mogoče ustvariti novo stran z nazivom vaše poizvedbe preko povezave ''Uredi stran''."; $lang['regmissing'] = 'Izpolniti je treba vsa polja.'; $lang['reguexists'] = 'Uporabnik s tem imenom že obstaja.'; $lang['regsuccess'] = 'Uporabniški račun je uspešno ustvarjen. Geslo je bilo poslano na naveden elektronski naslov.'; @@ -84,6 +89,7 @@ $lang['profchanged'] = 'Uporabniški profil je uspešno posodobljen.'; $lang['profnodelete'] = 'Ni omogočena podpora za brisanje uporabnikov.'; $lang['profdeleteuser'] = 'Izbriši račun'; $lang['profdeleted'] = 'Uporabniški račun je izbrisan.'; +$lang['profconfdeletemissing'] = 'Potrditveno okno ni označeno'; $lang['pwdforget'] = 'Ali ste pozabili geslo? Pridobite si novo geslo.'; $lang['resendna'] = 'DokuWiki ne podpira možnosti ponovnega pošiljanja gesel.'; $lang['resendpwd'] = 'Nastavi novo geslo za'; @@ -96,11 +102,11 @@ $lang['license'] = 'V kolikor ni posebej določeno, je vsebina Wik $lang['licenseok'] = 'Opomba: z urejanjem vsebine strani, se strinjate z objavo pod pogoji dovoljenja:'; $lang['searchmedia'] = 'Poišči ime datoteke:'; $lang['searchmedia_in'] = 'Poišči v %s'; -$lang['txt_upload'] = 'Izberite datoteko za pošiljanje'; -$lang['txt_filename'] = 'Pošlji z imenom (izborno)'; +$lang['txt_upload'] = 'Izberite datoteko za pošiljanje:'; +$lang['txt_filename'] = 'Pošlji z imenom (izborno):'; $lang['txt_overwrt'] = 'Prepiši obstoječo datoteko'; -$lang['lockedby'] = 'Trenutno je zaklenjeno s strani'; -$lang['lockexpire'] = 'Zaklep preteče ob'; +$lang['lockedby'] = 'Trenutno je zaklenjeno s strani:'; +$lang['lockexpire'] = 'Zaklep preteče ob:'; $lang['js']['willexpire'] = 'Zaklep za urejevanje bo pretekel čez eno minuto.\nV izogib sporom, uporabite predogled, da se merilnik časa za zaklep ponastavi.'; $lang['js']['notsavedyet'] = 'Neshranjene spremembe bodo izgubljene.'; $lang['js']['searchmedia'] = 'Poišči datoteke'; @@ -178,10 +184,13 @@ $lang['difflink'] = 'Poveži s tem pogledom primerjave.'; $lang['diff_type'] = 'Razlike:'; $lang['diff_inline'] = 'V besedilu'; $lang['diff_side'] = 'Eno ob drugem'; +$lang['diffprevrev'] = 'Prejšnja revizija'; +$lang['diffnextrev'] = 'Naslednja revizija'; +$lang['difflastrev'] = 'Zadnja revizija'; $lang['line'] = 'Vrstica'; -$lang['breadcrumb'] = 'Sled'; -$lang['youarehere'] = 'Trenutno dejavna stran'; -$lang['lastmod'] = 'Zadnja sprememba'; +$lang['breadcrumb'] = 'Sled:'; +$lang['youarehere'] = 'Trenutno dejavna stran:'; +$lang['lastmod'] = 'Zadnja sprememba:'; $lang['by'] = 'uporabnika'; $lang['deleted'] = 'odstranjena'; $lang['created'] = 'ustvarjena'; @@ -234,20 +243,18 @@ $lang['admin_register'] = 'Dodaj novega uporabnika'; $lang['metaedit'] = 'Uredi metapodatke'; $lang['metasaveerr'] = 'Zapisovanje metapodatkov je spodletelo'; $lang['metasaveok'] = 'Metapodatki so shranjeni'; -$lang['img_backto'] = 'Nazaj na'; -$lang['img_title'] = 'Naslov'; -$lang['img_caption'] = 'Opis'; -$lang['img_date'] = 'Datum'; -$lang['img_fname'] = 'Ime datoteke'; -$lang['img_fsize'] = 'Velikost'; -$lang['img_artist'] = 'Fotograf'; -$lang['img_copyr'] = 'Avtorska pravica'; -$lang['img_format'] = 'Zapis'; -$lang['img_camera'] = 'Fotoaparat'; -$lang['img_keywords'] = 'Ključne besede'; -$lang['img_width'] = 'Širina'; -$lang['img_height'] = 'Višina'; -$lang['img_manager'] = 'Poglej v urejevalniku predstavnih vsebin'; +$lang['img_title'] = 'Naslov:'; +$lang['img_caption'] = 'Opis:'; +$lang['img_date'] = 'Datum:'; +$lang['img_fname'] = 'Ime datoteke:'; +$lang['img_fsize'] = 'Velikost:'; +$lang['img_artist'] = 'Fotograf:'; +$lang['img_copyr'] = 'Avtorska pravica:'; +$lang['img_format'] = 'Zapis:'; +$lang['img_camera'] = 'Fotoaparat:'; +$lang['img_keywords'] = 'Ključne besede:'; +$lang['img_width'] = 'Širina:'; +$lang['img_height'] = 'Višina:'; $lang['subscr_subscribe_success'] = 'Uporabniški račun %s je dodan na seznam naročnin na %s'; $lang['subscr_subscribe_error'] = 'Napaka med dodajanjem %s na seznam naročnin na %s'; $lang['subscr_subscribe_noaddress'] = 'S trenutnimi prijavnimi podatki ni povezanega elektronskega naslova, zato uporabniškega računa ni mogoče dodati na seznam naročnikov.'; @@ -265,6 +272,7 @@ $lang['subscr_style_every'] = 'elektronsko sporočilo ob vsaki spremembi'; $lang['subscr_style_digest'] = 'strnjeno elektronsko sporočilo sprememb za vsako stran (vsakih %.2f dni)'; $lang['subscr_style_list'] = 'seznam spremenjenih strani od zadnjega elektronskega sporočila (vsakih %.2f dni)'; $lang['authtempfail'] = 'Potrditev uporabnika je trenutno nedostopna. Stopite v stik s skrbnikom sistema wiki.'; +$lang['authpwdexpire'] = 'Geslo bo poteklo v %d dneh. Priporočljivo ga je zamenjati.'; $lang['i_chooselang'] = 'Izberite jezik'; $lang['i_installer'] = 'DokuWiki namestitev'; $lang['i_wikiname'] = 'Ime Wiki spletišča'; @@ -289,6 +297,8 @@ $lang['i_allowreg'] = 'Dovoli uporabnikom vpis'; $lang['i_retry'] = 'Ponovni poskus'; $lang['i_license'] = 'Izbor dovoljenja objave vsebine:'; $lang['i_license_none'] = 'Ne pokaži podrobnosti dovoljenja.'; +$lang['i_pop_field'] = 'Prosimo pomagajte nam izboljšati DokuWiki izkušnjo:'; +$lang['i_pop_label'] = 'Enkrat na mesec pošlji anonimne uporabniške podatke DokuWiki razvijalcem'; $lang['recent_global'] = 'Trenutno so prikazane spremembe znotraj imenskega prostora <b>%s</b>. Mogoče si je ogledati tudi spremembe <a href="%s">celotnega sistema Wiki</a>.'; $lang['years'] = '%d let nazaj'; $lang['months'] = '%d mesecev nazaj'; @@ -324,3 +334,4 @@ $lang['media_restore'] = 'Obnovi to različico'; $lang['currentns'] = 'Trenutni imenski prostor'; $lang['searchresult'] = 'Rezultati iskanja'; $lang['plainhtml'] = 'Zapis HTML'; +$lang['wikimarkup'] = 'Oblikovni jezik Wiki'; diff --git a/inc/lang/sl/resetpwd.txt b/inc/lang/sl/resetpwd.txt new file mode 100644 index 000000000..c2a81ab9a --- /dev/null +++ b/inc/lang/sl/resetpwd.txt @@ -0,0 +1 @@ +====== Nastavitev novega gesla ======<br><br>Vnesite novo geslo za račun Wiki.
\ No newline at end of file diff --git a/inc/lang/sl/searchpage.txt b/inc/lang/sl/searchpage.txt index 736a36182..6ccfa96a4 100644 --- a/inc/lang/sl/searchpage.txt +++ b/inc/lang/sl/searchpage.txt @@ -1,5 +1,5 @@ ====== Iskanje ====== -Spodaj so izpisani rezultati iskanja. V kolikor rezultati niso skladni z zahtevami iskanja, je mogoče ustvariti novo stran z nazivom vaše poizvedbe preko povezave ''Uredi stran''. +Spodaj so izpisani rezultati iskanja. @CREATEPAGEINFO@ ===== Rezultati =====
\ No newline at end of file diff --git a/inc/lang/sq/denied.txt b/inc/lang/sq/denied.txt index 03e10527f..60aa05e55 100644 --- a/inc/lang/sq/denied.txt +++ b/inc/lang/sq/denied.txt @@ -1,3 +1,4 @@ ====== Leja Refuzohet ====== -Na vjen keq, ju nuk keni të drejta të mjaftueshme për të vazhduar. Mbase harruat të hyni?
\ No newline at end of file +Na vjen keq, ju nuk keni të drejta të mjaftueshme për të vazhduar. + diff --git a/inc/lang/sq/jquery.ui.datepicker.js b/inc/lang/sq/jquery.ui.datepicker.js new file mode 100644 index 000000000..f88c22c56 --- /dev/null +++ b/inc/lang/sq/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Albanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Flakron Bytyqi (flakron@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['sq'] = { + closeText: 'mbylle', + prevText: '<mbrapa', + nextText: 'Përpara>', + currentText: 'sot', + monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor', + 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'], + monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer', + 'Kor','Gus','Sht','Tet','Nën','Dhj'], + dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'], + dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'], + dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'], + weekHeader: 'Ja', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['sq']); + +return datepicker.regional['sq']; + +})); diff --git a/inc/lang/sq/lang.php b/inc/lang/sq/lang.php index 2ed62ed4e..4c61b6a70 100644 --- a/inc/lang/sq/lang.php +++ b/inc/lang/sq/lang.php @@ -49,7 +49,7 @@ $lang['btn_recover'] = 'Rekupero skicën'; $lang['btn_draftdel'] = 'Fshi skicën'; $lang['btn_revert'] = 'Kthe si më parë'; $lang['btn_register'] = 'Regjsitrohuni'; -$lang['loggedinas'] = 'Regjistruar si '; +$lang['loggedinas'] = 'Regjistruar si :'; $lang['user'] = 'Nofka e përdoruesit:'; $lang['pass'] = 'Fjalëkalimi'; $lang['newpass'] = 'Fjalëkalim i ri'; @@ -63,6 +63,7 @@ $lang['badlogin'] = 'Na vjen keq, emri ose fjalëkalimi është gab $lang['minoredit'] = 'Ndryshime të Vogla'; $lang['draftdate'] = 'Skica u ruajt automatikisht në'; $lang['nosecedit'] = 'Faqja u ndryshua ndëwrkohë, informacioni i kwtij seksioni ishte i vjetër, u ngarkua faqja e tërë në vend të saj.'; +$lang['searchcreatepage'] = 'Nëse nuk e gjetët atë që po kërkonit, mund të krijoni ose redaktoni një faqe pas pyetjes suaj me butonin përkatës.'; $lang['regmissing'] = 'Na vjen keq, duhet të plotësoni të gjitha fushat.'; $lang['reguexists'] = 'Na vjen keq, ekziston një përdorues tjetër me të njëjtin emër.'; $lang['regsuccess'] = 'Përdoruesi u regjistrua dhe fjalëkalimi u dërgua me email.'; @@ -87,11 +88,11 @@ $lang['license'] = 'Përveç rasteve të përcaktuara, përmbajtja $lang['licenseok'] = 'Shënim: Duke redaktuar këtë faqe ju bini dakort të liçensoni përmbajtjen tuaj nën liçensën e mëposhtme:'; $lang['searchmedia'] = 'Kërko emrin e skedarit:'; $lang['searchmedia_in'] = 'Kërko në %s'; -$lang['txt_upload'] = 'Zgjidh skedarin për ngarkim'; -$lang['txt_filename'] = 'Ngarko si (alternative)'; +$lang['txt_upload'] = 'Zgjidh skedarin për ngarkim:'; +$lang['txt_filename'] = 'Ngarko si (alternative):'; $lang['txt_overwrt'] = 'Zëvendëso skedarin ekzistues'; -$lang['lockedby'] = 'Kyçur momentalisht nga'; -$lang['lockexpire'] = 'Kyçi skadon në'; +$lang['lockedby'] = 'Kyçur momentalisht nga:'; +$lang['lockexpire'] = 'Kyçi skadon në:'; $lang['js']['willexpire'] = 'Kyçi juaj për redaktimin e kësaj faqeje është duke skaduar.\nPër të shmangur konflikte përdorni butonin Shiko Paraprakisht për të rivendosur kohën e kyçjes.'; $lang['js']['notsavedyet'] = 'Ndryshimet e paruajtura do të humbasin.\nVazhdo me të vërtetë?'; $lang['rssfailed'] = 'Ndoshi një gabim gjatë kapjes së këtij lajmi:'; @@ -134,9 +135,9 @@ $lang['yours'] = 'Versioni Juaj'; $lang['diff'] = 'Trego ndryshimet nga rishikimet aktuale'; $lang['diff2'] = 'Trego ndryshimet mes rishikimeve të përzgjedhura'; $lang['line'] = 'Vijë'; -$lang['breadcrumb'] = 'Gjurmë'; -$lang['youarehere'] = 'Ju jeni këtu'; -$lang['lastmod'] = 'Redaktuar për herë të fundit'; +$lang['breadcrumb'] = 'Gjurmë:'; +$lang['youarehere'] = 'Ju jeni këtu:'; +$lang['lastmod'] = 'Redaktuar për herë të fundit:'; $lang['by'] = 'nga'; $lang['deleted'] = 'u fshi'; $lang['created'] = 'u krijua'; @@ -179,17 +180,17 @@ $lang['admin_register'] = 'Shto Përdorues të Ri'; $lang['metaedit'] = 'Redakto Metadata'; $lang['metasaveerr'] = 'Shkrimi i metadata-ve dështoi'; $lang['metasaveok'] = 'Metadata u ruajt'; -$lang['img_backto'] = 'Mbrapa te'; -$lang['img_title'] = 'Titulli '; -$lang['img_caption'] = 'Titra'; -$lang['img_date'] = 'Data'; -$lang['img_fname'] = 'Emri Skedarit'; -$lang['img_fsize'] = 'Madhësia'; -$lang['img_artist'] = 'Autor'; -$lang['img_copyr'] = 'Mbajtësi i të drejtave të autorit'; -$lang['img_format'] = 'Formati'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Fjalë Kyçe'; +$lang['btn_img_backto'] = 'Mbrapa te %s'; +$lang['img_title'] = 'Titulli :'; +$lang['img_caption'] = 'Titra:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Emri Skedarit:'; +$lang['img_fsize'] = 'Madhësia:'; +$lang['img_artist'] = 'Autor:'; +$lang['img_copyr'] = 'Mbajtësi i të drejtave të autorit:'; +$lang['img_format'] = 'Formati:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Fjalë Kyçe:'; $lang['subscr_subscribe_success'] = 'Iu shtua %s listës së abonimeve për %s'; $lang['subscr_subscribe_error'] = 'Gabim gjatë shtimit të %s listës së abonimeve për %s'; $lang['subscr_subscribe_noaddress'] = 'Nuk ekziston asnjë adresë e lidhur me regjistrimin tuaj, ju nuk mund t\'i shtoheni listës së abonimeve.'; diff --git a/inc/lang/sq/searchpage.txt b/inc/lang/sq/searchpage.txt index 2f34cabb9..b0d6d1f31 100644 --- a/inc/lang/sq/searchpage.txt +++ b/inc/lang/sq/searchpage.txt @@ -1,5 +1,5 @@ ====== Kërko ====== -Mund të gjeni rezultatet e kërkimit tuaj më poshtë. Nëse nuk e gjetët atë që po kërkonit, mund të krijoni ose redaktoni një faqe pas pyetjes suaj me butonin përkatës. +Mund të gjeni rezultatet e kërkimit tuaj më poshtë. @CREATEPAGEINFO@ ===== Rezultate =====
\ No newline at end of file diff --git a/inc/lang/sr/denied.txt b/inc/lang/sr/denied.txt index b74f2b1f8..521c28453 100644 --- a/inc/lang/sr/denied.txt +++ b/inc/lang/sr/denied.txt @@ -1,4 +1,4 @@ ====== Забрањен приступ ====== -Извините, али немате довољно права да наставите. Можда сте заборавили да се пријавите? +Извините, али немате довољно права да наставите. diff --git a/inc/lang/sr/jquery.ui.datepicker.js b/inc/lang/sr/jquery.ui.datepicker.js new file mode 100644 index 000000000..0f6d9e240 --- /dev/null +++ b/inc/lang/sr/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['sr'] = { + closeText: 'Затвори', + prevText: '<', + nextText: '>', + currentText: 'Данас', + monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун', + 'Јул','Август','Септембар','Октобар','Новембар','Децембар'], + monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун', + 'Јул','Авг','Сеп','Окт','Нов','Дец'], + dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'], + dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'], + dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'], + weekHeader: 'Сед', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['sr']); + +return datepicker.regional['sr']; + +})); diff --git a/inc/lang/sr/lang.php b/inc/lang/sr/lang.php index 7c434cbc9..37a36c82b 100644 --- a/inc/lang/sr/lang.php +++ b/inc/lang/sr/lang.php @@ -46,7 +46,7 @@ $lang['btn_recover'] = 'Опорави нацрт'; $lang['btn_draftdel'] = 'Обриши нацрт'; $lang['btn_revert'] = 'Врати на пређашњу верзију'; $lang['btn_register'] = 'Региструј се'; -$lang['loggedinas'] = 'Пријављен као'; +$lang['loggedinas'] = 'Пријављен као:'; $lang['user'] = 'Корисничко име'; $lang['pass'] = 'Лозинка'; $lang['newpass'] = 'Нова лозинка'; @@ -60,6 +60,7 @@ $lang['badlogin'] = 'Извините, није добро кори $lang['minoredit'] = 'Мала измена'; $lang['draftdate'] = 'Нацрт је аутоматски сачуван'; $lang['nosecedit'] = 'Страна је у међувремену промењена, поглавље је застарело и поново се учитава цела страна.'; +$lang['searchcreatepage'] = "Ако нисте нашли то што сте тражили, можете да направите нову страницу названу по Вашем упиту користећи дугме ''Измени ову страницу''."; $lang['regmissing'] = 'Извините, морате да попуните сва поља.'; $lang['reguexists'] = 'Извините, корисник са истим именом већ постоји.'; $lang['regsuccess'] = 'Корисник је направљен и лозинка је послата путем е-поште.'; @@ -84,11 +85,11 @@ $lang['license'] = 'Осим где је другачије наз $lang['licenseok'] = 'Напомена: Изменом ове стране слажете се да ће ваше измене бити под следећом лиценцом:'; $lang['searchmedia'] = 'Претражи по имену фајла'; $lang['searchmedia_in'] = 'Претражи у %s'; -$lang['txt_upload'] = 'Изаберите датотеку за слање'; -$lang['txt_filename'] = 'Унесите вики-име (опционо)'; +$lang['txt_upload'] = 'Изаберите датотеку за слање:'; +$lang['txt_filename'] = 'Унесите вики-име (опционо):'; $lang['txt_overwrt'] = 'Препишите тренутни фајл'; -$lang['lockedby'] = 'Тренутно закључано од стране'; -$lang['lockexpire'] = 'Закључавање истиче'; +$lang['lockedby'] = 'Тренутно закључано од стране:'; +$lang['lockexpire'] = 'Закључавање истиче:'; $lang['js']['willexpire'] = 'Ваше закључавање за измену ове странице ће да истекне за један минут.\nДа би сте избегли конфликте, искористите дугме за преглед како би сте ресетовали тајмер закључавања.'; $lang['js']['notsavedyet'] = 'Несачуване измене ће бити изгубљене. Да ли стварно желите да наставите?'; @@ -156,9 +157,9 @@ $lang['diff'] = 'прикажи разлике до трену $lang['diff2'] = 'Прикажи разлике између одабраних ревизија'; $lang['difflink'] = 'Постави везу ка овом компаративном приказу'; $lang['line'] = 'Линија'; -$lang['breadcrumb'] = 'Траг'; -$lang['youarehere'] = 'Сада сте овде'; -$lang['lastmod'] = 'Последњи пут мењано'; +$lang['breadcrumb'] = 'Траг:'; +$lang['youarehere'] = 'Сада сте овде:'; +$lang['lastmod'] = 'Последњи пут мењано:'; $lang['by'] = 'од'; $lang['deleted'] = 'избрисано'; $lang['created'] = 'направљено'; @@ -201,17 +202,17 @@ $lang['admin_register'] = 'Додај новог корисника'; $lang['metaedit'] = 'Измени мета-податке'; $lang['metasaveerr'] = 'Записивање мета-података није било успешно'; $lang['metasaveok'] = 'Мета-подаци су сачувани'; -$lang['img_backto'] = 'Натраг на'; -$lang['img_title'] = 'Наслов'; -$lang['img_caption'] = 'Назив'; -$lang['img_date'] = 'Датум'; -$lang['img_fname'] = 'Име фајла'; -$lang['img_fsize'] = 'Величина'; -$lang['img_artist'] = 'Фотограф'; -$lang['img_copyr'] = 'Права копирања'; -$lang['img_format'] = 'Формат'; -$lang['img_camera'] = 'Камера'; -$lang['img_keywords'] = 'Кључне речи'; +$lang['btn_img_backto'] = 'Натраг на %s'; +$lang['img_title'] = 'Наслов:'; +$lang['img_caption'] = 'Назив:'; +$lang['img_date'] = 'Датум:'; +$lang['img_fname'] = 'Име фајла:'; +$lang['img_fsize'] = 'Величина:'; +$lang['img_artist'] = 'Фотограф:'; +$lang['img_copyr'] = 'Права копирања:'; +$lang['img_format'] = 'Формат:'; +$lang['img_camera'] = 'Камера:'; +$lang['img_keywords'] = 'Кључне речи:'; $lang['subscr_subscribe_success'] = '%s је додат на списак претплатника %s'; $lang['subscr_subscribe_error'] = 'Грешка приликом додавања %s на списак претплатника %s'; $lang['subscr_subscribe_noaddress'] = 'Не постоји адреса повезана са вашим подацима, стога вас не можемо додати на списак претплатника.'; diff --git a/inc/lang/sr/searchpage.txt b/inc/lang/sr/searchpage.txt index 010966a7c..458c5b1fc 100644 --- a/inc/lang/sr/searchpage.txt +++ b/inc/lang/sr/searchpage.txt @@ -1,5 +1,5 @@ ====== Претрага ====== -Испод можете да нађете резултате Ваше претраге. Ако нисте нашли то што сте тражили, можете да направите нову страницу названу по Вашем упиту користећи дугме ''Измени ову страницу''. +Испод можете да нађете резултате Ваше претраге. @CREATEPAGEINFO@ ===== Резултати ===== diff --git a/inc/lang/sv/denied.txt b/inc/lang/sv/denied.txt index 64d129227..7ae09b85b 100644 --- a/inc/lang/sv/denied.txt +++ b/inc/lang/sv/denied.txt @@ -1,4 +1,4 @@ ====== Åtkomst nekad ====== -Tyvärr, du har inte behörighet att fortsätta. Kanske har du glömt att logga in? +Tyvärr, du har inte behörighet att fortsätta. diff --git a/inc/lang/sv/jquery.ui.datepicker.js b/inc/lang/sv/jquery.ui.datepicker.js new file mode 100644 index 000000000..487473890 --- /dev/null +++ b/inc/lang/sv/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Swedish initialisation for the jQuery UI date picker plugin. */ +/* Written by Anders Ekdahl ( anders@nomadiz.se). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['sv'] = { + closeText: 'Stäng', + prevText: '«Förra', + nextText: 'Nästa»', + currentText: 'Idag', + monthNames: ['Januari','Februari','Mars','April','Maj','Juni', + 'Juli','Augusti','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'], + dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'], + dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'], + weekHeader: 'Ve', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['sv']); + +return datepicker.regional['sv']; + +})); diff --git a/inc/lang/sv/lang.php b/inc/lang/sv/lang.php index 7d85f543e..f22491db1 100644 --- a/inc/lang/sv/lang.php +++ b/inc/lang/sv/lang.php @@ -2,7 +2,7 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) - * + * * @author Joaquim Homrighausen <joho@webbplatsen.se> * @author Per Foreby <per@foreby.se> * @author Nicklas Henriksson <nicklas[at]nihe.se> @@ -19,6 +19,8 @@ * @author Smorkster Andersson smorkster@gmail.com * @author Henrik <henrik@idealis.se> * @author Tor Härnqvist <tor.harnqvist@gmail.com> + * @author Hans Iwan Bratt <hibratt@gmail.com> + * @author Mikael Bergström <krank23@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -61,9 +63,11 @@ $lang['btn_draftdel'] = 'Radera utkast'; $lang['btn_revert'] = 'Återställ'; $lang['btn_register'] = 'Registrera'; $lang['btn_apply'] = 'Verkställ'; -$lang['btn_media'] = 'Media Hanteraren'; +$lang['btn_media'] = 'Mediahanteraren'; $lang['btn_deleteuser'] = 'Ta bort Mitt Konto'; -$lang['loggedinas'] = 'Inloggad som'; +$lang['btn_img_backto'] = 'Tillbaka till %s'; +$lang['btn_mediaManager'] = 'Se mediahanteraren'; +$lang['loggedinas'] = 'Inloggad som:'; $lang['user'] = 'Användarnamn'; $lang['pass'] = 'Lösenord'; $lang['newpass'] = 'Nytt lösenord'; @@ -78,6 +82,7 @@ $lang['badpassconfirm'] = 'Ledsen, lösenordet var felaktigt'; $lang['minoredit'] = 'Små ändringar'; $lang['draftdate'] = 'Utkast automatiskt sparat'; $lang['nosecedit'] = 'Sidan ändrades medan du skrev, sektionsinformationen var inte uppdaterad. Laddar hela sidan istället.'; +$lang['searchcreatepage'] = 'Om du inte hittar det du letar efter, så kan du skapa eller redigera sidan med någon av knapparna.'; $lang['regmissing'] = 'Du måste fylla i alla fälten.'; $lang['reguexists'] = 'Det finns redan en användare med det användarnamnet.'; $lang['regsuccess'] = 'Användarkontot skapat, lösenordet har skickats via e-post.'; @@ -108,12 +113,12 @@ $lang['license'] = 'Om inte annat angivet, innehållet i denna wik $lang['licenseok'] = 'Notera: Genom att ändra i denna sidan så accepterar du att licensiera ditt bidrag under följande licenser:'; $lang['searchmedia'] = 'Sök efter filnamn:'; $lang['searchmedia_in'] = 'Sök i %s'; -$lang['txt_upload'] = 'Välj fil att ladda upp'; -$lang['txt_filename'] = 'Ladda upp som (ej obligatoriskt)'; +$lang['txt_upload'] = 'Välj fil att ladda upp:'; +$lang['txt_filename'] = 'Ladda upp som (ej obligatoriskt):'; $lang['txt_overwrt'] = 'Skriv över befintlig fil'; $lang['maxuploadsize'] = 'Max %s per uppladdad fil.'; -$lang['lockedby'] = 'Låst av'; -$lang['lockexpire'] = 'Lås upphör att gälla'; +$lang['lockedby'] = 'Låst av:'; +$lang['lockexpire'] = 'Lås upphör att gälla:'; $lang['js']['willexpire'] = 'Ditt redigeringslås för detta dokument kommer snart att upphöra.\nFör att undvika versionskonflikter bör du förhandsgranska ditt dokument för att förlänga redigeringslåset.'; $lang['js']['notsavedyet'] = 'Det finns ändringar som inte är sparade. Är du säker på att du vill fortsätta?'; @@ -148,6 +153,8 @@ $lang['js']['del_confirm'] = 'Vill du verkligen radera?'; $lang['js']['restore_confirm'] = 'Återställa denna version?'; $lang['js']['media_diff'] = 'Se skillnader:'; $lang['js']['media_diff_both'] = 'Sida vid sida'; +$lang['js']['media_diff_opacity'] = 'Genomskinlig'; +$lang['js']['media_diff_portions'] = 'Svep'; $lang['js']['media_select'] = 'Välj filer...'; $lang['js']['media_upload_btn'] = 'Ladda upp'; $lang['js']['media_done_btn'] = 'Färdig'; @@ -191,9 +198,9 @@ $lang['difflink'] = 'Länk till den här jämförelsesidan'; $lang['diff_type'] = 'Visa skillnader:'; $lang['diff_side'] = 'Sida vid sida'; $lang['line'] = 'Rad'; -$lang['breadcrumb'] = 'Spår'; -$lang['youarehere'] = 'Här är du'; -$lang['lastmod'] = 'Senast uppdaterad'; +$lang['breadcrumb'] = 'Spår:'; +$lang['youarehere'] = 'Här är du:'; +$lang['lastmod'] = 'Senast uppdaterad:'; $lang['by'] = 'av'; $lang['deleted'] = 'raderad'; $lang['created'] = 'skapad'; @@ -204,8 +211,10 @@ $lang['noflash'] = '<a href="http://www.adobe.com/products/flashpl $lang['download'] = 'Ladda ner kodfragmentet'; $lang['tools'] = 'Verktyg'; $lang['user_tools'] = 'Användarverktyg'; +$lang['site_tools'] = 'Webbverktyg'; $lang['page_tools'] = 'Sidverktyg'; $lang['skip_to_content'] = 'hoppa till innehåll'; +$lang['sidebar'] = 'Sidmeny'; $lang['mail_newpage'] = 'sida tillagd:'; $lang['mail_changed'] = 'sida ändrad:'; $lang['mail_subscribe_list'] = 'sidor ändrade i namnrymd:'; @@ -244,20 +253,18 @@ $lang['admin_register'] = 'Lägg till ny användare'; $lang['metaedit'] = 'Redigera metadata'; $lang['metasaveerr'] = 'Skrivning av metadata misslyckades'; $lang['metasaveok'] = 'Metadata sparad'; -$lang['img_backto'] = 'Tillbaka till'; -$lang['img_title'] = 'Rubrik'; -$lang['img_caption'] = 'Bildtext'; -$lang['img_date'] = 'Datum'; -$lang['img_fname'] = 'Filnamn'; -$lang['img_fsize'] = 'Storlek'; -$lang['img_artist'] = 'Fotograf'; -$lang['img_copyr'] = 'Copyright'; -$lang['img_format'] = 'Format'; -$lang['img_camera'] = 'Kamera'; -$lang['img_keywords'] = 'Nyckelord'; -$lang['img_width'] = 'Bredd'; -$lang['img_height'] = 'Höjd'; -$lang['img_manager'] = 'Se mediahanteraren'; +$lang['img_title'] = 'Rubrik:'; +$lang['img_caption'] = 'Bildtext:'; +$lang['img_date'] = 'Datum:'; +$lang['img_fname'] = 'Filnamn:'; +$lang['img_fsize'] = 'Storlek:'; +$lang['img_artist'] = 'Fotograf:'; +$lang['img_copyr'] = 'Copyright:'; +$lang['img_format'] = 'Format:'; +$lang['img_camera'] = 'Kamera:'; +$lang['img_keywords'] = 'Nyckelord:'; +$lang['img_width'] = 'Bredd:'; +$lang['img_height'] = 'Höjd:'; $lang['subscr_subscribe_success'] = 'La till %s till prenumerationslista %s'; $lang['subscr_subscribe_noaddress'] = 'Det finns ingen adress associerad med din inloggning, du kan inte bli tillagd i prenumerationslistan'; $lang['subscr_unsubscribe_success'] = '%s borttagen från prenumerationslistan för %s'; @@ -298,6 +305,7 @@ $lang['i_policy'] = 'Initial ACL-policy'; $lang['i_pol0'] = 'Öppen wiki (alla får läsa, skriva och ladda upp filer)'; $lang['i_pol1'] = 'Publik wiki (alla får läsa, registrerade användare för skriva och ladda upp filer)'; $lang['i_pol2'] = 'Sluten wiki (endast registrerade användare får läsa, skriva och ladda upp filer)'; +$lang['i_allowreg'] = 'Tillåt användare att registrera sig själva'; $lang['i_retry'] = 'Försök igen'; $lang['i_license'] = 'Vänligen välj licens du vill använda för ditt innehåll:'; $lang['i_license_none'] = 'Visa ingen licensinformation'; @@ -335,3 +343,5 @@ $lang['media_perm_read'] = 'Du har tyvärr inte tillräckliga behörighete $lang['media_perm_upload'] = 'Du har tyvärr inte tillräckliga behörigheter för att ladda upp filer.'; $lang['media_update'] = 'Ladda upp ny version'; $lang['media_restore'] = 'Återställ denna version'; +$lang['searchresult'] = 'Sökresultat'; +$lang['plainhtml'] = 'Ren HTML'; diff --git a/inc/lang/sv/searchpage.txt b/inc/lang/sv/searchpage.txt index bcc88cd95..7b2d3bca3 100644 --- a/inc/lang/sv/searchpage.txt +++ b/inc/lang/sv/searchpage.txt @@ -1,5 +1,5 @@ ====== Sök ====== -Nedan ser du resultatet av sökningen. Om du inte hittar det du letar efter, så kan du skapa eller redigera sidan med någon av knapparna. +Nedan ser du resultatet av sökningen. @CREATEPAGEINFO@ ===== Resultat ===== diff --git a/inc/lang/sv/subscr_digest.txt b/inc/lang/sv/subscr_digest.txt new file mode 100644 index 000000000..6724726ac --- /dev/null +++ b/inc/lang/sv/subscr_digest.txt @@ -0,0 +1,19 @@ +Hej + +Sidan @PAGE@ med @TITLE@ har ändrats. +Här är ändringarna: + +----------------------------- +@DIFF@ +----------------------------- + +Äldre versionen: @OLDPAGE@ +Ny version: @NEWPAGE@ + +För att avbryta meddelanden om sidändringar logga in till wikin @DOKUWIKIURL@, besök sedan +@SUBSCRIBE@ +och avbeställ ändringar av sidor och/eller namespace. + +-- +Detta meddelande har skapats av DokuWiki vid +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/ta/denied.txt b/inc/lang/ta/denied.txt new file mode 100644 index 000000000..9dcf1c9ed --- /dev/null +++ b/inc/lang/ta/denied.txt @@ -0,0 +1 @@ +மன்னிக்கவும் ! உங்களுக்கு தொடர அனுமதி இல்லை
\ No newline at end of file diff --git a/inc/lang/ta/lang.php b/inc/lang/ta/lang.php new file mode 100644 index 000000000..a5b89527a --- /dev/null +++ b/inc/lang/ta/lang.php @@ -0,0 +1,37 @@ +<?php + +/** + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * + * @author Naveen Venugopal <naveen.venugopal.anu@gmail.com> + */ +$lang['btn_edit'] = 'இந்த பக்கத்தை திருத்து '; +$lang['btn_show'] = 'பக்கத்தை காண்பி '; +$lang['btn_create'] = 'இந்த பக்கத்தை உருவாக்கு '; +$lang['btn_search'] = 'தேடு'; +$lang['btn_save'] = 'சேமி '; +$lang['btn_revs'] = 'பழைய திருத்தங்கள்'; +$lang['btn_recent'] = 'சமீபத்திய மாற்றங்கள்'; +$lang['btn_upload'] = 'பதிவேற்று'; +$lang['btn_cancel'] = 'ரத்து'; +$lang['btn_index'] = 'தள வரைபடம்'; +$lang['btn_admin'] = 'நிர்வாகம்'; +$lang['btn_update'] = 'மேம்படுத்து '; +$lang['btn_delete'] = 'நீக்கு'; +$lang['btn_resendpwd'] = 'புதிய அடையாளச்சொல்லை நியமி'; +$lang['btn_apply'] = 'உபயோகி'; +$lang['user'] = 'பயனர்பெயர்'; +$lang['pass'] = 'அடையாளச்சொல்'; +$lang['newpass'] = 'புதிய அடையாளச்சொல்'; +$lang['oldpass'] = 'தற்போதைய அடையாளச்சொல்லை உறுதிப்படுத்து'; +$lang['passchk'] = 'மேலும் ஒரு முறை '; +$lang['remember'] = 'என்னை ஞாபகம் வைத்து கொள்'; +$lang['fullname'] = 'உண்மையான பெயர்'; +$lang['email'] = 'மின்னஞ்சல்'; +$lang['profile'] = 'பயன்படுத்துபவர் விவரம்'; +$lang['minoredit'] = 'சிறிய மாற்றங்கள்'; +$lang['media_historytab'] = 'வரலாறு'; +$lang['media_list_rows'] = 'வரிசைகள் '; +$lang['media_sort_name'] = 'பெயர் '; +$lang['media_sort_date'] = 'தேதி '; +$lang['media_namespaces'] = 'பெயர்வெளியை தேர்வுசெய் '; diff --git a/inc/lang/th/denied.txt b/inc/lang/th/denied.txt index 88b012a67..4cc29d626 100644 --- a/inc/lang/th/denied.txt +++ b/inc/lang/th/denied.txt @@ -1,3 +1,4 @@ ====== ปฏิเสธสิทธิ์ ====== -ขออภัย คุณไม่มีสิทธิ์เพียงพอที่จะดำเนินการต่อ บางทีคุณอาจจะลืมล็อกอิน?
\ No newline at end of file +ขออภัย คุณไม่มีสิทธิ์เพียงพอที่จะดำเนินการต่อ + diff --git a/inc/lang/th/jquery.ui.datepicker.js b/inc/lang/th/jquery.ui.datepicker.js new file mode 100644 index 000000000..9314268c2 --- /dev/null +++ b/inc/lang/th/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['th'] = { + closeText: 'ปิด', + prevText: '« ย้อน', + nextText: 'ถัดไป »', + currentText: 'วันนี้', + monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน', + 'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'], + monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.', + 'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'], + dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'], + dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['th']); + +return datepicker.regional['th']; + +})); diff --git a/inc/lang/th/lang.php b/inc/lang/th/lang.php index 5d364166b..113431276 100644 --- a/inc/lang/th/lang.php +++ b/inc/lang/th/lang.php @@ -1,17 +1,13 @@ <?php + /** - * th language file - * - * This file was initially built by fetching translations from other - * Wiki projects. See the @url lines below. Additional translations - * and fixes where done for DokuWiki by the people mentioned in the - * lines starting with @author - * - * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesTh.php?view=co + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * * @author Komgrit Niyomrath <n.komgrit@gmail.com> * @author Arthit Suriyawongkul <arthit@gmail.com> * @author Kittithat Arnontavilas <mrtomyum@gmail.com> * @author Thanasak Sompaisansin <jombthep@gmail.com> + * @author Yuthana Tantirungrotechai <yt203y@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -47,12 +43,17 @@ $lang['btn_backtomedia'] = 'กลับไปยังหน้าเล $lang['btn_subscribe'] = 'เฝ้าดู'; $lang['btn_profile'] = 'แก้ข้อมูลผู้ใช้'; $lang['btn_reset'] = 'เริ่มใหม่'; +$lang['btn_resendpwd'] = 'ตั้งพาสเวิร์ดใหม่'; $lang['btn_draft'] = 'แก้ไขเอกสารฉบับร่าง'; $lang['btn_recover'] = 'กู้คืนเอกสารฉบับร่าง'; $lang['btn_draftdel'] = 'ลบเอกสารฉบับร่าง'; $lang['btn_revert'] = 'กู้คืน'; $lang['btn_register'] = 'สร้างบัญชีผู้ใช้'; -$lang['loggedinas'] = 'ลงชื่อเข้าใช้เป็น'; +$lang['btn_media'] = 'ส่วนจัดการสื่อและไฟล์'; +$lang['btn_deleteuser'] = 'ลบบัญชีผู้ใช้งานของฉัน'; +$lang['btn_img_backto'] = 'กลับไปยัง %s'; +$lang['btn_mediaManager'] = 'ดูในส่วนจัดการสื่อและไฟล์'; +$lang['loggedinas'] = 'ลงชื่อเข้าใช้เป็น:'; $lang['user'] = 'ชื่อผู้ใช้:'; $lang['pass'] = 'รหัสผ่าน'; $lang['newpass'] = 'รหัสผ่านใหม่'; @@ -63,9 +64,11 @@ $lang['fullname'] = 'ชื่อจริง:'; $lang['email'] = 'อีเมล:'; $lang['profile'] = 'ข้อมูลส่วนตัวผู้ใช้'; $lang['badlogin'] = 'ขัดข้อง:'; +$lang['badpassconfirm'] = 'พาสเวิร์ดไม่ถูกต้อง'; $lang['minoredit'] = 'เป็นการแก้ไขเล็กน้อย'; $lang['draftdate'] = 'บันทึกฉบับร่างเมื่อ'; $lang['nosecedit'] = 'ในช่วงเวลาที่ผ่านมานี้เพจถูกแก้ไขไปแล้ว, เนื้อหาในเซคชั่นนี้ไม่ทันสมัย กรุณาโหลดเพจใหม่ทั้งหน้าแทน'; +$lang['searchcreatepage'] = 'ถ้าคุณไม่พบสิ่งที่คนมองหา คุณสามารถเลือกที่จะสร้าง หรือแก้ไขชื่อเพจหลังจากดูผลสืบค้นแล้วด้วยปุ่มที่เหมาะสม'; $lang['regmissing'] = 'ขออภัย คุณต้องกรอกให้ครบทุกช่อง'; $lang['reguexists'] = 'ชื่อบัญชีที่ใส่นั้นมีผู้อื่นได้ใช้แล้ว กรุณาเลือกชื่อผู้ใช้อื่น'; $lang['regsuccess'] = 'ผู้ใช้ถูกสร้างแล้ว และรหัสผ่านได้ถูกส่งไปทางอีเมลแล้ว'; @@ -79,6 +82,10 @@ $lang['profna'] = 'วิกินี้ไม่รองรั $lang['profnochange'] = 'ไม่มีการเปลี่ยนแปลงข้อมูลส่วนตัว'; $lang['profnoempty'] = 'ไม่อนุญาติให้เว้นว่างชื่อ หรืออีเมล'; $lang['profchanged'] = 'ปรับปรุงข้อมูลส่วนตัวผู้ใช้สำเร็จ'; +$lang['profnodelete'] = 'วิกินี้ไม่รองรับการลบบัญชีผู้ใช้งาน'; +$lang['profdeleteuser'] = 'ลบบัญชีผู้ใช้งาน'; +$lang['profdeleted'] = 'บัญชีผู้ใช้งานของคุณได้ถูกลบออกจากวิกิแล้ว'; +$lang['profconfdelete'] = 'ฉันอยากลบบัญชีผู้ใช้งานของฉันจากวิกินี้ <br/> การดำเนินการนี้ไม่สามารถแก้ไขคืนได้ '; $lang['pwdforget'] = 'ลืมรหัสผ่านหรือ? เอาอันใหม่สิ'; $lang['resendna'] = 'วิกินี้ไม่รองรับการส่งรหัสผ่านซ้ำ'; $lang['resendpwdmissing'] = 'ขออภัย, คุณต้องกรอกทุกช่อง'; @@ -90,13 +97,20 @@ $lang['license'] = 'เว้นแต่จะได้แจ้ $lang['licenseok'] = 'โปรดทราบ: เมื่อเริ่มแก้ไขหน้านี้ ถือว่าคุณตกลงให้สิทธิ์กับเนื้อหาของคุณอยู่ภายใต้สัญญาอนุญาตินี้'; $lang['searchmedia'] = 'สืบค้นไฟล์ชื่อ:'; $lang['searchmedia_in'] = 'สืบค้นใน %s'; -$lang['txt_upload'] = 'เลือกไฟล์ที่จะอัพโหลด'; -$lang['txt_filename'] = 'อัพโหลดเป็น(ตัวเลือก)'; +$lang['txt_upload'] = 'เลือกไฟล์ที่จะอัพโหลด:'; +$lang['txt_filename'] = 'อัพโหลดเป็น(ตัวเลือก):'; $lang['txt_overwrt'] = 'เขียนทับไฟล์ที่มีอยู่แล้ว'; -$lang['lockedby'] = 'ตอนนี้ถูกล๊อคโดย'; -$lang['lockexpire'] = 'การล๊อคจะหมดอายุเมื่อ'; -$lang['js']['willexpire'] = 'การล๊อคเพื่อแก้ไขหน้านี้กำลังจะหมดเวลาในอีก \n นาที เพื่อที่จะหลีกเลี่ยงข้อขัดแย้งให้ใช้ปุ่ม "Preview" เพื่อรีเซ็ทเวลาใหม่'; +$lang['lockedby'] = 'ตอนนี้ถูกล๊อคโดย:'; +$lang['lockexpire'] = 'การล๊อคจะหมดอายุเมื่อ:'; +$lang['js']['willexpire'] = 'การล๊อคเพื่อแก้ไขหน้านี้กำลังจะหมดเวลาในอีก \n นาที เพื่อที่จะหลีกเลี่ยงข้อขัดแย้งให้ใช้ปุ่ม "Preview" เพื่อรีเซ็ทเวลาใหม่'; $lang['js']['notsavedyet'] = 'การแก้ไขที่ไม่ได้บันทึกจะสูญหาย \n ต้องการทำต่อจริงๆหรือ?'; +$lang['js']['searchmedia'] = 'ค้นหาไฟล์'; +$lang['js']['keepopen'] = 'เปิดหน้าต่างไว้ระหว่างที่เลือก'; +$lang['js']['hidedetails'] = 'ซ่อนรายละเอียด'; +$lang['js']['nosmblinks'] = 'เชื่อมไปยังหน้าต่างแบ่งปัน ทำงานได้กับเฉพาะไมโครซอฟท์อินเตอร์เน็ตเอ็กซโปรเรอร์(IE) คุณยังคงสามารถคัดลอกและแปะลิ้งค์ได้'; +$lang['js']['linkwiz'] = 'ลิงค์วิเศษ'; +$lang['js']['linkto'] = 'ลิงค์ไป:'; +$lang['js']['del_confirm'] = 'ต้องการลบรายการที่เลือกจริงๆหรือ?'; $lang['rssfailed'] = 'มีข้อผิดพลาดขณะดูดฟีดนี้'; $lang['nothingfound'] = 'ไม่พบสิ่งใด'; $lang['mediaselect'] = 'ไฟล์สื่อ'; @@ -114,13 +128,6 @@ $lang['deletefail'] = '"%s" ไม่สามารถลบได $lang['mediainuse'] = 'ไฟล์ "%s" ไม่ได้ถูกลบ - มันถูกใช้อยู่'; $lang['namespaces'] = 'เนมสเปซ'; $lang['mediafiles'] = 'มีไฟล์พร้อมใช้อยู่ใน'; -$lang['js']['searchmedia'] = 'ค้นหาไฟล์'; -$lang['js']['keepopen'] = 'เปิดหน้าต่างไว้ระหว่างที่เลือก'; -$lang['js']['hidedetails'] = 'ซ่อนรายละเอียด'; -$lang['js']['nosmblinks'] = 'เชื่อมไปยังหน้าต่างแบ่งปัน ทำงานได้กับเฉพาะไมโครซอฟท์อินเตอร์เน็ตเอ็กซโปรเรอร์(IE) คุณยังคงสามารถคัดลอกและแปะลิ้งค์ได้'; -$lang['js']['linkwiz'] = 'ลิงค์วิเศษ'; -$lang['js']['linkto'] = 'ลิงค์ไป:'; -$lang['js']['del_confirm'] = 'ต้องการลบรายการที่เลือกจริงๆหรือ?'; $lang['mediausage'] = 'ให้ใช้ไวยกรณ์ต่อไปนี้เพื่ออ้างอิงไฟล์นี้'; $lang['mediaview'] = 'ดูไฟล์ต้นฉบับ'; $lang['mediaroot'] = 'ราก(รูท)'; @@ -137,9 +144,9 @@ $lang['yours'] = 'ฉบับของคุณ'; $lang['diff'] = 'แสดงจุดแตกต่างกับฉบับปัจจุบัน'; $lang['diff2'] = 'แสดงจุดแตกต่างระหว่างฉบับที่เลือกไว้'; $lang['line'] = 'บรรทัด'; -$lang['breadcrumb'] = 'ตามรอย'; -$lang['youarehere'] = 'คุณอยู่ที่นี่'; -$lang['lastmod'] = 'แก้ไขครั้งล่าสุด'; +$lang['breadcrumb'] = 'ตามรอย:'; +$lang['youarehere'] = 'คุณอยู่ที่นี่:'; +$lang['lastmod'] = 'แก้ไขครั้งล่าสุด:'; $lang['by'] = 'โดย'; $lang['deleted'] = 'ถูกถอดออก'; $lang['created'] = 'ถูกสร้าง'; @@ -181,17 +188,16 @@ $lang['admin_register'] = 'สร้างบัญชีผู้ใช $lang['metaedit'] = 'แก้ไขข้อมูลเมต้า'; $lang['metasaveerr'] = 'มีข้อผิดพลาดในการเขียนข้อมูลเมต้า'; $lang['metasaveok'] = 'บันทึกเมต้าดาต้าแล้ว'; -$lang['img_backto'] = 'กลับไปยัง'; -$lang['img_title'] = 'ชื่อภาพ'; -$lang['img_caption'] = 'คำบรรยายภาพ'; -$lang['img_date'] = 'วันที่'; -$lang['img_fname'] = 'ชื่อไฟล์'; -$lang['img_fsize'] = 'ขนาดภาพ'; -$lang['img_artist'] = 'ผู้สร้างสรรค์'; -$lang['img_copyr'] = 'ผู้ถือลิขสิทธิ์'; -$lang['img_format'] = 'รูปแบบ'; -$lang['img_camera'] = 'กล้อง'; -$lang['img_keywords'] = 'คำหลัก'; +$lang['img_title'] = 'ชื่อภาพ:'; +$lang['img_caption'] = 'คำบรรยายภาพ:'; +$lang['img_date'] = 'วันที่:'; +$lang['img_fname'] = 'ชื่อไฟล์:'; +$lang['img_fsize'] = 'ขนาดภาพ:'; +$lang['img_artist'] = 'ผู้สร้างสรรค์:'; +$lang['img_copyr'] = 'ผู้ถือลิขสิทธิ์:'; +$lang['img_format'] = 'รูปแบบ:'; +$lang['img_camera'] = 'กล้อง:'; +$lang['img_keywords'] = 'คำหลัก:'; $lang['authtempfail'] = 'ระบบตรวจสอบสิทธิ์ผู้ใช้ไม่พร้อมใช้งานชั่วคราว หากสถานการณ์ยังไม่เปลี่ยนแปลง กรุณาแจ้งผู้ดูแลระบวิกิของคุณ'; $lang['i_chooselang'] = 'เลือกภาษาของคุณ'; $lang['i_installer'] = 'ตัวติดตั้งโดกุวิกิ'; diff --git a/inc/lang/th/searchpage.txt b/inc/lang/th/searchpage.txt index d6399a9e9..263c656ab 100644 --- a/inc/lang/th/searchpage.txt +++ b/inc/lang/th/searchpage.txt @@ -1,4 +1,5 @@ ====== สืบค้น ====== -คุณสามารถพบผลลัพธ์การสืบค้นของคุณด้านล่าง ถ้าคุณไม่พบสิ่งที่คนมองหา คุณสามารถเลือกที่จะสร้าง หรือแก้ไขชื่อเพจหลังจากดูผลสืบค้นแล้วด้วยปุ่มที่เหมาะสม + +คุณสามารถพบผลลัพธ์การสืบค้นของคุณด้านล่าง @CREATEPAGEINFO@ ====== ผลลัพธ์ ======
\ No newline at end of file diff --git a/inc/lang/tr/denied.txt b/inc/lang/tr/denied.txt index 04e9b8bfb..2acfd7a8f 100644 --- a/inc/lang/tr/denied.txt +++ b/inc/lang/tr/denied.txt @@ -1,4 +1,4 @@ ====== Yetki Reddedildi ====== -Üzgünüz, devam etmek için yetkiniz yok. Giriş yapmayı unutmuş olabilir misiniz? +Üzgünüz, devam etmek için yetkiniz yok. diff --git a/inc/lang/tr/jquery.ui.datepicker.js b/inc/lang/tr/jquery.ui.datepicker.js new file mode 100644 index 000000000..c366eb16a --- /dev/null +++ b/inc/lang/tr/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['tr'] = { + closeText: 'kapat', + prevText: '<geri', + nextText: 'ileri>', + currentText: 'bugün', + monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran', + 'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'], + monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz', + 'Tem','Ağu','Eyl','Eki','Kas','Ara'], + dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'], + dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['tr']); + +return datepicker.regional['tr']; + +})); diff --git a/inc/lang/tr/lang.php b/inc/lang/tr/lang.php index 6b9e0dd44..1676256a5 100644 --- a/inc/lang/tr/lang.php +++ b/inc/lang/tr/lang.php @@ -10,6 +10,9 @@ * @author Caleb Maclennan <caleb@alerque.com> * @author farukerdemoncel@gmail.com * @author Mustafa Aslan <maslan@hotmail.com> + * @author huseyin can <huseyincan73@gmail.com> + * @author ilker rifat kapaç <irifat@gmail.com> + * @author İlker R. Kapaç <irifat@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -54,7 +57,9 @@ $lang['btn_register'] = 'Kayıt ol'; $lang['btn_apply'] = 'Uygula'; $lang['btn_media'] = 'Çokluortam Yöneticisi'; $lang['btn_deleteuser'] = 'Hesabımı Sil'; -$lang['loggedinas'] = 'Giriş ismi'; +$lang['btn_img_backto'] = 'Şuna dön: %s'; +$lang['btn_mediaManager'] = 'Ortam oynatıcısında göster'; +$lang['loggedinas'] = 'Giriş ismi:'; $lang['user'] = 'Kullanıcı ismi'; $lang['pass'] = 'Parola'; $lang['newpass'] = 'Yeni Parola'; @@ -69,6 +74,7 @@ $lang['badpassconfirm'] = 'Üzgünüz, parolanız yanlış'; $lang['minoredit'] = 'Küçük Değişiklikler'; $lang['draftdate'] = 'Taslak şu saatte otomatik kaydedildi:'; $lang['nosecedit'] = 'Sayfa yakın zamanda değiştirilmiştir, bölüm bilgisi eski kalmıştır. Bunun için bölüm yerine tüm sayfa yüklenmiştir.'; +$lang['searchcreatepage'] = "Aradığınız şeyi bulamadıysanız, ''Sayfayı değiştir'' tuşuna tıklayarak girdiğiniz sorgu adıyla yeni bir sayfa oluşturabilirsiniz ."; $lang['regmissing'] = 'Üzgünüz, tüm alanları doldurmalısınız.'; $lang['reguexists'] = 'Üzgünüz, bu isime sahip bir kullanıcı zaten mevcut.'; $lang['regsuccess'] = 'Kullanıcı oluşturuldu ve şifre e-posta adresine gönderildi.'; @@ -99,8 +105,8 @@ $lang['license'] = 'Aksi belirtilmediği halde, bu wikinin içeri $lang['licenseok'] = 'Not: Bu sayfayı değiştirerek yazınızın şu lisans ile yayınlanmasını kabul etmiş olacaksınız:'; $lang['searchmedia'] = 'Dosya Adı Ara:'; $lang['searchmedia_in'] = '%s içinde ara'; -$lang['txt_upload'] = 'Yüklenecek dosyayı seç'; -$lang['txt_filename'] = 'Dosya adı (zorunlu değil)'; +$lang['txt_upload'] = 'Yüklenecek dosyayı seç:'; +$lang['txt_filename'] = 'Dosya adı (zorunlu değil):'; $lang['txt_overwrt'] = 'Mevcut dosyanın üstüne yaz'; $lang['maxuploadsize'] = 'Yükleme dosya başına en fazla %s'; $lang['lockedby'] = 'Şu an şunun tarafından kilitli:'; @@ -179,10 +185,17 @@ $lang['yours'] = 'Senin Sürümün'; $lang['diff'] = 'Kullanılan sürüm ile farkları göster'; $lang['diff2'] = 'Seçili sürümler arasındaki farkı göster'; $lang['difflink'] = 'Karşılaştırma görünümüne bağlantı'; +$lang['diff_type'] = 'farklı görünüş'; +$lang['diff_side'] = 'Yan yana'; +$lang['diffprevrev'] = 'Önceki sürüm'; +$lang['diffnextrev'] = 'Sonraki sürüm'; +$lang['difflastrev'] = 'Son sürüm'; +$lang['diffbothprevrev'] = 'İki taraf da önceki sürüm'; +$lang['diffbothnextrev'] = 'İki taraf da sonraki sürüm'; $lang['line'] = 'Satır'; -$lang['breadcrumb'] = 'İz'; -$lang['youarehere'] = 'Buradasınız'; -$lang['lastmod'] = 'Son değiştirilme'; +$lang['breadcrumb'] = 'İz:'; +$lang['youarehere'] = 'Buradasınız:'; +$lang['lastmod'] = 'Son değiştirilme:'; $lang['by'] = 'Değiştiren:'; $lang['deleted'] = 'silindi'; $lang['created'] = 'oluşturuldu'; @@ -191,10 +204,18 @@ $lang['external_edit'] = 'Dışarıdan düzenle'; $lang['summary'] = 'Özeti düzenle'; $lang['noflash'] = 'Bu içeriği göstermek için <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Eklentisi</a> gerekmektedir.'; $lang['download'] = 'Parçacığı indir'; +$lang['tools'] = 'Alet'; +$lang['user_tools'] = 'Kullanıcı Aletleri'; +$lang['site_tools'] = 'Site Aletleri'; +$lang['page_tools'] = 'Sayfa Aletleri'; +$lang['skip_to_content'] = 'Bağlanmak için kaydır'; +$lang['sidebar'] = 'kaydırma çubuğu'; $lang['mail_newpage'] = 'sayfa eklenme:'; $lang['mail_changed'] = 'sayfa değiştirilme:'; +$lang['mail_subscribe_list'] = 'isimalanındaki değişmiş sayfalar: '; $lang['mail_new_user'] = 'yeni kullanıcı'; $lang['mail_upload'] = 'dosya yüklendi:'; +$lang['changes_type'] = 'görünüşü değiştir'; $lang['pages_changes'] = 'Sayfalar'; $lang['media_changes'] = 'Çokluortam dosyaları'; $lang['both_changes'] = 'Sayfalar ve çoklu ortam dosyaları'; @@ -211,6 +232,8 @@ $lang['qb_h5'] = '5. Seviye Başlık'; $lang['qb_h'] = 'Başlık'; $lang['qb_hs'] = 'Başlığı seç'; $lang['qb_hplus'] = 'Daha yüksek başlık'; +$lang['qb_hminus'] = 'Daha Düşük Başlık'; +$lang['qb_hequal'] = 'Aynı Seviye Başlık'; $lang['qb_link'] = 'İç Bağlantı'; $lang['qb_extlink'] = 'Dış Bağlantı'; $lang['qb_hr'] = 'Yatay Çizgi'; @@ -220,26 +243,29 @@ $lang['qb_media'] = 'Resim ve başka dosyalar ekle'; $lang['qb_sig'] = 'İmza Ekle'; $lang['qb_smileys'] = 'Gülen Yüzler'; $lang['qb_chars'] = 'Özel Karakterler'; +$lang['upperns'] = 'ebeveyn isimalanına atla'; $lang['admin_register'] = 'Yeni kullanıcı ekle...'; $lang['metaedit'] = 'Metaverileri Değiştir'; $lang['metasaveerr'] = 'Metaveri yazma başarısız '; $lang['metasaveok'] = 'Metaveri kaydedildi'; -$lang['img_backto'] = 'Şuna dön:'; -$lang['img_title'] = 'Başlık'; -$lang['img_caption'] = 'Serlevha'; -$lang['img_date'] = 'Tarih'; -$lang['img_fname'] = 'Dosya Adı'; -$lang['img_fsize'] = 'Boyut'; -$lang['img_artist'] = 'Fotoğrafçı'; -$lang['img_copyr'] = 'Telif Hakkı'; -$lang['img_format'] = 'Biçim'; -$lang['img_camera'] = 'Fotoğraf Makinası'; -$lang['img_keywords'] = 'Anahtar Sözcükler'; -$lang['img_width'] = 'Genişlik'; -$lang['img_height'] = 'Yükseklik'; -$lang['img_manager'] = 'Ortam oynatıcısında göster'; +$lang['img_title'] = 'Başlık:'; +$lang['img_caption'] = 'Serlevha:'; +$lang['img_date'] = 'Tarih:'; +$lang['img_fname'] = 'Dosya Adı:'; +$lang['img_fsize'] = 'Boyut:'; +$lang['img_artist'] = 'Fotoğrafçı:'; +$lang['img_copyr'] = 'Telif Hakkı:'; +$lang['img_format'] = 'Biçim:'; +$lang['img_camera'] = 'Fotoğraf Makinası:'; +$lang['img_keywords'] = 'Anahtar Sözcükler:'; +$lang['img_width'] = 'Genişlik:'; +$lang['img_height'] = 'Yükseklik:'; +$lang['subscr_m_new_header'] = 'Üyelik ekle'; +$lang['subscr_m_current_header'] = 'Üyeliğini onayla'; +$lang['subscr_m_unsubscribe'] = 'Üyelik iptali'; $lang['subscr_m_subscribe'] = 'Kayıt ol'; $lang['subscr_m_receive'] = 'Al'; +$lang['subscr_style_every'] = 'her değişiklikte e-posta gönder'; $lang['authtempfail'] = 'Kullanıcı doğrulama geçici olarak yapılamıyor. Eğer bu durum devam ederse lütfen Wiki yöneticine haber veriniz.'; $lang['authpwdexpire'] = 'Şifreniz %d gün sonra geçersiz hale gelecek, yakın bir zamanda değiştirmelisiniz.'; $lang['i_chooselang'] = 'Dili seçiniz'; @@ -262,8 +288,12 @@ $lang['i_policy'] = 'İlk ACL ayarı'; $lang['i_pol0'] = 'Tamamen Açık Wiki (herkes okuyabilir, yazabilir ve dosya yükleyebilir)'; $lang['i_pol1'] = 'Açık Wiki (herkes okuyabilir, ancak sadece üye olanlar yazabilir ve dosya yükleyebilir)'; $lang['i_pol2'] = 'Kapalı Wiki (sadece üye olanlar okuyabilir, yazabilir ve dosya yükleyebilir)'; +$lang['i_allowreg'] = 'Kullanıcıların kendi kendilerine üye olmalarına için ver'; $lang['i_retry'] = 'Tekrar Dene'; $lang['i_license'] = 'Lütfen içeriği hangi lisans altında yayınlamak istediğniizi belirtin:'; +$lang['i_license_none'] = 'Hiç bir lisans bilgisi gösterme'; +$lang['i_pop_field'] = 'Lütfen DokuWiki deneyimini geliştirmemizde, bize yardım edin:'; +$lang['i_pop_label'] = 'DokuWiki geliştiricilerine ayda bir, anonim kullanım bilgisini gönder'; $lang['recent_global'] = '<b>%s</b> namespace\'i içerisinde yapılan değişiklikleri görüntülemektesiniz. Wiki\'deki tüm değişiklikleri de <a href="%s">bu adresten</a> görebilirsiniz. '; $lang['years'] = '%d yıl önce'; $lang['months'] = '%d ay önce'; @@ -283,11 +313,19 @@ $lang['media_list_thumbs'] = 'Küçük resimler'; $lang['media_list_rows'] = 'Satırlar'; $lang['media_sort_name'] = 'İsim'; $lang['media_sort_date'] = 'Tarih'; +$lang['media_namespaces'] = 'İsimalanı seçin'; $lang['media_files'] = '%s deki dosyalar'; $lang['media_upload'] = '%s dizinine yükle'; $lang['media_search'] = '%s dizininde ara'; $lang['media_view'] = '%s'; $lang['media_edit'] = 'Düzenle %s'; $lang['media_history'] = 'Geçmiş %s'; +$lang['media_meta_edited'] = 'üstveri düzenlendi'; +$lang['media_perm_read'] = 'Özür dileriz, dosyaları okumak için yeterli haklara sahip değilsiniz.'; $lang['media_perm_upload'] = 'Üzgünüm, karşıya dosya yükleme yetkiniz yok.'; +$lang['media_update'] = 'Yeni versiyonu yükleyin'; $lang['media_restore'] = 'Bu sürümü eski haline getir'; +$lang['currentns'] = 'Geçerli isimalanı'; +$lang['searchresult'] = 'Arama Sonucu'; +$lang['plainhtml'] = 'Yalın HTML'; +$lang['wikimarkup'] = 'Wiki Biçimlendirmesi'; diff --git a/inc/lang/tr/searchpage.txt b/inc/lang/tr/searchpage.txt index ae6d50c77..bdb3ddf17 100644 --- a/inc/lang/tr/searchpage.txt +++ b/inc/lang/tr/searchpage.txt @@ -1,5 +1,5 @@ ====== Arama ====== -Aşağıda aramanın sonuçları listelenmiştir. Aradığınız şeyi bulamadıysanız, ''Sayfayı değiştir'' tuşuna tıklayarak girdiğiniz sorgu adıyla yeni bir sayfa oluşturabilirsiniz . +Aşağıda aramanın sonuçları listelenmiştir. @CREATEPAGEINFO@ ===== Sonuçlar ===== diff --git a/inc/lang/tr/subscr_form.txt b/inc/lang/tr/subscr_form.txt new file mode 100644 index 000000000..21a8fbaeb --- /dev/null +++ b/inc/lang/tr/subscr_form.txt @@ -0,0 +1,3 @@ +====== Abonelik Yönetimi ====== + +Bu sayfa, geçerli isimalanı ve sayfa için aboneliklerinizi düzenlemenize olanak sağlar.
\ No newline at end of file diff --git a/inc/lang/uk/denied.txt b/inc/lang/uk/denied.txt index 5db12e1bc..635d31c38 100644 --- a/inc/lang/uk/denied.txt +++ b/inc/lang/uk/denied.txt @@ -1,4 +1,4 @@ ====== Доступ заборонено ====== -Вибачте, але у вас не вистачає прав для продовження. Можливо ви забули увійти в систему? +Вибачте, але у вас не вистачає прав для продовження. diff --git a/inc/lang/uk/jquery.ui.datepicker.js b/inc/lang/uk/jquery.ui.datepicker.js new file mode 100644 index 000000000..ab4adb9dd --- /dev/null +++ b/inc/lang/uk/jquery.ui.datepicker.js @@ -0,0 +1,38 @@ +/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */ +/* Corrected by Igor Milla (igor.fsp.milla@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['uk'] = { + closeText: 'Закрити', + prevText: '<', + nextText: '>', + currentText: 'Сьогодні', + monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень', + 'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'], + monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер', + 'Лип','Сер','Вер','Жов','Лис','Гру'], + dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'], + dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'], + dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'], + weekHeader: 'Тиж', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['uk']); + +return datepicker.regional['uk']; + +})); diff --git a/inc/lang/uk/lang.php b/inc/lang/uk/lang.php index 4e91e82a2..a6b08c905 100644 --- a/inc/lang/uk/lang.php +++ b/inc/lang/uk/lang.php @@ -53,7 +53,7 @@ $lang['btn_revert'] = 'Відновити'; $lang['btn_register'] = 'Реєстрація'; $lang['btn_apply'] = 'Застосувати'; $lang['btn_deleteuser'] = 'Видалити мій аккаунт'; -$lang['loggedinas'] = 'Ви'; +$lang['loggedinas'] = 'Ви:'; $lang['user'] = 'Користувач'; $lang['pass'] = 'Пароль'; $lang['newpass'] = 'Новий пароль'; @@ -68,6 +68,7 @@ $lang['badpassconfirm'] = 'Вибачте, але пароль невір $lang['minoredit'] = 'Незначні зміни'; $lang['draftdate'] = 'Чернетка збережена'; $lang['nosecedit'] = 'Сторінку змінено, дані розділу застарілі. Завантажено сторінку повністю.'; +$lang['searchcreatepage'] = 'Якщо ви не знайшли те, що ви шукали, ви можете створити або редагувати сторінку, що має таке ж ім’я, що і пошуковий запит за допомогою відповідної кнопки.'; $lang['regmissing'] = 'Необхідно заповнити всі поля.'; $lang['reguexists'] = 'Користувач з таким іменем вже існує.'; $lang['regsuccess'] = 'Користувача створено. Пароль відправлено на e-mail.'; @@ -94,11 +95,11 @@ $lang['license'] = 'Якщо не вказано інше, вмі $lang['licenseok'] = 'Примітка. Редагуючи ці сторінку, ви погоджуєтесь на розповсюдження інформації за такою ліцензією:'; $lang['searchmedia'] = 'Пошук файлу:'; $lang['searchmedia_in'] = 'Шукати у %s'; -$lang['txt_upload'] = 'Виберіть файл для завантаження'; -$lang['txt_filename'] = 'Завантажити як (не обов\'язкове)'; +$lang['txt_upload'] = 'Виберіть файл для завантаження:'; +$lang['txt_filename'] = 'Завантажити як (не обов\'язкове):'; $lang['txt_overwrt'] = 'Перезаписати існуючий файл'; -$lang['lockedby'] = 'Заблоковано'; -$lang['lockexpire'] = 'Блокування завершується в'; +$lang['lockedby'] = 'Заблоковано:'; +$lang['lockexpire'] = 'Блокування завершується в:'; $lang['js']['willexpire'] = 'Блокування редагування цієї сторінки закінчується через хвилину.\n Щоб уникнути конфліктів використовуйте кнопку перегляду для продовження блокування.'; $lang['js']['notsavedyet'] = 'Незбережені зміни будуть втрачені. Дійсно продовжити?'; @@ -172,9 +173,9 @@ $lang['diff_type'] = 'Переглянути відмінності: $lang['diff_inline'] = 'Вбудувати'; $lang['diff_side'] = 'Поряд'; $lang['line'] = 'Рядок'; -$lang['breadcrumb'] = 'Відвідано'; -$lang['youarehere'] = 'Ви тут'; -$lang['lastmod'] = 'В останнє змінено'; +$lang['breadcrumb'] = 'Відвідано:'; +$lang['youarehere'] = 'Ви тут:'; +$lang['lastmod'] = 'В останнє змінено:'; $lang['by'] = ' '; $lang['deleted'] = 'знищено'; $lang['created'] = 'створено'; @@ -223,17 +224,17 @@ $lang['admin_register'] = 'Додати нового користувач $lang['metaedit'] = 'Редагувати метадані'; $lang['metasaveerr'] = 'Помилка запису метаданих'; $lang['metasaveok'] = 'Метадані збережено'; -$lang['img_backto'] = 'Повернутися до'; -$lang['img_title'] = 'Назва'; -$lang['img_caption'] = 'Підпис'; -$lang['img_date'] = 'Дата'; -$lang['img_fname'] = 'Ім’я файлу'; -$lang['img_fsize'] = 'Розмір'; -$lang['img_artist'] = 'Фотограф'; -$lang['img_copyr'] = 'Авторські права'; -$lang['img_format'] = 'Формат'; -$lang['img_camera'] = 'Камера'; -$lang['img_keywords'] = 'Ключові слова'; +$lang['btn_img_backto'] = 'Повернутися до %s'; +$lang['img_title'] = 'Назва:'; +$lang['img_caption'] = 'Підпис:'; +$lang['img_date'] = 'Дата:'; +$lang['img_fname'] = 'Ім’я файлу:'; +$lang['img_fsize'] = 'Розмір:'; +$lang['img_artist'] = 'Фотограф:'; +$lang['img_copyr'] = 'Авторські права:'; +$lang['img_format'] = 'Формат:'; +$lang['img_camera'] = 'Камера:'; +$lang['img_keywords'] = 'Ключові слова:'; $lang['subscr_subscribe_success'] = 'Додано %s до списку підписки для %s'; $lang['subscr_subscribe_error'] = 'Помилка при додавані %s до списку підписки для %s'; $lang['subscr_subscribe_noaddress'] = 'Немає адреси, асоційованої з Вашим логіном, тому Ви не можете бути додані до списку підписки.'; diff --git a/inc/lang/uk/searchpage.txt b/inc/lang/uk/searchpage.txt index 971c24814..3889a7618 100644 --- a/inc/lang/uk/searchpage.txt +++ b/inc/lang/uk/searchpage.txt @@ -1,5 +1,5 @@ ====== Пошук ====== -Дивіться результати пошуку нижче. Якщо ви не знайшли те, що ви шукали, ви можете створити або редагувати сторінку, що має таке ж ім’я, що і пошуковий запит за допомогою відповідної кнопки. +Дивіться результати пошуку нижче. @CREATEPAGEINFO@ ===== Результати ===== diff --git a/inc/lang/vi/denied.txt b/inc/lang/vi/denied.txt index 35acaeb62..fe6e759fc 100644 --- a/inc/lang/vi/denied.txt +++ b/inc/lang/vi/denied.txt @@ -1,3 +1,4 @@ ====== Không được phép vào ====== -Rất tiếc là bạn không được phép để tiếp tục. Bạn quên đăng nhập hay sao? +Rất tiếc là bạn không được phép để tiếp tục. + diff --git a/inc/lang/vi/jquery.ui.datepicker.js b/inc/lang/vi/jquery.ui.datepicker.js new file mode 100644 index 000000000..187ec15e4 --- /dev/null +++ b/inc/lang/vi/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Vietnamese initialisation for the jQuery UI date picker plugin. */ +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['vi'] = { + closeText: 'Đóng', + prevText: '<Trước', + nextText: 'Tiếp>', + currentText: 'Hôm nay', + monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu', + 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'], + monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', + 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'], + dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'], + dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + weekHeader: 'Tu', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; +datepicker.setDefaults(datepicker.regional['vi']); + +return datepicker.regional['vi']; + +})); diff --git a/inc/lang/vi/lang.php b/inc/lang/vi/lang.php index c6b61da51..41a7d590f 100644 --- a/inc/lang/vi/lang.php +++ b/inc/lang/vi/lang.php @@ -1,42 +1,38 @@ <?php + /** - * vietnamese language file - * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) - * @author James Do <jdo@myrealbox.com> + * + * @author James Do <jdo@myrealbox.com> */ - - - $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; -$lang['doublequoteopening'] = '“'; //“ -$lang['doublequoteclosing'] = '”'; //” -$lang['singlequoteopening'] = '‘'; //‘ -$lang['singlequoteclosing'] = '’'; //’ -$lang['apostrophe'] = '’'; //’ - -$lang['btn_edit'] = 'Biên soạn trang này'; -$lang['btn_source'] = 'Xem mã nguồn'; -$lang['btn_show'] = 'Xem trang'; -$lang['btn_create'] = 'Tạo trang này'; -$lang['btn_search'] = 'Tìm'; -$lang['btn_save'] = 'Lưu'; -$lang['btn_preview']= 'Duyệt trước'; -$lang['btn_top'] = 'Trở lên trên'; +$lang['doublequoteopening'] = '“'; +$lang['doublequoteclosing'] = '”'; +$lang['singlequoteopening'] = '‘'; +$lang['singlequoteclosing'] = '’'; +$lang['apostrophe'] = '’'; +$lang['btn_edit'] = 'Biên soạn trang này'; +$lang['btn_source'] = 'Xem mã nguồn'; +$lang['btn_show'] = 'Xem trang'; +$lang['btn_create'] = 'Tạo trang này'; +$lang['btn_search'] = 'Tìm'; +$lang['btn_save'] = 'Lưu'; +$lang['btn_preview'] = 'Duyệt trước'; +$lang['btn_top'] = 'Trở lên trên'; $lang['btn_newer'] = '<< mới hơn'; $lang['btn_older'] = 'cũ hơn >>'; -$lang['btn_revs'] = 'Các phiên bản cũ'; -$lang['btn_recent'] = 'Thay đổi gần đây'; -$lang['btn_upload'] = 'Tải lên'; -$lang['btn_cancel'] = 'Huỷ bỏ'; -$lang['btn_index'] = 'Mục lục'; -$lang['btn_secedit']= 'Biên soạn'; -$lang['btn_login'] = 'Đăng nhập'; -$lang['btn_logout'] = 'Thoát'; -$lang['btn_admin'] = 'Quản lý'; -$lang['btn_update'] = 'Cập nhật'; -$lang['btn_delete'] = 'Xoá'; +$lang['btn_revs'] = 'Các phiên bản cũ'; +$lang['btn_recent'] = 'Thay đổi gần đây'; +$lang['btn_upload'] = 'Tải lên'; +$lang['btn_cancel'] = 'Huỷ bỏ'; +$lang['btn_index'] = 'Mục lục'; +$lang['btn_secedit'] = 'Biên soạn'; +$lang['btn_login'] = 'Đăng nhập'; +$lang['btn_logout'] = 'Thoát'; +$lang['btn_admin'] = 'Quản lý'; +$lang['btn_update'] = 'Cập nhật'; +$lang['btn_delete'] = 'Xoá'; $lang['btn_back'] = 'Quay lại'; $lang['btn_backlink'] = 'Liên kết tới đây'; $lang['btn_profile'] = 'Cập nhật hồ sơ'; @@ -46,40 +42,37 @@ $lang['btn_draft'] = 'Sửa bản nháp'; $lang['btn_recover'] = 'Phục hồi bản nháp'; $lang['btn_draftdel'] = 'Xóa bản nháp'; $lang['btn_revert'] = 'Phục hồi'; -$lang['btn_register'] = 'Đăng ký'; +$lang['btn_register'] = 'Đăng ký'; $lang['btn_apply'] = 'Chấp nhận'; $lang['btn_media'] = 'Quản lý tệp tin'; - -$lang['loggedinas'] = 'Username đang dùng'; -$lang['user'] = 'Username'; -$lang['pass'] = 'Mật khẩu'; +$lang['loggedinas'] = 'Username đang dùng:'; +$lang['user'] = 'Username'; +$lang['pass'] = 'Mật khẩu'; $lang['newpass'] = 'Mật khẩu mới'; $lang['oldpass'] = 'Nhập lại mật khẩu hiện tại'; $lang['passchk'] = 'lần nữa'; -$lang['remember'] = 'Lưu username/password lại'; -$lang['fullname'] = 'Họ và tên'; -$lang['email'] = 'E-Mail'; +$lang['remember'] = 'Lưu username/password lại'; +$lang['fullname'] = 'Họ và tên'; +$lang['email'] = 'E-Mail'; $lang['profile'] = 'Hồ sơ thành viên'; -$lang['badlogin'] = 'Username hoặc password không đúng.'; +$lang['badlogin'] = 'Username hoặc password không đúng.'; $lang['minoredit'] = 'Minor Changes'; -$lang['draftdate'] = 'Bản nháp được tự động lưu lúc'; // full dformat date will be added +$lang['draftdate'] = 'Bản nháp được tự động lưu lúc'; $lang['nosecedit'] = 'Các trang web đã được thay đổi trong khi chờ đợi, phần thông tin quá hạn đã được thay thế bằng trang đầy đủ.'; - -$lang['regmissing'] = 'Bạn cần điền vào tất cả các trường'; -$lang['reguexists'] = 'Bạn khác đã dùng username này rồi.'; -$lang['regsuccess'] = 'Đã tạo username, và đã gởi password.'; +$lang['searchcreatepage'] = "Nếu bạn không thấy được những gì bạn đang tìm, bạn có thể tạo một trang mới bằng cách bấm vào nút ''Biên soạn trang này'', khi đó bạn sẽ có 1 trang mới với tên trang chính là tuwfw khóa bạn đã tìm kiếm."; +$lang['regmissing'] = 'Bạn cần điền vào tất cả các trường'; +$lang['reguexists'] = 'Bạn khác đã dùng username này rồi.'; +$lang['regsuccess'] = 'Đã tạo username, và đã gởi password.'; $lang['regsuccess2'] = 'Thành viên vừa được tạo.'; -$lang['regmailfail']= 'Không gởi password được. Xin bạn liên hệ với người quản lý.'; -$lang['regbadmail'] = 'Email hình như không đúng. Xin bạn liên hệ với người quản lý.'; +$lang['regmailfail'] = 'Không gởi password được. Xin bạn liên hệ với người quản lý.'; +$lang['regbadmail'] = 'Email hình như không đúng. Xin bạn liên hệ với người quản lý.'; $lang['regbadpass'] = 'Hai mật khẩu đưa ra là không giống nhau, xin vui lòng thử lại.'; -$lang['regpwmail'] = 'Password DokuWiki của bạn là'; -$lang['reghere'] = 'Xin bạn đăng ký username nếu chưa có'; - +$lang['regpwmail'] = 'Password DokuWiki của bạn là'; +$lang['reghere'] = 'Xin bạn đăng ký username nếu chưa có'; $lang['profna'] = 'Wiki này không hỗ trợ sửa đổi hồ sơ cá nhân'; $lang['profnochange'] = 'Không có thay đổi, không có gì để làm.'; $lang['profnoempty'] = 'Không được để trống tên hoặc địa chỉ email.'; $lang['profchanged'] = 'Cập nhật hồ sơ thành viên thành công.'; - $lang['pwdforget'] = 'Bạn quên mật khẩu? Tạo lại mật khẩu mới'; $lang['resendna'] = 'Wiki này không hỗ trợ gửi lại mật khẩu.'; $lang['resendpwd'] = 'Gửi mật khẩu mới cho'; @@ -88,20 +81,17 @@ $lang['resendpwdnouser'] = 'Xin lỗi, chúng tôi không thể tìm thấ $lang['resendpwdbadauth'] = 'Xin lỗi, mã này xác thực không hợp lệ. Hãy chắc chắn rằng bạn sử dụng liên kết xác nhận đầy đủ.'; $lang['resendpwdconfirm'] = 'Một liên kết xác nhận đã được gửi bằng email.'; $lang['resendpwdsuccess'] = 'Mật khẩu mới của bạn đã được gửi bằng email.'; - $lang['license'] = 'Trừ khi có ghi chú khác, nội dung trên wiki này được cấp phép theo giấy phép sau đây:'; $lang['licenseok'] = 'Lưu ý: Bằng cách chỉnh sửa trang này, bạn đồng ý cấp giấy phép nội dung của bạn theo giấy phép sau:'; - $lang['searchmedia'] = 'Tìm tên file:'; $lang['searchmedia_in'] = 'Tìm ở %s'; -$lang['txt_upload'] = 'Chọn tệp để tải lên'; -$lang['txt_filename'] = 'Điền wikiname (tuỳ ý)'; +$lang['txt_upload'] = 'Chọn tệp để tải lên:'; +$lang['txt_filename'] = 'Điền wikiname (tuỳ ý):'; $lang['txt_overwrt'] = 'Ghi đè file trùng'; -$lang['lockedby'] = 'Đang khoá bởi'; -$lang['lockexpire'] = 'Sẽ được mở khóa vào lúc'; - -$lang['js']['willexpire'] = 'Trong một phút nữa bài viết sẽ được mở khóa để cho phép người khác chỉnh sửa.\nĐể tránh xung đột, bạn nên bấm nút Duyệt trước để lập lại thời gian khoá bài'; -$lang['js']['notsavedyet'] = 'Hiện có những thay đổi chưa được bảo lưu, và sẽ mất.\nBạn thật sự muốn tiếp tục?'; +$lang['lockedby'] = 'Đang khoá bởi:'; +$lang['lockexpire'] = 'Sẽ được mở khóa vào lúc:'; +$lang['js']['willexpire'] = 'Trong một phút nữa bài viết sẽ được mở khóa để cho phép người khác chỉnh sửa.\nĐể tránh xung đột, bạn nên bấm nút Duyệt trước để lập lại thời gian khoá bài'; +$lang['js']['notsavedyet'] = 'Hiện có những thay đổi chưa được bảo lưu, và sẽ mất.\nBạn thật sự muốn tiếp tục?'; $lang['js']['searchmedia'] = 'Tìm kiếm tập tin'; $lang['js']['keepopen'] = 'Giữ cửa sổ đang mở trên lựa chọn'; $lang['js']['hidedetails'] = 'Ẩn thông tin chi tiết'; @@ -126,29 +116,27 @@ $lang['js']['medialeft'] = 'Căn ảnh sang trái.'; $lang['js']['mediaright'] = 'Căn ảnh sang phải.'; $lang['js']['mediacenter'] = 'Cản ảnh ra giữa.'; $lang['js']['medianoalign'] = 'Không căn.'; -$lang['js']['nosmblinks'] = 'Nối với các Windows shares chỉ có hiệu lực với Microsoft Internet Explorer.\nBạn vẫn có thể sao và chép các mốc nối.'; +$lang['js']['nosmblinks'] = 'Nối với các Windows shares chỉ có hiệu lực với Microsoft Internet Explorer.\nBạn vẫn có thể sao và chép các mốc nối.'; $lang['js']['linkwiz'] = 'Hộp thoại liên kết'; $lang['js']['linkto'] = 'Liên kết tới:'; -$lang['js']['del_confirm']= 'Xoá mục này?'; +$lang['js']['del_confirm'] = 'Xoá mục này?'; $lang['js']['restore_confirm'] = 'Sẵn sàng phục hồi phiên bản này?'; -$lang['js']['media_diff'] = 'So sánh:'; -$lang['js']['media_select'] = 'Chọn nhiều file…'; -$lang['js']['media_upload_btn'] = 'Tải lên'; -$lang['js']['media_done_btn'] = 'Xong'; -$lang['js']['media_drop'] = 'Kéo các file vào đây để tải lên'; -$lang['js']['media_overwrt'] = 'Ghi đè các file trùng'; - -$lang['rssfailed'] = 'Nguồn này gặp phải lỗi'; -$lang['nothingfound']= 'Không tìm được gì'; - -$lang['mediaselect'] = 'Xem'; -$lang['fileupload'] = 'Tải lên tệp media'; -$lang['uploadsucc'] = 'Tải lên thành công'; -$lang['uploadfail'] = 'Tải lên thất bại. Có thể vì không đủ quyền?'; -$lang['uploadwrong'] = 'Tải lên bị từ chối. Cấm tải loại tệp này'; +$lang['js']['media_diff'] = 'So sánh:'; +$lang['js']['media_select'] = 'Chọn nhiều file…'; +$lang['js']['media_upload_btn'] = 'Tải lên'; +$lang['js']['media_done_btn'] = 'Xong'; +$lang['js']['media_drop'] = 'Kéo các file vào đây để tải lên'; +$lang['js']['media_overwrt'] = 'Ghi đè các file trùng'; +$lang['rssfailed'] = 'Nguồn này gặp phải lỗi'; +$lang['nothingfound'] = 'Không tìm được gì'; +$lang['mediaselect'] = 'Xem'; +$lang['fileupload'] = 'Tải lên tệp media'; +$lang['uploadsucc'] = 'Tải lên thành công'; +$lang['uploadfail'] = 'Tải lên thất bại. Có thể vì không đủ quyền?'; +$lang['uploadwrong'] = 'Tải lên bị từ chối. Cấm tải loại tệp này'; $lang['uploadexist'] = 'Tệp tin bị trùng. Chưa có gì xảy ra.'; -$lang['namespaces'] = 'Thư mục'; -$lang['mediafiles'] = 'Tệp có sẵn ở'; +$lang['namespaces'] = 'Thư mục'; +$lang['mediafiles'] = 'Tệp có sẵn ở'; $lang['accessdenied'] = 'Bạn không được phép xem trang này.'; $lang['mediausage'] = 'Sử dụng cú pháp sau đây để dẫn đến tập tin này:'; $lang['mediaview'] = 'Xem tệp gốc'; @@ -157,78 +145,70 @@ $lang['mediaupload'] = 'Tải một tập tin lên thư mục hiện t $lang['mediaextchange'] = 'Phần mở rộng thay đổi từ .%s thành .%s!'; $lang['ref_inuse'] = 'Không thể xóa tập tin vì nó đang được sử dụng cho các trang sau:'; $lang['ref_hidden'] = 'Một số tài liệu sử dụng cho trang này bạn không được cấp phép truy cập.'; - -$lang['hits'] = 'Trùng'; -$lang['quickhits'] = 'Trang trùng hợp'; -$lang['toc'] = 'Nội dung'; -$lang['current'] = 'hiện tại'; -$lang['yours'] = 'Phiên bản hiện tại'; -$lang['diff'] = 'cho xem khác biệt với phiên bản hiện tại'; +$lang['hits'] = 'Trùng'; +$lang['quickhits'] = 'Trang trùng hợp'; +$lang['toc'] = 'Nội dung'; +$lang['current'] = 'hiện tại'; +$lang['yours'] = 'Phiên bản hiện tại'; +$lang['diff'] = 'cho xem khác biệt với phiên bản hiện tại'; $lang['diff2'] = 'Sự khác biệt giữa các bản được lựa chọn'; $lang['difflink'] = 'Liên kết để xem bản so sánh này'; $lang['diff_type'] = 'Xem sự khác biệt:'; $lang['diff_inline'] = 'Nội tuyến'; $lang['diff_side'] = 'Xếp cạnh nhau'; -$lang['line'] = 'Dòng'; -$lang['breadcrumb'] = 'Trang đã xem'; -$lang['youarehere'] = 'Bạn đang ở đây'; -$lang['lastmod'] = 'Thời điểm thay đổi'; -$lang['by'] = 'do'; -$lang['deleted'] = 'bị xoá'; -$lang['created'] = 'được tạo ra'; -$lang['restored'] = 'phiên bản cũ đã được khôi phục (%s)'; +$lang['line'] = 'Dòng'; +$lang['breadcrumb'] = 'Trang đã xem:'; +$lang['youarehere'] = 'Bạn đang ở đây:'; +$lang['lastmod'] = 'Thời điểm thay đổi:'; +$lang['by'] = 'do'; +$lang['deleted'] = 'bị xoá'; +$lang['created'] = 'được tạo ra'; +$lang['restored'] = 'phiên bản cũ đã được khôi phục (%s)'; $lang['external_edit'] = 'external edit'; -$lang['summary'] = 'Tóm tắt biên soạn'; +$lang['summary'] = 'Tóm tắt biên soạn'; $lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> cần được cài để có thể xem nội dung này.'; - -$lang['mail_newpage'] = 'Trang được thêm:'; -$lang['mail_changed'] = 'Trang thay đổi:'; - +$lang['mail_newpage'] = 'Trang được thêm:'; +$lang['mail_changed'] = 'Trang thay đổi:'; $lang['changes_type'] = 'Xem thay đổi của'; $lang['pages_changes'] = 'Trang'; $lang['media_changes'] = 'Tệp media'; $lang['both_changes'] = 'Cả trang và các tập tin media'; - -$lang['qb_bold'] = 'Chữ đậm'; -$lang['qb_italic'] = 'Chữ nghiêng'; -$lang['qb_underl'] = 'Chữ gạch dưới'; -$lang['qb_code'] = 'Chữ mã nguồn'; +$lang['qb_bold'] = 'Chữ đậm'; +$lang['qb_italic'] = 'Chữ nghiêng'; +$lang['qb_underl'] = 'Chữ gạch dưới'; +$lang['qb_code'] = 'Chữ mã nguồn'; $lang['qb_strike'] = 'Strike-through Text'; -$lang['qb_h1'] = 'Đầu đề cấp 1'; -$lang['qb_h2'] = 'Đầu đề cấp 2'; -$lang['qb_h3'] = 'Đầu đề cấp 3'; -$lang['qb_h4'] = 'Đầu đề cấp 4'; -$lang['qb_h5'] = 'Đầu đề cấp 5'; -$lang['qb_link'] = 'Mốc nối nội tại'; -$lang['qb_extlink'] = 'Mốc nối ra ngoài'; -$lang['qb_hr'] = 'Gạch ngang'; -$lang['qb_ol'] = 'Điểm trong danh sách có thứ tự'; -$lang['qb_ul'] = 'Điểm trong danh sách không đánh số'; -$lang['qb_media'] = 'Thêm ảnh và tệp khác'; -$lang['qb_sig'] = 'Đặt chữ ký'; - +$lang['qb_h1'] = 'Đầu đề cấp 1'; +$lang['qb_h2'] = 'Đầu đề cấp 2'; +$lang['qb_h3'] = 'Đầu đề cấp 3'; +$lang['qb_h4'] = 'Đầu đề cấp 4'; +$lang['qb_h5'] = 'Đầu đề cấp 5'; +$lang['qb_link'] = 'Mốc nối nội tại'; +$lang['qb_extlink'] = 'Mốc nối ra ngoài'; +$lang['qb_hr'] = 'Gạch ngang'; +$lang['qb_ol'] = 'Điểm trong danh sách có thứ tự'; +$lang['qb_ul'] = 'Điểm trong danh sách không đánh số'; +$lang['qb_media'] = 'Thêm ảnh và tệp khác'; +$lang['qb_sig'] = 'Đặt chữ ký'; $lang['metaedit'] = 'Sửa Metadata'; $lang['metasaveerr'] = 'Thất bại khi viết metadata'; $lang['metasaveok'] = 'Metadata đã được lưu'; -$lang['img_backto'] = 'Quay lại'; -$lang['img_title'] = 'Tiêu đề'; -$lang['img_caption'] = 'Ghi chú'; -$lang['img_date'] = 'Ngày'; -$lang['img_fname'] = 'Tên file'; -$lang['img_fsize'] = 'Kích cỡ'; -$lang['img_artist'] = 'Người chụp'; -$lang['img_copyr'] = 'Bản quyền'; -$lang['img_format'] = 'Định dạng'; -$lang['img_camera'] = 'Camera'; -$lang['img_keywords'] = 'Từ khóa'; -$lang['img_width'] = 'Rộng'; -$lang['img_height'] = 'Cao'; -$lang['img_manager'] = 'Xem trong trình quản lý tệp media'; - -/* installer strings */ +$lang['btn_img_backto'] = 'Quay lại %s'; +$lang['img_title'] = 'Tiêu đề:'; +$lang['img_caption'] = 'Ghi chú:'; +$lang['img_date'] = 'Ngày:'; +$lang['img_fname'] = 'Tên file:'; +$lang['img_fsize'] = 'Kích cỡ:'; +$lang['img_artist'] = 'Người chụp:'; +$lang['img_copyr'] = 'Bản quyền:'; +$lang['img_format'] = 'Định dạng:'; +$lang['img_camera'] = 'Camera:'; +$lang['img_keywords'] = 'Từ khóa:'; +$lang['img_width'] = 'Rộng:'; +$lang['img_height'] = 'Cao:'; +$lang['btn_mediaManager'] = 'Xem trong trình quản lý tệp media'; $lang['i_chooselang'] = 'Chọn ngôn ngữ'; $lang['i_retry'] = 'Thử lại'; - $lang['years'] = 'cách đây %d năm'; $lang['months'] = 'cách đây %d tháng'; $lang['weeks'] = 'cách đây %d tuần'; @@ -236,9 +216,7 @@ $lang['days'] = 'cách đây %d ngày'; $lang['hours'] = 'cách đây %d giờ'; $lang['minutes'] = 'cách đây %d phút'; $lang['seconds'] = 'cách đây %d giây'; - $lang['wordblock'] = 'Thay đổi của bạn đã không được lưu lại bởi vì nó có chứa văn bản bị chặn (spam).'; - $lang['media_uploadtab'] = 'Tải lên'; $lang['media_searchtab'] = 'Tìm'; $lang['media_file'] = 'Tệp'; @@ -262,5 +240,3 @@ $lang['media_perm_read'] = 'Sorry, bạn không đủ quyền truy cập.' $lang['media_perm_upload'] = 'Xin lỗi, bạn không đủ quyền để upload file lên.'; $lang['media_update'] = 'Tải lên phiên bản mới'; $lang['media_restore'] = 'Phục hồi phiên bản này'; - -//Setup VIM: ex: et ts=2 : diff --git a/inc/lang/vi/searchpage.txt b/inc/lang/vi/searchpage.txt index 7ded7a808..c0c748545 100644 --- a/inc/lang/vi/searchpage.txt +++ b/inc/lang/vi/searchpage.txt @@ -1,5 +1,5 @@ ====== Tìm ====== -Sau đây là kết quả mà bạn đã tìm. Nếu bạn không thấy được những gì bạn đang tìm, bạn có thể tạo một trang mới bằng cách bấm vào nút ''Biên soạn trang này'', khi đó bạn sẽ có 1 trang mới với tên trang chính là tuwfw khóa bạn đã tìm kiếm. +Sau đây là kết quả mà bạn đã tìm. @CREATEPAGEINFO@ ===== Kết quả ===== diff --git a/inc/lang/zh-tw/denied.txt b/inc/lang/zh-tw/denied.txt index 5a4d483a5..23f306d07 100644 --- a/inc/lang/zh-tw/denied.txt +++ b/inc/lang/zh-tw/denied.txt @@ -1,4 +1,4 @@ ====== 權限拒絕 ====== -抱歉,您沒有足夠權限繼續執行。或許您忘了登入? +抱歉,您沒有足夠權限繼續執行。 diff --git a/inc/lang/zh-tw/jquery.ui.datepicker.js b/inc/lang/zh-tw/jquery.ui.datepicker.js new file mode 100644 index 000000000..c9e6dfcb6 --- /dev/null +++ b/inc/lang/zh-tw/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Ressol (ressol@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['zh-TW'] = { + closeText: '關閉', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + weekHeader: '周', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; +datepicker.setDefaults(datepicker.regional['zh-TW']); + +return datepicker.regional['zh-TW']; + +})); diff --git a/inc/lang/zh-tw/lang.php b/inc/lang/zh-tw/lang.php index 456377810..c5e7da000 100644 --- a/inc/lang/zh-tw/lang.php +++ b/inc/lang/zh-tw/lang.php @@ -2,7 +2,7 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) - * + * * @author chinsan <chinsan@mail2000.com.tw> * @author Li-Jiun Huang <ljhuang.tw@gmail.com> * @author http://www.chinese-tools.com/tools/converter-simptrad.html @@ -13,6 +13,9 @@ * @author Ichirou Uchiki <syaoranhinata@gmail.com> * @author tsangho <ou4222@gmail.com> * @author Danny Lin <danny0838@gmail.com> + * @author Stan <talktostan@gmail.com> + * @author June-Hao Hou <junehao@gmail.com> + * @author lioujheyu <lioujheyu@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -57,7 +60,9 @@ $lang['btn_register'] = '註冊'; $lang['btn_apply'] = '套用'; $lang['btn_media'] = '多媒體管理器'; $lang['btn_deleteuser'] = '移除我的帳號'; -$lang['loggedinas'] = '登入成'; +$lang['btn_img_backto'] = '回上一頁 %s'; +$lang['btn_mediaManager'] = '在多媒體管理器中檢視'; +$lang['loggedinas'] = '登入成:'; $lang['user'] = '帳號'; $lang['pass'] = '密碼'; $lang['newpass'] = '新密碼'; @@ -72,6 +77,7 @@ $lang['badpassconfirm'] = '抱歉,這密碼是錯的'; $lang['minoredit'] = '小修改'; $lang['draftdate'] = '草稿已自動存檔於'; $lang['nosecedit'] = '在您編輯期間,其他使用者修改過本頁面。區段資料已逾時,因此系統載入了全頁,以取代之。'; +$lang['searchcreatepage'] = '若沒找到您想要的,可按下按鈕建立或編輯和查詢關鍵字同名的頁面。'; $lang['regmissing'] = '很抱歉,所有欄位都要填寫。'; $lang['reguexists'] = '很抱歉,有人已使用了這個帳號。'; $lang['regsuccess'] = '使用者帳號已建立,密碼已寄發至該電郵。'; @@ -102,12 +108,12 @@ $lang['license'] = '若無特別註明,本 wiki 上的內容都 $lang['licenseok'] = '注意:編輯此頁面表示您同意用以下授權方式發布您撰寫的內容:'; $lang['searchmedia'] = '搜尋檔名:'; $lang['searchmedia_in'] = '在 %s 裏搜尋'; -$lang['txt_upload'] = '請選擇要上傳的檔案'; -$lang['txt_filename'] = '請輸入要上傳至本 wiki 的檔案名稱 (非必要)'; +$lang['txt_upload'] = '請選擇要上傳的檔案:'; +$lang['txt_filename'] = '請輸入要上傳至本 wiki 的檔案名稱 (非必要):'; $lang['txt_overwrt'] = '是否要覆蓋原有檔案'; $lang['maxuploadsize'] = '每個上傳檔案不可大於 %s 。'; -$lang['lockedby'] = '目前已被下列人員鎖定'; -$lang['lockexpire'] = '預計解除鎖定於'; +$lang['lockedby'] = '目前已被下列人員鎖定:'; +$lang['lockexpire'] = '預計解除鎖定於:'; $lang['js']['willexpire'] = '本頁的編輯鎖定將在一分鐘內到期。要避免發生衝突,請按「預覽」鍵重設鎖定計時。'; $lang['js']['notsavedyet'] = '未儲存的變更將會遺失,繼續嗎?'; $lang['js']['searchmedia'] = '搜尋檔案'; @@ -187,10 +193,15 @@ $lang['difflink'] = '連向這個比對檢視'; $lang['diff_type'] = '檢視差異:'; $lang['diff_inline'] = '行內'; $lang['diff_side'] = '並排'; +$lang['diffprevrev'] = '前次修改 +'; +$lang['diffnextrev'] = '下次修改'; +$lang['difflastrev'] = '最後一次修改 +'; $lang['line'] = '行'; -$lang['breadcrumb'] = '足跡'; -$lang['youarehere'] = '您在這裏'; -$lang['lastmod'] = '上一次變更'; +$lang['breadcrumb'] = '足跡:'; +$lang['youarehere'] = '您在這裏:'; +$lang['lastmod'] = '上一次變更:'; $lang['by'] = '由'; $lang['deleted'] = '移除'; $lang['created'] = '建立'; @@ -243,20 +254,18 @@ $lang['admin_register'] = '新增使用者'; $lang['metaedit'] = '編輯後設資料'; $lang['metasaveerr'] = '後設資料無法寫入'; $lang['metasaveok'] = '後設資料已儲存'; -$lang['img_backto'] = '回上一頁'; -$lang['img_title'] = '標題'; -$lang['img_caption'] = '照片說明'; -$lang['img_date'] = '日期'; -$lang['img_fname'] = '檔名'; -$lang['img_fsize'] = '大小'; -$lang['img_artist'] = '攝影者'; -$lang['img_copyr'] = '版權'; -$lang['img_format'] = '格式'; -$lang['img_camera'] = '相機'; -$lang['img_keywords'] = '關鍵字'; -$lang['img_width'] = '寬度'; -$lang['img_height'] = '高度'; -$lang['img_manager'] = '在多媒體管理器中檢視'; +$lang['img_title'] = '標題:'; +$lang['img_caption'] = '照片說明:'; +$lang['img_date'] = '日期:'; +$lang['img_fname'] = '檔名:'; +$lang['img_fsize'] = '大小:'; +$lang['img_artist'] = '攝影者:'; +$lang['img_copyr'] = '版權:'; +$lang['img_format'] = '格式:'; +$lang['img_camera'] = '相機:'; +$lang['img_keywords'] = '關鍵字:'; +$lang['img_width'] = '寬度:'; +$lang['img_height'] = '高度:'; $lang['subscr_subscribe_success'] = '已將 %s 加入至 %s 的訂閱列表'; $lang['subscr_subscribe_error'] = '將 %s 加入至 %s 的訂閱列表時發生錯誤'; $lang['subscr_subscribe_noaddress'] = '沒有與您登入相關的地址,無法將您加入訂閱列表'; @@ -273,8 +282,6 @@ $lang['subscr_m_receive'] = '接收'; $lang['subscr_style_every'] = '每次更改都發送信件'; $lang['subscr_style_digest'] = '對每個頁面發送更改的摘要信件 (每 %.2f 天)'; $lang['subscr_style_list'] = '自上次發信以來更改的頁面的列表 (每 %.2f 天)'; - -/* auth.class language support */ $lang['authtempfail'] = '暫不提供帳號認證。若本狀況持續,請通知本 wiki 管理員。'; $lang['authpwdexpire'] = '您的密碼將在 %d 天內到期,請馬上更換新密碼。'; $lang['i_chooselang'] = '選擇您的語系'; @@ -299,6 +306,7 @@ $lang['i_policy'] = '初步的 ACL 政策'; $lang['i_pol0'] = '開放的 wiki (任何人可讀取、寫入、上傳)'; $lang['i_pol1'] = '公開的 wiki (任何人可讀取,註冊使用者可寫入與上傳)'; $lang['i_pol2'] = '封閉的 wiki (只有註冊使用者可讀取、寫入、上傳)'; +$lang['i_allowreg'] = '允許使用者自行註冊'; $lang['i_retry'] = '重試'; $lang['i_license'] = '請選擇您想要的內容發佈授權方式:'; $lang['i_license_none'] = '不要顯示任何關於授權方式的訊息'; @@ -336,7 +344,6 @@ $lang['media_perm_read'] = '抱歉,您沒有足夠權限讀取檔案。' $lang['media_perm_upload'] = '抱歉,您沒有足夠權限上傳檔案。'; $lang['media_update'] = '上傳新的版本'; $lang['media_restore'] = '還原這個版本'; - $lang['currentns'] = '目前的命名空間'; $lang['searchresult'] = '搜尋結果'; $lang['plainhtml'] = '純 HTML'; diff --git a/inc/lang/zh-tw/searchpage.txt b/inc/lang/zh-tw/searchpage.txt index e0f04c433..96680019d 100644 --- a/inc/lang/zh-tw/searchpage.txt +++ b/inc/lang/zh-tw/searchpage.txt @@ -1,5 +1,5 @@ ====== 搜尋精靈 ====== -提示:您可以在下面找到您的搜尋結果。若沒找到您想要的,可按下按鈕建立或編輯和查詢關鍵字同名的頁面。 +提示:您可以在下面找到您的搜尋結果。@CREATEPAGEINFO@ ===== 搜尋結果 ===== diff --git a/inc/lang/zh/denied.txt b/inc/lang/zh/denied.txt index 276741c40..94721e48a 100644 --- a/inc/lang/zh/denied.txt +++ b/inc/lang/zh/denied.txt @@ -1,3 +1,4 @@ ====== 拒绝授权 ====== -对不起,您没有足够权限,无法继续。也许您忘了登录?
\ No newline at end of file +对不起,您没有足够权限,无法继续。 + diff --git a/inc/lang/zh/jquery.ui.datepicker.js b/inc/lang/zh/jquery.ui.datepicker.js new file mode 100644 index 000000000..b62090a63 --- /dev/null +++ b/inc/lang/zh/jquery.ui.datepicker.js @@ -0,0 +1,37 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "../datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +}(function( datepicker ) { + +datepicker.regional['zh-CN'] = { + closeText: '关闭', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + weekHeader: '周', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; +datepicker.setDefaults(datepicker.regional['zh-CN']); + +return datepicker.regional['zh-CN']; + +})); diff --git a/inc/lang/zh/lang.php b/inc/lang/zh/lang.php index 0c0011925..6f55834d0 100644 --- a/inc/lang/zh/lang.php +++ b/inc/lang/zh/lang.php @@ -19,6 +19,11 @@ * @author Donald <donaldtcong@gmail.com> * @author Yangyu Huang <yangyu.huang@gmail.com> * @author anjianshi <anjianshi@gmail.com> + * @author oott123 <ip.192.168.1.1@qq.com> + * @author Cupen <Cupenoruler@foxmail.com> + * @author xiqingongzi <Xiqingongzi@Gmail.com> + * @author qinghao <qingxianhao@gmail.com> + * @author Yuwei Sun <yuwei@hrz.tu-chemnitz.de> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -63,7 +68,9 @@ $lang['btn_register'] = '注册'; $lang['btn_apply'] = '应用'; $lang['btn_media'] = '媒体管理器'; $lang['btn_deleteuser'] = '移除我的账户'; -$lang['loggedinas'] = '登录为'; +$lang['btn_img_backto'] = '返回到 %s'; +$lang['btn_mediaManager'] = '在媒体管理器中查看'; +$lang['loggedinas'] = '登录为:'; $lang['user'] = '用户名'; $lang['pass'] = '密码'; $lang['newpass'] = '请输入新密码'; @@ -78,6 +85,7 @@ $lang['badpassconfirm'] = '对不起,密码错误'; $lang['minoredit'] = '细微修改'; $lang['draftdate'] = '草稿自动保存于'; $lang['nosecedit'] = '在您编辑期间本页刚被他人修改过,局部信息已过期,故载入全页。'; +$lang['searchcreatepage'] = '如果没有找到您想要的东西,您可以使用相应的按钮来创建或编辑该页面。'; $lang['regmissing'] = '对不起,您必须填写所有的字段。'; $lang['reguexists'] = '对不起,该用户名已经存在。'; $lang['regsuccess'] = '新用户已建立,密码将通过电子邮件发送给您。'; @@ -108,12 +116,12 @@ $lang['license'] = '除额外注明的地方外,本维基上的 $lang['licenseok'] = '当您选择开始编辑本页,即寓示你同意将你贡献的内容按下列许可协议发布:'; $lang['searchmedia'] = '查找文件名:'; $lang['searchmedia_in'] = '在%s中查找'; -$lang['txt_upload'] = '选择要上传的文件'; -$lang['txt_filename'] = '上传并重命名为(可选)'; +$lang['txt_upload'] = '选择要上传的文件:'; +$lang['txt_filename'] = '上传并重命名为(可选):'; $lang['txt_overwrt'] = '覆盖已存在的同名文件'; $lang['maxuploadsize'] = '上传限制。每个文件 %s'; -$lang['lockedby'] = '目前已被下列人员锁定'; -$lang['lockexpire'] = '预计锁定解除于'; +$lang['lockedby'] = '目前已被下列人员锁定:'; +$lang['lockexpire'] = '预计锁定解除于:'; $lang['js']['willexpire'] = '您对本页的独有编辑权将于一分钟之后解除。\n为了防止与其他人的编辑冲突,请使用预览按钮重设计时器。'; $lang['js']['notsavedyet'] = '未保存的更改将丢失。 真的要继续?'; @@ -194,10 +202,15 @@ $lang['difflink'] = '到此差别页面的链接'; $lang['diff_type'] = '查看差异:'; $lang['diff_inline'] = '行内显示'; $lang['diff_side'] = '并排显示'; +$lang['diffprevrev'] = '前一修订版'; +$lang['diffnextrev'] = '后一修订版'; +$lang['difflastrev'] = '上一修订版'; +$lang['diffbothprevrev'] = '两侧同时换到之前的修订记录'; +$lang['diffbothnextrev'] = '两侧同时换到之后的修订记录'; $lang['line'] = '行'; -$lang['breadcrumb'] = '您的足迹'; -$lang['youarehere'] = '您在这里'; -$lang['lastmod'] = '最后更改'; +$lang['breadcrumb'] = '您的足迹:'; +$lang['youarehere'] = '您在这里:'; +$lang['lastmod'] = '最后更改:'; $lang['by'] = '由'; $lang['deleted'] = '移除'; $lang['created'] = '创建'; @@ -250,20 +263,18 @@ $lang['admin_register'] = '添加新用户'; $lang['metaedit'] = '编辑元数据'; $lang['metasaveerr'] = '写入元数据失败'; $lang['metasaveok'] = '元数据已保存'; -$lang['img_backto'] = '返回到'; -$lang['img_title'] = '标题'; -$lang['img_caption'] = '说明'; -$lang['img_date'] = '日期'; -$lang['img_fname'] = '名称'; -$lang['img_fsize'] = '大小'; -$lang['img_artist'] = '摄影师'; -$lang['img_copyr'] = '版权'; -$lang['img_format'] = '格式'; -$lang['img_camera'] = '相机'; -$lang['img_keywords'] = '关键字'; -$lang['img_width'] = '宽度'; -$lang['img_height'] = '高度'; -$lang['img_manager'] = '在媒体管理器中查看'; +$lang['img_title'] = '标题:'; +$lang['img_caption'] = '说明:'; +$lang['img_date'] = '日期:'; +$lang['img_fname'] = '名称:'; +$lang['img_fsize'] = '大小:'; +$lang['img_artist'] = '摄影师:'; +$lang['img_copyr'] = '版权:'; +$lang['img_format'] = '格式:'; +$lang['img_camera'] = '相机:'; +$lang['img_keywords'] = '关键字:'; +$lang['img_width'] = '宽度:'; +$lang['img_height'] = '高度:'; $lang['subscr_subscribe_success'] = '添加 %s 到 %s 的订阅列表'; $lang['subscr_subscribe_error'] = '添加 %s 到 %s 的订阅列表中出现错误'; $lang['subscr_subscribe_noaddress'] = '没有与您登录信息相关联的地址,您无法被添加到订阅列表'; @@ -293,6 +304,7 @@ $lang['i_modified'] = '由于安全上的考虑,该脚本只能用 <a href="http://dokuwiki.org/install">Dokuwiki 安装指南</a>'; $lang['i_funcna'] = 'PHP 功能 <code>%s</code> 无法使用。也许您的服务器提供商因为某些原因禁用了它。'; $lang['i_phpver'] = '您的 PHP 版本 <code>%s</code> 低于最低要求的 <code>%s</code>。您需要升级您的 PHP 版本。'; +$lang['i_mbfuncoverload'] = '为了运行DocuWiki,您必须在php.ini中禁用mbstring.func_overload。'; $lang['i_permfail'] = 'DokuWiki 无法写入 <code>%s</code>。您需要修改该路径的权限设定!'; $lang['i_confexists'] = '<code>%s</code> 已经存在'; $lang['i_writeerr'] = '无法创建 <code>%s</code>。您需要检查该路径/文件的权限设定并手动创建该文件。'; @@ -346,3 +358,7 @@ $lang['media_update'] = '上传新版本'; $lang['media_restore'] = '恢复这个版本'; $lang['currentns'] = '当前命名空间'; $lang['searchresult'] = '搜索结果'; +$lang['plainhtml'] = '纯HTML'; +$lang['wikimarkup'] = 'Wiki Markup 语言'; +$lang['page_nonexist_rev'] = '页面在 %s 不存在。它曾创建于 <a href="%s">%s</a>。'; +$lang['unable_to_parse_date'] = '无法解析参数 "%s"。'; diff --git a/inc/lang/zh/searchpage.txt b/inc/lang/zh/searchpage.txt index 8222e242c..be7ae7909 100644 --- a/inc/lang/zh/searchpage.txt +++ b/inc/lang/zh/searchpage.txt @@ -1,5 +1,5 @@ ====== 搜索 ====== -下面将显示您的搜索结果。如果没有找到您想要的东西,您可以使用相应的按钮来创建或编辑该页面。 +下面将显示您的搜索结果。@CREATEPAGEINFO@ ===== 搜索结果 =====
\ No newline at end of file diff --git a/inc/lessc.inc.php b/inc/lessc.inc.php index 0699de52f..3d0ed768a 100644 --- a/inc/lessc.inc.php +++ b/inc/lessc.inc.php @@ -708,7 +708,7 @@ class lessc { } $oldParent = $mixin->parent; - if ($mixin != $block) $mixin->parent = $block; + if ($mixin !== $block) $mixin->parent = $block; foreach ($this->sortProps($mixin->props) as $subProp) { if ($suffix !== null && diff --git a/inc/load.php b/inc/load.php index c5b40ffd8..18786dc79 100644 --- a/inc/load.php +++ b/inc/load.php @@ -76,6 +76,7 @@ function load_autoload($name){ 'ZipLib' => DOKU_INC.'inc/ZipLib.class.php', 'DokuWikiFeedCreator' => DOKU_INC.'inc/feedcreator.class.php', 'Doku_Parser_Mode' => DOKU_INC.'inc/parser/parser.php', + 'Doku_Parser_Mode_Plugin' => DOKU_INC.'inc/parser/parser.php', 'SafeFN' => DOKU_INC.'inc/SafeFN.class.php', 'Sitemapper' => DOKU_INC.'inc/Sitemapper.php', 'PassHash' => DOKU_INC.'inc/PassHash.class.php', @@ -95,6 +96,16 @@ function load_autoload($name){ 'DokuWiki_Remote_Plugin' => DOKU_PLUGIN.'remote.php', 'DokuWiki_Auth_Plugin' => DOKU_PLUGIN.'auth.php', + 'Doku_Renderer' => DOKU_INC.'inc/parser/renderer.php', + 'Doku_Renderer_xhtml' => DOKU_INC.'inc/parser/xhtml.php', + 'Doku_Renderer_code' => DOKU_INC.'inc/parser/code.php', + 'Doku_Renderer_xhtmlsummary' => DOKU_INC.'inc/parser/xhtmlsummary.php', + 'Doku_Renderer_metadata' => DOKU_INC.'inc/parser/metadata.php', + + 'DokuCLI' => DOKU_INC.'inc/cli.php', + 'DokuCLI_Options' => DOKU_INC.'inc/cli.php', + 'DokuCLI_Colors' => DOKU_INC.'inc/cli.php', + ); if(isset($classes[$name])){ @@ -108,7 +119,7 @@ function load_autoload($name){ // try to load the wanted plugin file $c = ((count($m) === 4) ? "/{$m[3]}" : ''); $plg = DOKU_PLUGIN . "{$m[2]}/{$m[1]}$c.php"; - if(@file_exists($plg)){ + if(file_exists($plg)){ include_once DOKU_PLUGIN . "{$m[2]}/{$m[1]}$c.php"; } return; diff --git a/inc/mail.php b/inc/mail.php index 0b60c0a5b..9f1b1f3d6 100644 --- a/inc/mail.php +++ b/inc/mail.php @@ -27,7 +27,7 @@ if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL',"\n"); * Check if a given mail address is valid */ if (!defined('RFC2822_ATEXT')) define('RFC2822_ATEXT',"0-9a-zA-Z!#$%&'*+/=?^_`{|}~-"); -if (!defined('PREG_PATTERN_VALID_EMAIL')) define('PREG_PATTERN_VALID_EMAIL', '['.RFC2822_ATEXT.']+(?:\.['.RFC2822_ATEXT.']+)*@(?i:[0-9a-z][0-9a-z-]*\.)+(?i:[a-z]{2,4}|museum|travel)'); +if (!defined('PREG_PATTERN_VALID_EMAIL')) define('PREG_PATTERN_VALID_EMAIL', '['.RFC2822_ATEXT.']+(?:\.['.RFC2822_ATEXT.']+)*@(?i:[0-9a-z][0-9a-z-]*\.)+(?i:[a-z]{2,63})'); /** * Prepare mailfrom replacement patterns @@ -40,6 +40,8 @@ if (!defined('PREG_PATTERN_VALID_EMAIL')) define('PREG_PATTERN_VALID_EMAIL', '[' function mail_setup(){ global $conf; global $USERINFO; + /** @var Input $INPUT */ + global $INPUT; // auto constructed address $host = @parse_url(DOKU_URL,PHP_URL_HOST); @@ -53,11 +55,8 @@ function mail_setup(){ $replace['@MAIL@'] = $noreply; } - if(!empty($_SERVER['REMOTE_USER'])){ - $replace['@USER@'] = $_SERVER['REMOTE_USER']; - }else{ - $replace['@USER@'] = 'noreply'; - } + // use 'noreply' if no user + $replace['@USER@'] = $INPUT->server->str('REMOTE_USER', 'noreply', true); if(!empty($USERINFO['name'])){ $replace['@NAME@'] = $USERINFO['name']; diff --git a/inc/media.php b/inc/media.php index d69426414..81081d5dc 100644 --- a/inc/media.php +++ b/inc/media.php @@ -16,6 +16,9 @@ if(!defined('NL')) define('NL',"\n"); * their CSS tags except pagenames won't be links. * * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> + * + * @param array $data + * @param string $id */ function media_filesinuse($data,$id){ global $lang; @@ -41,6 +44,11 @@ function media_filesinuse($data,$id){ * * @author Andreas Gohr <andi@splitbrain.org> * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $id media id + * @param int $auth permission level + * @param array $data + * @return false|string */ function media_metasave($id,$auth,$data){ if($auth < AUTH_UPLOAD) return false; @@ -62,7 +70,7 @@ function media_metasave($id,$auth,$data){ } $old = @filemtime($src); - if(!@file_exists(mediaFN($id, $old)) && @file_exists($src)) { + if(!file_exists(mediaFN($id, $old)) && file_exists($src)) { // add old revision to the attic media_saveOldRevision($id); } @@ -86,6 +94,7 @@ function media_metasave($id,$auth,$data){ * check if a media is external source * * @author Gerrit Uitslag <klapinklapin@gmail.com> + * * @param string $id the media ID or URL * @return bool */ @@ -98,6 +107,7 @@ function media_isexternal($id){ * Check if a media item is public (eg, external URL or readable by @ALL) * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $id the media ID or URL * @return bool */ @@ -113,9 +123,13 @@ function media_ispublic($id){ * * @author Andreas Gohr <andi@splitbrain.org> * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $id media id + * @param int $auth permission level + * @return bool */ function media_metaform($id,$auth){ - global $lang, $config_cascade; + global $lang; if($auth < AUTH_UPLOAD) { echo '<div class="nothing">'.$lang['media_perm_upload'].'</div>'.NL; @@ -127,7 +141,7 @@ function media_metaform($id,$auth){ if(is_null($fields)){ $config_files = getConfigFiles('mediameta'); foreach ($config_files as $config_file) { - if(@file_exists($config_file)) include($config_file); + if(file_exists($config_file)) include($config_file); } } @@ -167,16 +181,21 @@ function media_metaform($id,$auth){ $form->addElement(form_makeButton('submit', '', $lang['btn_save'], array('accesskey' => 's', 'name' => 'mediado[save]'))); $form->addElement('</div>'.NL); $form->printForm(); + + return true; } /** * Convenience function to check if a media file is still in use * * @author Michael Klier <chi@chimeric.de> + * + * @param string $id media id + * @return array|bool */ function media_inuse($id) { global $conf; - $mediareferences = array(); + if($conf['refcheck']){ $mediareferences = ft_mediause($id,true); if(!count($mediareferences)) { @@ -199,7 +218,10 @@ define('DOKU_MEDIA_EMPTY_NS', 8); * * If configured, checks for media references before deletion * - * @author Andreas Gohr <andi@splitbrain.org> + * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id media id + * @param int $auth no longer used * @return int One of: 0, * DOKU_MEDIA_DELETED, * DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS, @@ -208,23 +230,25 @@ define('DOKU_MEDIA_EMPTY_NS', 8); */ function media_delete($id,$auth){ global $lang; + $auth = auth_quickaclcheck(ltrim(getNS($id).':*', ':')); if($auth < AUTH_DELETE) return DOKU_MEDIA_NOT_AUTH; if(media_inuse($id)) return DOKU_MEDIA_INUSE; $file = mediaFN($id); // trigger an event - MEDIA_DELETE_FILE + $data = array(); $data['id'] = $id; $data['name'] = utf8_basename($file); $data['path'] = $file; - $data['size'] = (@file_exists($file)) ? filesize($file) : 0; + $data['size'] = (file_exists($file)) ? filesize($file) : 0; $data['unl'] = false; $data['del'] = false; $evt = new Doku_Event('MEDIA_DELETE_FILE',$data); if ($evt->advise_before()) { $old = @filemtime($file); - if(!@file_exists(mediaFN($id, $old)) && @file_exists($file)) { + if(!file_exists(mediaFN($id, $old)) && file_exists($file)) { // add old revision to the attic media_saveOldRevision($id); } @@ -248,14 +272,16 @@ function media_delete($id,$auth){ /** * Handle file uploads via XMLHttpRequest * - * @return mixed false on error, id of the new file on success + * @param string $ns target namespace + * @param int $auth current auth check result + * @return false|string false on error, id of the new file on success */ function media_upload_xhr($ns,$auth){ if(!checkSecurityToken()) return false; global $INPUT; $id = $INPUT->get->str('qqfile'); - list($ext,$mime,$dl) = mimetype($id); + list($ext,$mime) = mimetype($id); $input = fopen("php://input", "r"); if (!($tmp = io_mktmpdir())) return false; $path = $tmp.'/'.md5($id); @@ -278,7 +304,7 @@ function media_upload_xhr($ns,$auth){ 'copy' ); unlink($path); - if ($tmp) dir_delete($tmp); + if ($tmp) io_rmdir($tmp, true); if (is_array($res)) { msg($res[0], $res[1]); return false; @@ -291,7 +317,11 @@ function media_upload_xhr($ns,$auth){ * * @author Andreas Gohr <andi@splitbrain.org> * @author Michael Klier <chi@chimeric.de> - * @return mixed false on error, id of the new file on success + * + * @param string $ns target namespace + * @param int $auth current auth check result + * @param bool|array $file $_FILES member, $_FILES['upload'] if false + * @return false|string false on error, id of the new file on success */ function media_upload($ns,$auth,$file=false){ if(!checkSecurityToken()) return false; @@ -307,8 +337,8 @@ function media_upload($ns,$auth,$file=false){ if($file['error']) return false; // check extensions - list($fext,$fmime,$dl) = mimetype($file['name']); - list($iext,$imime,$dl) = mimetype($id); + list($fext,$fmime) = mimetype($file['name']); + list($iext,$imime) = mimetype($id); if($fext && !$iext){ // no extension specified in id - read original one $id .= '.'.$fext; @@ -335,6 +365,7 @@ function media_upload($ns,$auth,$file=false){ * Using copy, makes sure any setgid bits on the media directory are honored * * @see move_uploaded_file() + * * @param string $from * @param string $to * @return bool @@ -352,13 +383,21 @@ function copy_uploaded_file($from, $to){ * (The triggered event is preventable.) * * Event data: - * $data[0] fn_tmp: the temporary file name (read from $_FILES) - * $data[1] fn: the file name of the uploaded file - * $data[2] id: the future directory id of the uploaded file - * $data[3] imime: the mimetype of the uploaded file + * $data[0] fn_tmp: the temporary file name (read from $_FILES) + * $data[1] fn: the file name of the uploaded file + * $data[2] id: the future directory id of the uploaded file + * $data[3] imime: the mimetype of the uploaded file * $data[4] overwrite: if an existing file is going to be overwritten + * $data[5] move: name of function that performs move/copy/.. * * @triggers MEDIA_UPLOAD_FINISH + * + * @param array $file + * @param string $id media id + * @param bool $ow overwrite? + * @param int $auth permission level + * @param string $move name of functions that performs move/copy/.. + * @return false|array|string */ function media_save($file, $id, $ow, $auth, $move) { if($auth < AUTH_UPLOAD) { @@ -392,7 +431,7 @@ function media_save($file, $id, $ow, $auth, $move) { } //check for overwrite - $overwrite = @file_exists($fn); + $overwrite = file_exists($fn); $auth_ow = (($conf['mediarevisions']) ? AUTH_UPLOAD : AUTH_DELETE); if($overwrite && (!$ow || $auth < $auth_ow)) { return array($lang['uploadexist'], 0); @@ -408,6 +447,7 @@ function media_save($file, $id, $ow, $auth, $move) { } // prepare event data + $data = array(); $data[0] = $file['name']; $data[1] = $fn; $data[2] = $id; @@ -420,8 +460,12 @@ function media_save($file, $id, $ow, $auth, $move) { } /** - * Callback adapter for media_upload_finish() + * Callback adapter for media_upload_finish() triggered by MEDIA_UPLOAD_FINISH + * * @author Michael Klier <chi@chimeric.de> + * + * @param array $data event data + * @return false|array|string */ function _media_upload_action($data) { // fixme do further sanity tests of given data? @@ -438,6 +482,14 @@ function _media_upload_action($data) { * @author Andreas Gohr <andi@splitbrain.org> * @author Michael Klier <chi@chimeric.de> * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $fn_tmp + * @param string $fn + * @param string $id media id + * @param string $imime mime type + * @param bool $overwrite overwrite existing? + * @param string $move function name + * @return array|string */ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'move_uploaded_file') { global $conf; @@ -445,7 +497,7 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'mov global $REV; $old = @filemtime($fn); - if(!@file_exists(mediaFN($id, $old)) && @file_exists($fn)) { + if(!file_exists(mediaFN($id, $old)) && file_exists($fn)) { // add old revision to the attic if missing media_saveOldRevision($id); } @@ -481,6 +533,7 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'mov * directory * * @author Kate Arzamastseva <pshns@ukr.net> + * * @param string $id * @return int - revision date */ @@ -488,14 +541,15 @@ function media_saveOldRevision($id){ global $conf, $lang; $oldf = mediaFN($id); - if(!@file_exists($oldf)) return ''; + if(!file_exists($oldf)) return ''; $date = filemtime($oldf); if (!$conf['mediarevisions']) return $date; - if (!getRevisionInfo($id, $date, 8192, true)) { + $medialog = new MediaChangeLog($id); + if (!$medialog->getRevisionInfo($date)) { // there was an external edit, // there is no log entry for current version of file - if (!@file_exists(mediaMetaFN($id,'.changes'))) { + if (!file_exists(mediaMetaFN($id,'.changes'))) { addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created']); } else { addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_EDIT); @@ -523,6 +577,10 @@ function media_saveOldRevision($id){ * @author Andreas Gohr <andi@splitbrain.org> * @link http://www.splitbrain.org/blog/2007-02/12-internet_explorer_facilitates_cross_site_scripting * @fixme check all 26 magic IE filetypes here? + * + * @param string $file path to file + * @param string $mime mimetype + * @return int */ function media_contentcheck($file,$mime){ global $conf; @@ -532,14 +590,14 @@ function media_contentcheck($file,$mime){ $bytes = fread($fh, 256); fclose($fh); if(preg_match('/<(script|a|img|html|body|iframe)[\s>]/i',$bytes)){ - return -3; + return -3; //XSS: possibly malicious content } } } if(substr($mime,0,6) == 'image/'){ $info = @getimagesize($file); if($mime == 'image/gif' && $info[2] != 1){ - return -1; + return -1; // uploaded content did not match the file extension }elseif($mime == 'image/jpeg' && $info[2] != 2){ return -1; }elseif($mime == 'image/png' && $info[2] != 3){ @@ -550,7 +608,7 @@ function media_contentcheck($file,$mime){ global $TEXT; $TEXT = io_readFile($file); if(checkwordblock()){ - return -2; + return -2; //blocked by the spam blacklist } } return 0; @@ -560,17 +618,29 @@ function media_contentcheck($file,$mime){ * Send a notify mail on uploads * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id media id + * @param string $file path to file + * @param string $mime mime type + * @param bool|int $old_rev revision timestamp or false + * @return bool */ function media_notify($id,$file,$mime,$old_rev=false){ global $conf; - if(empty($conf['notify'])) return; //notify enabled? + if(empty($conf['notify'])) return false; //notify enabled? $subscription = new Subscription(); - return $subscription->send_media_diff($conf['notify'], 'uploadmail', $id, $old_rev, ''); + return $subscription->send_media_diff($conf['notify'], 'uploadmail', $id, $old_rev); } /** * List all files in a given Media namespace + * + * @param string $ns namespace + * @param null|int $auth permission level + * @param string $jump id + * @param bool $fullscreenview + * @param bool|string $sort sorting order, false skips sorting */ function media_filelist($ns,$auth=null,$jump='',$fullscreenview=false,$sort=false){ global $conf; @@ -640,7 +710,8 @@ function media_tabs_files($selected_tab = ''){ * Prints tabs for files details actions * * @author Kate Arzamastseva <pshns@ukr.net> - * @param string $selected_tab - opened tab + * @param string $image filename of the current image + * @param string $selected_tab opened tab */ function media_tabs_details($image, $selected_tab = ''){ global $lang, $conf; @@ -649,8 +720,8 @@ function media_tabs_details($image, $selected_tab = ''){ $tabs['view'] = array('href' => media_managerURL(array('tab_details' => 'view'), '&'), 'caption' => $lang['media_viewtab']); - list($ext, $mime) = mimetype($image); - if ($mime == 'image/jpeg' && @file_exists(mediaFN($image))) { + list(, $mime) = mimetype($image); + if ($mime == 'image/jpeg' && file_exists(mediaFN($image))) { $tabs['edit'] = array('href' => media_managerURL(array('tab_details' => 'edit'), '&'), 'caption' => $lang['media_edittab']); } @@ -669,7 +740,6 @@ function media_tabs_details($image, $selected_tab = ''){ */ function media_tab_files_options(){ global $lang; - global $NS; global $INPUT; global $ID; $form = new Doku_Form(array('class' => 'options', 'method' => 'get', @@ -695,7 +765,7 @@ function media_tab_files_options(){ if ($checked == $option) { $attrs['checked'] = 'checked'; } - $form->addElement(form_makeRadioField($group, $option, + $form->addElement(form_makeRadioField($group . '_dwmedia', $option, $lang['media_' . $group . '_' . $option], $content[0] . '__' . $option, $option, $attrs)); @@ -713,16 +783,31 @@ function media_tab_files_options(){ * Returns type of sorting for the list of files in media manager * * @author Kate Arzamastseva <pshns@ukr.net> + * * @return string - sort type */ function _media_get_sort_type() { return _media_get_display_param('sort', array('default' => 'name', 'date')); } +/** + * Returns type of listing for the list of files in media manager + * + * @author Kate Arzamastseva <pshns@ukr.net> + * + * @return string - list type + */ function _media_get_list_type() { return _media_get_display_param('list', array('default' => 'thumbs', 'rows')); } +/** + * Get display parameters + * + * @param string $param name of parameter + * @param array $values allowed values, where default value has index key 'default' + * @return string the parameter value + */ function _media_get_display_param($param, $values) { global $INPUT; if (in_array($INPUT->str($param), $values)) { @@ -741,6 +826,10 @@ function _media_get_display_param($param, $values) { * Prints tab that displays a list of all files * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $ns + * @param null|int $auth permission level + * @param string $jump item id */ function media_tab_files($ns,$auth=null,$jump='') { global $lang; @@ -757,6 +846,10 @@ function media_tab_files($ns,$auth=null,$jump='') { * Prints tab that displays uploading form * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $ns + * @param null|int $auth permission level + * @param string $jump item id */ function media_tab_upload($ns,$auth=null,$jump='') { global $lang; @@ -774,9 +867,11 @@ function media_tab_upload($ns,$auth=null,$jump='') { * Prints tab that displays search form * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $ns + * @param null|int $auth permission level */ function media_tab_search($ns,$auth=null) { - global $lang; global $INPUT; $do = $INPUT->str('mediado'); @@ -794,9 +889,14 @@ function media_tab_search($ns,$auth=null) { * Prints tab that displays mediafile details * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $image media id + * @param string $ns + * @param null|int $auth permission level + * @param string|int $rev revision timestamp or empty string */ -function media_tab_view($image, $ns, $auth=null, $rev=false) { - global $lang, $conf; +function media_tab_view($image, $ns, $auth=null, $rev='') { + global $lang; if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*"); if ($image && $auth >= AUTH_READ) { @@ -814,13 +914,16 @@ function media_tab_view($image, $ns, $auth=null, $rev=false) { * Prints tab that displays form for editing mediafile metadata * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $image media id + * @param string $ns + * @param null|int $auth permission level */ function media_tab_edit($image, $ns, $auth=null) { - global $lang; if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*"); if ($image) { - list($ext, $mime) = mimetype($image); + list(, $mime) = mimetype($image); if ($mime == 'image/jpeg') media_metaform($image,$auth); } } @@ -829,6 +932,10 @@ function media_tab_edit($image, $ns, $auth=null) { * Prints tab that displays mediafile revisions * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $image media id + * @param string $ns + * @param null|int $auth permission level */ function media_tab_history($image, $ns, $auth=null) { global $lang; @@ -852,9 +959,14 @@ function media_tab_history($image, $ns, $auth=null) { /** * Prints mediafile details * + * @param string $image media id + * @param int $auth permission level + * @param int|string $rev revision timestamp or empty string + * @param JpegMeta|bool $meta + * * @author Kate Arzamastseva <pshns@ukr.net> */ -function media_preview($image, $auth, $rev=false, $meta=false) { +function media_preview($image, $auth, $rev='', $meta=false) { $size = media_image_preview_size($image, $rev, $meta); @@ -886,13 +998,17 @@ function media_preview($image, $auth, $rev=false, $meta=false) { * Prints mediafile action buttons * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $image media id + * @param int $auth permission level + * @param string|int $rev revision timestamp, or empty string */ -function media_preview_buttons($image, $auth, $rev=false) { +function media_preview_buttons($image, $auth, $rev='') { global $lang, $conf; echo '<ul class="actions">'.NL; - if($auth >= AUTH_DELETE && !$rev && @file_exists(mediaFN($image))){ + if($auth >= AUTH_DELETE && !$rev && file_exists(mediaFN($image))){ // delete button $form = new Doku_Form(array('id' => 'mediamanager__btn_delete', @@ -915,7 +1031,7 @@ function media_preview_buttons($image, $auth, $rev=false) { echo '</li>'.NL; } - if($auth >= AUTH_UPLOAD && $rev && $conf['mediarevisions'] && @file_exists(mediaFN($image, $rev))){ + if($auth >= AUTH_UPLOAD && $rev && $conf['mediarevisions'] && file_exists(mediaFN($image, $rev))){ // restore button $form = new Doku_Form(array('id' => 'mediamanager__btn_restore', @@ -935,10 +1051,11 @@ function media_preview_buttons($image, $auth, $rev=false) { * Returns image width and height for mediamanager preview panel * * @author Kate Arzamastseva <pshns@ukr.net> - * @param string $image - * @param int $rev - * @param JpegMeta $meta - * @return array + * @param string $image + * @param int|string $rev + * @param JpegMeta|bool $meta + * @param int $size + * @return array|false */ function media_image_preview_size($image, $rev, $meta, $size = 500) { if (!preg_match("/\.(jpe?g|gif|png)$/", $image) || !file_exists(mediaFN($image, $rev))) return false; @@ -959,9 +1076,10 @@ function media_image_preview_size($image, $rev, $meta, $size = 500) { * Returns the requested EXIF/IPTC tag from the image meta * * @author Kate Arzamastseva <pshns@ukr.net> - * @param array $tags + * + * @param array $tags array with tags, first existing is returned * @param JpegMeta $meta - * @param string $alt + * @param string $alt alternative value * @return string */ function media_getTag($tags,$meta,$alt=''){ @@ -975,18 +1093,17 @@ function media_getTag($tags,$meta,$alt=''){ * Returns mediafile tags * * @author Kate Arzamastseva <pshns@ukr.net> + * * @param JpegMeta $meta - * @return array + * @return array list of tags of the mediafile */ function media_file_tags($meta) { - global $config_cascade; - // load the field descriptions static $fields = null; if(is_null($fields)){ $config_files = getConfigFiles('mediameta'); foreach ($config_files as $config_file) { - if(@file_exists($config_file)) include($config_file); + if(file_exists($config_file)) include($config_file); } } @@ -995,7 +1112,7 @@ function media_file_tags($meta) { foreach($fields as $key => $tag){ $t = array(); if (!empty($tag[0])) $t = array($tag[0]); - if(is_array($tag[3])) $t = array_merge($t,$tag[3]); + if(isset($tag[3]) && is_array($tag[3])) $t = array_merge($t,$tag[3]); $value = media_getTag($t, $meta); $tags[] = array('tag' => $tag, 'value' => $value); } @@ -1007,8 +1124,13 @@ function media_file_tags($meta) { * Prints mediafile tags * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $image image id + * @param int $auth permission level + * @param string|int $rev revision timestamp, or empty string + * @param bool|JpegMeta $meta image object, or create one if false */ -function media_details($image, $auth, $rev=false, $meta=false) { +function media_details($image, $auth, $rev='', $meta=false) { global $lang; if (!$meta) $meta = new JpegMeta(mediaFN($image, $rev)); @@ -1018,7 +1140,7 @@ function media_details($image, $auth, $rev=false, $meta=false) { foreach($tags as $tag){ if ($tag['value']) { $value = cleanText($tag['value']); - echo '<dt>'.$lang[$tag['tag'][1]].':</dt><dd>'; + echo '<dt>'.$lang[$tag['tag'][1]].'</dt><dd>'; if ($tag['tag'][2] == 'date') echo dformat($value); else echo hsc($value); echo '</dd>'.NL; @@ -1031,9 +1153,14 @@ function media_details($image, $auth, $rev=false, $meta=false) { * Shows difference between two revisions of file * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $image image id + * @param string $ns + * @param int $auth permission level + * @param bool $fromajax + * @return false|null|string */ function media_diff($image, $ns, $auth, $fromajax = false) { - global $lang; global $conf; global $INPUT; @@ -1071,7 +1198,8 @@ function media_diff($image, $ns, $auth, $fromajax = false) { $l_rev = $rev1; }else{ // no revision was given, compare previous to current $r_rev = ''; - $revs = getRevisions($image, 0, 1, 8192, true); + $medialog = new MediaChangeLog($image); + $revs = $medialog->getRevisions(0, 1); if (file_exists(mediaFN($image, $revs[0]))) { $l_rev = $revs[0]; } else { @@ -1080,6 +1208,7 @@ function media_diff($image, $ns, $auth, $fromajax = false) { } // prepare event data + $data = array(); $data[0] = $image; $data[1] = $l_rev; $data[2] = $r_rev; @@ -1089,12 +1218,17 @@ function media_diff($image, $ns, $auth, $fromajax = false) { // trigger event return trigger_event('MEDIA_DIFF', $data, '_media_file_diff', true); - } +/** + * Callback for media file diff + * + * @param array $data event data + * @return false|null + */ function _media_file_diff($data) { if(is_array($data) && count($data)===6) { - return media_file_diff($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]); + media_file_diff($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]); } else { return false; } @@ -1104,16 +1238,22 @@ function _media_file_diff($data) { * Shows difference between two revisions of image * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $image + * @param string|int $l_rev revision timestamp, or empty string + * @param string|int $r_rev revision timestamp, or empty string + * @param string $ns + * @param int $auth permission level + * @param bool $fromajax */ function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){ global $lang; - global $config_cascade; global $INPUT; $l_meta = new JpegMeta(mediaFN($image, $l_rev)); $r_meta = new JpegMeta(mediaFN($image, $r_rev)); - $is_img = preg_match("/\.(jpe?g|gif|png)$/", $image); + $is_img = preg_match('/\.(jpe?g|gif|png)$/', $image); if ($is_img) { $l_size = media_image_preview_size($image, $l_rev, $l_meta); $r_size = media_image_preview_size($image, $r_rev, $r_meta); @@ -1140,7 +1280,7 @@ function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){ if ($difftype == 'opacity' || $difftype == 'portions') { media_image_diff($image, $l_rev, $r_rev, $l_size, $r_size, $difftype); if (!$fromajax) echo '</div>'; - return ''; + return; } } @@ -1196,7 +1336,7 @@ function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){ foreach($tags as $tag){ $value = cleanText($tag['value']); if (!$value) $value = '-'; - echo '<dt>'.$lang[$tag['tag'][1]].':</dt>'; + echo '<dt>'.$lang[$tag['tag'][1]].'</dt>'; echo '<dd>'; if ($tag['highlighted']) { echo '<strong>'; @@ -1225,11 +1365,12 @@ function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){ * and slider * * @author Kate Arzamastseva <pshns@ukr.net> - * @param string $image - * @param int $l_rev - * @param int $r_rev - * @param array $l_size - * @param array $r_size + * + * @param string $image image id + * @param int $l_rev revision timestamp, or empty string + * @param int $r_rev revision timestamp, or empty string + * @param array $l_size array with width and height + * @param array $r_size array with width and height * @param string $type */ function media_image_diff($image, $l_rev, $r_rev, $l_size, $r_size, $type) { @@ -1262,10 +1403,11 @@ function media_image_diff($image, $l_rev, $r_rev, $l_size, $r_size, $type) { /** * Restores an old revision of a media file * - * @param string $image - * @param int $rev - * @param int $auth + * @param string $image media id + * @param int $rev revision timestamp or empty string + * @param int $auth * @return string - file's id + * * @author Kate Arzamastseva <pshns@ukr.net> */ function media_restore($image, $rev, $auth){ @@ -1274,7 +1416,7 @@ function media_restore($image, $rev, $auth){ $removed = (!file_exists(mediaFN($image)) && file_exists(mediaMetaFN($image, '.changes'))); if (!$image || (!file_exists(mediaFN($image)) && !$removed)) return false; if (!$rev || !file_exists(mediaFN($image, $rev))) return false; - list($iext,$imime,$dl) = mimetype($image); + list(,$imime,) = mimetype($image); $res = media_upload_finish(mediaFN($image, $rev), mediaFN($image), $image, @@ -1295,19 +1437,24 @@ function media_restore($image, $rev, $auth){ * @author Andreas Gohr <gohr@cosmocode.de> * @author Kate Arzamastseva <pshns@ukr.net> * @triggers MEDIA_SEARCH + * + * @param string $query + * @param string $ns + * @param null|int $auth + * @param bool $fullscreen + * @param string $sort */ function media_searchlist($query,$ns,$auth=null,$fullscreen=false,$sort='natural'){ global $conf; global $lang; $ns = cleanID($ns); - + $evdata = array( + 'ns' => $ns, + 'data' => array(), + 'query' => $query + ); if ($query) { - $evdata = array( - 'ns' => $ns, - 'data' => array(), - 'query' => $query - ); $evt = new Doku_Event('MEDIA_SEARCH', $evdata); if ($evt->advise_before()) { $dir = utf8_encodeFN(str_replace(':','/',$evdata['ns'])); @@ -1345,10 +1492,14 @@ function media_searchlist($query,$ns,$auth=null,$fullscreen=false,$sort='natural /** * Formats and prints one file in the list + * + * @param array $item + * @param int $auth permission level + * @param string $jump item id + * @param bool $display_namespace */ function media_printfile($item,$auth,$jump,$display_namespace=false){ global $lang; - global $conf; // Prepare zebra coloring // I always wanted to use this variable name :-D @@ -1364,7 +1515,7 @@ function media_printfile($item,$auth,$jump,$display_namespace=false){ } // Prepare fileicons - list($ext,$mime,$dl) = mimetype($item['file'],false); + list($ext) = mimetype($item['file'],false); $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext); $class = 'select mediafile mf_'.$class; @@ -1419,27 +1570,36 @@ function media_printfile($item,$auth,$jump,$display_namespace=false){ echo '</div>'.NL; } -function media_printicon($filename){ - list($ext,$mime,$dl) = mimetype(mediaFN($filename),false); +/** + * Display a media icon + * + * @param string $filename media id + * @param string $size the size subfolder, if not specified 16x16 is used + * @return string html + */ +function media_printicon($filename, $size=''){ + list($ext) = mimetype(mediaFN($filename),false); - if (@file_exists(DOKU_INC.'lib/images/fileicons/'.$ext.'.png')) { - $icon = DOKU_BASE.'lib/images/fileicons/'.$ext.'.png'; + if (file_exists(DOKU_INC.'lib/images/fileicons/'.$size.'/'.$ext.'.png')) { + $icon = DOKU_BASE.'lib/images/fileicons/'.$size.'/'.$ext.'.png'; } else { - $icon = DOKU_BASE.'lib/images/fileicons/file.png'; + $icon = DOKU_BASE.'lib/images/fileicons/'.$size.'/file.png'; } return '<img src="'.$icon.'" alt="'.$filename.'" class="icon" />'; - } /** * Formats and prints one file in the list in the thumbnails view * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param array $item + * @param int $auth permission level + * @param bool|string $jump item id + * @param bool $display_namespace */ function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false){ - global $lang; - global $conf; // Prepare filename $file = utf8_decodeFN($item['file']); @@ -1455,7 +1615,7 @@ function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false echo '<a id="d_:'.$item['id'].'" class="image" title="'.$item['id'].'" href="'. media_managerURL(array('image' => hsc($item['id']), 'ns' => getNS($item['id']), 'tab_details' => 'view')).'">'; - echo media_printicon($item['id']); + echo media_printicon($item['id'], '32x32'); echo '</a>'; } echo '</dt>'.NL; @@ -1485,6 +1645,9 @@ function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false /** * Prints a thumbnail and metainfo + * + * @param array $item + * @param bool $fullscreen */ function media_printimgdetail($item, $fullscreen=false){ // prepare thumbnail @@ -1548,16 +1711,17 @@ function media_printimgdetail($item, $fullscreen=false){ } /** - * Build link based on the current, adding/rewriting - * parameters + * Build link based on the current, adding/rewriting parameters * * @author Kate Arzamastseva <pshns@ukr.net> - * @param array $params - * @param string $amp - separator - * @return string - link + * + * @param array|bool $params + * @param string $amp separator + * @param bool $abs absolute url? + * @param bool $params_array return the parmeters array? + * @return string|array - link or link parameters */ function media_managerURL($params=false, $amp='&', $abs=false, $params_array=false) { - global $conf; global $ID; global $INPUT; @@ -1586,6 +1750,10 @@ function media_managerURL($params=false, $amp='&', $abs=false, $params_array * * @author Andreas Gohr <andi@splitbrain.org> * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $ns + * @param int $auth permission level + * @param bool $fullscreen */ function media_uploadform($ns, $auth, $fullscreen = false){ global $lang; @@ -1620,10 +1788,10 @@ function media_uploadform($ns, $auth, $fullscreen = false){ $form->addElement(formSecurityToken()); $form->addHidden('ns', hsc($ns)); $form->addElement(form_makeOpenTag('p')); - $form->addElement(form_makeFileField('upload', $lang['txt_upload'].':', 'upload__file')); + $form->addElement(form_makeFileField('upload', $lang['txt_upload'], 'upload__file')); $form->addElement(form_makeCloseTag('p')); $form->addElement(form_makeOpenTag('p')); - $form->addElement(form_makeTextField('mediaid', noNS($id), $lang['txt_filename'].':', 'upload__name')); + $form->addElement(form_makeTextField('mediaid', noNS($id), $lang['txt_filename'], 'upload__name')); $form->addElement(form_makeButton('submit', '', $lang['btn_upload'])); $form->addElement(form_makeCloseTag('p')); @@ -1673,6 +1841,10 @@ function media_getuploadsize(){ * * @author Tobias Sarnowski <sarnowski@cosmocode.de> * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $ns + * @param string $query + * @param bool $fullscreen */ function media_searchform($ns,$query='',$fullscreen=false){ global $lang; @@ -1700,6 +1872,8 @@ function media_searchform($ns,$query='',$fullscreen=false){ * Build a tree outline of available media namespaces * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $ns */ function media_nstree($ns){ global $conf; @@ -1748,12 +1922,15 @@ function media_nstree($ns){ * Prints a media namespace tree item * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $item + * @return string html */ function media_nstree_item($item){ global $INPUT; $pos = strrpos($item['id'], ':'); $label = substr($item['id'], $pos > 0 ? $pos + 1 : 0); - if(!$item['label']) $item['label'] = $label; + if(empty($item['label'])) $item['label'] = $label; $ret = ''; if (!($INPUT->str('do') == 'media')) @@ -1771,6 +1948,9 @@ function media_nstree_item($item){ * Prints a media namespace tree item opener * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $item + * @return string html */ function media_nstree_li($item){ $class='media level'.$item['level']; @@ -1792,6 +1972,12 @@ function media_nstree_li($item){ * Resizes the given image to the given size * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $file filename, path to file + * @param string $ext extension + * @param int $w desired width + * @param int $h desired height + * @return string path to resized or original size if failed */ function media_resize_image($file, $ext, $w, $h=0){ global $conf; @@ -1800,6 +1986,7 @@ function media_resize_image($file, $ext, $w, $h=0){ if($info == false) return $file; // that's no image - it's a spaceship! if(!$h) $h = round(($w * $info[1]) / $info[0]); + if(!$w) $w = round(($h * $info[0]) / $info[1]); // we wont scale up to infinity if($w > 2000 || $h > 2000) return $file; @@ -1811,10 +1998,11 @@ function media_resize_image($file, $ext, $w, $h=0){ $local = getCacheName($file,'.media.'.$w.'x'.$h.'.'.$ext); $mtime = @filemtime($local); // 0 if not exists - if( $mtime > filemtime($file) || - media_resize_imageIM($ext,$file,$info[0],$info[1],$local,$w,$h) || - media_resize_imageGD($ext,$file,$info[0],$info[1],$local,$w,$h) ){ - if($conf['fperm']) chmod($local, $conf['fperm']); + if($mtime > filemtime($file) || + media_resize_imageIM($ext, $file, $info[0], $info[1], $local, $w, $h) || + media_resize_imageGD($ext, $file, $info[0], $info[1], $local, $w, $h) + ) { + if(!empty($conf['fperm'])) @chmod($local, $conf['fperm']); return $local; } //still here? resizing failed @@ -1829,6 +2017,12 @@ function media_resize_image($file, $ext, $w, $h=0){ * image because most pics are more interesting in that area (rule of thirds) * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $file filename, path to file + * @param string $ext extension + * @param int $w desired width + * @param int $h desired height + * @return string path to resized or original size if failed */ function media_crop_image($file, $ext, $w, $h=0){ global $conf; @@ -1875,7 +2069,7 @@ function media_crop_image($file, $ext, $w, $h=0){ if( $mtime > @filemtime($file) || media_crop_imageIM($ext,$file,$info[0],$info[1],$local,$cw,$ch,$cx,$cy) || media_resize_imageGD($ext,$file,$cw,$ch,$local,$cw,$ch,$cx,$cy) ){ - if($conf['fperm']) chmod($local, $conf['fperm']); + if(!empty($conf['fperm'])) @chmod($local, $conf['fperm']); return media_resize_image($local,$ext, $w, $h); } @@ -1893,7 +2087,7 @@ function media_crop_image($file, $ext, $w, $h=0){ * @param string $id id of the image * @param int $w resize/crop width * @param int $h resize/crop height - * @return string + * @return string token or empty string if no token required */ function media_get_token($id,$w,$h){ // token is only required for modified images @@ -1916,6 +2110,11 @@ function media_get_token($id,$w,$h){ * * @author Andreas Gohr <andi@splitbrain.org> * @author Pavel Vitis <Pavel.Vitis@seznam.cz> + * + * @param string $url + * @param string $ext extension + * @param int $cache cachetime in seconds + * @return false|string path to cached file */ function media_get_from_URL($url,$ext,$cache){ global $conf; @@ -1928,12 +2127,12 @@ function media_get_from_URL($url,$ext,$cache){ $mtime = @filemtime($local); // 0 if not exists //decide if download needed: - if( ($mtime == 0) || // cache does not exist - ($cache != -1 && $mtime < time()-$cache) // 'recache' and cache has expired - ){ - if(media_image_download($url,$local)){ + if(($mtime == 0) || // cache does not exist + ($cache != -1 && $mtime < time() - $cache) // 'recache' and cache has expired + ) { + if(media_image_download($url, $local)) { return $local; - }else{ + } else { return false; } } @@ -1949,6 +2148,10 @@ function media_get_from_URL($url,$ext,$cache){ * Download image files * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $url + * @param string $file path to file in which to put the downloaded content + * @return bool */ function media_image_download($url,$file){ global $conf; @@ -1962,7 +2165,7 @@ function media_image_download($url,$file){ $data = $http->get($url); if(!$data) return false; - $fileexists = @file_exists($file); + $fileexists = file_exists($file); $fp = @fopen($file,"w"); if(!$fp) return false; fwrite($fp,$data); @@ -1984,6 +2187,15 @@ function media_image_download($url,$file){ * * @author Pavel Vitis <Pavel.Vitis@seznam.cz> * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $ext extension + * @param string $from filename path to file + * @param int $from_w original width + * @param int $from_h original height + * @param string $to path to resized file + * @param int $to_w desired width + * @param int $to_h desired height + * @return bool */ function media_resize_imageIM($ext,$from,$from_w,$from_h,$to,$to_w,$to_h){ global $conf; @@ -2008,6 +2220,17 @@ function media_resize_imageIM($ext,$from,$from_w,$from_h,$to,$to_w,$to_h){ * crop images using external ImageMagick convert program * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $ext extension + * @param string $from filename path to file + * @param int $from_w original width + * @param int $from_h original height + * @param string $to path to resized file + * @param int $to_w desired width + * @param int $to_h desired height + * @param int $ofs_x offset of crop centre + * @param int $ofs_y offset of crop centre + * @return bool */ function media_crop_imageIM($ext,$from,$from_w,$from_h,$to,$to_w,$to_h,$ofs_x,$ofs_y){ global $conf; @@ -2033,6 +2256,17 @@ function media_crop_imageIM($ext,$from,$from_w,$from_h,$to,$to_w,$to_h,$ofs_x,$o * * @author Andreas Gohr <andi@splitbrain.org> * @author Sebastian Wienecke <s_wienecke@web.de> + * + * @param string $ext extension + * @param string $from filename path to file + * @param int $from_w original width + * @param int $from_h original height + * @param string $to path to resized file + * @param int $to_w desired width + * @param int $to_h desired height + * @param int $ofs_x offset of crop centre + * @param int $ofs_y offset of crop centre + * @return bool */ function media_resize_imageGD($ext,$from,$from_w,$from_h,$to,$to_w,$to_h,$ofs_x=0,$ofs_y=0){ global $conf; @@ -2045,6 +2279,7 @@ function media_resize_imageGD($ext,$from,$from_w,$from_h,$to,$to_w,$to_h,$ofs_x= } // create an image of the given filetype + $image = false; if ($ext == 'jpg' || $ext == 'jpeg'){ if(!function_exists("imagecreatefromjpeg")) return false; $image = @imagecreatefromjpeg($from); @@ -2058,6 +2293,7 @@ function media_resize_imageGD($ext,$from,$from_w,$from_h,$to,$to_w,$to_h,$ofs_x= } if(!$image) return false; + $newimg = false; if(($conf['gdlib']>1) && function_exists("imagecreatetruecolor") && $ext != 'gif'){ $newimg = @imagecreatetruecolor ($to_w, $to_h); } @@ -2129,4 +2365,61 @@ function media_resize_imageGD($ext,$from,$from_w,$from_h,$to,$to_w,$to_h,$ofs_x= return $okay; } +/** + * Return other media files with the same base name + * but different extensions. + * + * @param string $src - ID of media file + * @param string[] $exts - alternative extensions to find other files for + * @return array - array(mime type => file ID) + * + * @author Anika Henke <anika@selfthinker.org> + */ +function media_alternativefiles($src, $exts){ + + $files = array(); + list($srcExt, /* $srcMime */) = mimetype($src); + $filebase = substr($src, 0, -1 * (strlen($srcExt)+1)); + + foreach($exts as $ext) { + $fileid = $filebase.'.'.$ext; + $file = mediaFN($fileid); + if(file_exists($file)) { + list(/* $fileExt */, $fileMime) = mimetype($file); + $files[$fileMime] = $fileid; + } + } + return $files; +} + +/** + * Check if video/audio is supported to be embedded. + * + * @param string $mime - mimetype of media file + * @param string $type - type of media files to check ('video', 'audio', or null for all) + * @return boolean + * + * @author Anika Henke <anika@selfthinker.org> + */ +function media_supportedav($mime, $type=NULL){ + $supportedAudio = array( + 'ogg' => 'audio/ogg', + 'mp3' => 'audio/mpeg', + 'wav' => 'audio/wav', + ); + $supportedVideo = array( + 'webm' => 'video/webm', + 'ogv' => 'video/ogg', + 'mp4' => 'video/mp4', + ); + if ($type == 'audio') { + $supportedAv = $supportedAudio; + } elseif ($type == 'video') { + $supportedAv = $supportedVideo; + } else { + $supportedAv = array_merge($supportedAudio, $supportedVideo); + } + return in_array($mime, $supportedAv); +} + /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ diff --git a/inc/pageutils.php b/inc/pageutils.php index c8d3cf4bb..375712661 100644 --- a/inc/pageutils.php +++ b/inc/pageutils.php @@ -17,8 +17,13 @@ * If the second parameter is true (default) the ID is cleaned. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $param the $_REQUEST variable name, default 'id' + * @param bool $clean if true, ID is cleaned + * @return string */ function getID($param='id',$clean=true){ + /** @var Input $INPUT */ global $INPUT; global $conf; global $ACT; @@ -27,7 +32,7 @@ function getID($param='id',$clean=true){ //construct page id from request URI if(empty($id) && $conf['userewrite'] == 2){ - $request = $_SERVER['REQUEST_URI']; + $request = $INPUT->server->str('REQUEST_URI'); $script = ''; //get the script URL @@ -36,15 +41,15 @@ function getID($param='id',$clean=true){ if($param != 'id') { $relpath = 'lib/exe/'; } - $script = $conf['basedir'].$relpath.utf8_basename($_SERVER['SCRIPT_FILENAME']); - - }elseif($_SERVER['PATH_INFO']){ - $request = $_SERVER['PATH_INFO']; - }elseif($_SERVER['SCRIPT_NAME']){ - $script = $_SERVER['SCRIPT_NAME']; - }elseif($_SERVER['DOCUMENT_ROOT'] && $_SERVER['SCRIPT_FILENAME']){ - $script = preg_replace ('/^'.preg_quote($_SERVER['DOCUMENT_ROOT'],'/').'/','', - $_SERVER['SCRIPT_FILENAME']); + $script = $conf['basedir'].$relpath.utf8_basename($INPUT->server->str('SCRIPT_FILENAME')); + + }elseif($INPUT->server->str('PATH_INFO')){ + $request = $INPUT->server->str('PATH_INFO'); + }elseif($INPUT->server->str('SCRIPT_NAME')){ + $script = $INPUT->server->str('SCRIPT_NAME'); + }elseif($INPUT->server->str('DOCUMENT_ROOT') && $INPUT->server->str('SCRIPT_FILENAME')){ + $script = preg_replace ('/^'.preg_quote($INPUT->server->str('DOCUMENT_ROOT'),'/').'/','', + $INPUT->server->str('SCRIPT_FILENAME')); $script = '/'.$script; } @@ -92,8 +97,10 @@ function getID($param='id',$clean=true){ * converted to unaccented ones * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $raw_id The pageid to clean * @param boolean $ascii Force ASCII + * @return string cleaned id */ function cleanID($raw_id,$ascii=false){ global $conf; @@ -144,6 +151,9 @@ function cleanID($raw_id,$ascii=false){ * Return namespacepart of a wiki ID * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id + * @return string|false the namespace part or false if the given ID has no namespace (root) */ function getNS($id){ $pos = strrpos((string)$id,':'); @@ -157,6 +167,9 @@ function getNS($id){ * Returns the ID without the namespace * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id + * @return string */ function noNS($id) { $pos = strrpos($id, ':'); @@ -171,6 +184,9 @@ function noNS($id) { * Returns the current namespace * * @author Nathan Fritz <fritzn@crown.edu> + * + * @param string $id + * @return string */ function curNS($id) { return noNS(getNS($id)); @@ -180,6 +196,9 @@ function curNS($id) { * Returns the ID without the namespace or current namespace for 'start' pages * * @author Nathan Fritz <fritzn@crown.edu> + * + * @param string $id + * @return string */ function noNSorNS($id) { global $conf; @@ -200,6 +219,7 @@ function noNSorNS($id) { * @param string $title The headline title * @param array|bool $check Existing IDs (title => number) * @return string the title + * * @author Andreas Gohr <andi@splitbrain.org> */ function sectionID($title,&$check) { @@ -230,9 +250,20 @@ function sectionID($title,&$check) { * parameters as for wikiFN * * @author Chris Smith <chris@jalakai.co.uk> + * + * @param string $id page id + * @param string|int $rev empty or revision timestamp + * @param bool $clean flag indicating that $id should be cleaned (see wikiFN as well) + * @return bool exists? */ -function page_exists($id,$rev='',$clean=true) { - return @file_exists(wikiFN($id,$rev,$clean)); +function page_exists($id,$rev='',$clean=true, $date_at=false) { + if($rev !== '' && $date_at) { + $pagelog = new PageChangeLog($id); + $pagelog_rev = $pagelog->getLastRevisionAt($rev); + if($pagelog_rev !== false) + $rev = $pagelog_rev; + } + return file_exists(wikiFN($id,$rev,$clean)); } /** @@ -241,9 +272,10 @@ function page_exists($id,$rev='',$clean=true) { * The filename is URL encoded to protect Unicode chars * * @param $raw_id string id of wikipage - * @param $rev string page revision, empty string for current + * @param $rev int|string page revision, empty string for current * @param $clean bool flag indicating that $raw_id should be cleaned. Only set to false * when $id is guaranteed to have been cleaned already. + * @return string full path * * @author Andreas Gohr <andi@splitbrain.org> */ @@ -267,9 +299,9 @@ function wikiFN($raw_id,$rev='',$clean=true){ $fn = $conf['olddir'].'/'.utf8_encodeFN($id).'.'.$rev.'.txt'; if($conf['compression']){ //test for extensions here, we want to read both compressions - if (@file_exists($fn . '.gz')){ + if (file_exists($fn . '.gz')){ $fn .= '.gz'; - }else if(@file_exists($fn . '.bz2')){ + }else if(file_exists($fn . '.bz2')){ $fn .= '.bz2'; }else{ //file doesnt exist yet, so we take the configured extension @@ -287,6 +319,9 @@ function wikiFN($raw_id,$rev='',$clean=true){ * Returns the full path to the file for locking the page while editing. * * @author Ben Coburn <btcoburn@silicodon.net> + * + * @param string $id page id + * @return string full path */ function wikiLockFN($id) { global $conf; @@ -298,6 +333,10 @@ function wikiLockFN($id) { * returns the full path to the meta file specified by ID and extension * * @author Steven Danz <steven-danz@kc.rr.com> + * + * @param string $id page id + * @param string $ext file extension + * @return string full path */ function metaFN($id,$ext){ global $conf; @@ -311,6 +350,10 @@ function metaFN($id,$ext){ * returns the full path to the media's meta file specified by ID and extension * * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $id media id + * @param string $ext extension of media + * @return string */ function mediaMetaFN($id,$ext){ global $conf; @@ -325,6 +368,9 @@ function mediaMetaFN($id,$ext){ * * @author Esther Brunner <esther@kaffeehaus.ch> * @author Michael Hamann <michael@content-space.de> + * + * @param string $id page id + * @return array */ function metaFiles($id){ $basename = metaFN($id, ''); @@ -340,6 +386,10 @@ function metaFiles($id){ * * @author Andreas Gohr <andi@splitbrain.org> * @author Kate Arzamastseva <pshns@ukr.net> + * + * @param string $id media id + * @param string|int $rev empty string or revision timestamp + * @return string full path */ function mediaFN($id, $rev=''){ global $conf; @@ -361,14 +411,16 @@ function mediaFN($id, $rev=''){ * * @param string $id The id of the local file * @param string $ext The file extension (usually txt) + * @return string full filepath to localized file + * * @author Andreas Gohr <andi@splitbrain.org> */ function localeFN($id,$ext='txt'){ global $conf; $file = DOKU_CONF.'lang/'.$conf['lang'].'/'.$id.'.'.$ext; - if(!@file_exists($file)){ + if(!file_exists($file)){ $file = DOKU_INC.'inc/lang/'.$conf['lang'].'/'.$id.'.'.$ext; - if(!@file_exists($file)){ + if(!file_exists($file)){ //fall back to english $file = DOKU_INC.'inc/lang/en/'.$id.'.'.$ext; } @@ -386,6 +438,11 @@ function localeFN($id,$ext='txt'){ * http://www.php.net/manual/en/function.realpath.php#57016 * * @author <bart at mediawave dot nl> + * + * @param string $ns namespace which is context of id + * @param string $id relative id + * @param bool $clean flag indicating that id should be cleaned + * @return string */ function resolve_id($ns,$id,$clean=true){ global $conf; @@ -431,19 +488,35 @@ function resolve_id($ns,$id,$clean=true){ * Returns a full media id * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $ns namespace which is context of id + * @param string &$page (reference) relative media id, updated to resolved id + * @param bool &$exists (reference) updated with existance of media */ -function resolve_mediaid($ns,&$page,&$exists){ +function resolve_mediaid($ns,&$page,&$exists,$rev='',$date_at=false){ $page = resolve_id($ns,$page); - $file = mediaFN($page); - $exists = @file_exists($file); + if($rev !== '' && $date_at){ + $medialog = new MediaChangeLog($page); + $medialog_rev = $medialog->getLastRevisionAt($rev); + if($medialog_rev !== false) { + $rev = $medialog_rev; + } + } + + $file = mediaFN($page,$rev); + $exists = file_exists($file); } /** * Returns a full page id * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $ns namespace which is context of id + * @param string &$page (reference) relative page id, updated to resolved id + * @param bool &$exists (reference) updated with existance of media */ -function resolve_pageid($ns,&$page,&$exists){ +function resolve_pageid($ns,&$page,&$exists,$rev='',$date_at=false ){ global $conf; global $ID; $exists = false; @@ -463,20 +536,26 @@ function resolve_pageid($ns,&$page,&$exists){ $page = resolve_id($ns,$page,false); // resolve but don't clean, yet // get filename (calls clean itself) - $file = wikiFN($page); + if($rev !== '' && $date_at) { + $pagelog = new PageChangeLog($page); + $pagelog_rev = $pagelog->getLastRevisionAt($rev); + if($pagelog_rev !== false)//something found + $rev = $pagelog_rev; + } + $file = wikiFN($page,$rev); // if ends with colon or slash we have a namespace link if(in_array(substr($page,-1), array(':', ';')) || ($conf['useslash'] && substr($page,-1) == '/')){ - if(page_exists($page.$conf['start'])){ + if(page_exists($page.$conf['start'],$rev,true,$date_at)){ // start page inside namespace $page = $page.$conf['start']; $exists = true; - }elseif(page_exists($page.noNS(cleanID($page)))){ + }elseif(page_exists($page.noNS(cleanID($page)),$rev,true,$date_at)){ // page named like the NS inside the NS $page = $page.noNS(cleanID($page)); $exists = true; - }elseif(page_exists($page)){ + }elseif(page_exists($page,$rev,true,$date_at)){ // page like namespace exists $page = $page; $exists = true; @@ -486,14 +565,14 @@ function resolve_pageid($ns,&$page,&$exists){ } }else{ //check alternative plural/nonplural form - if(!@file_exists($file)){ + if(!file_exists($file)){ if( $conf['autoplural'] ){ if(substr($page,-1) == 's'){ $try = substr($page,0,-1); }else{ $try = $page.'s'; } - if(page_exists($try)){ + if(page_exists($try,$rev,true,$date_at)){ $page = $try; $exists = true; } @@ -533,6 +612,9 @@ function getCacheName($data,$ext=''){ * Checks a pageid against $conf['hidepages'] * * @author Andreas Gohr <gohr@cosmocode.de> + * + * @param string $id page id + * @return bool */ function isHiddenPage($id){ $data = array( @@ -543,6 +625,11 @@ function isHiddenPage($id){ return $data['hidden']; } +/** + * callback checks if page is hidden + * + * @param array $data event data - see isHiddenPage() + */ function _isHiddenPage(&$data) { global $conf; global $ACT; @@ -560,6 +647,9 @@ function _isHiddenPage(&$data) { * Reverse of isHiddenPage * * @author Andreas Gohr <gohr@cosmocode.de> + * + * @param string $id page id + * @return bool */ function isVisiblePage($id){ return !isHiddenPage($id); @@ -572,8 +662,10 @@ function isVisiblePage($id){ * “*”. Output is escaped. * * @author Adrian Lang <lang@cosmocode.de> + * + * @param string $id page id + * @return string */ - function prettyprint_id($id) { if (!$id || $id === ':') { return '*'; @@ -596,6 +688,10 @@ function prettyprint_id($id) { * * @author Andreas Gohr <andi@splitbrain.org> * @see urlencode + * + * @param string $file file name + * @param bool $safe if true, only encoded when non ASCII characters detected + * @return string */ function utf8_encodeFN($file,$safe=true){ global $conf; @@ -621,6 +717,9 @@ function utf8_encodeFN($file,$safe=true){ * * @author Andreas Gohr <andi@splitbrain.org> * @see urldecode + * + * @param string $file file name + * @return string */ function utf8_decodeFN($file){ global $conf; @@ -640,6 +739,7 @@ function utf8_decodeFN($file){ * Used for sidebars, but can be used other stuff as well * * @todo add event hook + * * @param string $page the pagename you're looking for * @return string|false the full page id of the found page, false if any */ diff --git a/inc/parser/code.php b/inc/parser/code.php index 0b8e3ee02..2353e0dfa 100644 --- a/inc/parser/code.php +++ b/inc/parser/code.php @@ -5,28 +5,32 @@ * @author Andreas Gohr <andi@splitbrain.org> */ if(!defined('DOKU_INC')) die('meh.'); -require_once DOKU_INC . 'inc/parser/renderer.php'; class Doku_Renderer_code extends Doku_Renderer { - var $_codeblock=0; + var $_codeblock = 0; /** * Send the wanted code block to the browser * * When the correct block was found it exits the script. */ - function code($text, $language = null, $filename='' ) { + function code($text, $language = null, $filename = '') { global $INPUT; if(!$language) $language = 'txt'; if(!$filename) $filename = 'snippet.'.$language; $filename = utf8_basename($filename); $filename = utf8_stripspecials($filename, '_'); - if($this->_codeblock == $INPUT->str('codeblock')){ + // send CRLF to Windows clients + if(strpos($INPUT->server->str('HTTP_USER_AGENT'), 'Windows') !== false) { + $text = str_replace("\n", "\r\n", $text); + } + + if($this->_codeblock == $INPUT->str('codeblock')) { header("Content-Type: text/plain; charset=utf-8"); header("Content-Disposition: attachment; filename=$filename"); header("X-Robots-Tag: noindex"); - echo trim($text,"\r\n"); + echo trim($text, "\r\n"); exit; } @@ -36,7 +40,7 @@ class Doku_Renderer_code extends Doku_Renderer { /** * Wraps around code() */ - function file($text, $language = null, $filename='') { + function file($text, $language = null, $filename = '') { $this->code($text, $language, $filename); } @@ -54,7 +58,7 @@ class Doku_Renderer_code extends Doku_Renderer { * * @returns string 'code' */ - function getFormat(){ + function getFormat() { return 'code'; } } diff --git a/inc/parser/handler.php b/inc/parser/handler.php index 8ae991209..b8e2de82a 100644 --- a/inc/parser/handler.php +++ b/inc/parser/handler.php @@ -12,6 +12,7 @@ class Doku_Handler { var $status = array( 'section' => false, + 'doublequote' => 0, ); var $rewriteBlocks = true; @@ -20,6 +21,9 @@ class Doku_Handler { $this->CallWriter = new Doku_Handler_CallWriter($this); } + /** + * @param string $handler + */ function _addCall($handler, $args, $pos) { $call = array($handler,$args, $pos); $this->CallWriter->writeCall($call); @@ -70,6 +74,7 @@ class Doku_Handler { */ function plugin($match, $state, $pos, $pluginname){ $data = array($match); + /** @var DokuWiki_Syntax_Plugin $plugin */ $plugin = plugin_load('syntax',$pluginname); if($plugin != null){ $data = $plugin->handle($match, $state, $pos, $this); @@ -131,6 +136,9 @@ class Doku_Handler { return true; } + /** + * @param string $name + */ function _nestingTag($match, $state, $pos, $name) { switch ( $state ) { case DOKU_LEXER_ENTER: @@ -401,11 +409,17 @@ class Doku_Handler { function doublequoteopening($match, $state, $pos) { $this->_addCall('doublequoteopening',array(), $pos); + $this->status['doublequote']++; return true; } function doublequoteclosing($match, $state, $pos) { - $this->_addCall('doublequoteclosing',array(), $pos); + if ($this->status['doublequote'] <= 0) { + $this->doublequoteopening($match, $state, $pos); + } else { + $this->_addCall('doublequoteclosing',array(), $pos); + $this->status['doublequote'] = max(0, --$this->status['doublequote']); + } return true; } @@ -518,6 +532,7 @@ class Doku_Handler { $p['author'] = (preg_match('/\b(by|author)/',$params)); $p['date'] = (preg_match('/\b(date)/',$params)); $p['details'] = (preg_match('/\b(desc|detail)/',$params)); + $p['nosort'] = (preg_match('/\b(nosort)\b/',$params)); if (preg_match('/\b(\d+)([dhm])\b/',$params,$match)) { $period = array('d' => 86400, 'h' => 3600, 'm' => 60); @@ -704,6 +719,9 @@ class Doku_Handler_CallWriter { var $Handler; + /** + * @param Doku_Handler $Handler + */ function Doku_Handler_CallWriter(& $Handler) { $this->Handler = & $Handler; } @@ -740,7 +758,7 @@ class Doku_Handler_Nest { /** * constructor * - * @param object $CallWriter the renderers current call writer + * @param Doku_Handler_CallWriter $CallWriter the renderers current call writer * @param string $close closing instruction name, this is required to properly terminate the * syntax mode if the document ends without a closing pattern */ @@ -798,6 +816,8 @@ class Doku_Handler_List { var $listCalls = array(); var $listStack = array(); + const NODE = 1; + function Doku_Handler_List(& $CallWriter) { $this->CallWriter = & $CallWriter; } @@ -849,7 +869,8 @@ class Doku_Handler_List { $depth = $this->interpretSyntax($call[1][0], $listType); $this->initialDepth = $depth; - $this->listStack[] = array($listType, $depth); + // array(list type, current depth, index of current listitem_open) + $this->listStack[] = array($listType, $depth, 1); $this->listCalls[] = array('list'.$listType.'_open',array(),$call[2]); $this->listCalls[] = array('listitem_open',array(1),$call[2]); @@ -874,6 +895,7 @@ class Doku_Handler_List { function listOpen($call) { $depth = $this->interpretSyntax($call[1][0], $listType); $end = end($this->listStack); + $key = key($this->listStack); // Not allowed to be shallower than initialDepth if ( $depth < $this->initialDepth ) { @@ -890,6 +912,9 @@ class Doku_Handler_List { $this->listCalls[] = array('listitem_open',array($depth-1),$call[2]); $this->listCalls[] = array('listcontent_open',array(),$call[2]); + // new list item, update list stack's index into current listitem_open + $this->listStack[$key][2] = count($this->listCalls) - 2; + // Switched list type... } else { @@ -901,7 +926,7 @@ class Doku_Handler_List { $this->listCalls[] = array('listcontent_open',array(),$call[2]); array_pop($this->listStack); - $this->listStack[] = array($listType, $depth); + $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2); } //------------------------------------------------------------------------ @@ -913,7 +938,10 @@ class Doku_Handler_List { $this->listCalls[] = array('listitem_open', array($depth-1), $call[2]); $this->listCalls[] = array('listcontent_open',array(),$call[2]); - $this->listStack[] = array($listType, $depth); + // set the node/leaf state of this item's parent listitem_open to NODE + $this->listCalls[$this->listStack[$key][2]][1][1] = self::NODE; + + $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2); //------------------------------------------------------------------------ // Getting shallower ( $depth < $end[1] ) @@ -927,6 +955,7 @@ class Doku_Handler_List { while (1) { $end = end($this->listStack); + $key = key($this->listStack); if ( $end[1] <= $depth ) { @@ -939,6 +968,9 @@ class Doku_Handler_List { $this->listCalls[] = array('listitem_open',array($depth-1),$call[2]); $this->listCalls[] = array('listcontent_open',array(),$call[2]); + // new list item, update list stack's index into current listitem_open + $this->listStack[$key][2] = count($this->listCalls) - 2; + } else { // Switching list type... $this->listCalls[] = array('list'.$end[0].'_close', array(), $call[2]); @@ -947,7 +979,7 @@ class Doku_Handler_List { $this->listCalls[] = array('listcontent_open',array(),$call[2]); array_pop($this->listStack); - $this->listStack[] = array($listType, $depth); + $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2); } break; @@ -1149,6 +1181,9 @@ class Doku_Handler_Table { var $currentCols = 0; var $firstCell = false; var $lastCellType = 'tablecell'; + var $inTableHead = true; + var $currentRow = array('tableheader' => 0, 'tablecell' => 0); + var $countTableHeadRows = 0; function Doku_Handler_Table(& $CallWriter) { $this->CallWriter = & $CallWriter; @@ -1216,15 +1251,24 @@ class Doku_Handler_Table { $this->firstCell = true; $this->lastCellType = 'tablecell'; $this->maxRows++; + if ($this->inTableHead) { + $this->currentRow = array('tablecell' => 0, 'tableheader' => 0); + } } function tableRowClose($call) { + if ($this->inTableHead && ($this->inTableHead = $this->isTableHeadRow())) { + $this->countTableHeadRows++; + } // Strip off final cell opening and anything after it while ( $discard = array_pop($this->tableCalls ) ) { if ( $discard[0] == 'tablecell_open' || $discard[0] == 'tableheader_open') { break; } + if (!empty($this->currentRow[$discard[0]])) { + $this->currentRow[$discard[0]]--; + } } $this->tableCalls[] = array('tablerow_close', array(), $call[2]); @@ -1233,7 +1277,20 @@ class Doku_Handler_Table { } } + function isTableHeadRow() { + $td = $this->currentRow['tablecell']; + $th = $this->currentRow['tableheader']; + + if (!$th || $td > 2) return false; + if (2*$td > $th) return false; + + return true; + } + function tableCell($call) { + if ($this->inTableHead) { + $this->currentRow[$call[0]]++; + } if ( !$this->firstCell ) { // Increase the span @@ -1281,6 +1338,13 @@ class Doku_Handler_Table { $cellKey = array(); $toDelete = array(); + // if still in tableheader, then there can be no table header + // as all rows can't be within <THEAD> + if ($this->inTableHead) { + $this->inTableHead = false; + $this->countTableHeadRows = 0; + } + // Look for the colspan elements and increment the colspan on the // previous non-empty opening cell. Once done, delete all the cells // that contain colspans @@ -1288,6 +1352,14 @@ class Doku_Handler_Table { $call = $this->tableCalls[$key]; switch ($call[0]) { + case 'table_open' : + if($this->countTableHeadRows) { + array_splice($this->tableCalls, $key+1, 0, array( + array('tablethead_open', array(), $call[2])) + ); + } + break; + case 'tablerow_open': $lastRow++; @@ -1357,15 +1429,19 @@ class Doku_Handler_Table { } else { $spanning_cell = null; - for($i = $lastRow-1; $i > 0; $i--) { - if ( $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tablecell_open' || $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tableheader_open' ) { + // can't cross thead/tbody boundary + if (!$this->countTableHeadRows || ($lastRow-1 != $this->countTableHeadRows)) { + for($i = $lastRow-1; $i > 0; $i--) { - if ($this->tableCalls[$cellKey[$i][$lastCell]][1][2] >= $lastRow - $i) { - $spanning_cell = $i; - break; - } + if ( $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tablecell_open' || $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tableheader_open' ) { + if ($this->tableCalls[$cellKey[$i][$lastCell]][1][2] >= $lastRow - $i) { + $spanning_cell = $i; + break; + } + + } } } if (is_null($spanning_cell)) { @@ -1396,6 +1472,10 @@ class Doku_Handler_Table { $key += 3; } + if($this->countTableHeadRows == $lastRow) { + array_splice($this->tableCalls, $key+1, 0, array( + array('tablethead_close', array(), $call[2]))); + } break; } @@ -1438,7 +1518,7 @@ class Doku_Handler_Block { var $blockOpen = array( 'header', 'listu_open','listo_open','listitem_open','listcontent_open', - 'table_open','tablerow_open','tablecell_open','tableheader_open', + 'table_open','tablerow_open','tablecell_open','tableheader_open','tablethead_open', 'quote_open', 'code','file','hr','preformatted','rss', 'htmlblock','phpblock', @@ -1448,7 +1528,7 @@ class Doku_Handler_Block { var $blockClose = array( 'header', 'listu_close','listo_close','listitem_close','listcontent_close', - 'table_close','tablerow_close','tablecell_close','tableheader_close', + 'table_close','tablerow_close','tablecell_close','tableheader_close','tablethead_close', 'quote_close', 'code','file','hr','preformatted','rss', 'htmlblock','phpblock', diff --git a/inc/parser/lexer.php b/inc/parser/lexer.php index 2e84eca7c..b46a5f505 100644 --- a/inc/parser/lexer.php +++ b/inc/parser/lexer.php @@ -56,12 +56,12 @@ class Doku_LexerParallelRegex { /** * Adds a pattern with an optional label. * - * @param mixed $pattern Perl style regex. Must be UTF-8 + * @param mixed $pattern Perl style regex. Must be UTF-8 * encoded. If its a string, the (, ) * lose their meaning unless they * form part of a lookahead or * lookbehind assertation. - * @param string $label Label of regex to be returned + * @param bool|string $label Label of regex to be returned * on a match. Label must be ASCII * @access public */ @@ -151,7 +151,8 @@ class Doku_LexerParallelRegex { * "or" operator. Caches the regex. * Will automatically escape (, ) and / tokens. * - * @param array $patterns List of patterns in order. + * @internal array $_patterns List of patterns in order. + * @return null|string * @access private */ function _getCompoundedRegex() { @@ -297,6 +298,7 @@ class Doku_Lexer { */ function Doku_Lexer(&$parser, $start = "accept", $case = false) { $this->_case = $case; + /** @var Doku_LexerParallelRegex[] _regexes */ $this->_regexes = array(); $this->_parser = &$parser; $this->_mode = new Doku_LexerStateStack($start); @@ -425,11 +427,13 @@ class Doku_Lexer { * Sends the matched token and any leading unmatched * text to the parser changing the lexer to a new * mode if one is listed. - * @param string $unmatched Unmatched leading portion. - * @param string $matched Actual token match. - * @param string $mode Mode after match. A boolean + * @param string $unmatched Unmatched leading portion. + * @param string $matched Actual token match. + * @param bool|string $mode Mode after match. A boolean * false mode causes no change. - * @param int $pos Current byte index location in raw doc + * @param int $initialPos + * @param int $matchPos + * Current byte index location in raw doc * thats being parsed * @return boolean False if there was any error * from the parser. @@ -498,11 +502,12 @@ class Doku_Lexer { * Calls the parser method named after the current * mode. Empty content will be ignored. The lexer * has a parser handler for each mode in the lexer. - * @param string $content Text parsed. - * @param boolean $is_match Token is recognised rather + * @param string $content Text parsed. + * @param boolean $is_match Token is recognised rather * than unparsed data. - * @param int $pos Current byte index location in raw doc + * @param int $pos Current byte index location in raw doc * thats being parsed + * @return bool * @access private */ function _invokeParser($content, $is_match, $pos) { diff --git a/inc/parser/metadata.php b/inc/parser/metadata.php index 8ba159d62..ac8fd2130 100644 --- a/inc/parser/metadata.php +++ b/inc/parser/metadata.php @@ -6,131 +6,198 @@ */ if(!defined('DOKU_INC')) die('meh.'); -if ( !defined('DOKU_LF') ) { +if(!defined('DOKU_LF')) { // Some whitespace to help View > Source - define ('DOKU_LF',"\n"); + define ('DOKU_LF', "\n"); } -if ( !defined('DOKU_TAB') ) { +if(!defined('DOKU_TAB')) { // Some whitespace to help View > Source - define ('DOKU_TAB',"\t"); + define ('DOKU_TAB', "\t"); } -require_once DOKU_INC . 'inc/parser/renderer.php'; - /** - * The Renderer + * The MetaData Renderer + * + * Metadata is additional information about a DokuWiki page that gets extracted mainly from the page's content + * but also it's own filesystem data (like the creation time). All metadata is stored in the fields $meta and + * $persistent. + * + * Some simplified rendering to $doc is done to gather the page's (text-only) abstract. */ class Doku_Renderer_metadata extends Doku_Renderer { + /** the approximate byte lenght to capture for the abstract */ + const ABSTRACT_LEN = 250; + + /** the maximum UTF8 character length for the abstract */ + const ABSTRACT_MAX = 500; + + /** @var array transient meta data, will be reset on each rendering */ + public $meta = array(); - var $doc = ''; - var $meta = array(); - var $persistent = array(); + /** @var array persistent meta data, will be kept until explicitly deleted */ + public $persistent = array(); - var $headers = array(); - var $capture = true; - var $store = ''; - var $firstimage = ''; + /** @var array the list of headers used to create unique link ids */ + protected $headers = array(); - function getFormat(){ + /** @var string temporary $doc store */ + protected $store = ''; + + /** @var string keeps the first image reference */ + protected $firstimage = ''; + + /** @var bool determines if enough data for the abstract was collected, yet */ + public $capture = true; + + /** @var int number of bytes captured for abstract */ + protected $captured = 0; + + /** + * Returns the format produced by this renderer. + * + * @return string always 'metadata' + */ + function getFormat() { return 'metadata'; } - function document_start(){ + /** + * Initialize the document + * + * Sets up some of the persistent info about the page if it doesn't exist, yet. + */ + function document_start() { global $ID; $this->headers = array(); // external pages are missing create date - if(!$this->persistent['date']['created']){ + if(!$this->persistent['date']['created']) { $this->persistent['date']['created'] = filectime(wikiFN($ID)); } - if(!isset($this->persistent['user'])){ + if(!isset($this->persistent['user'])) { $this->persistent['user'] = ''; } - if(!isset($this->persistent['creator'])){ + if(!isset($this->persistent['creator'])) { $this->persistent['creator'] = ''; } // reset metadata to persistent values $this->meta = $this->persistent; } - function document_end(){ + /** + * Finalize the document + * + * Stores collected data in the metadata + */ + function document_end() { global $ID; // store internal info in metadata (notoc,nocache) $this->meta['internal'] = $this->info; - if (!isset($this->meta['description']['abstract'])){ + if(!isset($this->meta['description']['abstract'])) { // cut off too long abstracts $this->doc = trim($this->doc); - if (strlen($this->doc) > 500) - $this->doc = utf8_substr($this->doc, 0, 500).'…'; + if(strlen($this->doc) > self::ABSTRACT_MAX) { + $this->doc = utf8_substr($this->doc, 0, self::ABSTRACT_MAX).'…'; + } $this->meta['description']['abstract'] = $this->doc; } $this->meta['relation']['firstimage'] = $this->firstimage; - if(!isset($this->meta['date']['modified'])){ + if(!isset($this->meta['date']['modified'])) { $this->meta['date']['modified'] = filemtime(wikiFN($ID)); } } + /** + * Render plain text data + * + * This function takes care of the amount captured data and will stop capturing when + * enough abstract data is available + * + * @param $text + */ + function cdata($text) { + if(!$this->capture) return; + + $this->doc .= $text; + + $this->captured += strlen($text); + if($this->captured > self::ABSTRACT_LEN) $this->capture = false; + } + + /** + * Add an item to the TOC + * + * @param string $id the hash link + * @param string $text the text to display + * @param int $level the nesting level + */ function toc_additem($id, $text, $level) { global $conf; //only add items within configured levels - if($level >= $conf['toptoclevel'] && $level <= $conf['maxtoclevel']){ + if($level >= $conf['toptoclevel'] && $level <= $conf['maxtoclevel']) { // the TOC is one of our standard ul list arrays ;-) $this->meta['description']['tableofcontents'][] = array( - 'hid' => $id, - 'title' => $text, - 'type' => 'ul', - 'level' => $level-$conf['toptoclevel']+1 + 'hid' => $id, + 'title' => $text, + 'type' => 'ul', + 'level' => $level - $conf['toptoclevel'] + 1 ); } } + /** + * Render a heading + * + * @param string $text the text to display + * @param int $level header level + * @param int $pos byte position in the original source + */ function header($text, $level, $pos) { - if (!isset($this->meta['title'])) $this->meta['title'] = $text; + if(!isset($this->meta['title'])) $this->meta['title'] = $text; // add the header to the TOC - $hid = $this->_headerToLink($text,'true'); + $hid = $this->_headerToLink($text, true); $this->toc_additem($hid, $text, $level); // add to summary - if ($this->capture && ($level > 1)) $this->doc .= DOKU_LF.$text.DOKU_LF; + $this->cdata(DOKU_LF.$text.DOKU_LF); } - function section_open($level){} - function section_close(){} - - function cdata($text){ - if ($this->capture) $this->doc .= $text; - } - - function p_open(){ - if ($this->capture) $this->doc .= DOKU_LF; + /** + * Open a paragraph + */ + function p_open() { + $this->cdata(DOKU_LF); } - function p_close(){ - if ($this->capture){ - if (strlen($this->doc) > 250) $this->capture = false; - else $this->doc .= DOKU_LF; - } + /** + * Close a paragraph + */ + function p_close() { + $this->cdata(DOKU_LF); } - function linebreak(){ - if ($this->capture) $this->doc .= DOKU_LF; + /** + * Create a line break + */ + function linebreak() { + $this->cdata(DOKU_LF); } - function hr(){ - if ($this->capture){ - if (strlen($this->doc) > 250) $this->capture = false; - else $this->doc .= DOKU_LF.'----------'.DOKU_LF; - } + /** + * Create a horizontal line + */ + function hr() { + $this->cdata(DOKU_LF.'----------'.DOKU_LF); } /** @@ -143,7 +210,7 @@ class Doku_Renderer_metadata extends Doku_Renderer { * @author Andreas Gohr <andi@splitbrain.org> */ function footnote_open() { - if ($this->capture){ + if($this->capture) { // move current content to store and record footnote $this->store = $this->doc; $this->doc = ''; @@ -159,141 +226,215 @@ class Doku_Renderer_metadata extends Doku_Renderer { * @author Andreas Gohr */ function footnote_close() { - if ($this->capture){ + if($this->capture) { // restore old content - $this->doc = $this->store; + $this->doc = $this->store; $this->store = ''; } } - function listu_open(){ - if ($this->capture) $this->doc .= DOKU_LF; - } - - function listu_close(){ - if ($this->capture && (strlen($this->doc) > 250)) $this->capture = false; - } - - function listo_open(){ - if ($this->capture) $this->doc .= DOKU_LF; - } - - function listo_close(){ - if ($this->capture && (strlen($this->doc) > 250)) $this->capture = false; + /** + * Open an unordered list + */ + function listu_open() { + $this->cdata(DOKU_LF); } - function listitem_open($level){ - if ($this->capture) $this->doc .= str_repeat(DOKU_TAB, $level).'* '; + /** + * Open an ordered list + */ + function listo_open() { + $this->cdata(DOKU_LF); } - function listitem_close(){ - if ($this->capture) $this->doc .= DOKU_LF; + /** + * Open a list item + * + * @param int $level the nesting level + * @param bool $node true when a node; false when a leaf + */ + function listitem_open($level,$node=false) { + $this->cdata(str_repeat(DOKU_TAB, $level).'* '); } - function listcontent_open(){} - function listcontent_close(){} - - function unformatted($text){ - if ($this->capture) $this->doc .= $text; + /** + * Close a list item + */ + function listitem_close() { + $this->cdata(DOKU_LF); } - function preformatted($text){ - if ($this->capture) $this->doc .= $text; + /** + * Output preformatted text + * + * @param string $text + */ + function preformatted($text) { + $this->cdata($text); } - function file($text, $lang = null, $file = null){ - if ($this->capture){ - $this->doc .= DOKU_LF.$text; - if (strlen($this->doc) > 250) $this->capture = false; - else $this->doc .= DOKU_LF; - } + /** + * Start a block quote + */ + function quote_open() { + $this->cdata(DOKU_LF.DOKU_TAB.'"'); } - function quote_open(){ - if ($this->capture) $this->doc .= DOKU_LF.DOKU_TAB.'"'; + /** + * Stop a block quote + */ + function quote_close() { + $this->cdata('"'.DOKU_LF); } - function quote_close(){ - if ($this->capture){ - $this->doc .= '"'; - if (strlen($this->doc) > 250) $this->capture = false; - else $this->doc .= DOKU_LF; - } + /** + * Display text as file content, optionally syntax highlighted + * + * @param string $text text to show + * @param string $lang programming language to use for syntax highlighting + * @param string $file file path label + */ + function file($text, $lang = null, $file = null) { + $this->cdata(DOKU_LF.$text.DOKU_LF); } - function code($text, $language = null, $file = null){ - if ($this->capture){ - $this->doc .= DOKU_LF.$text; - if (strlen($this->doc) > 250) $this->capture = false; - else $this->doc .= DOKU_LF; - } + /** + * Display text as code content, optionally syntax highlighted + * + * @param string $text text to show + * @param string $language programming language to use for syntax highlighting + * @param string $file file path label + */ + function code($text, $language = null, $file = null) { + $this->cdata(DOKU_LF.$text.DOKU_LF); } - function acronym($acronym){ - if ($this->capture) $this->doc .= $acronym; + /** + * Format an acronym + * + * Uses $this->acronyms + * + * @param string $acronym + */ + function acronym($acronym) { + $this->cdata($acronym); } - function smiley($smiley){ - if ($this->capture) $this->doc .= $smiley; + /** + * Format a smiley + * + * Uses $this->smiley + * + * @param string $smiley + */ + function smiley($smiley) { + $this->cdata($smiley); } - function entity($entity){ - if ($this->capture) $this->doc .= $entity; + /** + * Format an entity + * + * Entities are basically small text replacements + * + * Uses $this->entities + * + * @param string $entity + */ + function entity($entity) { + $this->cdata($entity); } - function multiplyentity($x, $y){ - if ($this->capture) $this->doc .= $x.'×'.$y; + /** + * Typographically format a multiply sign + * + * Example: ($x=640, $y=480) should result in "640×480" + * + * @param string|int $x first value + * @param string|int $y second value + */ + function multiplyentity($x, $y) { + $this->cdata($x.'×'.$y); } - function singlequoteopening(){ + /** + * Render an opening single quote char (language specific) + */ + function singlequoteopening() { global $lang; - if ($this->capture) $this->doc .= $lang['singlequoteopening']; + $this->cdata($lang['singlequoteopening']); } - function singlequoteclosing(){ + /** + * Render a closing single quote char (language specific) + */ + function singlequoteclosing() { global $lang; - if ($this->capture) $this->doc .= $lang['singlequoteclosing']; + $this->cdata($lang['singlequoteclosing']); } + /** + * Render an apostrophe char (language specific) + */ function apostrophe() { global $lang; - if ($this->capture) $this->doc .= $lang['apostrophe']; + $this->cdata($lang['apostrophe']); } - function doublequoteopening(){ + /** + * Render an opening double quote char (language specific) + */ + function doublequoteopening() { global $lang; - if ($this->capture) $this->doc .= $lang['doublequoteopening']; + $this->cdata($lang['doublequoteopening']); } - function doublequoteclosing(){ + /** + * Render an closinging double quote char (language specific) + */ + function doublequoteclosing() { global $lang; - if ($this->capture) $this->doc .= $lang['doublequoteclosing']; + $this->cdata($lang['doublequoteclosing']); } + /** + * Render a CamelCase link + * + * @param string $link The link name + * @see http://en.wikipedia.org/wiki/CamelCase + */ function camelcaselink($link) { $this->internallink($link, $link); } - function locallink($hash, $name = null){ + /** + * Render a page local link + * + * @param string $hash hash link identifier + * @param string $name name for the link + */ + function locallink($hash, $name = null) { if(is_array($name)) { $this->_firstimage($name['src']); - if ($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); + if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); } } /** * keep track of internal links in $this->meta['relation']['references'] + * + * @param string $id page ID to link to. eg. 'wiki:syntax' + * @param string|array|null $name name for the link, array for media file */ - function internallink($id, $name = null){ + function internallink($id, $name = null) { global $ID; if(is_array($name)) { $this->_firstimage($name['src']); - if ($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); + if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); } $parts = explode('?', $id, 2); - if (count($parts) === 2) { + if(count($parts) === 2) { $id = $parts[0]; } @@ -301,7 +442,7 @@ class Doku_Renderer_metadata extends Doku_Renderer { // first resolve and clean up the $id resolve_pageid(getNS($ID), $id, $exists); - list($page, $hash) = explode('#', $id, 2); + @list($page) = explode('#', $id, 2); // set metadata $this->meta['relation']['references'][$page] = $exists; @@ -309,84 +450,141 @@ class Doku_Renderer_metadata extends Doku_Renderer { // p_set_metadata($id, $data); // add link title to summary - if ($this->capture){ + if($this->capture) { $name = $this->_getLinkTitle($name, $default, $id); $this->doc .= $name; } } - function externallink($url, $name = null){ + /** + * Render an external link + * + * @param string $url full URL with scheme + * @param string|array|null $name name for the link, array for media file + */ + function externallink($url, $name = null) { if(is_array($name)) { $this->_firstimage($name['src']); - if ($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); + if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); } - if ($this->capture){ - $this->doc .= $this->_getLinkTitle($name, '<' . $url . '>'); + if($this->capture) { + $this->doc .= $this->_getLinkTitle($name, '<'.$url.'>'); } } - function interwikilink($match, $name = null, $wikiName, $wikiUri){ + /** + * Render an interwiki link + * + * You may want to use $this->_resolveInterWiki() here + * + * @param string $match original link - probably not much use + * @param string|array $name name for the link, array for media file + * @param string $wikiName indentifier (shortcut) for the remote wiki + * @param string $wikiUri the fragment parsed from the original link + */ + function interwikilink($match, $name = null, $wikiName, $wikiUri) { if(is_array($name)) { $this->_firstimage($name['src']); - if ($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); + if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); } - if ($this->capture){ - list($wikiUri, $hash) = explode('#', $wikiUri, 2); + if($this->capture) { + list($wikiUri) = explode('#', $wikiUri, 2); $name = $this->_getLinkTitle($name, $wikiUri); $this->doc .= $name; } } - function windowssharelink($url, $name = null){ + /** + * Link to windows share + * + * @param string $url the link + * @param string|array $name name for the link, array for media file + */ + function windowssharelink($url, $name = null) { if(is_array($name)) { $this->_firstimage($name['src']); - if ($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); + if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); } - if ($this->capture){ - if ($name) $this->doc .= $name; + if($this->capture) { + if($name) $this->doc .= $name; else $this->doc .= '<'.$url.'>'; } } - function emaillink($address, $name = null){ + /** + * Render a linked E-Mail Address + * + * Should honor $conf['mailguard'] setting + * + * @param string $address Email-Address + * @param string|array $name name for the link, array for media file + */ + function emaillink($address, $name = null) { if(is_array($name)) { $this->_firstimage($name['src']); - if ($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); + if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']); } - if ($this->capture){ - if ($name) $this->doc .= $name; + if($this->capture) { + if($name) $this->doc .= $name; else $this->doc .= '<'.$address.'>'; } } - function internalmedia($src, $title=null, $align=null, $width=null, - $height=null, $cache=null, $linking=null){ - if ($this->capture && $title) $this->doc .= '['.$title.']'; + /** + * Render an internal media file + * + * @param string $src media ID + * @param string $title descriptive text + * @param string $align left|center|right + * @param int $width width of media in pixel + * @param int $height height of media in pixel + * @param string $cache cache|recache|nocache + * @param string $linking linkonly|detail|nolink + */ + function internalmedia($src, $title = null, $align = null, $width = null, + $height = null, $cache = null, $linking = null) { + if($this->capture && $title) $this->doc .= '['.$title.']'; $this->_firstimage($src); $this->_recordMediaUsage($src); } - function externalmedia($src, $title=null, $align=null, $width=null, - $height=null, $cache=null, $linking=null){ - if ($this->capture && $title) $this->doc .= '['.$title.']'; + /** + * Render an external media file + * + * @param string $src full media URL + * @param string $title descriptive text + * @param string $align left|center|right + * @param int $width width of media in pixel + * @param int $height height of media in pixel + * @param string $cache cache|recache|nocache + * @param string $linking linkonly|detail|nolink + */ + function externalmedia($src, $title = null, $align = null, $width = null, + $height = null, $cache = null, $linking = null) { + if($this->capture && $title) $this->doc .= '['.$title.']'; $this->_firstimage($src); } - function rss($url,$params) { + /** + * Render the output of an RSS feed + * + * @param string $url URL of the feed + * @param array $params Finetuning of the output + */ + function rss($url, $params) { $this->meta['relation']['haspart'][$url] = true; $this->meta['date']['valid']['age'] = - isset($this->meta['date']['valid']['age']) ? - min($this->meta['date']['valid']['age'],$params['refresh']) : - $params['refresh']; + isset($this->meta['date']['valid']['age']) ? + min($this->meta['date']['valid']['age'], $params['refresh']) : + $params['refresh']; } - //---------------------------------------------------------- - // Utils + #region Utils /** * Removes any Namespace from the given name but keeps @@ -394,35 +592,36 @@ class Doku_Renderer_metadata extends Doku_Renderer { * * @author Andreas Gohr <andi@splitbrain.org> */ - function _simpleTitle($name){ + function _simpleTitle($name) { global $conf; if(is_array($name)) return ''; - if($conf['useslash']){ + if($conf['useslash']) { $nssep = '[:;/]'; - }else{ + } else { $nssep = '[:;]'; } - $name = preg_replace('!.*'.$nssep.'!','',$name); + $name = preg_replace('!.*'.$nssep.'!', '', $name); //if there is a hash we use the anchor name only - $name = preg_replace('!.*#!','',$name); + $name = preg_replace('!.*#!', '', $name); return $name; } /** * Creates a linkid from a headline * + * @author Andreas Gohr <andi@splitbrain.org> * @param string $title The headline title * @param boolean $create Create a new unique ID? - * @author Andreas Gohr <andi@splitbrain.org> + * @return string */ - function _headerToLink($title, $create=false) { - if($create){ - return sectionID($title,$this->headers); - }else{ + function _headerToLink($title, $create = false) { + if($create) { + return sectionID($title, $this->headers); + } else { $check = false; - return sectionID($title,$check); + return sectionID($title, $check); } } @@ -430,17 +629,22 @@ class Doku_Renderer_metadata extends Doku_Renderer { * Construct a title and handle images in titles * * @author Harry Fuecks <hfuecks@gmail.com> + * @param string|array|null $title either string title or media array + * @param string $default default title if nothing else is found + * @param null|string $id linked page id (used to extract title from first heading) + * @return string title text */ - function _getLinkTitle($title, $default, $id=null) { - global $conf; - - $isImage = false; - if (is_array($title)){ - if($title['title']) return '['.$title['title'].']'; - } else if (is_null($title) || trim($title)==''){ - if (useHeading('content') && $id){ - $heading = p_get_first_heading($id,METADATA_DONT_RENDER); - if ($heading) return $heading; + function _getLinkTitle($title, $default, $id = null) { + if(is_array($title)) { + if($title['title']) { + return '['.$title['title'].']'; + } else { + return $default; + } + } else if(is_null($title) || trim($title) == '') { + if(useHeading('content') && $id) { + $heading = p_get_first_heading($id, METADATA_DONT_RENDER); + if($heading) return $heading; } return $default; } else { @@ -448,27 +652,39 @@ class Doku_Renderer_metadata extends Doku_Renderer { } } - function _firstimage($src){ + /** + * Remember first image + * + * @param string $src image URL or ID + */ + function _firstimage($src) { if($this->firstimage) return; global $ID; - list($src,$hash) = explode('#',$src,2); - if(!media_isexternal($src)){ - resolve_mediaid(getNS($ID),$src, $exists); + list($src) = explode('#', $src, 2); + if(!media_isexternal($src)) { + resolve_mediaid(getNS($ID), $src, $exists); } - if(preg_match('/.(jpe?g|gif|png)$/i',$src)){ + if(preg_match('/.(jpe?g|gif|png)$/i', $src)) { $this->firstimage = $src; } } + /** + * Store list of used media files in metadata + * + * @param string $src media ID + */ function _recordMediaUsage($src) { global $ID; - list ($src, $hash) = explode('#', $src, 2); - if (media_isexternal($src)) return; + list ($src) = explode('#', $src, 2); + if(media_isexternal($src)) return; resolve_mediaid(getNS($ID), $src, $exists); $this->meta['relation']['media'][$src] = $exists; } + + #endregion } //Setup VIM: ex: et ts=4 : diff --git a/inc/parser/parser.php b/inc/parser/parser.php index 1f14b98a3..5f86cf5c4 100644 --- a/inc/parser/parser.php +++ b/inc/parser/parser.php @@ -61,6 +61,9 @@ class Doku_Parser { var $connected = false; + /** + * @param Doku_Parser_Mode_base $BaseMode + */ function addBaseMode(& $BaseMode) { $this->modes['base'] =& $BaseMode; if ( !$this->Lexer ) { @@ -125,43 +128,99 @@ class Doku_Parser { } //------------------------------------------------------------------- + /** - * This class and all the subclasses below are - * used to reduce the effort required to register - * modes with the Lexer. For performance these - * could all be eliminated later perhaps, or - * the Parser could be serialized to a file once - * all modes are registered + * Class Doku_Parser_Mode_Interface * - * @author Harry Fuecks <hfuecks@gmail.com> + * Defines a mode (syntax component) in the Parser */ -class Doku_Parser_Mode { +interface Doku_Parser_Mode_Interface { + /** + * returns a number used to determine in which order modes are added + */ + public function getSort(); + + /** + * Called before any calls to connectTo + * @return void + */ + function preConnect(); + + /** + * Connects the mode + * + * @param string $mode + * @return void + */ + function connectTo($mode); + + /** + * Called after all calls to connectTo + * @return void + */ + function postConnect(); /** + * Check if given mode is accepted inside this mode + * + * @param string $mode + * @return bool + */ + function accepts($mode); +} + +/** + * This class and all the subclasses below are used to reduce the effort required to register + * modes with the Lexer. + * + * @author Harry Fuecks <hfuecks@gmail.com> + */ +class Doku_Parser_Mode implements Doku_Parser_Mode_Interface { + /** * @var Doku_Lexer $Lexer */ var $Lexer; - var $allowedModes = array(); - // returns a number used to determine in which order modes are added function getSort() { trigger_error('getSort() not implemented in '.get_class($this), E_USER_WARNING); } - // Called before any calls to connectTo function preConnect() {} - - // Connects the mode function connectTo($mode) {} - - // Called after all calls to connectTo function postConnect() {} - function accepts($mode) { return in_array($mode, (array) $this->allowedModes ); } +} +/** + * Basically the same as Doku_Parser_Mode but extends from DokuWiki_Plugin + * + * Adds additional functions to syntax plugins + */ +class Doku_Parser_Mode_Plugin extends DokuWiki_Plugin implements Doku_Parser_Mode_Interface { + /** + * @var Doku_Lexer $Lexer + */ + var $Lexer; + var $allowedModes = array(); + + /** + * Sort for applying this mode + * + * @return int + */ + function getSort() { + trigger_error('getSort() not implemented in '.get_class($this), E_USER_WARNING); + } + + function preConnect() {} + function connectTo($mode) {} + function postConnect() {} + function accepts($mode) { + return in_array($mode, (array) $this->allowedModes ); + } } //------------------------------------------------------------------- @@ -354,6 +413,9 @@ class Doku_Parser_Mode_formatting extends Doku_Parser_Mode { ), ); + /** + * @param string $type + */ function Doku_Parser_Mode_formatting($type) { global $PARSER_MODES; diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php index c697e990c..e1d28267a 100644 --- a/inc/parser/renderer.php +++ b/inc/parser/renderer.php @@ -6,278 +6,775 @@ * @author Andreas Gohr <andi@splitbrain.org> */ if(!defined('DOKU_INC')) die('meh.'); -require_once DOKU_INC . 'inc/plugin.php'; -require_once DOKU_INC . 'inc/pluginutils.php'; /** * An empty renderer, produces no output * * Inherits from DokuWiki_Plugin for giving additional functions to render plugins + * + * The renderer transforms the syntax instructions created by the parser and handler into the + * desired output format. For each instruction a corresponding method defined in this class will + * be called. That method needs to produce the desired output for the instruction and add it to the + * $doc field. When all instructions are processed, the $doc field contents will be cached by + * DokuWiki and sent to the user. */ class Doku_Renderer extends DokuWiki_Plugin { - var $info = array( + /** @var array Settings, control the behavior of the renderer */ + public $info = array( 'cache' => true, // may the rendered result cached? 'toc' => true, // render the TOC? ); - var $doc = ''; + /** @var array contains the smiley configuration, set in p_render() */ + public $smileys = array(); + /** @var array contains the entity configuration, set in p_render() */ + public $entities = array(); + /** @var array contains the acronym configuration, set in p_render() */ + public $acronyms = array(); + /** @var array contains the interwiki configuration, set in p_render() */ + public $interwiki = array(); - // keep some config options - var $acronyms = array(); - var $smileys = array(); - var $badwords = array(); - var $entities = array(); - var $interwiki = array(); + /** + * @var string the rendered document, this will be cached after the renderer ran through + */ + public $doc = ''; - // allows renderer to be used again, clean out any per-use values + /** + * clean out any per-use values + * + * This is called before each use of the renderer object and should be used to + * completely reset the state of the renderer to be reused for a new document + */ function reset() { } - function nocache() { - $this->info['cache'] = false; - } - - function notoc() { - $this->info['toc'] = false; + /** + * Allow the plugin to prevent DokuWiki from reusing an instance + * + * Since most renderer plugins fail to implement Doku_Renderer::reset() we default + * to reinstantiating the renderer here + * + * @return bool false if the plugin has to be instantiated + */ + function isSingleton() { + return false; } /** * Returns the format produced by this renderer. * - * Has to be overidden by decendend classes + * Has to be overidden by sub classes + * + * @return string */ - function getFormat(){ + function getFormat() { trigger_error('getFormat() not implemented in '.get_class($this), E_USER_WARNING); + return ''; } /** - * Allow the plugin to prevent DokuWiki from reusing an instance - * - * @return bool false if the plugin has to be instantiated + * Disable caching of this renderer's output */ - function isSingleton() { - return false; + function nocache() { + $this->info['cache'] = false; } + /** + * Disable TOC generation for this renderer's output + * + * This might not be used for certain sub renderer + */ + function notoc() { + $this->info['toc'] = false; + } - //handle plugin rendering - function plugin($name,$data){ - $plugin = plugin_load('syntax',$name); - if($plugin != null){ - $plugin->render($this->getFormat(),$this,$data); + /** + * Handle plugin rendering + * + * Most likely this needs NOT to be overwritten by sub classes + * + * @param string $name Plugin name + * @param mixed $data custom data set by handler + * @param string $state matched state if any + * @param string $match raw matched syntax + */ + function plugin($name, $data, $state = '', $match = '') { + /** @var DokuWiki_Syntax_Plugin $plugin */ + $plugin = plugin_load('syntax', $name); + if($plugin != null) { + $plugin->render($this->getFormat(), $this, $data); } } /** * handle nested render instructions * this method (and nest_close method) should not be overloaded in actual renderer output classes + * + * @param array $instructions */ function nest($instructions) { - - foreach ( $instructions as $instruction ) { + foreach($instructions as $instruction) { // execute the callback against ourself - if (method_exists($this,$instruction[0])) { + if(method_exists($this, $instruction[0])) { call_user_func_array(array($this, $instruction[0]), $instruction[1] ? $instruction[1] : array()); } } } - // dummy closing instruction issued by Doku_Handler_Nest, normally the syntax mode should - // override this instruction when instantiating Doku_Handler_Nest - however plugins will not - // be able to - as their instructions require data. - function nest_close() {} + /** + * dummy closing instruction issued by Doku_Handler_Nest + * + * normally the syntax mode should override this instruction when instantiating Doku_Handler_Nest - + * however plugins will not be able to - as their instructions require data. + */ + function nest_close() { + } - function document_start() {} + #region Syntax modes - sub classes will need to implement them to fill $doc - function document_end() {} + /** + * Initialize the document + */ + function document_start() { + } - function render_TOC() { return ''; } + /** + * Finalize the document + */ + function document_end() { + } - function toc_additem($id, $text, $level) {} + /** + * Render the Table of Contents + * + * @return string + */ + function render_TOC() { + return ''; + } - function header($text, $level, $pos) {} + /** + * Add an item to the TOC + * + * @param string $id the hash link + * @param string $text the text to display + * @param int $level the nesting level + */ + function toc_additem($id, $text, $level) { + } - function section_open($level) {} + /** + * Render a heading + * + * @param string $text the text to display + * @param int $level header level + * @param int $pos byte position in the original source + */ + function header($text, $level, $pos) { + } - function section_close() {} + /** + * Open a new section + * + * @param int $level section level (as determined by the previous header) + */ + function section_open($level) { + } + + /** + * Close the current section + */ + function section_close() { + } - function cdata($text) {} + /** + * Render plain text data + * + * @param string $text + */ + function cdata($text) { + } - function p_open() {} + /** + * Open a paragraph + */ + function p_open() { + } - function p_close() {} + /** + * Close a paragraph + */ + function p_close() { + } - function linebreak() {} + /** + * Create a line break + */ + function linebreak() { + } - function hr() {} + /** + * Create a horizontal line + */ + function hr() { + } - function strong_open() {} + /** + * Start strong (bold) formatting + */ + function strong_open() { + } - function strong_close() {} + /** + * Stop strong (bold) formatting + */ + function strong_close() { + } - function emphasis_open() {} + /** + * Start emphasis (italics) formatting + */ + function emphasis_open() { + } - function emphasis_close() {} + /** + * Stop emphasis (italics) formatting + */ + function emphasis_close() { + } - function underline_open() {} + /** + * Start underline formatting + */ + function underline_open() { + } - function underline_close() {} + /** + * Stop underline formatting + */ + function underline_close() { + } - function monospace_open() {} + /** + * Start monospace formatting + */ + function monospace_open() { + } - function monospace_close() {} + /** + * Stop monospace formatting + */ + function monospace_close() { + } - function subscript_open() {} + /** + * Start a subscript + */ + function subscript_open() { + } - function subscript_close() {} + /** + * Stop a subscript + */ + function subscript_close() { + } - function superscript_open() {} + /** + * Start a superscript + */ + function superscript_open() { + } - function superscript_close() {} + /** + * Stop a superscript + */ + function superscript_close() { + } - function deleted_open() {} + /** + * Start deleted (strike-through) formatting + */ + function deleted_open() { + } - function deleted_close() {} + /** + * Stop deleted (strike-through) formatting + */ + function deleted_close() { + } - function footnote_open() {} + /** + * Start a footnote + */ + function footnote_open() { + } - function footnote_close() {} + /** + * Stop a footnote + */ + function footnote_close() { + } - function listu_open() {} + /** + * Open an unordered list + */ + function listu_open() { + } - function listu_close() {} + /** + * Close an unordered list + */ + function listu_close() { + } - function listo_open() {} + /** + * Open an ordered list + */ + function listo_open() { + } - function listo_close() {} + /** + * Close an ordered list + */ + function listo_close() { + } - function listitem_open($level) {} + /** + * Open a list item + * + * @param int $level the nesting level + * @param bool $node true when a node; false when a leaf + */ + function listitem_open($level,$node=false) { + } - function listitem_close() {} + /** + * Close a list item + */ + function listitem_close() { + } - function listcontent_open() {} + /** + * Start the content of a list item + */ + function listcontent_open() { + } - function listcontent_close() {} + /** + * Stop the content of a list item + */ + function listcontent_close() { + } - function unformatted($text) {} + /** + * Output unformatted $text + * + * Defaults to $this->cdata() + * + * @param string $text + */ + function unformatted($text) { + $this->cdata($text); + } - function php($text) {} + /** + * Output inline PHP code + * + * If $conf['phpok'] is true this should evaluate the given code and append the result + * to $doc + * + * @param string $text The PHP code + */ + function php($text) { + } - function phpblock($text) {} + /** + * Output block level PHP code + * + * If $conf['phpok'] is true this should evaluate the given code and append the result + * to $doc + * + * @param string $text The PHP code + */ + function phpblock($text) { + } - function html($text) {} + /** + * Output raw inline HTML + * + * If $conf['htmlok'] is true this should add the code as is to $doc + * + * @param string $text The HTML + */ + function html($text) { + } - function htmlblock($text) {} + /** + * Output raw block-level HTML + * + * If $conf['htmlok'] is true this should add the code as is to $doc + * + * @param string $text The HTML + */ + function htmlblock($text) { + } - function preformatted($text) {} + /** + * Output preformatted text + * + * @param string $text + */ + function preformatted($text) { + } - function quote_open() {} + /** + * Start a block quote + */ + function quote_open() { + } - function quote_close() {} + /** + * Stop a block quote + */ + function quote_close() { + } - function file($text, $lang = null, $file = null ) {} + /** + * Display text as file content, optionally syntax highlighted + * + * @param string $text text to show + * @param string $lang programming language to use for syntax highlighting + * @param string $file file path label + */ + function file($text, $lang = null, $file = null) { + } - function code($text, $lang = null, $file = null ) {} + /** + * Display text as code content, optionally syntax highlighted + * + * @param string $text text to show + * @param string $lang programming language to use for syntax highlighting + * @param string $file file path label + */ + function code($text, $lang = null, $file = null) { + } - function acronym($acronym) {} + /** + * Format an acronym + * + * Uses $this->acronyms + * + * @param string $acronym + */ + function acronym($acronym) { + } - function smiley($smiley) {} + /** + * Format a smiley + * + * Uses $this->smiley + * + * @param string $smiley + */ + function smiley($smiley) { + } - function wordblock($word) {} + /** + * Format an entity + * + * Entities are basically small text replacements + * + * Uses $this->entities + * + * @param string $entity + */ + function entity($entity) { + } - function entity($entity) {} + /** + * Typographically format a multiply sign + * + * Example: ($x=640, $y=480) should result in "640×480" + * + * @param string|int $x first value + * @param string|int $y second value + */ + function multiplyentity($x, $y) { + } - // 640x480 ($x=640, $y=480) - function multiplyentity($x, $y) {} + /** + * Render an opening single quote char (language specific) + */ + function singlequoteopening() { + } - function singlequoteopening() {} + /** + * Render a closing single quote char (language specific) + */ + function singlequoteclosing() { + } - function singlequoteclosing() {} + /** + * Render an apostrophe char (language specific) + */ + function apostrophe() { + } - function apostrophe() {} + /** + * Render an opening double quote char (language specific) + */ + function doublequoteopening() { + } - function doublequoteopening() {} + /** + * Render an closinging double quote char (language specific) + */ + function doublequoteclosing() { + } - function doublequoteclosing() {} + /** + * Render a CamelCase link + * + * @param string $link The link name + * @see http://en.wikipedia.org/wiki/CamelCase + */ + function camelcaselink($link) { + } - // $link like 'SomePage' - function camelcaselink($link) {} + /** + * Render a page local link + * + * @param string $hash hash link identifier + * @param string $name name for the link + */ + function locallink($hash, $name = null) { + } - function locallink($hash, $name = null) {} + /** + * Render a wiki internal link + * + * @param string $link page ID to link to. eg. 'wiki:syntax' + * @param string|array $title name for the link, array for media file + */ + function internallink($link, $title = null) { + } - // $link like 'wiki:syntax', $title could be an array (media) - function internallink($link, $title = null) {} + /** + * Render an external link + * + * @param string $link full URL with scheme + * @param string|array $title name for the link, array for media file + */ + function externallink($link, $title = null) { + } - // $link is full URL with scheme, $title could be an array (media) - function externallink($link, $title = null) {} + /** + * Render the output of an RSS feed + * + * @param string $url URL of the feed + * @param array $params Finetuning of the output + */ + function rss($url, $params) { + } - function rss ($url,$params) {} + /** + * Render an interwiki link + * + * You may want to use $this->_resolveInterWiki() here + * + * @param string $link original link - probably not much use + * @param string|array $title name for the link, array for media file + * @param string $wikiName indentifier (shortcut) for the remote wiki + * @param string $wikiUri the fragment parsed from the original link + */ + function interwikilink($link, $title = null, $wikiName, $wikiUri) { + } - // $link is the original link - probably not much use - // $wikiName is an indentifier for the wiki - // $wikiUri is the URL fragment to append to some known URL - function interwikilink($link, $title = null, $wikiName, $wikiUri) {} + /** + * Link to file on users OS + * + * @param string $link the link + * @param string|array $title name for the link, array for media file + */ + function filelink($link, $title = null) { + } - // Link to file on users OS, $title could be an array (media) - function filelink($link, $title = null) {} + /** + * Link to windows share + * + * @param string $link the link + * @param string|array $title name for the link, array for media file + */ + function windowssharelink($link, $title = null) { + } - // Link to a Windows share, , $title could be an array (media) - function windowssharelink($link, $title = null) {} + /** + * Render a linked E-Mail Address + * + * Should honor $conf['mailguard'] setting + * + * @param string $address Email-Address + * @param string|array $name name for the link, array for media file + */ + function emaillink($address, $name = null) { + } -// function email($address, $title = null) {} - function emaillink($address, $name = null) {} + /** + * Render an internal media file + * + * @param string $src media ID + * @param string $title descriptive text + * @param string $align left|center|right + * @param int $width width of media in pixel + * @param int $height height of media in pixel + * @param string $cache cache|recache|nocache + * @param string $linking linkonly|detail|nolink + */ + function internalmedia($src, $title = null, $align = null, $width = null, + $height = null, $cache = null, $linking = null) { + } - function internalmedia ($src, $title=null, $align=null, $width=null, - $height=null, $cache=null, $linking=null) {} + /** + * Render an external media file + * + * @param string $src full media URL + * @param string $title descriptive text + * @param string $align left|center|right + * @param int $width width of media in pixel + * @param int $height height of media in pixel + * @param string $cache cache|recache|nocache + * @param string $linking linkonly|detail|nolink + */ + function externalmedia($src, $title = null, $align = null, $width = null, + $height = null, $cache = null, $linking = null) { + } - function externalmedia ($src, $title=null, $align=null, $width=null, - $height=null, $cache=null, $linking=null) {} + /** + * Render a link to an internal media file + * + * @param string $src media ID + * @param string $title descriptive text + * @param string $align left|center|right + * @param int $width width of media in pixel + * @param int $height height of media in pixel + * @param string $cache cache|recache|nocache + */ + function internalmedialink($src, $title = null, $align = null, + $width = null, $height = null, $cache = null) { + } - function internalmedialink ( - $src,$title=null,$align=null,$width=null,$height=null,$cache=null - ) {} + /** + * Render a link to an external media file + * + * @param string $src media ID + * @param string $title descriptive text + * @param string $align left|center|right + * @param int $width width of media in pixel + * @param int $height height of media in pixel + * @param string $cache cache|recache|nocache + */ + function externalmedialink($src, $title = null, $align = null, + $width = null, $height = null, $cache = null) { + } - function externalmedialink( - $src,$title=null,$align=null,$width=null,$height=null,$cache=null - ) {} + /** + * Start a table + * + * @param int $maxcols maximum number of columns + * @param int $numrows NOT IMPLEMENTED + * @param int $pos byte position in the original source + */ + function table_open($maxcols = null, $numrows = null, $pos = null) { + } - function table_open($maxcols = null, $numrows = null, $pos = null){} + /** + * Close a table + * + * @param int $pos byte position in the original source + */ + function table_close($pos = null) { + } - function table_close($pos = null){} + /** + * Open a table header + */ + function tablethead_open() { + } - function tablerow_open(){} + /** + * Close a table header + */ + function tablethead_close() { + } - function tablerow_close(){} + /** + * Open a table row + */ + function tablerow_open() { + } - function tableheader_open($colspan = 1, $align = null, $rowspan = 1){} + /** + * Close a table row + */ + function tablerow_close() { + } - function tableheader_close(){} + /** + * Open a table header cell + * + * @param int $colspan + * @param string $align left|center|right + * @param int $rowspan + */ + function tableheader_open($colspan = 1, $align = null, $rowspan = 1) { + } - function tablecell_open($colspan = 1, $align = null, $rowspan = 1){} + /** + * Close a table header cell + */ + function tableheader_close() { + } - function tablecell_close(){} + /** + * Open a table cell + * + * @param int $colspan + * @param string $align left|center|right + * @param int $rowspan + */ + function tablecell_open($colspan = 1, $align = null, $rowspan = 1) { + } + /** + * Close a table cell + */ + function tablecell_close() { + } - // util functions follow, you probably won't need to reimplement them + #endregion + #region util functions, you probably won't need to reimplement them /** * Removes any Namespace from the given name but keeps * casing and special chars * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $name + * @return string */ - function _simpleTitle($name){ + function _simpleTitle($name) { global $conf; //if there is a hash we use the ancor name only - list($name,$hash) = explode('#',$name,2); + @list($name, $hash) = explode('#', $name, 2); if($hash) return $hash; - if($conf['useslash']){ - $name = strtr($name,';/',';:'); - }else{ - $name = strtr($name,';',':'); + if($conf['useslash']) { + $name = strtr($name, ';/', ';:'); + } else { + $name = strtr($name, ';', ':'); } return noNSorNS($name); @@ -285,40 +782,53 @@ class Doku_Renderer extends DokuWiki_Plugin { /** * Resolve an interwikilink + * + * @param string $shortcut identifier for the interwiki link + * @param string $reference fragment that refers the content + * @param null|bool $exists reference which returns if an internal page exists + * @return string interwikilink */ - function _resolveInterWiki(&$shortcut,$reference){ + function _resolveInterWiki(&$shortcut, $reference, &$exists = null) { //get interwiki URL - if ( isset($this->interwiki[$shortcut]) ) { + if(isset($this->interwiki[$shortcut])) { $url = $this->interwiki[$shortcut]; } else { // Default to Google I'm feeling lucky - $url = 'http://www.google.com/search?q={URL}&btnI=lucky'; + $url = 'http://www.google.com/search?q={URL}&btnI=lucky'; $shortcut = 'go'; } //split into hash and url part - list($reference,$hash) = explode('#',$reference,2); + @list($reference, $hash) = explode('#', $reference, 2); //replace placeholder - if(preg_match('#\{(URL|NAME|SCHEME|HOST|PORT|PATH|QUERY)\}#',$url)){ + if(preg_match('#\{(URL|NAME|SCHEME|HOST|PORT|PATH|QUERY)\}#', $url)) { //use placeholders - $url = str_replace('{URL}',rawurlencode($reference),$url); - $url = str_replace('{NAME}',$reference,$url); + $url = str_replace('{URL}', rawurlencode($reference), $url); + $url = str_replace('{NAME}', $reference, $url); $parsed = parse_url($reference); if(!$parsed['port']) $parsed['port'] = 80; - $url = str_replace('{SCHEME}',$parsed['scheme'],$url); - $url = str_replace('{HOST}',$parsed['host'],$url); - $url = str_replace('{PORT}',$parsed['port'],$url); - $url = str_replace('{PATH}',$parsed['path'],$url); - $url = str_replace('{QUERY}',$parsed['query'],$url); - }else{ + $url = str_replace('{SCHEME}', $parsed['scheme'], $url); + $url = str_replace('{HOST}', $parsed['host'], $url); + $url = str_replace('{PORT}', $parsed['port'], $url); + $url = str_replace('{PATH}', $parsed['path'], $url); + $url = str_replace('{QUERY}', $parsed['query'], $url); + } else { //default $url = $url.rawurlencode($reference); } + //handle as wiki links + if($url{0} === ':') { + list($id, $urlparam) = explode('?', $url, 2); + $url = wl(cleanID($id), $urlparam); + $exists = page_exists($id); + } if($hash) $url .= '#'.rawurlencode($hash); return $url; } + + #endregion } diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php index fd02c0ce0..c68d206be 100644 --- a/inc/parser/xhtml.php +++ b/inc/parser/xhtml.php @@ -7,89 +7,114 @@ */ if(!defined('DOKU_INC')) die('meh.'); -if ( !defined('DOKU_LF') ) { +if(!defined('DOKU_LF')) { // Some whitespace to help View > Source - define ('DOKU_LF',"\n"); + define ('DOKU_LF', "\n"); } -if ( !defined('DOKU_TAB') ) { +if(!defined('DOKU_TAB')) { // Some whitespace to help View > Source - define ('DOKU_TAB',"\t"); + define ('DOKU_TAB', "\t"); } -require_once DOKU_INC . 'inc/parser/renderer.php'; -require_once DOKU_INC . 'inc/html.php'; - /** - * The Renderer + * The XHTML Renderer + * + * This is DokuWiki's main renderer used to display page content in the wiki */ class Doku_Renderer_xhtml extends Doku_Renderer { + /** @var array store the table of contents */ + public $toc = array(); + + /** @var array A stack of section edit data */ + protected $sectionedits = array(); + var $date_at = ''; // link pages and media against this revision - // @access public - var $doc = ''; // will contain the whole document - var $toc = array(); // will contain the Table of Contents + /** @var int last section edit id, used by startSectionEdit */ + protected $lastsecid = 0; - var $sectionedits = array(); // A stack of section edit data - private $lastsecid = 0; // last section edit id, used by startSectionEdit + /** @var array the list of headers used to create unique link ids */ + protected $headers = array(); - var $headers = array(); /** @var array a list of footnotes, list starts at 1! */ - var $footnotes = array(); - var $lastlevel = 0; - var $node = array(0,0,0,0,0); - var $store = ''; + protected $footnotes = array(); + + /** @var int current section level */ + protected $lastlevel = 0; + /** @var array section node tracker */ + protected $node = array(0, 0, 0, 0, 0); + + /** @var string temporary $doc store */ + protected $store = ''; - var $_counter = array(); // used as global counter, introduced for table classes - var $_codeblock = 0; // counts the code and file blocks, used to provide download links + /** @var array global counter, for table classes etc. */ + protected $_counter = array(); // + + /** @var int counts the code and file blocks, used to provide download links */ + protected $_codeblock = 0; + + /** @var array list of allowed URL schemes */ + protected $schemes = null; /** * Register a new edit section range * - * @param $type string The section type identifier - * @param $title string The section title - * @param $start int The byte position for the edit start - * @return string A marker class for the starting HTML element + * @param string $type The section type identifier + * @param string $title The section title + * @param int $start The byte position for the edit start + * @return string A marker class for the starting HTML element + * * @author Adrian Lang <lang@cosmocode.de> */ public function startSectionEdit($start, $type, $title = null) { $this->sectionedits[] = array(++$this->lastsecid, $start, $type, $title); - return 'sectionedit' . $this->lastsecid; + return 'sectionedit'.$this->lastsecid; } /** * Finish an edit section range * - * @param $end int The byte position for the edit end; null for the rest of - * the page + * @param int $end The byte position for the edit end; null for the rest of the page + * * @author Adrian Lang <lang@cosmocode.de> */ public function finishSectionEdit($end = null) { list($id, $start, $type, $title) = array_pop($this->sectionedits); - if (!is_null($end) && $end <= $start) { + if(!is_null($end) && $end <= $start) { return; } - $this->doc .= "<!-- EDIT$id " . strtoupper($type) . ' '; - if (!is_null($title)) { - $this->doc .= '"' . str_replace('"', '', $title) . '" '; + $this->doc .= "<!-- EDIT$id ".strtoupper($type).' '; + if(!is_null($title)) { + $this->doc .= '"'.str_replace('"', '', $title).'" '; } - $this->doc .= "[$start-" . (is_null($end) ? '' : $end) . '] -->'; + $this->doc .= "[$start-".(is_null($end) ? '' : $end).'] -->'; } - function getFormat(){ + /** + * Returns the format produced by this renderer. + * + * @return string always 'xhtml' + */ + function getFormat() { return 'xhtml'; } - + /** + * Initialize the document + */ function document_start() { //reset some internals $this->toc = array(); $this->headers = array(); } + /** + * Finalize the document + */ function document_end() { // Finish open section edits. - while (count($this->sectionedits) > 0) { - if ($this->sectionedits[count($this->sectionedits) - 1][1] <= 1) { + while(count($this->sectionedits) > 0) { + if($this->sectionedits[count($this->sectionedits) - 1][1] <= 1) { // If there is only one section, do not write a section edit // marker. array_pop($this->sectionedits); @@ -98,12 +123,12 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } } - if ( count ($this->footnotes) > 0 ) { + if(count($this->footnotes) > 0) { $this->doc .= '<div class="footnotes">'.DOKU_LF; - foreach ( $this->footnotes as $id => $footnote ) { + foreach($this->footnotes as $id => $footnote) { // check its not a placeholder that indicates actual footnote text is elsewhere - if (substr($footnote, 0, 5) != "@@FNT") { + if(substr($footnote, 0, 5) != "@@FNT") { // open the footnote and set the anchor and backlink $this->doc .= '<div class="fn">'; @@ -113,8 +138,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer { // get any other footnotes that use the same markup $alt = array_keys($this->footnotes, "@@FNT$id"); - if (count($alt)) { - foreach ($alt as $ref) { + if(count($alt)) { + foreach($alt as $ref) { // set anchor and backlink for the other footnotes $this->doc .= ', <sup><a href="#fnt__'.($ref).'" id="fn__'.($ref).'" class="fn_bot">'; $this->doc .= ($ref).')</a></sup> '.DOKU_LF; @@ -123,7 +148,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { // add footnote markup and close this footnote $this->doc .= $footnote; - $this->doc .= '</div>' . DOKU_LF; + $this->doc .= '</div>'.DOKU_LF; } } $this->doc .= '</div>'.DOKU_LF; @@ -131,139 +156,221 @@ class Doku_Renderer_xhtml extends Doku_Renderer { // Prepare the TOC global $conf; - if($this->info['toc'] && is_array($this->toc) && $conf['tocminheads'] && count($this->toc) >= $conf['tocminheads']){ + if($this->info['toc'] && is_array($this->toc) && $conf['tocminheads'] && count($this->toc) >= $conf['tocminheads']) { global $TOC; $TOC = $this->toc; } // make sure there are no empty paragraphs - $this->doc = preg_replace('#<p>\s*</p>#','',$this->doc); + $this->doc = preg_replace('#<p>\s*</p>#', '', $this->doc); } + /** + * Add an item to the TOC + * + * @param string $id the hash link + * @param string $text the text to display + * @param int $level the nesting level + */ function toc_additem($id, $text, $level) { global $conf; //handle TOC - if($level >= $conf['toptoclevel'] && $level <= $conf['maxtoclevel']){ - $this->toc[] = html_mktocitem($id, $text, $level-$conf['toptoclevel']+1); + if($level >= $conf['toptoclevel'] && $level <= $conf['maxtoclevel']) { + $this->toc[] = html_mktocitem($id, $text, $level - $conf['toptoclevel'] + 1); } } + /** + * Render a heading + * + * @param string $text the text to display + * @param int $level header level + * @param int $pos byte position in the original source + */ function header($text, $level, $pos) { global $conf; if(!$text) return; //skip empty headlines - $hid = $this->_headerToLink($text,true); + $hid = $this->_headerToLink($text, true); //only add items within configured levels $this->toc_additem($hid, $text, $level); // adjust $node to reflect hierarchy of levels - $this->node[$level-1]++; - if ($level < $this->lastlevel) { - for ($i = 0; $i < $this->lastlevel-$level; $i++) { - $this->node[$this->lastlevel-$i-1] = 0; + $this->node[$level - 1]++; + if($level < $this->lastlevel) { + for($i = 0; $i < $this->lastlevel - $level; $i++) { + $this->node[$this->lastlevel - $i - 1] = 0; } } $this->lastlevel = $level; - if ($level <= $conf['maxseclevel'] && + if($level <= $conf['maxseclevel'] && count($this->sectionedits) > 0 && - $this->sectionedits[count($this->sectionedits) - 1][2] === 'section') { + $this->sectionedits[count($this->sectionedits) - 1][2] === 'section' + ) { $this->finishSectionEdit($pos - 1); } // write the header $this->doc .= DOKU_LF.'<h'.$level; - if ($level <= $conf['maxseclevel']) { - $this->doc .= ' class="' . $this->startSectionEdit($pos, 'section', $text) . '"'; + if($level <= $conf['maxseclevel']) { + $this->doc .= ' class="'.$this->startSectionEdit($pos, 'section', $text).'"'; } $this->doc .= ' id="'.$hid.'">'; $this->doc .= $this->_xmlEntities($text); $this->doc .= "</h$level>".DOKU_LF; } + /** + * Open a new section + * + * @param int $level section level (as determined by the previous header) + */ function section_open($level) { - $this->doc .= '<div class="level' . $level . '">' . DOKU_LF; + $this->doc .= '<div class="level'.$level.'">'.DOKU_LF; } + /** + * Close the current section + */ function section_close() { $this->doc .= DOKU_LF.'</div>'.DOKU_LF; } + /** + * Render plain text data + * + * @param $text + */ function cdata($text) { $this->doc .= $this->_xmlEntities($text); } + /** + * Open a paragraph + */ function p_open() { $this->doc .= DOKU_LF.'<p>'.DOKU_LF; } + /** + * Close a paragraph + */ function p_close() { $this->doc .= DOKU_LF.'</p>'.DOKU_LF; } + /** + * Create a line break + */ function linebreak() { $this->doc .= '<br/>'.DOKU_LF; } + /** + * Create a horizontal line + */ function hr() { $this->doc .= '<hr />'.DOKU_LF; } + /** + * Start strong (bold) formatting + */ function strong_open() { $this->doc .= '<strong>'; } + /** + * Stop strong (bold) formatting + */ function strong_close() { $this->doc .= '</strong>'; } + /** + * Start emphasis (italics) formatting + */ function emphasis_open() { $this->doc .= '<em>'; } + /** + * Stop emphasis (italics) formatting + */ function emphasis_close() { $this->doc .= '</em>'; } + /** + * Start underline formatting + */ function underline_open() { $this->doc .= '<em class="u">'; } + /** + * Stop underline formatting + */ function underline_close() { $this->doc .= '</em>'; } + /** + * Start monospace formatting + */ function monospace_open() { $this->doc .= '<code>'; } + /** + * Stop monospace formatting + */ function monospace_close() { $this->doc .= '</code>'; } + /** + * Start a subscript + */ function subscript_open() { $this->doc .= '<sub>'; } + /** + * Stop a subscript + */ function subscript_close() { $this->doc .= '</sub>'; } + /** + * Start a superscript + */ function superscript_open() { $this->doc .= '<sup>'; } + /** + * Stop a superscript + */ function superscript_close() { $this->doc .= '</sup>'; } + /** + * Start deleted (strike-through) formatting + */ function deleted_open() { $this->doc .= '<del>'; } + /** + * Stop deleted (strike-through) formatting + */ function deleted_close() { $this->doc .= '</del>'; } @@ -299,14 +406,14 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $fnid++; // recover footnote into the stack and restore old content - $footnote = $this->doc; - $this->doc = $this->store; + $footnote = $this->doc; + $this->doc = $this->store; $this->store = ''; // check to see if this footnote has been seen before $i = array_search($footnote, $this->footnotes); - if ($i === false) { + if($i === false) { // its a new footnote, add it to the $footnotes array $this->footnotes[$fnid] = $footnote; } else { @@ -318,38 +425,73 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $this->doc .= '<sup><a href="#fn__'.$fnid.'" id="fnt__'.$fnid.'" class="fn_top">'.$fnid.')</a></sup>'; } + /** + * Open an unordered list + */ function listu_open() { $this->doc .= '<ul>'.DOKU_LF; } + /** + * Close an unordered list + */ function listu_close() { $this->doc .= '</ul>'.DOKU_LF; } + /** + * Open an ordered list + */ function listo_open() { $this->doc .= '<ol>'.DOKU_LF; } + /** + * Close an ordered list + */ function listo_close() { $this->doc .= '</ol>'.DOKU_LF; } - function listitem_open($level) { - $this->doc .= '<li class="level'.$level.'">'; + /** + * Open a list item + * + * @param int $level the nesting level + * @param bool $node true when a node; false when a leaf + */ + function listitem_open($level, $node=false) { + $branching = $node ? ' node' : ''; + $this->doc .= '<li class="level'.$level.$branching.'">'; } + /** + * Close a list item + */ function listitem_close() { $this->doc .= '</li>'.DOKU_LF; } + /** + * Start the content of a list item + */ function listcontent_open() { $this->doc .= '<div class="li">'; } + /** + * Stop the content of a list item + */ function listcontent_close() { $this->doc .= '</div>'.DOKU_LF; } + /** + * Output unformatted $text + * + * Defaults to $this->cdata() + * + * @param string $text + */ function unformatted($text) { $this->doc .= $this->_xmlEntities($text); } @@ -357,15 +499,15 @@ class Doku_Renderer_xhtml extends Doku_Renderer { /** * Execute PHP code if allowed * - * @param string $text PHP code that is either executed or printed - * @param string $wrapper html element to wrap result if $conf['phpok'] is okff + * @param string $text PHP code that is either executed or printed + * @param string $wrapper html element to wrap result if $conf['phpok'] is okff * * @author Andreas Gohr <andi@splitbrain.org> */ - function php($text, $wrapper='code') { + function php($text, $wrapper = 'code') { global $conf; - if($conf['phpok']){ + if($conf['phpok']) { ob_start(); eval($text); $this->doc .= ob_get_contents(); @@ -375,6 +517,14 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } } + /** + * Output block level PHP code + * + * If $conf['phpok'] is true this should evaluate the given code and append the result + * to $doc + * + * @param string $text The PHP code + */ function phpblock($text) { $this->php($text, 'pre'); } @@ -382,75 +532,110 @@ class Doku_Renderer_xhtml extends Doku_Renderer { /** * Insert HTML if allowed * - * @param string $text html text - * @param string $wrapper html element to wrap result if $conf['htmlok'] is okff + * @param string $text html text + * @param string $wrapper html element to wrap result if $conf['htmlok'] is okff * * @author Andreas Gohr <andi@splitbrain.org> */ - function html($text, $wrapper='code') { + function html($text, $wrapper = 'code') { global $conf; - if($conf['htmlok']){ + if($conf['htmlok']) { $this->doc .= $text; } else { $this->doc .= p_xhtml_cached_geshi($text, 'html4strict', $wrapper); } } + /** + * Output raw block-level HTML + * + * If $conf['htmlok'] is true this should add the code as is to $doc + * + * @param string $text The HTML + */ function htmlblock($text) { $this->html($text, 'pre'); } + /** + * Start a block quote + */ function quote_open() { $this->doc .= '<blockquote><div class="no">'.DOKU_LF; } + /** + * Stop a block quote + */ function quote_close() { $this->doc .= '</div></blockquote>'.DOKU_LF; } + /** + * Output preformatted text + * + * @param string $text + */ function preformatted($text) { - $this->doc .= '<pre class="code">' . trim($this->_xmlEntities($text),"\n\r") . '</pre>'. DOKU_LF; + $this->doc .= '<pre class="code">'.trim($this->_xmlEntities($text), "\n\r").'</pre>'.DOKU_LF; } - function file($text, $language=null, $filename=null) { - $this->_highlight('file',$text,$language,$filename); + /** + * Display text as file content, optionally syntax highlighted + * + * @param string $text text to show + * @param string $language programming language to use for syntax highlighting + * @param string $filename file path label + */ + function file($text, $language = null, $filename = null) { + $this->_highlight('file', $text, $language, $filename); } - function code($text, $language=null, $filename=null) { - $this->_highlight('code',$text,$language,$filename); + /** + * Display text as code content, optionally syntax highlighted + * + * @param string $text text to show + * @param string $language programming language to use for syntax highlighting + * @param string $filename file path label + */ + function code($text, $language = null, $filename = null) { + $this->_highlight('code', $text, $language, $filename); } /** * Use GeSHi to highlight language syntax in code and file blocks * * @author Andreas Gohr <andi@splitbrain.org> + * @param string $type code|file + * @param string $text text to show + * @param string $language programming language to use for syntax highlighting + * @param string $filename file path label */ - function _highlight($type, $text, $language=null, $filename=null) { - global $conf; + function _highlight($type, $text, $language = null, $filename = null) { global $ID; global $lang; - if($filename){ + if($filename) { // add icon - list($ext) = mimetype($filename,false); - $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext); + list($ext) = mimetype($filename, false); + $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext); $class = 'mediafile mf_'.$class; $this->doc .= '<dl class="'.$type.'">'.DOKU_LF; - $this->doc .= '<dt><a href="'.exportlink($ID,'code',array('codeblock'=>$this->_codeblock)).'" title="'.$lang['download'].'" class="'.$class.'">'; + $this->doc .= '<dt><a href="'.exportlink($ID, 'code', array('codeblock' => $this->_codeblock)).'" title="'.$lang['download'].'" class="'.$class.'">'; $this->doc .= hsc($filename); $this->doc .= '</a></dt>'.DOKU_LF.'<dd>'; } - if ($text{0} == "\n") { + if($text{0} == "\n") { $text = substr($text, 1); } - if (substr($text, -1) == "\n") { + if(substr($text, -1) == "\n") { $text = substr($text, 0, -1); } - if ( is_null($language) ) { + if(is_null($language)) { $this->doc .= '<pre class="'.$type.'">'.$this->_xmlEntities($text).'</pre>'.DOKU_LF; } else { $class = 'code'; //we always need the code class to make the syntax highlighting apply @@ -459,16 +644,23 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $this->doc .= "<pre class=\"$class $language\">".p_xhtml_cached_geshi($text, $language, '').'</pre>'.DOKU_LF; } - if($filename){ + if($filename) { $this->doc .= '</dd></dl>'.DOKU_LF; } $this->_codeblock++; } + /** + * Format an acronym + * + * Uses $this->acronyms + * + * @param string $acronym + */ function acronym($acronym) { - if ( array_key_exists($acronym, $this->acronyms) ) { + if(array_key_exists($acronym, $this->acronyms)) { $title = $this->_xmlEntities($this->acronyms[$acronym]); @@ -480,73 +672,109 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } } + /** + * Format a smiley + * + * Uses $this->smiley + * + * @param string $smiley + */ function smiley($smiley) { - if ( array_key_exists($smiley, $this->smileys) ) { - $title = $this->_xmlEntities($this->smileys[$smiley]); + if(array_key_exists($smiley, $this->smileys)) { $this->doc .= '<img src="'.DOKU_BASE.'lib/images/smileys/'.$this->smileys[$smiley]. '" class="icon" alt="'. - $this->_xmlEntities($smiley).'" />'; + $this->_xmlEntities($smiley).'" />'; } else { $this->doc .= $this->_xmlEntities($smiley); } } - /* - * not used - function wordblock($word) { - if ( array_key_exists($word, $this->badwords) ) { - $this->doc .= '** BLEEP **'; - } else { - $this->doc .= $this->_xmlEntities($word); - } - } - */ - + /** + * Format an entity + * + * Entities are basically small text replacements + * + * Uses $this->entities + * + * @param string $entity + */ function entity($entity) { - if ( array_key_exists($entity, $this->entities) ) { + if(array_key_exists($entity, $this->entities)) { $this->doc .= $this->entities[$entity]; } else { $this->doc .= $this->_xmlEntities($entity); } } + /** + * Typographically format a multiply sign + * + * Example: ($x=640, $y=480) should result in "640×480" + * + * @param string|int $x first value + * @param string|int $y second value + */ function multiplyentity($x, $y) { $this->doc .= "$x×$y"; } + /** + * Render an opening single quote char (language specific) + */ function singlequoteopening() { global $lang; $this->doc .= $lang['singlequoteopening']; } + /** + * Render a closing single quote char (language specific) + */ function singlequoteclosing() { global $lang; $this->doc .= $lang['singlequoteclosing']; } + /** + * Render an apostrophe char (language specific) + */ function apostrophe() { global $lang; $this->doc .= $lang['apostrophe']; } + /** + * Render an opening double quote char (language specific) + */ function doublequoteopening() { global $lang; $this->doc .= $lang['doublequoteopening']; } + /** + * Render an closinging double quote char (language specific) + */ function doublequoteclosing() { global $lang; $this->doc .= $lang['doublequoteclosing']; } /** + * Render a CamelCase link + * + * @param string $link The link name + * @see http://en.wikipedia.org/wiki/CamelCase */ function camelcaselink($link) { - $this->internallink($link,$link); + $this->internallink($link, $link); } - - function locallink($hash, $name = null){ + /** + * Render a page local link + * + * @param string $hash hash link identifier + * @param string $name name for the link + */ + function locallink($hash, $name = null) { global $ID; $name = $this->_getLinkTitle($name, $hash, $isImage); $hash = $this->_headerToLink($hash); @@ -563,16 +791,22 @@ class Doku_Renderer_xhtml extends Doku_Renderer { * elsewhere - no need to implement them in other renderers * * @author Andreas Gohr <andi@splitbrain.org> + * @param string $id pageid + * @param string|null $name link name + * @param string|null $search adds search url param + * @param bool $returnonly whether to return html or write to doc attribute + * @param string $linktype type to set use of headings + * @return void|string writes to doc attribute or returns html depends on $returnonly */ - function internallink($id, $name = null, $search=null,$returnonly=false,$linktype='content') { + function internallink($id, $name = null, $search = null, $returnonly = false, $linktype = 'content') { global $conf; global $ID; global $INFO; $params = ''; - $parts = explode('?', $id, 2); - if (count($parts) === 2) { - $id = $parts[0]; + $parts = explode('?', $id, 2); + if(count($parts) === 2) { + $id = $parts[0]; $params = $parts[1]; } @@ -580,7 +814,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { // We need this check because _simpleTitle needs // correct $id and resolve_pageid() use cleanID($id) // (some things could be lost) - if ($id === '') { + if($id === '') { $id = $ID; } @@ -588,22 +822,23 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $default = $this->_simpleTitle($id); // now first resolve and clean up the $id - resolve_pageid(getNS($ID),$id,$exists); + resolve_pageid(getNS($ID), $id, $exists, $this->date_at, true); + $link = array(); $name = $this->_getLinkTitle($name, $default, $isImage, $id, $linktype); - if ( !$isImage ) { - if ( $exists ) { - $class='wikilink1'; + if(!$isImage) { + if($exists) { + $class = 'wikilink1'; } else { - $class='wikilink2'; - $link['rel']='nofollow'; + $class = 'wikilink2'; + $link['rel'] = 'nofollow'; } } else { - $class='media'; + $class = 'media'; } //keep hash anchor - list($id,$hash) = explode('#',$id,2); + @list($id, $hash) = explode('#', $id, 2); if(!empty($hash)) $hash = $this->_headerToLink($hash); //prepare for formating @@ -612,37 +847,46 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $link['pre'] = ''; $link['suf'] = ''; // highlight link to current page - if ($id == $INFO['id']) { - $link['pre'] = '<span class="curid">'; - $link['suf'] = '</span>'; + if($id == $INFO['id']) { + $link['pre'] = '<span class="curid">'; + $link['suf'] = '</span>'; } $link['more'] = ''; $link['class'] = $class; + if($this->date_at) { + $params['at'] = $this->date_at; + } $link['url'] = wl($id, $params); $link['name'] = $name; $link['title'] = $id; //add search string - if($search){ - ($conf['userewrite']) ? $link['url'].='?' : $link['url'].='&'; - if(is_array($search)){ - $search = array_map('rawurlencode',$search); - $link['url'] .= 's[]='.join('&s[]=',$search); - }else{ + if($search) { + ($conf['userewrite']) ? $link['url'] .= '?' : $link['url'] .= '&'; + if(is_array($search)) { + $search = array_map('rawurlencode', $search); + $link['url'] .= 's[]='.join('&s[]=', $search); + } else { $link['url'] .= 's='.rawurlencode($search); } } //keep hash - if($hash) $link['url'].='#'.$hash; + if($hash) $link['url'] .= '#'.$hash; //output formatted - if($returnonly){ + if($returnonly) { return $this->_formatLink($link); - }else{ + } else { $this->doc .= $this->_formatLink($link); } } + /** + * Render an external link + * + * @param string $url full URL with scheme + * @param string|array $name name for the link, array for media file + */ function externallink($url, $name = null) { global $conf; @@ -650,24 +894,25 @@ class Doku_Renderer_xhtml extends Doku_Renderer { // url might be an attack vector, only allow registered protocols if(is_null($this->schemes)) $this->schemes = getSchemes(); - list($scheme) = explode('://',$url); + list($scheme) = explode('://', $url); $scheme = strtolower($scheme); - if(!in_array($scheme,$this->schemes)) $url = ''; + if(!in_array($scheme, $this->schemes)) $url = ''; // is there still an URL? - if(!$url){ + if(!$url) { $this->doc .= $name; return; } // set class - if ( !$isImage ) { - $class='urlextern'; + if(!$isImage) { + $class = 'urlextern'; } else { - $class='media'; + $class = 'media'; } //prepare for formating + $link = array(); $link['target'] = $conf['target']['extern']; $link['style'] = ''; $link['pre'] = ''; @@ -676,8 +921,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $link['class'] = $class; $link['url'] = $url; - $link['name'] = $name; - $link['title'] = $this->_xmlEntities($url); + $link['name'] = $name; + $link['title'] = $this->_xmlEntities($url); if($conf['relnofollow']) $link['more'] .= ' rel="nofollow"'; //output formatted @@ -685,11 +930,19 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } /** - */ + * Render an interwiki link + * + * You may want to use $this->_resolveInterWiki() here + * + * @param string $match original link - probably not much use + * @param string|array $name name for the link, array for media file + * @param string $wikiName indentifier (shortcut) for the remote wiki + * @param string $wikiUri the fragment parsed from the original link + */ function interwikilink($match, $name = null, $wikiName, $wikiUri) { global $conf; - $link = array(); + $link = array(); $link['target'] = $conf['target']['interwiki']; $link['pre'] = ''; $link['suf'] = ''; @@ -697,21 +950,30 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $link['name'] = $this->_getLinkTitle($name, $wikiUri, $isImage); //get interwiki URL - $url = $this->_resolveInterWiki($wikiName,$wikiUri); + $exists = null; + $url = $this->_resolveInterWiki($wikiName, $wikiUri, $exists); - if ( !$isImage ) { - $class = preg_replace('/[^_\-a-z0-9]+/i','_',$wikiName); + if(!$isImage) { + $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $wikiName); $link['class'] = "interwiki iw_$class"; } else { $link['class'] = 'media'; } //do we stay at the same server? Use local target - if( strpos($url,DOKU_URL) === 0 ){ + if(strpos($url, DOKU_URL) === 0 OR strpos($url, DOKU_BASE) === 0) { $link['target'] = $conf['target']['wiki']; } + if($exists !== null && !$isImage) { + if($exists) { + $link['class'] .= ' wikilink1'; + } else { + $link['class'] .= ' wikilink2'; + $link['rel'] = 'nofollow'; + } + } - $link['url'] = $url; + $link['url'] = $url; $link['title'] = htmlspecialchars($link['url']); //output formatted @@ -719,54 +981,68 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } /** + * Link to windows share + * + * @param string $url the link + * @param string|array $name name for the link, array for media file */ function windowssharelink($url, $name = null) { global $conf; - global $lang; + //simple setup + $link = array(); $link['target'] = $conf['target']['windows']; $link['pre'] = ''; - $link['suf'] = ''; + $link['suf'] = ''; $link['style'] = ''; $link['name'] = $this->_getLinkTitle($name, $url, $isImage); - if ( !$isImage ) { + if(!$isImage) { $link['class'] = 'windows'; } else { $link['class'] = 'media'; } $link['title'] = $this->_xmlEntities($url); - $url = str_replace('\\','/',$url); - $url = 'file:///'.$url; - $link['url'] = $url; + $url = str_replace('\\', '/', $url); + $url = ltrim($url,'/'); + $url = 'file:///'.$url; + $link['url'] = $url; //output formatted $this->doc .= $this->_formatLink($link); } + /** + * Render a linked E-Mail Address + * + * Honors $conf['mailguard'] setting + * + * @param string $address Email-Address + * @param string|array $name name for the link, array for media file + */ function emaillink($address, $name = null) { global $conf; //simple setup - $link = array(); + $link = array(); $link['target'] = ''; $link['pre'] = ''; - $link['suf'] = ''; + $link['suf'] = ''; $link['style'] = ''; $link['more'] = ''; $name = $this->_getLinkTitle($name, '', $isImage); - if ( !$isImage ) { - $link['class']='mail'; + if(!$isImage) { + $link['class'] = 'mail'; } else { - $link['class']='media'; + $link['class'] = 'media'; } $address = $this->_xmlEntities($address); $address = obfuscate($address); $title = $address; - if(empty($name)){ + if(empty($name)) { $name = $address; } @@ -780,69 +1056,104 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $this->doc .= $this->_formatLink($link); } - function internalmedia ($src, $title=null, $align=null, $width=null, - $height=null, $cache=null, $linking=null) { + /** + * Render an internal media file + * + * @param string $src media ID + * @param string $title descriptive text + * @param string $align left|center|right + * @param int $width width of media in pixel + * @param int $height height of media in pixel + * @param string $cache cache|recache|nocache + * @param string $linking linkonly|detail|nolink + * @param bool $return return HTML instead of adding to $doc + * @return void|string + */ + function internalmedia($src, $title = null, $align = null, $width = null, + $height = null, $cache = null, $linking = null, $return = false) { global $ID; - list($src,$hash) = explode('#',$src,2); - resolve_mediaid(getNS($ID),$src, $exists); + list($src, $hash) = explode('#', $src, 2); + resolve_mediaid(getNS($ID), $src, $exists, $this->date_at, true); $noLink = false; $render = ($linking == 'linkonly') ? false : true; - $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); + $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); - list($ext,$mime,$dl) = mimetype($src,false); - if(substr($mime,0,5) == 'image' && $render){ - $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),($linking=='direct')); - }elseif($mime == 'application/x-shockwave-flash' && $render){ - // don't link flash movies + list($ext, $mime) = mimetype($src, false); + if(substr($mime, 0, 5) == 'image' && $render) { + $link['url'] = ml($src, array('id' => $ID, 'cache' => $cache, 'rev'=>$this->_getLastMediaRevisionAt($src)), ($linking == 'direct')); + } elseif(($mime == 'application/x-shockwave-flash' || media_supportedav($mime)) && $render) { + // don't link movies $noLink = true; - }else{ + } else { // add file icons - $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext); + $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext); $link['class'] .= ' mediafile mf_'.$class; - $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),true); - if ($exists) $link['title'] .= ' (' . filesize_h(filesize(mediaFN($src))).')'; + $link['url'] = ml($src, array('id' => $ID, 'cache' => $cache , 'rev'=>$this->_getLastMediaRevisionAt($src)), true); + if($exists) $link['title'] .= ' ('.filesize_h(filesize(mediaFN($src))).')'; } if($hash) $link['url'] .= '#'.$hash; //markup non existing files - if (!$exists) { + if(!$exists) { $link['class'] .= ' wikilink2'; } //output formatted - if ($linking == 'nolink' || $noLink) $this->doc .= $link['name']; - else $this->doc .= $this->_formatLink($link); + if($return) { + if($linking == 'nolink' || $noLink) return $link['name']; + else return $this->_formatLink($link); + } else { + if($linking == 'nolink' || $noLink) $this->doc .= $link['name']; + else $this->doc .= $this->_formatLink($link); + } } - function externalmedia ($src, $title=null, $align=null, $width=null, - $height=null, $cache=null, $linking=null) { - list($src,$hash) = explode('#',$src,2); + /** + * Render an external media file + * + * @param string $src full media URL + * @param string $title descriptive text + * @param string $align left|center|right + * @param int $width width of media in pixel + * @param int $height height of media in pixel + * @param string $cache cache|recache|nocache + * @param string $linking linkonly|detail|nolink + * @param bool $return return HTML instead of adding to $doc + */ + function externalmedia($src, $title = null, $align = null, $width = null, + $height = null, $cache = null, $linking = null, $return = false) { + list($src, $hash) = explode('#', $src, 2); $noLink = false; $render = ($linking == 'linkonly') ? false : true; - $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); + $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); - $link['url'] = ml($src,array('cache'=>$cache)); + $link['url'] = ml($src, array('cache' => $cache)); - list($ext,$mime,$dl) = mimetype($src,false); - if(substr($mime,0,5) == 'image' && $render){ + list($ext, $mime) = mimetype($src, false); + if(substr($mime, 0, 5) == 'image' && $render) { // link only jpeg images // if ($ext != 'jpg' && $ext != 'jpeg') $noLink = true; - }elseif($mime == 'application/x-shockwave-flash' && $render){ - // don't link flash movies + } elseif(($mime == 'application/x-shockwave-flash' || media_supportedav($mime)) && $render) { + // don't link movies $noLink = true; - }else{ + } else { // add file icons - $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext); + $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext); $link['class'] .= ' mediafile mf_'.$class; } if($hash) $link['url'] .= '#'.$hash; //output formatted - if ($linking == 'nolink' || $noLink) $this->doc .= $link['name']; - else $this->doc .= $this->_formatLink($link); + if($return) { + if($linking == 'nolink' || $noLink) return $link['name']; + else return $this->_formatLink($link); + } else { + if($linking == 'nolink' || $noLink) $this->doc .= $link['name']; + else $this->doc .= $this->_formatLink($link); + } } /** @@ -850,7 +1161,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { * * @author Andreas Gohr <andi@splitbrain.org> */ - function rss ($url,$params){ + function rss($url, $params) { global $lang; global $conf; @@ -859,17 +1170,23 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $feed->set_feed_url($url); //disable warning while fetching - if (!defined('DOKU_E_LEVEL')) { $elvl = error_reporting(E_ERROR); } + if(!defined('DOKU_E_LEVEL')) { + $elvl = error_reporting(E_ERROR); + } $rc = $feed->init(); - if (!defined('DOKU_E_LEVEL')) { error_reporting($elvl); } + if(isset($elvl)) { + error_reporting($elvl); + } + + if($params['nosort']) $feed->enable_order_by_date(false); //decide on start and end - if($params['reverse']){ - $mod = -1; - $start = $feed->get_item_quantity()-1; + if($params['reverse']) { + $mod = -1; + $start = $feed->get_item_quantity() - 1; $end = $start - ($params['max']); $end = ($end < -1) ? -1 : $end; - }else{ + } else { $mod = 1; $start = 0; $end = $feed->get_item_quantity(); @@ -877,36 +1194,38 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } $this->doc .= '<ul class="rss">'; - if($rc){ - for ($x = $start; $x != $end; $x += $mod) { + if($rc) { + for($x = $start; $x != $end; $x += $mod) { $item = $feed->get_item($x); $this->doc .= '<li><div class="li">'; // support feeds without links $lnkurl = $item->get_permalink(); - if($lnkurl){ + if($lnkurl) { // title is escaped by SimplePie, we unescape here because it // is escaped again in externallink() FS#1705 - $this->externallink($item->get_permalink(), - html_entity_decode($item->get_title(), ENT_QUOTES, 'UTF-8')); - }else{ + $this->externallink( + $item->get_permalink(), + html_entity_decode($item->get_title(), ENT_QUOTES, 'UTF-8') + ); + } else { $this->doc .= ' '.$item->get_title(); } - if($params['author']){ + if($params['author']) { $author = $item->get_author(0); - if($author){ + if($author) { $name = $author->get_name(); if(!$name) $name = $author->get_email(); if($name) $this->doc .= ' '.$lang['by'].' '.$name; } } - if($params['date']){ + if($params['date']) { $this->doc .= ' ('.$item->get_local_date($conf['dformat']).')'; } - if($params['details']){ + if($params['details']) { $this->doc .= '<div class="detail">'; - if($conf['htmlok']){ + if($conf['htmlok']) { $this->doc .= $item->get_description(); - }else{ + } else { $this->doc .= strip_tags($item->get_description()); } $this->doc .= '</div>'; @@ -914,11 +1233,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $this->doc .= '</div></li>'; } - }else{ + } else { $this->doc .= '<li><div class="li">'; $this->doc .= '<em>'.$lang['rssfailed'].'</em>'; $this->externallink($url); - if($conf['allowdebug']){ + if($conf['allowdebug']) { $this->doc .= '<!--'.hsc($feed->error).'-->'; } $this->doc .= '</div></li>'; @@ -926,81 +1245,130 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $this->doc .= '</ul>'; } - // $numrows not yet implemented - function table_open($maxcols = null, $numrows = null, $pos = null){ - global $lang; + /** + * Start a table + * + * @param int $maxcols maximum number of columns + * @param int $numrows NOT IMPLEMENTED + * @param int $pos byte position in the original source + */ + function table_open($maxcols = null, $numrows = null, $pos = null) { // initialize the row counter used for classes $this->_counter['row_counter'] = 0; - $class = 'table'; - if ($pos !== null) { - $class .= ' ' . $this->startSectionEdit($pos, 'table'); + $class = 'table'; + if($pos !== null) { + $class .= ' '.$this->startSectionEdit($pos, 'table'); } - $this->doc .= '<div class="' . $class . '"><table class="inline">' . - DOKU_LF; + $this->doc .= '<div class="'.$class.'"><table class="inline">'. + DOKU_LF; } - function table_close($pos = null){ + /** + * Close a table + * + * @param int $pos byte position in the original source + */ + function table_close($pos = null) { $this->doc .= '</table></div>'.DOKU_LF; - if ($pos !== null) { + if($pos !== null) { $this->finishSectionEdit($pos); } } - function tablerow_open(){ + /** + * Open a table header + */ + function tablethead_open() { + $this->doc .= DOKU_TAB.'<thead>'.DOKU_LF; + } + + /** + * Close a table header + */ + function tablethead_close() { + $this->doc .= DOKU_TAB.'</thead>'.DOKU_LF; + } + + /** + * Open a table row + */ + function tablerow_open() { // initialize the cell counter used for classes $this->_counter['cell_counter'] = 0; - $class = 'row' . $this->_counter['row_counter']++; - $this->doc .= DOKU_TAB . '<tr class="'.$class.'">' . DOKU_LF . DOKU_TAB . DOKU_TAB; + $class = 'row'.$this->_counter['row_counter']++; + $this->doc .= DOKU_TAB.'<tr class="'.$class.'">'.DOKU_LF.DOKU_TAB.DOKU_TAB; } - function tablerow_close(){ - $this->doc .= DOKU_LF . DOKU_TAB . '</tr>' . DOKU_LF; + /** + * Close a table row + */ + function tablerow_close() { + $this->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF; } - function tableheader_open($colspan = 1, $align = null, $rowspan = 1){ - $class = 'class="col' . $this->_counter['cell_counter']++; - if ( !is_null($align) ) { + /** + * Open a table header cell + * + * @param int $colspan + * @param string $align left|center|right + * @param int $rowspan + */ + function tableheader_open($colspan = 1, $align = null, $rowspan = 1) { + $class = 'class="col'.$this->_counter['cell_counter']++; + if(!is_null($align)) { $class .= ' '.$align.'align'; } $class .= '"'; - $this->doc .= '<th ' . $class; - if ( $colspan > 1 ) { - $this->_counter['cell_counter'] += $colspan-1; + $this->doc .= '<th '.$class; + if($colspan > 1) { + $this->_counter['cell_counter'] += $colspan - 1; $this->doc .= ' colspan="'.$colspan.'"'; } - if ( $rowspan > 1 ) { + if($rowspan > 1) { $this->doc .= ' rowspan="'.$rowspan.'"'; } $this->doc .= '>'; } - function tableheader_close(){ + /** + * Close a table header cell + */ + function tableheader_close() { $this->doc .= '</th>'; } - function tablecell_open($colspan = 1, $align = null, $rowspan = 1){ - $class = 'class="col' . $this->_counter['cell_counter']++; - if ( !is_null($align) ) { + /** + * Open a table cell + * + * @param int $colspan + * @param string $align left|center|right + * @param int $rowspan + */ + function tablecell_open($colspan = 1, $align = null, $rowspan = 1) { + $class = 'class="col'.$this->_counter['cell_counter']++; + if(!is_null($align)) { $class .= ' '.$align.'align'; } $class .= '"'; $this->doc .= '<td '.$class; - if ( $colspan > 1 ) { - $this->_counter['cell_counter'] += $colspan-1; + if($colspan > 1) { + $this->_counter['cell_counter'] += $colspan - 1; $this->doc .= ' colspan="'.$colspan.'"'; } - if ( $rowspan > 1 ) { + if($rowspan > 1) { $this->doc .= ' rowspan="'.$rowspan.'"'; } $this->doc .= '>'; } - function tablecell_close(){ + /** + * Close a table cell + */ + function tablecell_close() { $this->doc .= '</td>'; } - //---------------------------------------------------------- - // Utils + #region Utility functions /** * Build a link @@ -1009,29 +1377,29 @@ class Doku_Renderer_xhtml extends Doku_Renderer { * * @author Andreas Gohr <andi@splitbrain.org> */ - function _formatLink($link){ + function _formatLink($link) { //make sure the url is XHTML compliant (skip mailto) - if(substr($link['url'],0,7) != 'mailto:'){ - $link['url'] = str_replace('&','&',$link['url']); - $link['url'] = str_replace('&amp;','&',$link['url']); + if(substr($link['url'], 0, 7) != 'mailto:') { + $link['url'] = str_replace('&', '&', $link['url']); + $link['url'] = str_replace('&amp;', '&', $link['url']); } //remove double encodings in titles - $link['title'] = str_replace('&amp;','&',$link['title']); + $link['title'] = str_replace('&amp;', '&', $link['title']); // be sure there are no bad chars in url or title // (we can't do this for name because it can contain an img tag) - $link['url'] = strtr($link['url'],array('>'=>'%3E','<'=>'%3C','"'=>'%22')); - $link['title'] = strtr($link['title'],array('>'=>'>','<'=>'<','"'=>'"')); + $link['url'] = strtr($link['url'], array('>' => '%3E', '<' => '%3C', '"' => '%22')); + $link['title'] = strtr($link['title'], array('>' => '>', '<' => '<', '"' => '"')); - $ret = ''; + $ret = ''; $ret .= $link['pre']; $ret .= '<a href="'.$link['url'].'"'; - if(!empty($link['class'])) $ret .= ' class="'.$link['class'].'"'; + if(!empty($link['class'])) $ret .= ' class="'.$link['class'].'"'; if(!empty($link['target'])) $ret .= ' target="'.$link['target'].'"'; - if(!empty($link['title'])) $ret .= ' title="'.$link['title'].'"'; - if(!empty($link['style'])) $ret .= ' style="'.$link['style'].'"'; - if(!empty($link['rel'])) $ret .= ' rel="'.$link['rel'].'"'; - if(!empty($link['more'])) $ret .= ' '.$link['more']; + if(!empty($link['title'])) $ret .= ' title="'.$link['title'].'"'; + if(!empty($link['style'])) $ret .= ' style="'.$link['style'].'"'; + if(!empty($link['rel'])) $ret .= ' rel="'.$link['rel'].'"'; + if(!empty($link['more'])) $ret .= ' '.$link['more']; $ret .= '>'; $ret .= $link['name']; $ret .= '</a>'; @@ -1043,78 +1411,112 @@ class Doku_Renderer_xhtml extends Doku_Renderer { * Renders internal and external media * * @author Andreas Gohr <andi@splitbrain.org> + * @param string $src media ID + * @param string $title descriptive text + * @param string $align left|center|right + * @param int $width width of media in pixel + * @param int $height height of media in pixel + * @param string $cache cache|recache|nocache + * @param bool $render should the media be embedded inline or just linked + * @return string */ - function _media ($src, $title=null, $align=null, $width=null, - $height=null, $cache=null, $render = true) { + function _media($src, $title = null, $align = null, $width = null, + $height = null, $cache = null, $render = true) { $ret = ''; - list($ext,$mime,$dl) = mimetype($src); - if(substr($mime,0,5) == 'image'){ + list($ext, $mime) = mimetype($src); + if(substr($mime, 0, 5) == 'image') { // first get the $title - if (!is_null($title)) { - $title = $this->_xmlEntities($title); - }elseif($ext == 'jpg' || $ext == 'jpeg'){ + if(!is_null($title)) { + $title = $this->_xmlEntities($title); + } elseif($ext == 'jpg' || $ext == 'jpeg') { //try to use the caption from IPTC/EXIF require_once(DOKU_INC.'inc/JpegMeta.php'); - $jpeg =new JpegMeta(mediaFN($src)); + $jpeg = new JpegMeta(mediaFN($src)); if($jpeg !== false) $cap = $jpeg->getTitle(); - if($cap){ + if(!empty($cap)) { $title = $this->_xmlEntities($cap); } } - if (!$render) { + if(!$render) { // if the picture is not supposed to be rendered // return the title of the picture - if (!$title) { + if(!$title) { // just show the sourcename $title = $this->_xmlEntities(utf8_basename(noNS($src))); } return $title; } //add image tag - $ret .= '<img src="'.ml($src,array('w'=>$width,'h'=>$height,'cache'=>$cache)).'"'; + $ret .= '<img src="'.ml($src, array('w' => $width, 'h' => $height, 'cache' => $cache, 'rev'=>$this->_getLastMediaRevisionAt($src))).'"'; $ret .= ' class="media'.$align.'"'; - if ($title) { - $ret .= ' title="' . $title . '"'; - $ret .= ' alt="' . $title .'"'; - }else{ + if($title) { + $ret .= ' title="'.$title.'"'; + $ret .= ' alt="'.$title.'"'; + } else { $ret .= ' alt=""'; } - if ( !is_null($width) ) + if(!is_null($width)) $ret .= ' width="'.$this->_xmlEntities($width).'"'; - if ( !is_null($height) ) + if(!is_null($height)) $ret .= ' height="'.$this->_xmlEntities($height).'"'; $ret .= ' />'; - }elseif($mime == 'application/x-shockwave-flash'){ - if (!$render) { + } elseif(media_supportedav($mime, 'video') || media_supportedav($mime, 'audio')) { + // first get the $title + $title = !is_null($title) ? $this->_xmlEntities($title) : false; + if(!$render) { + // if the file is not supposed to be rendered + // return the title of the file (just the sourcename if there is no title) + return $title ? $title : $this->_xmlEntities(utf8_basename(noNS($src))); + } + + $att = array(); + $att['class'] = "media$align"; + if($title) { + $att['title'] = $title; + } + + if(media_supportedav($mime, 'video')) { + //add video + $ret .= $this->_video($src, $width, $height, $att); + } + if(media_supportedav($mime, 'audio')) { + //add audio + $ret .= $this->_audio($src, $att); + } + + } elseif($mime == 'application/x-shockwave-flash') { + if(!$render) { // if the flash is not supposed to be rendered // return the title of the flash - if (!$title) { + if(!$title) { // just show the sourcename $title = utf8_basename(noNS($src)); } return $this->_xmlEntities($title); } - $att = array(); + $att = array(); $att['class'] = "media$align"; if($align == 'right') $att['align'] = 'right'; - if($align == 'left') $att['align'] = 'left'; - $ret .= html_flashobject(ml($src,array('cache'=>$cache),true,'&'),$width,$height, - array('quality' => 'high'), - null, - $att, - $this->_xmlEntities($title)); - }elseif($title){ + if($align == 'left') $att['align'] = 'left'; + $ret .= html_flashobject( + ml($src, array('cache' => $cache), true, '&'), $width, $height, + array('quality' => 'high'), + null, + $att, + $this->_xmlEntities($title) + ); + } elseif($title) { // well at least we have a title to display $ret .= $this->_xmlEntities($title); - }else{ + } else { // just show the sourcename $ret .= $this->_xmlEntities(utf8_basename(noNS($src))); } @@ -1122,23 +1524,30 @@ class Doku_Renderer_xhtml extends Doku_Renderer { return $ret; } + /** + * Escape string for output + * + * @param $string + * @return string + */ function _xmlEntities($string) { - return htmlspecialchars($string,ENT_QUOTES,'UTF-8'); + return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); } /** * Creates a linkid from a headline * + * @author Andreas Gohr <andi@splitbrain.org> * @param string $title The headline title * @param boolean $create Create a new unique ID? - * @author Andreas Gohr <andi@splitbrain.org> + * @return string */ - function _headerToLink($title,$create=false) { - if($create){ - return sectionID($title,$this->headers); - }else{ + function _headerToLink($title, $create = false) { + if($create) { + return sectionID($title, $this->headers); + } else { $check = false; - return sectionID($title,$check); + return sectionID($title, $check); } } @@ -1146,18 +1555,22 @@ class Doku_Renderer_xhtml extends Doku_Renderer { * Construct a title and handle images in titles * * @author Harry Fuecks <hfuecks@gmail.com> + * @param string|array $title either string title or media array + * @param string $default default title if nothing else is found + * @param bool $isImage will be set to true if it's a media file + * @param null|string $id linked page id (used to extract title from first heading) + * @param string $linktype content|navigation + * @return string HTML of the title, might be full image tag or just escaped text */ - function _getLinkTitle($title, $default, & $isImage, $id=null, $linktype='content') { - global $conf; - + function _getLinkTitle($title, $default, &$isImage, $id = null, $linktype = 'content') { $isImage = false; - if ( is_array($title) ) { + if(is_array($title)) { $isImage = true; return $this->_imageTitle($title); - } elseif ( is_null($title) || trim($title)=='') { - if (useHeading($linktype) && $id) { + } elseif(is_null($title) || trim($title) == '') { + if(useHeading($linktype) && $id) { $heading = p_get_first_heading($id); - if ($heading) { + if($heading) { return $this->_xmlEntities($heading); } } @@ -1168,48 +1581,51 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } /** - * Returns an HTML code for images used in link titles + * Returns HTML code for images used in link titles * - * @todo Resolve namespace on internal images * @author Andreas Gohr <andi@splitbrain.org> + * @param array $img + * @return string HTML img tag or similar */ function _imageTitle($img) { global $ID; // some fixes on $img['src'] // see internalmedia() and externalmedia() - list($img['src'],$hash) = explode('#',$img['src'],2); - if ($img['type'] == 'internalmedia') { - resolve_mediaid(getNS($ID),$img['src'],$exists); + list($img['src']) = explode('#', $img['src'], 2); + if($img['type'] == 'internalmedia') { + resolve_mediaid(getNS($ID), $img['src'], $exists ,$this->date_at, true); } - return $this->_media($img['src'], - $img['title'], - $img['align'], - $img['width'], - $img['height'], - $img['cache']); + return $this->_media( + $img['src'], + $img['title'], + $img['align'], + $img['width'], + $img['height'], + $img['cache'] + ); } /** - * _getMediaLinkConf is a helperfunction to internalmedia() and externalmedia() - * which returns a basic link to a media. + * helperfunction to return a basic link to a media * - * @author Pierre Spring <pierre.spring@liip.ch> - * @param string $src - * @param string $title - * @param string $align - * @param string $width - * @param string $height - * @param string $cache - * @param string $render - * @access protected - * @return array + * used in internalmedia() and externalmedia() + * + * @author Pierre Spring <pierre.spring@liip.ch> + * @param string $src media ID + * @param string $title descriptive text + * @param string $align left|center|right + * @param int $width width of media in pixel + * @param int $height height of media in pixel + * @param string $cache cache|recache|nocache + * @param bool $render should the media be embedded inline or just linked + * @return array associative array with link config */ function _getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render) { global $conf; - $link = array(); + $link = array(); $link['class'] = 'media'; $link['style'] = ''; $link['pre'] = ''; @@ -1222,7 +1638,138 @@ class Doku_Renderer_xhtml extends Doku_Renderer { return $link; } + /** + * Embed video(s) in HTML + * + * @author Anika Henke <anika@selfthinker.org> + * + * @param string $src - ID of video to embed + * @param int $width - width of the video in pixels + * @param int $height - height of the video in pixels + * @param array $atts - additional attributes for the <video> tag + * @return string + */ + function _video($src, $width, $height, $atts = null) { + // prepare width and height + if(is_null($atts)) $atts = array(); + $atts['width'] = (int) $width; + $atts['height'] = (int) $height; + if(!$atts['width']) $atts['width'] = 320; + if(!$atts['height']) $atts['height'] = 240; + + $posterUrl = ''; + $files = array(); + $isExternal = media_isexternal($src); + + if ($isExternal) { + // take direct source for external files + list(/*ext*/, $srcMime) = mimetype($src); + $files[$srcMime] = $src; + } else { + // prepare alternative formats + $extensions = array('webm', 'ogv', 'mp4'); + $files = media_alternativefiles($src, $extensions); + $poster = media_alternativefiles($src, array('jpg', 'png')); + if(!empty($poster)) { + $posterUrl = ml(reset($poster), '', true, '&'); + } + } + + $out = ''; + // open video tag + $out .= '<video '.buildAttributes($atts).' controls="controls"'; + if($posterUrl) $out .= ' poster="'.hsc($posterUrl).'"'; + $out .= '>'.NL; + $fallback = ''; + + // output source for each alternative video format + foreach($files as $mime => $file) { + if ($isExternal) { + $url = $file; + $linkType = 'externalmedia'; + } else { + $url = ml($file, '', true, '&'); + $linkType = 'internalmedia'; + } + $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(utf8_basename(noNS($file))); + + $out .= '<source src="'.hsc($url).'" type="'.$mime.'" />'.NL; + // alternative content (just a link to the file) + $fallback .= $this->$linkType($file, $title, null, null, null, $cache = null, $linking = 'linkonly', $return = true); + } + + // finish + $out .= $fallback; + $out .= '</video>'.NL; + return $out; + } + + /** + * Embed audio in HTML + * + * @author Anika Henke <anika@selfthinker.org> + * + * @param string $src - ID of audio to embed + * @param array $atts - additional attributes for the <audio> tag + * @return string + */ + function _audio($src, $atts = array()) { + $files = array(); + $isExternal = media_isexternal($src); + + if ($isExternal) { + // take direct source for external files + list(/*ext*/, $srcMime) = mimetype($src); + $files[$srcMime] = $src; + } else { + // prepare alternative formats + $extensions = array('ogg', 'mp3', 'wav'); + $files = media_alternativefiles($src, $extensions); + } + + $out = ''; + // open audio tag + $out .= '<audio '.buildAttributes($atts).' controls="controls">'.NL; + $fallback = ''; + + // output source for each alternative audio format + foreach($files as $mime => $file) { + if ($isExternal) { + $url = $file; + $linkType = 'externalmedia'; + } else { + $url = ml($file, '', true, '&'); + $linkType = 'internalmedia'; + } + $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(utf8_basename(noNS($file))); + + $out .= '<source src="'.hsc($url).'" type="'.$mime.'" />'.NL; + // alternative content (just a link to the file) + $fallback .= $this->$linkType($file, $title, null, null, null, $cache = null, $linking = 'linkonly', $return = true); + } + + // finish + $out .= $fallback; + $out .= '</audio>'.NL; + return $out; + } + + /** + * _getLastMediaRevisionAt is a helperfunction to internalmedia() and _media() + * which returns an existing media revision less or equal to rev or date_at + * + * @author lisps + * @param string $media_id + * @access protected + * @return string revision ('' for current) + */ + function _getLastMediaRevisionAt($media_id){ + if(!$this->date_at || media_isexternal($media_id)) return ''; + $pagelog = new MediaChangeLog($media_id); + return $pagelog->getLastRevisionAt($this->date_at); + } + #endregion } //Setup VIM: ex: et ts=4 : diff --git a/inc/parser/xhtmlsummary.php b/inc/parser/xhtmlsummary.php index 95f86cbef..867b71f6a 100644 --- a/inc/parser/xhtmlsummary.php +++ b/inc/parser/xhtmlsummary.php @@ -1,6 +1,5 @@ <?php if(!defined('DOKU_INC')) die('meh.'); -require_once DOKU_INC . 'inc/parser/xhtml.php'; /** * The summary XHTML form selects either up to the first two paragraphs diff --git a/inc/parserutils.php b/inc/parserutils.php index b67daaabb..17c331ef5 100644 --- a/inc/parserutils.php +++ b/inc/parserutils.php @@ -55,8 +55,13 @@ define('METADATA_RENDER_UNLIMITED', 4); * wasn't found * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id page id + * @param string|int $rev revision timestamp or empty string + * @param bool $excuse + * @return null|string */ -function p_wiki_xhtml($id, $rev='', $excuse=true){ +function p_wiki_xhtml($id, $rev='', $excuse=true,$date_at=''){ $file = wikiFN($id,$rev); $ret = ''; @@ -65,14 +70,14 @@ function p_wiki_xhtml($id, $rev='', $excuse=true){ $keep = $ID; $ID = $id; - if($rev){ - if(@file_exists($file)){ - $ret = p_render('xhtml',p_get_instructions(io_readWikiPage($file,$id,$rev)),$info); //no caching on old revisions + if($rev || $date_at){ + if(file_exists($file)){ + $ret = p_render('xhtml',p_get_instructions(io_readWikiPage($file,$id,$rev)),$info,$date_at); //no caching on old revisions }elseif($excuse){ $ret = p_locale_xhtml('norev'); } }else{ - if(@file_exists($file)){ + if(file_exists($file)){ $ret = p_cached_output($file,'xhtml',$id); }elseif($excuse){ $ret = p_locale_xhtml('newpage'); @@ -89,6 +94,9 @@ function p_wiki_xhtml($id, $rev='', $excuse=true){ * Returns the specified local text in parsed format * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id page id + * @return null|string */ function p_locale_xhtml($id){ //fetch parsed locale @@ -101,6 +109,11 @@ function p_locale_xhtml($id){ * * @author Andreas Gohr <andi@splitbrain.org> * @author Chris Smith <chris@jalakai.co.uk> + * + * @param string $file filename, path to file + * @param string $format + * @param string $id page id + * @return null|string */ function p_cached_output($file, $format='xhtml', $id='') { global $conf; @@ -112,8 +125,7 @@ function p_cached_output($file, $format='xhtml', $id='') { } else { $parsed = p_render($format, p_cached_instructions($file,false,$id), $info); - if ($info['cache']) { - $cache->storeCache($parsed); //save cachefile + if ($info['cache'] && $cache->storeCache($parsed)) { // storeCache() attempts to save cachefile if($conf['allowdebug'] && $format=='xhtml') $parsed .= "\n<!-- no cachefile used, but created {$cache->cache} -->\n"; }else{ $cache->removeCache(); //try to delete cachefile @@ -130,6 +142,11 @@ function p_cached_output($file, $format='xhtml', $id='') { * Uses and creates a serialized cache file * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $file filename, path to file + * @param bool $cacheonly + * @param string $id page id + * @return array|null */ function p_cached_instructions($file,$cacheonly=false,$id='') { static $run = null; @@ -139,7 +156,7 @@ function p_cached_instructions($file,$cacheonly=false,$id='') { if ($cacheonly || $cache->useCache() || (isset($run[$file]) && !defined('DOKU_UNITTEST'))) { return $cache->retrieveCache(); - } else if (@file_exists($file)) { + } else if (file_exists($file)) { // no cache - do some work $ins = p_get_instructions(io_readWikiPage($file,$id)); if ($cache->storeCache($ins)) { @@ -158,6 +175,9 @@ function p_cached_instructions($file,$cacheonly=false,$id='') { * * @author Harry Fuecks <hfuecks@gmail.com> * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $text raw wiki syntax text + * @return array a list of instruction arrays */ function p_get_instructions($text){ @@ -184,9 +204,9 @@ function p_get_instructions($text){ /** * returns the metadata of a page * - * @param string $id The id of the page the metadata should be returned from - * @param string $key The key of the metdata value that shall be read (by default everything) - separate hierarchies by " " like "date created" - * @param int $render If the page should be rendererd - possible values: + * @param string $id The id of the page the metadata should be returned from + * @param string $key The key of the metdata value that shall be read (by default everything) - separate hierarchies by " " like "date created" + * @param int $render If the page should be rendererd - possible values: * METADATA_DONT_RENDER, METADATA_RENDER_USING_SIMPLE_CACHE, METADATA_RENDER_USING_CACHE * METADATA_RENDER_UNLIMITED (also combined with the previous two options), * default: METADATA_RENDER_USING_CACHE @@ -228,7 +248,7 @@ function p_get_metadata($id, $key='', $render=METADATA_RENDER_USING_CACHE){ if ($render & METADATA_RENDER_USING_SIMPLE_CACHE) { $pagefn = wikiFN($id); $metafn = metaFN($id, '.meta'); - if (!@file_exists($metafn) || @filemtime($pagefn) > @filemtime($cachefile->cache)) { + if (!file_exists($metafn) || @filemtime($pagefn) > @filemtime($cachefile->cache)) { $do_render = true; } } elseif (!$cachefile->useCache()){ @@ -359,6 +379,9 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){ * used on page deletion * * @author Michael Klier <chi@chimeric.de> + * + * @param string $id page id + * @return bool success / fail */ function p_purge_metadata($id) { $meta = p_read_metadata($id); @@ -391,7 +414,7 @@ function p_read_metadata($id,$cache=false) { if (isset($cache_metadata[(string)$id])) return $cache_metadata[(string)$id]; $file = metaFN($id, '.meta'); - $meta = @file_exists($file) ? unserialize(io_readFile($file, false)) : array('current'=>array(),'persistent'=>array()); + $meta = file_exists($file) ? unserialize(io_readFile($file, false)) : array('current'=>array(),'persistent'=>array()); if ($cache) { $cache_metadata[(string)$id] = $meta; @@ -422,14 +445,19 @@ function p_save_metadata($id, $meta) { * renders the metadata of a page * * @author Esther Brunner <esther@kaffeehaus.ch> + * + * @param string $id page id + * @param array $orig the original metadata + * @return array|null array('current'=> array,'persistent'=> array); */ function p_render_metadata($id, $orig){ // make sure the correct ID is in global ID global $ID, $METADATA_RENDERERS; // avoid recursive rendering processes for the same id - if (isset($METADATA_RENDERERS[$id])) + if (isset($METADATA_RENDERERS[$id])) { return $orig; + } // store the original metadata in the global $METADATA_RENDERERS so p_set_metadata can use it $METADATA_RENDERERS[$id] =& $orig; @@ -442,8 +470,6 @@ function p_render_metadata($id, $orig){ $evt = new Doku_Event('PARSER_METADATA_RENDER', $orig); if ($evt->advise_before()) { - require_once DOKU_INC."inc/parser/metadata.php"; - // get instructions $instructions = p_cached_instructions(wikiFN($id),false,$id); if(is_null($instructions)){ @@ -477,6 +503,8 @@ function p_render_metadata($id, $orig){ * returns all available parser syntax modes in correct order * * @author Andreas Gohr <andi@splitbrain.org> + * + * @return array[] with for each plugin the array('sort' => sortnumber, 'mode' => mode string, 'obj' => plugin object) */ function p_get_parsermodes(){ global $conf; @@ -569,6 +597,10 @@ function p_get_parsermodes(){ * Callback function for usort * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $a + * @param array $b + * @return int $a is lower/equal/higher than $b */ function p_sort_modes($a, $b){ if($a['sort'] == $b['sort']) return 0; @@ -582,15 +614,25 @@ function p_sort_modes($a, $b){ * * @author Harry Fuecks <hfuecks@gmail.com> * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $mode + * @param array|null|false $instructions + * @param array $info returns render info like enabled toc and cache + * @return null|string rendered output */ -function p_render($mode,$instructions,&$info){ +function p_render($mode,$instructions,&$info,$date_at=''){ if(is_null($instructions)) return ''; + if($instructions === false) return ''; - $Renderer =& p_get_renderer($mode); + $Renderer = p_get_renderer($mode); if (is_null($Renderer)) return null; $Renderer->reset(); + if($date_at) { + $Renderer->date_at = $date_at; + } + $Renderer->smileys = getSmileys(); $Renderer->entities = getEntities(); $Renderer->acronyms = getAcronyms(); @@ -614,43 +656,54 @@ function p_render($mode,$instructions,&$info){ } /** - * @param $mode string Mode of the renderer to get + * Figure out the correct renderer class to use for $mode, + * instantiate and return it + * + * @param string $mode Mode of the renderer to get * @return null|Doku_Renderer The renderer + * + * @author Christopher Smith <chris@jalakai.co.uk> */ -function & p_get_renderer($mode) { +function p_get_renderer($mode) { /** @var Doku_Plugin_Controller $plugin_controller */ global $conf, $plugin_controller; $rname = !empty($conf['renderer_'.$mode]) ? $conf['renderer_'.$mode] : $mode; $rclass = "Doku_Renderer_$rname"; + // if requested earlier or a bundled renderer if( class_exists($rclass) ) { $Renderer = new $rclass(); return $Renderer; } - // try default renderer first: - $file = DOKU_INC."inc/parser/$rname.php"; - if(@file_exists($file)){ - require_once $file; + // not bundled, see if its an enabled renderer plugin & when $mode is 'xhtml', the renderer can supply that format. + /** @var Doku_Renderer $Renderer */ + $Renderer = $plugin_controller->load('renderer',$rname); + if ($Renderer && is_a($Renderer, 'Doku_Renderer') && ($mode != 'xhtml' || $mode == $Renderer->getFormat())) { + return $Renderer; + } - if ( !class_exists($rclass) ) { - trigger_error("Unable to resolve render class $rclass",E_USER_WARNING); - msg("Renderer '$rname' for $mode not valid",-1); - return null; + // there is a configuration error! + // not bundled, not a valid enabled plugin, use $mode to try to fallback to a bundled renderer + $rclass = "Doku_Renderer_$mode"; + if ( class_exists($rclass) ) { + // viewers should see renderered output, so restrict the warning to admins only + $msg = "No renderer '$rname' found for mode '$mode', check your plugins"; + if ($mode == 'xhtml') { + $msg .= " and the 'renderer_xhtml' config setting"; } - $Renderer = new $rclass(); - }else{ - // Maybe a plugin/component is available? - $Renderer = $plugin_controller->load('renderer',$rname); + $msg .= ".<br/>Attempting to fallback to the bundled renderer."; + msg($msg,-1,'','',MSG_ADMINS_ONLY); - if(!isset($Renderer) || is_null($Renderer)){ - msg("No renderer '$rname' found for mode '$mode'",-1); - return null; - } + $Renderer = new $rclass; + $Renderer->nocache(); // fallback only (and may include admin alerts), don't cache + return $Renderer; } - return $Renderer; + // fallback failed, alert the world + msg("No renderer '$rname' found for mode '$mode'",-1); + return null; } /** @@ -663,8 +716,8 @@ function & p_get_renderer($mode) { * METADATA_RENDER_USING_SIMPLE_CACHE, * METADATA_RENDER_USING_CACHE, * METADATA_RENDER_UNLIMITED - * * @return string|null The first heading + * * @author Andreas Gohr <andi@splitbrain.org> * @author Michael Hamann <michael@content-space.de> */ @@ -678,8 +731,8 @@ function p_get_first_heading($id, $render=METADATA_RENDER_USING_SIMPLE_CACHE){ * @param string $code source code to be highlighted * @param string $language language to provide highlighting * @param string $wrapper html element to wrap the returned highlighted text - * * @return string xhtml code + * * @author Christopher Smith <chris@jalakai.co.uk> * @author Andreas Gohr <andi@splitbrain.org> */ diff --git a/inc/plugin.php b/inc/plugin.php index dccd37bd9..f2ad95e2e 100644 --- a/inc/plugin.php +++ b/inc/plugin.php @@ -30,33 +30,45 @@ class DokuWiki_Plugin { * desc - Short description of the plugin (Text only) * url - Website with more information on the plugin (eg. syntax description) */ - function getInfo(){ - $parts = explode('_',get_class($this)); - $info = DOKU_PLUGIN.'/'.$parts[2].'/plugin.info.txt'; - if(@file_exists($info)) return confToHash($info); - - msg('getInfo() not implemented in '.get_class($this). - ' and '.$info.' not found.<br />This is a bug in the '. - $parts[2].' plugin and should be reported to the '. - 'plugin author.',-1); + public function getInfo(){ + $parts = explode('_', get_class($this)); + $info = DOKU_PLUGIN . '/' . $parts[2] . '/plugin.info.txt'; + if(file_exists($info)) return confToHash($info); + + msg( + 'getInfo() not implemented in ' . get_class($this) . ' and ' . $info . ' not found.<br />' . + 'Verify you\'re running the latest version of the plugin. If the problem persists, send a ' . + 'bug report to the author of the ' . $parts[2] . ' plugin.', -1 + ); return array( - 'date' => '0000-00-00', - 'name' => $parts[2].' plugin', + 'date' => '0000-00-00', + 'name' => $parts[2] . ' plugin', ); } // plugin introspection methods // extract from class name, format = <plugin type>_plugin_<name>[_<component name>] - function getPluginType() { + /** + * @return string plugin type + */ + public function getPluginType() { list($t) = explode('_', get_class($this), 2); return $t; } - function getPluginName() { - list($t, $p, $n) = explode('_', get_class($this), 4); + + /** + * @return string plugin name + */ + public function getPluginName() { + list(/* $t */, /* $p */, $n) = explode('_', get_class($this), 4); return $n; } - function getPluginComponent() { - list($t, $p, $n, $c) = explode('_', get_class($this), 4); + + /** + * @return string component name + */ + public function getPluginComponent() { + list(/* $t */, /* $p */, /* $n */, $c) = explode('_', get_class($this), 4); return (isset($c)?$c:''); } @@ -70,7 +82,7 @@ class DokuWiki_Plugin { * @param string $id id of the string to be retrieved * @return string string in appropriate language or english if not available */ - function getLang($id) { + public function getLang($id) { if (!$this->localised) $this->setupLocale(); return (isset($this->lang[$id]) ? $this->lang[$id] : ''); @@ -85,22 +97,24 @@ class DokuWiki_Plugin { * @param string $id id of language dependent wiki page * @return string parsed contents of the wiki page in xhtml format */ - function locale_xhtml($id) { + public function locale_xhtml($id) { return p_cached_output($this->localFN($id)); } /** - * localFN($id) - * prepends appropriate path for a language dependent filename + * Prepends appropriate path for a language dependent filename * plugin equivalent of localFN() + * + * @param string $id id of localization file + * @return string wiki text */ - function localFN($id) { + public function localFN($id) { global $conf; $plugin = $this->getPluginName(); $file = DOKU_CONF.'plugin_lang/'.$plugin.'/'.$conf['lang'].'/'.$id.'.txt'; - if (!@file_exists($file)){ + if (!file_exists($file)){ $file = DOKU_PLUGIN.$plugin.'/lang/'.$conf['lang'].'/'.$id.'.txt'; - if(!@file_exists($file)){ + if(!file_exists($file)){ //fall back to english $file = DOKU_PLUGIN.$plugin.'/lang/en/'.$id.'.txt'; } @@ -109,21 +123,33 @@ class DokuWiki_Plugin { } /** - * setupLocale() - * reads all the plugins language dependent strings into $this->lang - * this function is automatically called by getLang() + * Reads all the plugins language dependent strings into $this->lang + * this function is automatically called by getLang() */ function setupLocale() { - if ($this->localised) return; + if($this->localised) return; - global $conf; // definitely don't invoke "global $lang" - $path = DOKU_PLUGIN.$this->getPluginName().'/lang/'; + global $conf, $config_cascade; // definitely don't invoke "global $lang" + $path = DOKU_PLUGIN . $this->getPluginName() . '/lang/'; $lang = array(); // don't include once, in case several plugin components require the same language file - @include($path.'en/lang.php'); - if ($conf['lang'] != 'en') @include($path.$conf['lang'].'/lang.php'); + @include($path . 'en/lang.php'); + foreach($config_cascade['lang']['plugin'] as $config_file) { + if(file_exists($config_file . $this->getPluginName() . '/en/lang.php')) { + include($config_file . $this->getPluginName() . '/en/lang.php'); + } + } + + if($conf['lang'] != 'en') { + @include($path . $conf['lang'] . '/lang.php'); + foreach($config_cascade['lang']['plugin'] as $config_file) { + if(file_exists($config_file . $this->getPluginName() . '/' . $conf['lang'] . '/lang.php')) { + include($config_file . $this->getPluginName() . '/' . $conf['lang'] . '/lang.php'); + } + } + } $this->lang = $lang; $this->localised = true; @@ -139,7 +165,7 @@ class DokuWiki_Plugin { * @param mixed $notset what to return if the setting is not available * @return mixed */ - function getConf($setting, $notset=false){ + public function getConf($setting, $notset=false){ if (!$this->configloaded){ $this->loadConfig(); } @@ -176,12 +202,12 @@ class DokuWiki_Plugin { * * @return array setting => value */ - function readDefaultSettings() { + protected function readDefaultSettings() { $path = DOKU_PLUGIN.$this->getPluginName().'/conf/'; $conf = array(); - if (@file_exists($path.'default.php')) { + if (file_exists($path.'default.php')) { include($path.'default.php'); } @@ -195,10 +221,9 @@ class DokuWiki_Plugin { * * @param string $name name of plugin to load * @param bool $msg if a message should be displayed in case the plugin is not available - * - * @return object helper plugin object + * @return DokuWiki_Plugin|null helper plugin object */ - function loadHelper($name, $msg = true){ + public function loadHelper($name, $msg = true){ $obj = plugin_load('helper',$name); if (is_null($obj) && $msg) msg("Helper plugin $name is not available or invalid.",-1); return $obj; @@ -210,8 +235,14 @@ class DokuWiki_Plugin { /** * email * standardised function to generate an email link according to obfuscation settings + * + * @param string $email + * @param string $name + * @param string $class + * @param string $more + * @return string html */ - function email($email, $name='', $class='', $more='') { + public function email($email, $name='', $class='', $more='') { if (!$email) return $name; $email = obfuscate($email); if (!$name) $name = $email; @@ -222,8 +253,15 @@ class DokuWiki_Plugin { /** * external_link * standardised function to generate an external link according to conf settings + * + * @param string $link + * @param string $title + * @param string $class + * @param string $target + * @param string $more + * @return string */ - function external_link($link, $title='', $class='', $target='', $more='') { + public function external_link($link, $title='', $class='', $target='', $more='') { global $conf; $link = htmlentities($link); @@ -239,10 +277,37 @@ class DokuWiki_Plugin { } /** + * A fallback to provide access to the old render() method + * + * Since syntax plugins provide their own render method with a different signature and they now + * inherit from Doku_Plugin we can no longer have a render() method here (Strict Standards Violation). + * Instead use render_text() + * + * @deprecated 2014-01-22 + * + * @param string $name + * @param array $arguments + * @return null|string + */ + public function __call($name, $arguments) { + if($name == 'render'){ + dbg_deprecated('render_text()'); + if(!isset($arguments[1])) $arguments[1] = 'xhtml'; + return $this->render_text($arguments[0], $arguments[1]); + } + trigger_error("no such method $name", E_USER_ERROR); + return null; + } + + /** * output text string through the parser, allows dokuwiki markup to be used * very ineffecient for small pieces of data - try not to use + * + * @param string $text wiki markup to parse + * @param string $format output format + * @return null|string */ - function render($text, $format='xhtml') { + public function render_text($text, $format='xhtml') { return p_render($format, p_get_instructions($text),$info); } @@ -251,7 +316,7 @@ class DokuWiki_Plugin { * * @return bool false if the plugin has to be instantiated */ - function isSingleton() { + public function isSingleton() { return true; } } diff --git a/inc/plugincontroller.class.php b/inc/plugincontroller.class.php index d80cd4c9e..8d20f885d 100644 --- a/inc/plugincontroller.class.php +++ b/inc/plugincontroller.class.php @@ -66,14 +66,14 @@ class Doku_Plugin_Controller { * @param $name string name of the plugin to load * @param $new bool true to return a new instance of the plugin, false to use an already loaded instance * @param $disabled bool true to load even disabled plugins - * @return DokuWiki_Plugin|DokuWiki_Syntax_Plugin|null the plugin object or null on failure + * @return DokuWiki_Plugin|DokuWiki_Syntax_Plugin|DokuWiki_Auth_Plugin|DokuWiki_Admin_Plugin|DokuWiki_Action_Plugin|DokuWiki_Remote_Plugin|null the plugin object or null on failure */ public function load($type,$name,$new=false,$disabled=false){ //we keep all loaded plugins available in global scope for reuse global $DOKU_PLUGINS; - list($plugin,$component) = $this->_splitName($name); + list($plugin, /* $component */) = $this->_splitName($name); // check if disabled if(!$disabled && $this->isdisabled($plugin)){ @@ -114,7 +114,7 @@ class Doku_Plugin_Controller { * Whether plugin is disabled * * @param string $plugin name of plugin - * @return bool; true disabled, false enabled + * @return bool true disabled, false enabled */ public function isdisabled($plugin) { return empty($this->tmp_plugins[$plugin]); @@ -124,7 +124,7 @@ class Doku_Plugin_Controller { * Disable the plugin * * @param string $plugin name of plugin - * @return bool; true saving succeed, false saving failed + * @return bool true saving succeed, false saving failed */ public function disable($plugin) { if(array_key_exists($plugin,$this->plugin_cascade['protected'])) return false; @@ -136,7 +136,7 @@ class Doku_Plugin_Controller { * Enable the plugin * * @param string $plugin name of plugin - * @return bool; true saving succeed, false saving failed + * @return bool true saving succeed, false saving failed */ public function enable($plugin) { if(array_key_exists($plugin,$this->plugin_cascade['protected'])) return false; @@ -177,9 +177,11 @@ class Doku_Plugin_Controller { // disabling mechanism was changed back very soon again // to keep everything simple we just skip the plugin completely continue; - } elseif (@file_exists(DOKU_PLUGIN.$plugin.'/disabled')) { - // treat this as a default disabled plugin(over-rideable by the plugin manager) - // deprecated 2011-09-10 (usage of disabled files) + } elseif (file_exists(DOKU_PLUGIN.$plugin.'/disabled')) { + /** + * treat this as a default disabled plugin(over-rideable by the plugin manager) + * @deprecated 2011-09-10 (usage of disabled files) + */ if (empty($this->plugin_cascade['local'][$plugin])) { $all_plugins[$plugin] = 0; } else { @@ -227,7 +229,7 @@ class Doku_Plugin_Controller { * @param bool $forceSave; * false to save only when config changed * true to always save - * @return bool; true saving succeed, false saving failed + * @return bool true saving succeed, false saving failed */ protected function saveList($forceSave = false) { global $conf; @@ -245,9 +247,9 @@ class Doku_Plugin_Controller { $out .= "\$plugins['$plugin'] = $value;\n"; } // backup current file (remove any existing backup) - if (@file_exists($file)) { + if (file_exists($file)) { $backup = $file.'.bak'; - if (@file_exists($backup)) @unlink($backup); + if (file_exists($backup)) @unlink($backup); if (!@copy($file,$backup)) return false; if (!empty($conf['fperm'])) chmod($backup, $conf['fperm']); } @@ -280,7 +282,7 @@ class Doku_Plugin_Controller { /** * Build the list of plugins and cascade - * + * */ protected function loadConfig() { global $config_cascade; @@ -300,35 +302,37 @@ class Doku_Plugin_Controller { /** * Returns a list of available plugin components of given type * - * @param string $type, plugin_type name; - * the type of plugin to return, - * @param bool $enabled; - * true to return enabled plugins, - * false to return disabled plugins - * + * @param string $type plugin_type name; the type of plugin to return, + * @param bool $enabled true to return enabled plugins, + * false to return disabled plugins * @return array of plugin components of requested type */ protected function _getListByType($type, $enabled) { $master_list = $enabled ? array_keys(array_filter($this->tmp_plugins)) : array_keys(array_filter($this->tmp_plugins,array($this,'negate'))); - $plugins = array(); + foreach ($master_list as $plugin) { - $dir = $this->get_directory($plugin); - if (@file_exists(DOKU_PLUGIN."$dir/$type.php")){ + $basedir = $this->get_directory($plugin); + if (file_exists(DOKU_PLUGIN."$basedir/$type.php")){ $plugins[] = $plugin; - } else { - if ($dp = @opendir(DOKU_PLUGIN."$dir/$type/")) { + continue; + } + + $typedir = DOKU_PLUGIN."$basedir/$type/"; + if (is_dir($typedir)) { + if ($dp = opendir($typedir)) { while (false !== ($component = readdir($dp))) { if (substr($component,0,1) == '.' || strtolower(substr($component, -4)) != ".php") continue; - if (is_file(DOKU_PLUGIN."$dir/$type/$component")) { + if (is_file($typedir.$component)) { $plugins[] = $plugin.'_'.substr($component, 0, -4); } } closedir($dp); } } - } + + }//foreach return $plugins; } diff --git a/inc/pluginutils.php b/inc/pluginutils.php index 894bbefb6..4d591869d 100644 --- a/inc/pluginutils.php +++ b/inc/pluginutils.php @@ -37,7 +37,7 @@ function plugin_list($type='',$all=false) { * @param $name string name of the plugin to load * @param $new bool true to return a new instance of the plugin, false to use an already loaded instance * @param $disabled bool true to load even disabled plugins - * @return DokuWiki_Plugin|DokuWiki_Syntax_Plugin|null the plugin object or null on failure + * @return DokuWiki_Plugin|null the plugin object or null on failure */ function plugin_load($type,$name,$new=false,$disabled=false) { /** @var $plugin_controller Doku_Plugin_Controller */ @@ -49,7 +49,7 @@ function plugin_load($type,$name,$new=false,$disabled=false) { * Whether plugin is disabled * * @param string $plugin name of plugin - * @return bool; true disabled, false enabled + * @return bool true disabled, false enabled */ function plugin_isdisabled($plugin) { /** @var $plugin_controller Doku_Plugin_Controller */ @@ -61,7 +61,7 @@ function plugin_isdisabled($plugin) { * Enable the plugin * * @param string $plugin name of plugin - * @return bool; true saving succeed, false saving failed + * @return bool true saving succeed, false saving failed */ function plugin_enable($plugin) { /** @var $plugin_controller Doku_Plugin_Controller */ @@ -73,7 +73,7 @@ function plugin_enable($plugin) { * Disable the plugin * * @param string $plugin name of plugin - * @return bool; true saving succeed, false saving failed + * @return bool true saving succeed, false saving failed */ function plugin_disable($plugin) { /** @var $plugin_controller Doku_Plugin_Controller */ diff --git a/inc/remote.php b/inc/remote.php index 2ef28afd2..861353a19 100644 --- a/inc/remote.php +++ b/inc/remote.php @@ -60,6 +60,9 @@ class RemoteAPI { private $dateTransformation; private $fileTransformation; + /** + * constructor + */ public function __construct() { $this->dateTransformation = array($this, 'dummyTransformation'); $this->fileTransformation = array($this, 'dummyTransformation'); @@ -75,7 +78,7 @@ class RemoteAPI { } /** - * call a method via remote api. + * Call a method via remote api. * * @param string $method name of the method to call. * @param array $args arguments to pass to the given method @@ -85,7 +88,7 @@ class RemoteAPI { if ($args === null) { $args = array(); } - list($type, $pluginName, $call) = explode('.', $method, 3); + list($type, $pluginName, /* $call */) = explode('.', $method, 3); if ($type === 'plugin') { return $this->callPlugin($pluginName, $method, $args); } @@ -95,11 +98,25 @@ class RemoteAPI { return $this->callCustomCallPlugin($method, $args); } + /** + * Check existance of core methods + * + * @param string $name name of the method + * @return bool if method exists + */ private function coreMethodExist($name) { $coreMethods = $this->getCoreMethods(); return array_key_exists($name, $coreMethods); } + /** + * Try to call custom methods provided by plugins + * + * @param string $method name of method + * @param array $args + * @return mixed + * @throws RemoteException if method not exists + */ private function callCustomCallPlugin($method, $args) { $customCalls = $this->getCustomCallPlugins(); if (!array_key_exists($method, $customCalls)) { @@ -109,6 +126,12 @@ class RemoteAPI { return $this->callPlugin($customCall[0], $customCall[1], $args); } + /** + * Returns plugin calls that are registered via RPC_CALL_ADD action + * + * @return array with pairs of custom plugin calls + * @triggers RPC_CALL_ADD + */ private function getCustomCallPlugins() { if ($this->pluginCustomCalls === null) { $data = array(); @@ -118,6 +141,15 @@ class RemoteAPI { return $this->pluginCustomCalls; } + /** + * Call a plugin method + * + * @param string $pluginName + * @param string $method method name + * @param array $args + * @return mixed return of custom method + * @throws RemoteException + */ private function callPlugin($pluginName, $method, $args) { $plugin = plugin_load('remote', $pluginName); $methods = $this->getPluginMethods(); @@ -129,6 +161,14 @@ class RemoteAPI { return call_user_func_array(array($plugin, $name), $args); } + /** + * Call a core method + * + * @param string $method name of method + * @param array $args + * @return mixed + * @throws RemoteException if method not exist + */ private function callCoreMethod($method, $args) { $coreMethods = $this->getCoreMethods(); $this->checkAccess($coreMethods[$method]); @@ -139,6 +179,11 @@ class RemoteAPI { return call_user_func_array(array($this->coreMethods, $this->getMethodName($coreMethods, $method)), $args); } + /** + * Check if access should be checked + * + * @param array $methodMeta data about the method + */ private function checkAccess($methodMeta) { if (!isset($methodMeta['public'])) { $this->forceAccess(); @@ -149,12 +194,26 @@ class RemoteAPI { } } - private function checkArgumentLength($method, $args) { - if (count($method['args']) < count($args)) { + /** + * Check the number of parameters + * + * @param array $methodMeta data about the method + * @param array $args + * @throws RemoteException if wrong parameter count + */ + private function checkArgumentLength($methodMeta, $args) { + if (count($methodMeta['args']) < count($args)) { throw new RemoteException('Method does not exist - wrong parameter count.', -32603); } } + /** + * Determine the name of the real method + * + * @param array $methodMeta list of data of the methods + * @param string $method name of method + * @return string + */ private function getMethodName($methodMeta, $method) { if (isset($methodMeta[$method]['name'])) { return $methodMeta[$method]['name']; @@ -164,11 +223,16 @@ class RemoteAPI { } /** + * Perform access check for current user + * * @return bool true if the current user has access to remote api. */ public function hasAccess() { global $conf; global $USERINFO; + /** @var Input $INPUT */ + global $INPUT; + if (!$conf['remote']) { return false; } @@ -179,12 +243,14 @@ class RemoteAPI { return true; } - return auth_isMember($conf['remoteuser'], $_SERVER['REMOTE_USER'], (array) $USERINFO['grps']); + return auth_isMember($conf['remoteuser'], $INPUT->server->str('REMOTE_USER'), (array) $USERINFO['grps']); } /** - * @throws RemoteException On denied access. + * Requests access + * * @return void + * @throws RemoteException On denied access. */ public function forceAccess() { if (!$this->hasAccess()) { @@ -193,7 +259,10 @@ class RemoteAPI { } /** + * Collects all the methods of the enabled Remote Plugins + * * @return array all plugin methods. + * @throws RemoteException if not implemented */ public function getPluginMethods() { if ($this->pluginMethods === null) { @@ -201,6 +270,7 @@ class RemoteAPI { $plugins = plugin_list('remote'); foreach ($plugins as $pluginName) { + /** @var DokuWiki_Remote_Plugin $plugin */ $plugin = plugin_load('remote', $pluginName); if (!is_subclass_of($plugin, 'DokuWiki_Remote_Plugin')) { throw new RemoteException("Plugin $pluginName does not implement DokuWiki_Remote_Plugin"); @@ -216,6 +286,8 @@ class RemoteAPI { } /** + * Collects all the core methods + * * @param RemoteAPICore $apiCore this parameter is used for testing. Here you can pass a non-default RemoteAPICore * instance. (for mocking) * @return array all core methods. @@ -231,22 +303,50 @@ class RemoteAPI { return $this->coreMethods->__getRemoteInfo(); } + /** + * Transform file to xml + * + * @param mixed $data + * @return mixed + */ public function toFile($data) { return call_user_func($this->fileTransformation, $data); } + /** + * Transform date to xml + * + * @param mixed $data + * @return mixed + */ public function toDate($data) { return call_user_func($this->dateTransformation, $data); } + /** + * A simple transformation + * + * @param mixed $data + * @return mixed + */ public function dummyTransformation($data) { return $data; } + /** + * Set the transformer function + * + * @param callback $dateTransformation + */ public function setDateTransformation($dateTransformation) { $this->dateTransformation = $dateTransformation; } + /** + * Set the transformer function + * + * @param callback $fileTransformation + */ public function setFileTransformation($fileTransformation) { $this->fileTransformation = $fileTransformation; } diff --git a/inc/search.php b/inc/search.php index c2d31b959..935969d3f 100644 --- a/inc/search.php +++ b/inc/search.php @@ -134,6 +134,11 @@ function search_namespaces(&$data,$base,$file,$type,$lvl,$opts){ /** * List all mediafiles in a namespace + * $opts['depth'] recursion level, 0 for all + * $opts['showmsg'] shows message if invalid media id is used + * $opts['skipacl'] skip acl checking + * $opts['pattern'] check given pattern + * $opts['hash'] add hashes to result list * * @author Andreas Gohr <andi@splitbrain.org> */ @@ -141,7 +146,7 @@ function search_media(&$data,$base,$file,$type,$lvl,$opts){ //we do nothing with directories if($type == 'd') { - if(!$opts['depth']) return true; // recurse forever + if(empty($opts['depth'])) return true; // recurse forever $depth = substr_count($file,'/'); if($depth >= $opts['depth']) return false; // depth reached return true; @@ -157,12 +162,12 @@ function search_media(&$data,$base,$file,$type,$lvl,$opts){ //check ACL for namespace (we have no ACL for mediafiles) $info['perm'] = auth_quickaclcheck(getNS($info['id']).':*'); - if(!$opts['skipacl'] && $info['perm'] < AUTH_READ){ + if(empty($opts['skipacl']) && $info['perm'] < AUTH_READ){ return false; } //check pattern filter - if($opts['pattern'] && !@preg_match($opts['pattern'], $info['id'])){ + if(!empty($opts['pattern']) && !@preg_match($opts['pattern'], $info['id'])){ return false; } @@ -176,7 +181,7 @@ function search_media(&$data,$base,$file,$type,$lvl,$opts){ }else{ $info['isimg'] = false; } - if($opts['hash']){ + if(!empty($opts['hash'])){ $info['hash'] = md5(io_readFile(mediaFN($info['id']),false)); } @@ -258,6 +263,7 @@ function search_allpages(&$data,$base,$file,$type,$lvl,$opts){ //only search txt files if(substr($file,-4) != '.txt') return true; + $item = array(); $item['id'] = pathID($file); if(!$opts['skipacl'] && auth_quickaclcheck($item['id']) < AUTH_READ){ return false; @@ -317,25 +323,25 @@ function pathID($path,$keeptxt=false){ * How the function behaves, depends on the options passed in the $opts * array, where the following settings can be used. * - * depth int recursion depth. 0 for unlimited - * keeptxt bool keep .txt extension for IDs - * listfiles bool include files in listing - * listdirs bool include namespaces in listing - * pagesonly bool restrict files to pages - * skipacl bool do not check for READ permission - * sneakyacl bool don't recurse into nonreadable dirs - * hash bool create MD5 hash for files - * meta bool return file metadata - * filematch string match files against this regexp - * idmatch string match full ID against this regexp - * dirmatch string match directory against this regexp when adding - * nsmatch string match namespace against this regexp when adding - * recmatch string match directory against this regexp when recursing - * showmsg bool warn about non-ID files - * showhidden bool show hidden files too - * firsthead bool return first heading for pages + * depth int recursion depth. 0 for unlimited (default: 0) + * keeptxt bool keep .txt extension for IDs (default: false) + * listfiles bool include files in listing (default: false) + * listdirs bool include namespaces in listing (default: false) + * pagesonly bool restrict files to pages (default: false) + * skipacl bool do not check for READ permission (default: false) + * sneakyacl bool don't recurse into nonreadable dirs (default: false) + * hash bool create MD5 hash for files (default: false) + * meta bool return file metadata (default: false) + * filematch string match files against this regexp (default: '', so accept everything) + * idmatch string match full ID against this regexp (default: '', so accept everything) + * dirmatch string match directory against this regexp when adding (default: '', so accept everything) + * nsmatch string match namespace against this regexp when adding (default: '', so accept everything) + * recmatch string match directory against this regexp when recursing (default: '', so accept everything) + * showmsg bool warn about non-ID files (default: false) + * showhidden bool show hidden files(e.g. by hidepages config) too (default: false) + * firsthead bool return first heading for pages (default: false) * - * @param array &$data - Reference to the result data structure + * @param array &$data - Reference to the result data structure * @param string $base - Base usually $conf['datadir'] * @param string $file - current file or directory relative to $base * @param string $type - Type either 'd' for directory or 'f' for file @@ -351,17 +357,18 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){ $return = true; // get ID and check if it is a valid one - $item['id'] = pathID($file,($type == 'd' || $opts['keeptxt'])); + $item['id'] = pathID($file,($type == 'd' || !empty($opts['keeptxt']))); if($item['id'] != cleanID($item['id'])){ - if($opts['showmsg']) + if(!empty($opts['showmsg'])){ msg(hsc($item['id']).' is not a valid file name for DokuWiki - skipped',-1); + } return false; // skip non-valid files } $item['ns'] = getNS($item['id']); if($type == 'd') { // decide if to recursion into this directory is wanted - if(!$opts['depth']){ + if(empty($opts['depth'])){ $return = true; // recurse forever }else{ $depth = substr_count($file,'/'); @@ -371,8 +378,12 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){ $return = true; } } - if($return && !preg_match('/'.$opts['recmatch'].'/',$file)){ - $return = false; // doesn't match + + if ($return) { + $match = empty($opts['recmatch']) || preg_match('/'.$opts['recmatch'].'/',$file); + if (!$match) { + return false; // doesn't match + } } } @@ -407,7 +418,7 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){ $item['level'] = $lvl; $item['open'] = $return; - if($opts['meta']){ + if(!empty($opts['meta'])){ $item['file'] = utf8_basename($file); $item['size'] = filesize($base.'/'.$file); $item['mtime'] = filemtime($base.'/'.$file); @@ -417,8 +428,8 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){ } if($type == 'f'){ - if($opts['hash']) $item['hash'] = md5(io_readFile($base.'/'.$file,false)); - if($opts['firsthead']) $item['title'] = p_get_first_heading($item['id'],METADATA_DONT_RENDER); + if(!empty($opts['hash'])) $item['hash'] = md5(io_readFile($base.'/'.$file,false)); + if(!empty($opts['firsthead'])) $item['title'] = p_get_first_heading($item['id'],METADATA_DONT_RENDER); } // finally add the item diff --git a/inc/subscription.php b/inc/subscription.php index ddf2f39e6..8b6dcb27e 100644 --- a/inc/subscription.php +++ b/inc/subscription.php @@ -166,7 +166,7 @@ class Subscription { // Handle files. $result = array(); foreach($files as $target => $file) { - if(!@file_exists($file)) continue; + if(!file_exists($file)) continue; $lines = file($file); foreach($lines as $line) { @@ -256,8 +256,10 @@ class Subscription { if(!$this->isenabled()) return false; global $ID; + /** @var Input $INPUT */ + global $INPUT; if(!$id) $id = $ID; - if(!$user) $user = $_SERVER['REMOTE_USER']; + if(!$user) $user = $INPUT->server->str('REMOTE_USER'); $subs = $this->subscribers($id, $user); if(!count($subs)) return false; @@ -288,17 +290,19 @@ class Subscription { public function send_bulk($page) { if(!$this->isenabled()) return 0; - /** @var auth_basic $auth */ + /** @var DokuWiki_Auth_Plugin $auth */ global $auth; global $conf; global $USERINFO; + /** @var Input $INPUT */ + global $INPUT; $count = 0; $subscriptions = $this->subscribers($page, null, array('digest', 'list')); // remember current user info $olduinfo = $USERINFO; - $olduser = $_SERVER['REMOTE_USER']; + $olduser = $INPUT->server->str('REMOTE_USER'); foreach($subscriptions as $target => $users) { if(!$this->lock($target)) continue; @@ -315,7 +319,7 @@ class Subscription { // Work as the user to make sure ACLs apply correctly $USERINFO = $auth->getUserData($user); - $_SERVER['REMOTE_USER'] = $user; + $INPUT->server->set('REMOTE_USER',$user); if($USERINFO === false) continue; if(!$USERINFO['mail']) continue; @@ -334,9 +338,10 @@ class Subscription { foreach($changes as $rev) { $n = 0; while(!is_null($rev) && $rev['date'] >= $lastupdate && - ($_SERVER['REMOTE_USER'] === $rev['user'] || + ($INPUT->server->str('REMOTE_USER') === $rev['user'] || $rev['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT)) { - $rev = getRevisions($rev['id'], $n++, 1); + $pagelog = new PageChangeLog($rev['id']); + $rev = $pagelog->getRevisions($n++, 1); $rev = (count($rev) > 0) ? $rev[0] : null; } @@ -369,7 +374,7 @@ class Subscription { // restore current user info $USERINFO = $olduinfo; - $_SERVER['REMOTE_USER'] = $olduser; + $INPUT->server->set('REMOTE_USER',$olduser); return $count; } @@ -439,17 +444,17 @@ class Subscription { * Send the diff for some media change * * @fixme this should embed thumbnails of images in HTML version + * * @param string $subscriber_mail The target mail address * @param string $template Mail template ('uploadmail', ...) * @param string $id Media file for which the notification is * @param int|bool $rev Old revision if any - * @return bool true if successfully sent */ public function send_media_diff($subscriber_mail, $template, $id, $rev = false) { global $conf; $file = mediaFN($id); - list($mime, $ext) = mimetype($id); + list($mime, /* $ext */) = mimetype($id); $trep = array( 'MIME' => $mime, @@ -510,14 +515,15 @@ class Subscription { * @author Adrian Lang <lang@cosmocode.de> * * @param string $subscriber_mail The target mail address - * @param array $id The ID + * @param string $id The ID * @param int $lastupdate Time of the last notification * @return bool */ protected function send_digest($subscriber_mail, $id, $lastupdate) { + $pagelog = new PageChangeLog($id); $n = 0; do { - $rev = getRevisions($id, $n++, 1); + $rev = $pagelog->getRevisions($n++, 1); $rev = (count($rev) > 0) ? $rev[0] : null; } while(!is_null($rev) && $rev > $lastupdate); @@ -613,6 +619,7 @@ class Subscription { /** * Get a valid message id for a certain $id and revision (or the current revision) + * * @param string $id The id of the page (or media file) the message id should be for * @param string $rev The revision of the page, set to the current revision of the page $id if not set * @return string @@ -644,16 +651,20 @@ class Subscription { * @todo move the whole functionality into this class, trigger SUBSCRIPTION_NOTIFY_ADDRESSLIST instead, * use an array for the addresses within it * - * @param array &$data Containing $id (the page id), $self (whether the author - * should be notified, $addresslist (current email address - * list) + * @param array &$data Containing the entries: + * - $id (the page id), + * - $self (whether the author should be notified, + * - $addresslist (current email address list) + * - $replacements (array of additional string substitutions, @KEY@ to be replaced by value) */ public function notifyaddresses(&$data) { if(!$this->isenabled()) return; - /** @var auth_basic $auth */ + /** @var DokuWiki_Auth_Plugin $auth */ global $auth; global $conf; + /** @var Input $INPUT */ + global $INPUT; $id = $data['id']; $self = $data['self']; @@ -667,7 +678,7 @@ class Subscription { $userinfo = $auth->getUserData($user); if($userinfo === false) continue; if(!$userinfo['mail']) continue; - if(!$self && $user == $_SERVER['REMOTE_USER']) continue; //skip our own changes + if(!$self && $user == $INPUT->server->str('REMOTE_USER')) continue; //skip our own changes $level = auth_aclcheck($id, $user, $userinfo['grps']); if($level >= AUTH_READ) { @@ -692,6 +703,7 @@ class Subscription { * @deprecated 2012-12-07 */ function subscription_addresslist(&$data) { + dbg_deprecated('class Subscription'); $sub = new Subscription(); $sub->notifyaddresses($data); } diff --git a/inc/template.php b/inc/template.php index 60e178d1a..a4ace1a63 100644 --- a/inc/template.php +++ b/inc/template.php @@ -68,6 +68,7 @@ function tpl_basedir($tpl='') { * handled by this function. ACL stuff is not done here either. * * @author Andreas Gohr <andi@splitbrain.org> + * * @triggers TPL_ACT_RENDER * @triggers TPL_CONTENT_DISPLAY * @param bool $prependTOC should the TOC be displayed here? @@ -154,7 +155,7 @@ function tpl_content_core() { html_resendpwd(); break; case 'denied': - print p_locale_xhtml('denied'); + html_denied(); break; case 'profile' : html_updateprofile(); @@ -170,8 +171,9 @@ function tpl_content_core() { break; default: $evt = new Doku_Event('TPL_ACT_UNKNOWN', $ACT); - if($evt->advise_before()) + if($evt->advise_before()) { msg("Failed to handle command: ".hsc($ACT), -1); + } $evt->advise_after(); unset($evt); return false; @@ -186,6 +188,7 @@ function tpl_content_core() { * a false argument * * @author Andreas Gohr <andi@splitbrain.org> + * * @param bool $return Should the TOC be returned instead to be printed? * @return string */ @@ -204,13 +207,13 @@ function tpl_toc($return = false) { $toc = $TOC; } elseif(($ACT == 'show' || substr($ACT, 0, 6) == 'export') && !$REV && $INFO['exists']) { // get TOC from metadata, render if neccessary - $meta = p_get_metadata($ID, false, METADATA_RENDER_USING_CACHE); + $meta = p_get_metadata($ID, '', METADATA_RENDER_USING_CACHE); if(isset($meta['internal']['toc'])) { $tocok = $meta['internal']['toc']; } else { $tocok = true; } - $toc = $meta['description']['tableofcontents']; + $toc = isset($meta['description']['tableofcontents']) ? $meta['description']['tableofcontents'] : null; if(!$tocok || !is_array($toc) || !$conf['tocminheads'] || count($toc) < $conf['tocminheads']) { $toc = array(); } @@ -243,6 +246,8 @@ function tpl_toc($return = false) { * Handle the admin page contents * * @author Andreas Gohr <andi@splitbrain.org> + * + * @return bool */ function tpl_admin() { global $INFO; @@ -277,6 +282,7 @@ function tpl_admin() { * This has to go into the head section of your template. * * @author Andreas Gohr <andi@splitbrain.org> + * * @triggers TPL_METAHEADER_OUTPUT * @param bool $alt Should feeds and alternative format links be added? * @return bool @@ -291,6 +297,8 @@ function tpl_metaheaders($alt = true) { global $lang; global $conf; global $updateVersion; + /** @var Input $INPUT */ + global $INPUT; // prepare the head array $head = array(); @@ -316,15 +324,17 @@ function tpl_metaheaders($alt = true) { } if($alt) { - $head['link'][] = array( - 'rel' => 'alternate', 'type'=> 'application/rss+xml', - 'title'=> $lang['btn_recent'], 'href'=> DOKU_BASE.'feed.php' - ); - $head['link'][] = array( - 'rel' => 'alternate', 'type'=> 'application/rss+xml', - 'title'=> $lang['currentns'], - 'href' => DOKU_BASE.'feed.php?mode=list&ns='.$INFO['namespace'] - ); + if(actionOK('rss')) { + $head['link'][] = array( + 'rel' => 'alternate', 'type'=> 'application/rss+xml', + 'title'=> $lang['btn_recent'], 'href'=> DOKU_BASE.'feed.php' + ); + $head['link'][] = array( + 'rel' => 'alternate', 'type'=> 'application/rss+xml', + 'title'=> $lang['currentns'], + 'href' => DOKU_BASE.'feed.php?mode=list&ns='.$INFO['namespace'] + ); + } if(($ACT == 'show' || $ACT == 'search') && $INFO['writable']) { $head['link'][] = array( 'rel' => 'edit', @@ -333,7 +343,7 @@ function tpl_metaheaders($alt = true) { ); } - if($ACT == 'search') { + if(actionOK('rss') && $ACT == 'search') { $head['link'][] = array( 'rel' => 'alternate', 'type'=> 'application/rss+xml', 'title'=> $lang['searchresult'], @@ -365,7 +375,11 @@ function tpl_metaheaders($alt = true) { } else { $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,nofollow'); } - $head['link'][] = array('rel'=> 'canonical', 'href'=> wl($ID, '', true, '&')); + $canonicalUrl = wl($ID, '', true, '&'); + if ($ID == $conf['start']) { + $canonicalUrl = DOKU_URL; + } + $head['link'][] = array('rel'=> 'canonical', 'href'=> $canonicalUrl); } else { $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,follow'); } @@ -377,13 +391,6 @@ function tpl_metaheaders($alt = true) { // set metadata if($ACT == 'show' || $ACT == 'export_xhtml') { - // date of modification - if($REV) { - $head['meta'][] = array('name'=> 'date', 'content'=> date('Y-m-d\TH:i:sO', $REV)); - } else { - $head['meta'][] = array('name'=> 'date', 'content'=> date('Y-m-d\TH:i:sO', $INFO['lastmod'])); - } - // keywords (explicit or implicit) if(!empty($INFO['meta']['subject'])) { $head['meta'][] = array('name'=> 'keywords', 'content'=> join(',', $INFO['meta']['subject'])); @@ -401,7 +408,7 @@ function tpl_metaheaders($alt = true) { // make $INFO and other vars available to JavaScripts $json = new JSON(); $script = "var NS='".$INFO['namespace']."';"; - if($conf['useacl'] && !empty($_SERVER['REMOTE_USER'])) { + if($conf['useacl'] && $INPUT->server->str('REMOTE_USER')) { $script .= "var SIG='".toolbar_signature()."';"; } $script .= 'var JSINFO = '.$json->encode($JSINFO).';'; @@ -425,10 +432,12 @@ function tpl_metaheaders($alt = true) { * instances. Attributes are given as key value pairs. Values will be HTML * encoded automatically so they should be provided as is in the $data array. * - * For tags having a body attribute specify the the body data in the special + * For tags having a body attribute specify the body data in the special * attribute '_data'. This field will NOT BE ESCAPED automatically. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param array $data */ function _tpl_metaheaders_action($data) { foreach($data as $tag => $inst) { @@ -455,6 +464,12 @@ function _tpl_metaheaders_action($data) { * Just builds a link. * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $url + * @param string $name + * @param string $more + * @param bool $return if true return the link html, otherwise print + * @return bool|string html of the link, or true if printed */ function tpl_link($url, $name, $more = '', $return = false) { $out = '<a href="'.$url.'" '; @@ -471,6 +486,10 @@ function tpl_link($url, $name, $more = '', $return = false) { * Wrapper around html_wikilink * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id page id + * @param string|null $name the name of the link + * @return bool true */ function tpl_pagelink($id, $name = null) { print '<bdi>'.html_wikilink($id, $name).'</bdi>'; @@ -484,6 +503,9 @@ function tpl_pagelink($id, $name = null) { * returns false if none is available * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $id page id + * @return false|string */ function tpl_getparent($id) { $parent = getNS($id).':'; @@ -502,6 +524,10 @@ function tpl_getparent($id) { * * @author Adrian Lang <mail@adrianlang.de> * @see tpl_get_action + * + * @param string $type + * @param bool $return + * @return bool|string html, or false if no data, true if printed */ function tpl_button($type, $return = false) { $data = tpl_get_action($type); @@ -533,6 +559,13 @@ function tpl_button($type, $return = false) { * * @author Adrian Lang <mail@adrianlang.de> * @see tpl_get_action + * + * @param string $type action command + * @param string $pre prefix of link + * @param string $suf suffix of link + * @param string $inner innerHML of link + * @param bool $return if true it returns html, otherwise prints + * @return bool|string html or false if no data, true if printed */ function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = false) { global $lang; @@ -548,6 +581,7 @@ function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = fals * @var string $method * @var bool $nofollow * @var array $params + * @var string $replacement */ extract($data); if(strpos($id, '#') === 0) { @@ -556,6 +590,9 @@ function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = fals $linktarget = wl($id, $params); } $caption = $lang['btn_'.$type]; + if(strpos($caption, '%s')){ + $caption = sprintf($caption, $replacement); + } $akey = $addTitle = ''; if($accesskey) { $akey = 'accesskey="'.$accesskey.'" '; @@ -566,7 +603,7 @@ function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = fals $linktarget, $pre.(($inner) ? $inner : $caption).$suf, 'class="action '.$type.'" '. $akey.$rel. - 'title="'.hsc($caption).$addTitle.'"', 1 + 'title="'.hsc($caption).$addTitle.'"', true ); } if($return) return $out; @@ -594,6 +631,7 @@ function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = fals * @author Andreas Gohr <andi@splitbrain.org> * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> * @author Adrian Lang <mail@adrianlang.de> + * * @param string $type * @return array|bool|string */ @@ -603,17 +641,20 @@ function tpl_get_action($type) { global $REV; global $ACT; global $conf; + /** @var Input $INPUT */ + global $INPUT; // check disabled actions and fix the badly named ones if($type == 'history') $type = 'revisions'; if ($type == 'subscription') $type = 'subscribe'; if(!actionOK($type)) return false; - $accesskey = null; - $id = $ID; - $method = 'get'; - $params = array('do' => $type); - $nofollow = true; + $accesskey = null; + $id = $ID; + $method = 'get'; + $params = array('do' => $type); + $nofollow = true; + $replacement = ''; switch($type) { case 'edit': // most complicated type - we need to decide on current action @@ -637,7 +678,7 @@ function tpl_get_action($type) { $accesskey = 'v'; } } else { - $params = array(); + $params = array('do' => ''); $type = 'show'; $accesskey = 'v'; } @@ -658,7 +699,7 @@ function tpl_get_action($type) { break; case 'top': $accesskey = 't'; - $params = array(); + $params = array('do' => ''); $id = '#dokuwiki__top'; break; case 'back': @@ -667,12 +708,17 @@ function tpl_get_action($type) { return false; } $id = $parent; - $params = array(); + $params = array('do' => ''); $accesskey = 'b'; break; + case 'img_backto': + $params = array(); + $accesskey = 'b'; + $replacement = $ID; + break; case 'login': $params['sectok'] = getSecurityToken(); - if(isset($_SERVER['REMOTE_USER'])) { + if($INPUT->server->has('REMOTE_USER')) { if(!actionOK('logout')) { return false; } @@ -681,12 +727,12 @@ function tpl_get_action($type) { } break; case 'register': - if(!empty($_SERVER['REMOTE_USER'])) { + if($INPUT->server->str('REMOTE_USER')) { return false; } break; case 'resendpwd': - if(!empty($_SERVER['REMOTE_USER'])) { + if($INPUT->server->str('REMOTE_USER')) { return false; } break; @@ -703,46 +749,61 @@ function tpl_get_action($type) { $params['sectok'] = getSecurityToken(); break; case 'subscribe': - if(!$_SERVER['REMOTE_USER']) { + if(!$INPUT->server->str('REMOTE_USER')) { return false; } break; case 'backlink': break; case 'profile': - if(!isset($_SERVER['REMOTE_USER'])) { + if(!$INPUT->server->has('REMOTE_USER')) { return false; } break; case 'media': $params['ns'] = getNS($ID); break; + case 'mediaManager': + // View image in media manager + global $IMG; + $imgNS = getNS($IMG); + $authNS = auth_quickaclcheck("$imgNS:*"); + if ($authNS < AUTH_UPLOAD) { + return false; + } + $params = array( + 'ns' => $imgNS, + 'image' => $IMG, + 'do' => 'media' + ); + //$type = 'media'; + break; default: return '[unknown %s type]'; - break; } - return compact('accesskey', 'type', 'id', 'method', 'params', 'nofollow'); + return compact('accesskey', 'type', 'id', 'method', 'params', 'nofollow', 'replacement'); } /** * Wrapper around tpl_button() and tpl_actionlink() * * @author Anika Henke <anika@selfthinker.org> - * @param - * @param bool $link link or form button? - * @param bool $wrapper HTML element wrapper - * @param bool $return return or print - * @param string $pre prefix for links - * @param string $suf suffix for links - * @param string $inner inner HTML for links + * + * @param string $type action command + * @param bool $link link or form button? + * @param string|bool $wrapper HTML element wrapper + * @param bool $return return or print + * @param string $pre prefix for links + * @param string $suf suffix for links + * @param string $inner inner HTML for links * @return bool|string */ function tpl_action($type, $link = false, $wrapper = false, $return = false, $pre = '', $suf = '', $inner = '') { $out = ''; if($link) { - $out .= tpl_actionlink($type, $pre, $suf, $inner, 1); + $out .= tpl_actionlink($type, $pre, $suf, $inner, true); } else { - $out .= tpl_button($type, 1); + $out .= tpl_button($type, true); } if($out && $wrapper) $out = "<$wrapper>$out</$wrapper>"; @@ -762,6 +823,7 @@ function tpl_action($type, $link = false, $wrapper = false, $return = false, $pr * autocompletion feature (MSIE and Firefox) * * @author Andreas Gohr <andi@splitbrain.org> + * * @param bool $ajax * @param bool $autocomplete * @return bool @@ -778,6 +840,7 @@ function tpl_searchform($ajax = true, $autocomplete = true) { print '<input type="hidden" name="do" value="search" />'; print '<input type="text" '; if($ACT == 'search') print 'value="'.htmlspecialchars($QUERY).'" '; + print 'placeholder="'.$lang['btn_search'].'" '; if(!$autocomplete) print 'autocomplete="off" '; print 'id="qsearch__in" accesskey="f" name="id" class="edit" title="[F]" />'; print '<input type="submit" value="'.$lang['btn_search'].'" class="button" title="'.$lang['btn_search'].'" />'; @@ -790,6 +853,7 @@ function tpl_searchform($ajax = true, $autocomplete = true) { * Print the breadcrumbs trace * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $sep Separator between entries * @return bool */ @@ -805,7 +869,7 @@ function tpl_breadcrumbs($sep = '•') { $crumbs_sep = ' <span class="bcsep">'.$sep.'</span> '; //render crumbs, highlight the last one - print '<span class="bchead">'.$lang['breadcrumb'].':</span>'; + print '<span class="bchead">'.$lang['breadcrumb'].'</span>'; $last = count($crumbs); $i = 0; foreach($crumbs as $id => $name) { @@ -830,11 +894,12 @@ function tpl_breadcrumbs($sep = '•') { * @author Nigel McNie <oracle.shinoda@gmail.com> * @author Sean Coates <sean@caedmon.net> * @author <fredrik@averpil.com> - * @todo May behave strangely in RTL languages + * @author Mark C. Prins <mprins@users.sf.net> + * * @param string $sep Separator between entries * @return bool */ -function tpl_youarehere($sep = ' » ') { +function tpl_youarehere($sep = ' → ') { global $conf; global $ID; global $lang; @@ -845,12 +910,15 @@ function tpl_youarehere($sep = ' » ') { $parts = explode(':', $ID); $count = count($parts); - echo '<span class="bchead">'.$lang['youarehere'].': </span>'; - + echo '<nav><h2 class="bchead">'.$lang['youarehere'].': </h2>'; + echo '<ul class="navlist">'; // always print the startpage - echo '<span class="home">'; - tpl_pagelink(':'.$conf['start']); - echo '</span>'; + if ($count > 1) { + echo '<li class="home">'.html_wikilink(':'.$conf['start']).$sep.'</li>'; + } else { + echo '<li class="home">'.$conf['start'].'</li>'; + } + // print intermediate namespace links $part = ''; @@ -859,18 +927,28 @@ function tpl_youarehere($sep = ' » ') { $page = $part; if($page == $conf['start']) continue; // Skip startpage - // output - echo $sep; - tpl_pagelink($page); + echo '<li>'.html_wikilink($page); + if ($i < $count - 2) { + echo $sep.'</li>'; + } else { + echo '</li>'; + } } // print current page, skipping start page, skipping for namespace index resolve_pageid('', $page, $exists); - if(isset($page) && $page == $part.$parts[$i]) return true; + if(isset($page) && $page == $part.$parts[$i]) { + echo '</li></ul></nav>'; + return true; + } + $page = $part.$parts[$i]; - if($page == $conf['start']) return true; - echo $sep; - tpl_pagelink($page); + if($page == $conf['start']) { + echo '</li></ul></nav>'; + return true; + } + + echo $sep.'</li><li class="curid">'.noNSorNS($page).'</li></ul></nav>'; return true; } @@ -881,13 +959,16 @@ function tpl_youarehere($sep = ' » ') { * Could be enhanced with a profile link in future? * * @author Andreas Gohr <andi@splitbrain.org> + * * @return bool */ function tpl_userinfo() { global $lang; - global $INFO; - if(isset($_SERVER['REMOTE_USER'])) { - print $lang['loggedinas'].': <bdi>'.hsc($INFO['userinfo']['name']).'</bdi> (<bdi>'.hsc($_SERVER['REMOTE_USER']).'</bdi>)'; + /** @var Input $INPUT */ + global $INPUT; + + if($INPUT->server->str('REMOTE_USER')) { + print $lang['loggedinas'].' '.userlink(); return true; } return false; @@ -897,6 +978,7 @@ function tpl_userinfo() { * Print some info about the current page * * @author Andreas Gohr <andi@splitbrain.org> + * * @param bool $ret return content instead of printing it * @return bool|string */ @@ -929,7 +1011,7 @@ function tpl_pageinfo($ret = false) { $out .= '<bdi>'.$fn.'</bdi>'; $out .= ' · '; $out .= $lang['lastmod']; - $out .= ': '; + $out .= ' '; $out .= $date; if($INFO['editor']) { $out .= ' '.$lang['by'].' '; @@ -940,7 +1022,7 @@ function tpl_pageinfo($ret = false) { if($INFO['locked']) { $out .= ' · '; $out .= $lang['lockedby']; - $out .= ': '; + $out .= ' '; $out .= '<bdi>'.editorinfo($INFO['locked']).'</bdi>'; } if($ret) { @@ -960,6 +1042,7 @@ function tpl_pageinfo($ret = false) { * the given ID is used. * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $id page id * @param bool $ret return content instead of printing * @return bool|string @@ -997,9 +1080,10 @@ function tpl_pagetitle($id = null, $ret = false) { * Only allowed in: detail.php * * @author Andreas Gohr <andi@splitbrain.org> - * @param array $tags tags to try - * @param string $alt alternative output if no data was found - * @param null $src the image src, uses global $SRC if not given + * + * @param array|string $tags tag or array of tags to try + * @param string $alt alternative output if no data was found + * @param null|string $src the image src, uses global $SRC if not given * @return string */ function tpl_img_getTag($tags, $alt = '', $src = null) { @@ -1011,12 +1095,73 @@ function tpl_img_getTag($tags, $alt = '', $src = null) { static $meta = null; if(is_null($meta)) $meta = new JpegMeta($src); if($meta === false) return $alt; - $info = $meta->getField($tags); + $info = cleanText($meta->getField($tags)); if($info == false) return $alt; return $info; } /** + * Returns a description list of the metatags of the current image + * + * @return string html of description list + */ +function tpl_img_meta() { + global $lang; + + $tags = tpl_get_img_meta(); + + echo '<dl>'; + foreach($tags as $tag) { + $label = $lang[$tag['langkey']]; + if(!$label) $label = $tag['langkey'] . ':'; + + echo '<dt>'.$label.'</dt><dd>'; + if ($tag['type'] == 'date') { + echo dformat($tag['value']); + } else { + echo hsc($tag['value']); + } + echo '</dd>'; + } + echo '</dl>'; +} + +/** + * Returns metadata as configured in mediameta config file, ready for creating html + * + * @return array with arrays containing the entries: + * - string langkey key to lookup in the $lang var, if not found printed as is + * - string type type of value + * - string value tag value (unescaped) + */ +function tpl_get_img_meta() { + + $config_files = getConfigFiles('mediameta'); + foreach ($config_files as $config_file) { + if(file_exists($config_file)) { + include($config_file); + } + } + /** @var array $fields the included array with metadata */ + + $tags = array(); + foreach($fields as $tag){ + $t = array(); + if (!empty($tag[0])) { + $t = array($tag[0]); + } + if(is_array($tag[3])) { + $t = array_merge($t,$tag[3]); + } + $value = tpl_img_getTag($t); + if ($value) { + $tags[] = array('langkey' => $tag[1], 'type' => $tag[2], 'value' => $value); + } + } + return $tags; +} + +/** * Prints the image with a link to the full sized version * * Only allowed in: detail.php @@ -1026,11 +1171,13 @@ function tpl_img_getTag($tags, $alt = '', $src = null) { * @param $maxheight int - maximal height of the image * @param $link bool - link to the orginal size? * @param $params array - additional image attributes - * @return mixed Result of TPL_IMG_DISPLAY + * @return bool Result of TPL_IMG_DISPLAY */ function tpl_img($maxwidth = 0, $maxheight = 0, $link = true, $params = null) { global $IMG; + /** @var Input $INPUT */ global $INPUT; + global $REV; $w = tpl_img_getTag('File.Width'); $h = tpl_img_getTag('File.Height'); @@ -1055,8 +1202,8 @@ function tpl_img($maxwidth = 0, $maxheight = 0, $link = true, $params = null) { } //prepare URLs - $url = ml($IMG, array('cache'=> $INPUT->str('cache')), true, '&'); - $src = ml($IMG, array('cache'=> $INPUT->str('cache'), 'w'=> $w, 'h'=> $h), true, '&'); + $url = ml($IMG, array('cache'=> $INPUT->str('cache'),'rev'=>$REV), true, '&'); + $src = ml($IMG, array('cache'=> $INPUT->str('cache'),'rev'=>$REV, 'w'=> $w, 'h'=> $h), true, '&'); //prepare attributes $alt = tpl_img_getTag('Simple.Title'); @@ -1123,10 +1270,11 @@ function tpl_indexerWebBug() { * * use this function to access template configuration variables * - * @param string $id - * @return string + * @param string $id name of the value to access + * @param mixed $notset what to return if the setting is not available + * @return mixed */ -function tpl_getConf($id) { +function tpl_getConf($id, $notset=false) { global $conf; static $tpl_configloaded = false; @@ -1143,7 +1291,11 @@ function tpl_getConf($id) { } } - return $conf['tpl'][$tpl][$id]; + if(isset($conf['tpl'][$tpl][$id])){ + return $conf['tpl'][$tpl][$id]; + } + + return $notset; } /** @@ -1159,7 +1311,7 @@ function tpl_loadConfig() { $file = tpl_incdir().'/conf/default.php'; $conf = array(); - if(!@file_exists($file)) return false; + if(!file_exists($file)) return false; // load default config file include($file); @@ -1172,21 +1324,37 @@ function tpl_loadConfig() { * tpl_getLang($id) * * use this function to access template language variables + * + * @param string $id key of language string + * @return string */ function tpl_getLang($id) { static $lang = array(); if(count($lang) === 0) { - $path = tpl_incdir().'lang/'; + global $conf, $config_cascade; // definitely don't invoke "global $lang" + + $path = tpl_incdir() . 'lang/'; $lang = array(); - global $conf; // definitely don't invoke "global $lang" // don't include once - @include($path.'en/lang.php'); - if($conf['lang'] != 'en') @include($path.$conf['lang'].'/lang.php'); - } + @include($path . 'en/lang.php'); + foreach($config_cascade['lang']['template'] as $config_file) { + if(file_exists($config_file . $conf['template'] . '/en/lang.php')) { + include($config_file . $conf['template'] . '/en/lang.php'); + } + } + if($conf['lang'] != 'en') { + @include($path . $conf['lang'] . '/lang.php'); + foreach($config_cascade['lang']['template'] as $config_file) { + if(file_exists($config_file . $conf['template'] . '/' . $conf['lang'] . '/lang.php')) { + include($config_file . $conf['template'] . '/' . $conf['lang'] . '/lang.php'); + } + } + } + } return $lang[$id]; } @@ -1203,14 +1371,17 @@ function tpl_locale_xhtml($id) { /** * Prepends appropriate path for a language dependent filename + * + * @param string $id id of localized text + * @return string wiki text */ function tpl_localeFN($id) { $path = tpl_incdir().'lang/'; global $conf; - $file = DOKU_CONF.'/template_lang/'.$conf['template'].'/'.$conf['lang'].'/'.$id.'.txt'; - if (!@file_exists($file)){ + $file = DOKU_CONF.'template_lang/'.$conf['template'].'/'.$conf['lang'].'/'.$id.'.txt'; + if (!file_exists($file)){ $file = $path.$conf['lang'].'/'.$id.'.txt'; - if(!@file_exists($file)){ + if(!file_exists($file)){ //fall back to english $file = $path.'en/'.$id.'.txt'; } @@ -1229,6 +1400,8 @@ function tpl_localeFN($id) { * * @triggers MEDIAMANAGER_CONTENT_OUTPUT * @param bool $fromajax - set true when calling this function via ajax + * @param string $sort + * * @author Andreas Gohr <andi@splitbrain.org> */ function tpl_mediaContent($fromajax = false, $sort='natural') { @@ -1237,6 +1410,7 @@ function tpl_mediaContent($fromajax = false, $sort='natural') { global $INUSE; global $NS; global $JUMPTO; + /** @var Input $INPUT */ global $INPUT; $do = $INPUT->extract('do')->str('do'); @@ -1286,6 +1460,7 @@ function tpl_mediaFileList() { global $NS; global $JUMPTO; global $lang; + /** @var Input $INPUT */ global $INPUT; $opened_tab = $INPUT->str('tab_files'); @@ -1326,12 +1501,14 @@ function tpl_mediaFileList() { * @author Kate Arzamastseva <pshns@ukr.net> */ function tpl_mediaFileDetails($image, $rev) { - global $AUTH, $NS, $conf, $DEL, $lang, $INPUT; + global $conf, $DEL, $lang; + /** @var Input $INPUT */ + global $INPUT; $removed = (!file_exists(mediaFN($image)) && file_exists(mediaMetaFN($image, '.changes')) && $conf['mediarevisions']); if(!$image || (!file_exists(mediaFN($image)) && !$removed) || $DEL) return; if($rev && !file_exists(mediaFN($image, $rev))) $rev = false; - if(isset($NS) && getNS($image) != $NS) return; + $ns = getNS($image); $do = $INPUT->str('mediado'); $opened_tab = $INPUT->str('tab_details'); @@ -1367,13 +1544,13 @@ function tpl_mediaFileDetails($image, $rev) { echo '<div class="panelContent">'.NL; if($opened_tab == 'view') { - media_tab_view($image, $NS, $AUTH, $rev); + media_tab_view($image, $ns, null, $rev); } elseif($opened_tab == 'edit' && !$removed) { - media_tab_edit($image, $NS, $AUTH); + media_tab_edit($image, $ns); } elseif($opened_tab == 'history' && $conf['mediarevisions']) { - media_tab_history($image, $NS, $AUTH); + media_tab_history($image, $ns); } echo '</div>'.NL; @@ -1399,17 +1576,22 @@ function tpl_mediaTree() { * Note: this will not use any pretty URLs * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $empty empty option label + * @param string $button submit button label */ function tpl_actiondropdown($empty = '', $button = '>') { global $ID; global $REV; global $lang; + /** @var Input $INPUT */ + global $INPUT; echo '<form action="'.script().'" method="get" accept-charset="utf-8">'; echo '<div class="no">'; echo '<input type="hidden" name="id" value="'.$ID.'" />'; if($REV) echo '<input type="hidden" name="rev" value="'.$REV.'" />'; - if (!empty($_SERVER['REMOTE_USER'])) { + if ($INPUT->server->str('REMOTE_USER')) { echo '<input type="hidden" name="sectok" value="'.getSecurityToken().'" />'; } @@ -1510,6 +1692,11 @@ function tpl_license($img = 'badge', $imgonly = false, $return = false, $wrap = * * This function is useful to populate sidebars or similar features in a * template + * + * @param string $pageid + * @param bool $print + * @param bool $propagate + * @return bool|null|string */ function tpl_include_page($pageid, $print = true, $propagate = false) { if (!$pageid) return false; @@ -1618,10 +1805,11 @@ function tpl_flush() { * If a given location starts with a colon it is assumed to be a media * file, otherwise it is assumed to be relative to the current template * - * @param array $search locations to look at - * @param bool $abs if to use absolute URL - * @param array &$imginfo filled with getimagesize() + * @param string[] $search locations to look at + * @param bool $abs if to use absolute URL + * @param array &$imginfo filled with getimagesize() * @return string + * * @author Andreas Gohr <andi@splitbrain.org> */ function tpl_getMediaFile($search, $abs = false, &$imginfo = null) { @@ -1672,6 +1860,8 @@ function tpl_getMediaFile($search, $abs = false, &$imginfo = null) { * * @author Anika Henke <anika@selfthinker.org> * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $file */ function tpl_includeFile($file) { global $config_cascade; @@ -1697,6 +1887,7 @@ function tpl_includeFile($file) { * Returns <link> tag for various icon types (favicon|mobile|generic) * * @author Anika Henke <anika@selfthinker.org> + * * @param array $types - list of icon types to display (favicon|mobile|generic) * @return string */ @@ -1772,14 +1963,19 @@ function tpl_media() { * Return useful layout classes * * @author Anika Henke <anika@selfthinker.org> + * + * @return string */ function tpl_classes() { global $ACT, $conf, $ID, $INFO; + /** @var Input $INPUT */ + global $INPUT; + $classes = array( 'dokuwiki', 'mode_'.$ACT, 'tpl_'.$conf['template'], - !empty($_SERVER['REMOTE_USER']) ? 'loggedIn' : '', + $INPUT->server->bool('REMOTE_USER') ? 'loggedIn' : '', $INFO['exists'] ? '' : 'notFound', ($ID == $conf['start']) ? 'home' : '', ); diff --git a/inc/toolbar.php b/inc/toolbar.php index b588d4477..7cc29e866 100644 --- a/inc/toolbar.php +++ b/inc/toolbar.php @@ -56,7 +56,7 @@ function toolbar_JSdefines($varname){ 'type' => 'format', 'title' => $lang['qb_code'], 'icon' => 'mono.png', - 'key' => 'c', + 'key' => 'm', 'open' => "''", 'close' => "''", 'block' => false @@ -241,10 +241,12 @@ function toolbar_JSdefines($varname){ function toolbar_signature(){ global $conf; global $INFO; + /** @var Input $INPUT */ + global $INPUT; $sig = $conf['signature']; $sig = dformat(null,$sig); - $sig = str_replace('@USER@',$_SERVER['REMOTE_USER'],$sig); + $sig = str_replace('@USER@',$INPUT->server->str('REMOTE_USER'),$sig); $sig = str_replace('@NAME@',$INFO['userinfo']['name'],$sig); $sig = str_replace('@MAIL@',$INFO['userinfo']['mail'],$sig); $sig = str_replace('@DATE@',dformat(),$sig); diff --git a/inc/utf8.php b/inc/utf8.php index c944667f7..f86217686 100644 --- a/inc/utf8.php +++ b/inc/utf8.php @@ -43,6 +43,9 @@ if(!function_exists('utf8_isASCII')){ * Checks if a string contains 7bit ASCII only * * @author Andreas Haerter <andreas.haerter@dev.mail-node.com> + * + * @param string $str + * @return bool */ function utf8_isASCII($str){ return (preg_match('/(?:[^\x00-\x7F])/', $str) !== 1); @@ -56,6 +59,9 @@ if(!function_exists('utf8_strip')){ * Returns a pure ASCII7 string * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $str + * @return string */ function utf8_strip($str){ $ascii = ''; @@ -75,6 +81,9 @@ if(!function_exists('utf8_check')){ * * @author <bmorel@ssi.fr> * @link http://www.php.net/manual/en/function.utf8-encode.php + * + * @param string $Str + * @return bool */ function utf8_check($Str) { $len = strlen($Str); @@ -105,6 +114,7 @@ if(!function_exists('utf8_basename')){ * * @see basename() * @link https://bugs.php.net/bug.php?id=37738 + * * @param string $path A path * @param string $suffix If the name component ends in suffix this will also be cut off * @return string @@ -134,6 +144,9 @@ if(!function_exists('utf8_strlen')){ * @author <chernyshevsky at hotmail dot com> * @see strlen() * @see utf8_decode() + * + * @param string $string + * @return int */ function utf8_strlen($string){ return strlen(utf8_decode($string)); @@ -148,10 +161,11 @@ if(!function_exists('utf8_substr')){ * * @author Harry Fuecks <hfuecks@gmail.com> * @author Chris Smith <chris@jalakai.co.uk> + * * @param string $str * @param int $offset number of UTF-8 characters offset (from left) * @param int $length (optional) length in UTF-8 characters from offset - * @return mixed string or false if failure + * @return string */ function utf8_substr($str, $offset, $length = null) { if(UTF8_MBSTRING){ @@ -250,6 +264,14 @@ if(!function_exists('utf8_substr_replace')){ * * @author Andreas Gohr <andi@splitbrain.org> * @see substr_replace() + * + * @param string $string input string + * @param string $replacement the replacement + * @param int $start the replacing will begin at the start'th offset into string. + * @param int $length If given and is positive, it represents the length of the portion of string which is + * to be replaced. If length is zero then this function will have the effect of inserting + * replacement into string at the given start offset. + * @return string */ function utf8_substr_replace($string, $replacement, $start , $length=0 ){ $ret = ''; @@ -266,6 +288,7 @@ if(!function_exists('utf8_ltrim')){ * * @author Andreas Gohr <andi@splitbrain.org> * @see ltrim() + * * @param string $str * @param string $charlist * @return string @@ -286,6 +309,7 @@ if(!function_exists('utf8_rtrim')){ * * @author Andreas Gohr <andi@splitbrain.org> * @see rtrim() + * * @param string $str * @param string $charlist * @return string @@ -306,6 +330,7 @@ if(!function_exists('utf8_trim')){ * * @author Andreas Gohr <andi@splitbrain.org> * @see trim() + * * @param string $str * @param string $charlist * @return string @@ -326,6 +351,9 @@ if(!function_exists('utf8_strtolower')){ * @author Leo Feyer <leo@typolight.org> * @see strtolower() * @see utf8_strtoupper() + * + * @param string $string + * @return string */ function utf8_strtolower($string){ if(UTF8_MBSTRING) return mb_strtolower($string,'utf-8'); @@ -344,6 +372,9 @@ if(!function_exists('utf8_strtoupper')){ * @author Leo Feyer <leo@typolight.org> * @see strtoupper() * @see utf8_strtoupper() + * + * @param string $string + * @return string */ function utf8_strtoupper($string){ if(UTF8_MBSTRING) return mb_strtoupper($string,'utf-8'); @@ -359,7 +390,8 @@ if(!function_exists('utf8_ucfirst')){ * Make a string's first character uppercase * * @author Harry Fuecks - * @param string + * + * @param string $str * @return string with first character as upper case (if applicable) */ function utf8_ucfirst($str){ @@ -381,9 +413,10 @@ if(!function_exists('utf8_ucwords')){ * Uppercase the first character of each word in a string * * @author Harry Fuecks - * @param string - * @return string with first char of each word uppercase * @see http://www.php.net/ucwords + * + * @param string $str + * @return string with first char of each word uppercase */ function utf8_ucwords($str) { // Note: [\x0c\x09\x0b\x0a\x0d\x20] matches; @@ -399,10 +432,11 @@ if(!function_exists('utf8_ucwords')){ * You don't need to call this yourself * * @author Harry Fuecks - * @param array $matches matches corresponding to a single word - * @return string with first char of the word in uppercase * @see utf8_ucwords * @see utf8_strtoupper + * + * @param array $matches matches corresponding to a single word + * @return string with first char of the word in uppercase */ function utf8_ucwords_callback($matches) { $leadingws = $matches[2]; @@ -420,6 +454,10 @@ if(!function_exists('utf8_deaccent')){ * letters. Default is to deaccent both cases ($case = 0) * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $string + * @param int $case + * @return string */ function utf8_deaccent($string,$case=0){ if($case <= 0){ @@ -439,6 +477,9 @@ if(!function_exists('utf8_romanize')){ * Romanize a non-latin string * * @author Andreas Gohr <andi@splitbrain.org> + * + * @param string $string + * @return string */ function utf8_romanize($string){ if(utf8_isASCII($string)) return $string; //nothing to do @@ -456,6 +497,7 @@ if(!function_exists('utf8_stripspecials')){ * stripped chars (they are not included in $UTF8_SPECIAL_CHARS) * * @author Andreas Gohr <andi@splitbrain.org> + * * @param string $string The UTF8 string to strip of special chars * @param string $repl Replace special with this string * @param string $additional Additional chars to strip (used in regexp char class) @@ -480,9 +522,10 @@ if(!function_exists('utf8_strpos')){ * * @author Leo Feyer <leo@typolight.org> * @see strpos() - * @param string - * @param string - * @param integer + * + * @param string $haystack + * @param string $needle + * @param integer $offset * @return integer */ function utf8_strpos($haystack, $needle, $offset=0){ @@ -512,6 +555,9 @@ if(!function_exists('utf8_tohtml')){ * @author Tom N Harris <tnharris@whoopdedo.org> * @author <vpribish at shopping dot com> * @link http://www.php.net/manual/en/function.utf8-decode.php + * + * @param string $str + * @return string */ function utf8_tohtml ($str) { $ret = ''; @@ -542,6 +588,7 @@ if(!function_exists('utf8_unhtml')){ * what it should be -> "&&#38;" * * @author Tom N Harris <tnharris@whoopdedo.org> + * * @param string $str UTF-8 encoded string * @param boolean $entities Flag controlling decoding of named entities. * @return string UTF-8 encoded string with numeric (and named) entities replaced. @@ -564,7 +611,7 @@ if(!function_exists('utf8_decode_numeric')){ * Decodes numeric HTML entities to their correct UTF-8 characters * * @param $ent string A numeric entity - * @return string + * @return string|false */ function utf8_decode_numeric($ent) { switch ($ent[2]) { @@ -597,10 +644,10 @@ if(!class_exists('utf8_entity_decoder')){ } /** - * Wrapper aorund unicode_to_utf8() + * Wrapper around unicode_to_utf8() * - * @param $c string - * @return mixed + * @param string $c + * @return string|false */ function makeutf8($c) { return unicode_to_utf8(array(ord($c))); @@ -609,8 +656,8 @@ if(!class_exists('utf8_entity_decoder')){ /** * Decodes any HTML entity to it's correct UTF-8 char equivalent * - * @param $ent string An entity - * @return string + * @param string $ent An entity + * @return string|false */ function decode($ent) { if ($ent[1] == '#') { @@ -640,12 +687,13 @@ if(!function_exists('utf8_to_unicode')){ * * @author <hsivonen@iki.fi> * @author Harry Fuecks <hfuecks@gmail.com> - * @param string $str UTF-8 encoded string - * @param boolean $strict Check for invalid sequences? - * @return mixed array of unicode code points or false if UTF-8 invalid * @see unicode_to_utf8 * @link http://hsivonen.iki.fi/php-utf8/ * @link http://sourceforge.net/projects/phputf8/ + * + * @param string $str UTF-8 encoded string + * @param boolean $strict Check for invalid sequences? + * @return mixed array of unicode code points or false if UTF-8 invalid */ function utf8_to_unicode($str,$strict=false) { $mState = 0; // cached expected number of octets after the current octet @@ -815,7 +863,8 @@ if(!function_exists('unicode_to_utf8')){ * * @param array $arr of unicode code points representing a string * @param boolean $strict Check for invalid sequences? - * @return mixed UTF-8 string or false if array contains invalid code points + * @return string|false UTF-8 string or false if array contains invalid code points + * * @author <hsivonen@iki.fi> * @author Harry Fuecks <hfuecks@gmail.com> * @see utf8_to_unicode @@ -896,6 +945,10 @@ if(!function_exists('utf8_to_utf16be')){ * UTF-8 to UTF-16BE conversion. * * Maybe really UCS-2 without mb_string due to utf8_to_unicode limits + * + * @param string $str + * @param bool $bom + * @return string */ function utf8_to_utf16be(&$str, $bom = false) { $out = $bom ? "\xFE\xFF" : ''; @@ -914,6 +967,9 @@ if(!function_exists('utf16be_to_utf8')){ * UTF-8 to UTF-16BE conversion. * * Maybe really UCS-2 without mb_string due to utf8_to_unicode limits + * + * @param string $str + * @return false|string */ function utf16be_to_utf8(&$str) { $uni = unpack('n*',$str); @@ -933,6 +989,7 @@ if(!function_exists('utf8_bad_replace')){ * * @author Harry Fuecks <hfuecks@gmail.com> * @see http://www.w3.org/International/questions/qa-forms-utf-8 + * * @param string $str to search * @param string $replace to replace bad bytes with (defaults to '?') - use ASCII * @return string @@ -967,8 +1024,8 @@ if(!function_exists('utf8_correctIdx')){ /** * adjust a byte index into a utf8 string to a utf8 character boundary * - * @param $str string utf8 character string - * @param $i int byte index into $str + * @param string $str utf8 character string + * @param int $i byte index into $str * @param $next bool direction to search for boundary, * false = up (current character) * true = down (next character) |