diff options
author | Michal Rezler <rezlemic@fel.cvut.cz> | 2011-03-23 10:39:45 +0100 |
---|---|---|
committer | Michal Rezler <rezlemic@fel.cvut.cz> | 2011-03-23 10:39:45 +0100 |
commit | 35838d22a57707952f630eaf9f9e9ab4c6c3cfb0 (patch) | |
tree | 3603e2e56314af40a4b7922e14e52c0bc06f6f9d /inc | |
parent | c4bb7947fcb2d4a5e5f8a15d9e3bbec333e44e13 (diff) | |
parent | ee1214abb2c14cf0f86ff6d9a5b49536c6b01e18 (diff) | |
download | rpg-35838d22a57707952f630eaf9f9e9ab4c6c3cfb0.tar.gz rpg-35838d22a57707952f630eaf9f9e9ab4c6c3cfb0.tar.bz2 |
jQuery rewrite branch merged into master branch of whole project
Diffstat (limited to 'inc')
415 files changed, 13573 insertions, 6884 deletions
diff --git a/inc/DifferenceEngine.php b/inc/DifferenceEngine.php index 7b14e4463..906a17b2d 100644 --- a/inc/DifferenceEngine.php +++ b/inc/DifferenceEngine.php @@ -30,7 +30,7 @@ class _DiffOp { class _DiffOp_Copy extends _DiffOp { var $type = 'copy'; - function _DiffOp_Copy ($orig, $closing = false) { + function _DiffOp_Copy($orig, $closing = false) { if (!is_array($closing)) $closing = $orig; $this->orig = $orig; @@ -45,7 +45,7 @@ class _DiffOp_Copy extends _DiffOp { class _DiffOp_Delete extends _DiffOp { var $type = 'delete'; - function _DiffOp_Delete ($lines) { + function _DiffOp_Delete($lines) { $this->orig = $lines; $this->closing = false; } @@ -58,7 +58,7 @@ class _DiffOp_Delete extends _DiffOp { class _DiffOp_Add extends _DiffOp { var $type = 'add'; - function _DiffOp_Add ($lines) { + function _DiffOp_Add($lines) { $this->closing = $lines; $this->orig = false; } @@ -71,7 +71,7 @@ class _DiffOp_Add extends _DiffOp { class _DiffOp_Change extends _DiffOp { var $type = 'change'; - function _DiffOp_Change ($orig, $closing) { + function _DiffOp_Change($orig, $closing) { $this->orig = $orig; $this->closing = $closing; } @@ -104,7 +104,7 @@ class _DiffOp_Change extends _DiffOp { */ class _DiffEngine { - function diff ($from_lines, $to_lines) { + function diff($from_lines, $to_lines) { $n_from = count($from_lines); $n_to = count($to_lines); @@ -135,7 +135,7 @@ class _DiffEngine { $xhash[$from_lines[$xi]] = 1; for ($yi = $skip; $yi < $n_to - $endskip; $yi++) { $line = $to_lines[$yi]; - if ( ($this->ychanged[$yi] = empty($xhash[$line])) ) + if (($this->ychanged[$yi] = empty($xhash[$line]))) continue; $yhash[$line] = 1; $this->yv[] = $line; @@ -143,7 +143,7 @@ class _DiffEngine { } for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $line = $from_lines[$xi]; - if ( ($this->xchanged[$xi] = empty($yhash[$line])) ) + if (($this->xchanged[$xi] = empty($yhash[$line]))) continue; $this->xv[] = $line; $this->xind[] = $xi; @@ -165,8 +165,7 @@ class _DiffEngine { // Skip matching "snake". $copy = array(); - while ( $xi < $n_from && $yi < $n_to - && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { + while ($xi < $n_from && $yi < $n_to && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { $copy[] = $from_lines[$xi++]; ++$yi; } @@ -210,15 +209,14 @@ class _DiffEngine { * match. The caller must trim matching lines from the beginning and end * of the portions it is going to specify. */ - function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) { + function _diag($xoff, $xlim, $yoff, $ylim, $nchunks) { $flip = false; if ($xlim - $xoff > $ylim - $yoff) { // Things seems faster (I'm not sure I understand why) // when the shortest sequence in X. $flip = true; - list ($xoff, $xlim, $yoff, $ylim) - = array( $yoff, $ylim, $xoff, $xlim); + list ($xoff, $xlim, $yoff, $ylim) = array($yoff, $ylim, $xoff, $xlim); } if ($flip) @@ -284,7 +282,7 @@ class _DiffEngine { return array($this->lcs, $seps); } - function _lcs_pos ($ypos) { + function _lcs_pos($ypos) { $end = $this->lcs; if ($end == 0 || $ypos > $this->seq[$end]) { $this->seq[++$this->lcs] = $ypos; @@ -295,7 +293,7 @@ class _DiffEngine { $beg = 1; while ($beg < $end) { $mid = (int)(($beg + $end) / 2); - if ( $ypos > $this->seq[$mid] ) + if ($ypos > $this->seq[$mid]) $beg = $mid + 1; else $end = $mid; @@ -321,17 +319,15 @@ class _DiffEngine { * Note that XLIM, YLIM are exclusive bounds. * All line numbers are origin-0 and discarded lines are not counted. */ - function _compareseq ($xoff, $xlim, $yoff, $ylim) { + function _compareseq($xoff, $xlim, $yoff, $ylim) { // Slide down the bottom initial diagonal. - while ($xoff < $xlim && $yoff < $ylim - && $this->xv[$xoff] == $this->yv[$yoff]) { + while ($xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff]) { ++$xoff; ++$yoff; } // Slide up the top initial diagonal. - while ($xlim > $xoff && $ylim > $yoff - && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { + while ($xlim > $xoff && $ylim > $yoff && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { --$xlim; --$ylim; } @@ -379,7 +375,7 @@ class _DiffEngine { * * This is extracted verbatim from analyze.c (GNU diffutils-2.7). */ - function _shift_boundaries ($lines, &$changed, $other_changed) { + function _shift_boundaries($lines, &$changed, $other_changed) { $i = 0; $j = 0; @@ -519,7 +515,7 @@ class Diff { * @return object A Diff object representing the inverse of the * original diff. */ - function reverse () { + function reverse() { $rev = $this; $rev->edits = array(); foreach ($this->edits as $edit) { @@ -533,7 +529,7 @@ class Diff { * * @return bool True iff two sequences were identical. */ - function isEmpty () { + function isEmpty() { foreach ($this->edits as $edit) { if ($edit->type != 'copy') return false; @@ -548,7 +544,7 @@ class Diff { * * @return int The length of the LCS. */ - function lcs () { + function lcs() { $lcs = 0; foreach ($this->edits as $edit) { if ($edit->type == 'copy') @@ -598,7 +594,7 @@ class Diff { * * This is here only for debugging purposes. */ - function _check ($from_lines, $to_lines) { + function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->orig())) trigger_error("Reconstructed original doesn't match", E_USER_ERROR); if (serialize($to_lines) != serialize($this->closing())) @@ -612,7 +608,7 @@ class Diff { $prevtype = 'none'; foreach ($this->edits as $edit) { - if ( $prevtype == $edit->type ) + if ($prevtype == $edit->type) trigger_error("Edit sequence is non-optimal", E_USER_ERROR); $prevtype = $edit->type; } @@ -649,8 +645,7 @@ class MappedDiff extends Diff { * @param $mapped_to_lines array This array should * have the same number of elements as $to_lines. */ - function MappedDiff($from_lines, $to_lines, - $mapped_from_lines, $mapped_to_lines) { + function MappedDiff($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); @@ -727,9 +722,7 @@ class DiffFormatter { $context = array_slice($edit->orig, 0, $ntrail); $block[] = new _DiffOp_Copy($context); } - $this->_block($x0, $ntrail + $xi - $x0, - $y0, $ntrail + $yi - $y0, - $block); + $this->_block($x0, $ntrail + $xi - $x0, $y0, $ntrail + $yi - $y0, $block); $block = false; } } @@ -754,9 +747,7 @@ class DiffFormatter { } if (is_array($block)) - $this->_block($x0, $xi - $x0, - $y0, $yi - $y0, - $block); + $this->_block($x0, $xi - $x0, $y0, $yi - $y0, $block); return $this->_end_diff(); } @@ -836,17 +827,21 @@ class DiffFormatter { define('NBSP', "\xC2\xA0"); // utf-8 non-breaking space. class _HWLDF_WordAccumulator { - function _HWLDF_WordAccumulator () { + function _HWLDF_WordAccumulator() { $this->_lines = array(); $this->_line = ''; $this->_group = ''; $this->_tag = ''; } - function _flushGroup ($new_tag) { + function _flushGroup($new_tag) { if ($this->_group !== '') { if ($this->_tag == 'mark') $this->_line .= '<strong>'.$this->_group.'</strong>'; + elseif ($this->_tag == 'add') + $this->_line .= '<span class="diff-addedline">'.$this->_group.'</span>'; + elseif ($this->_tag == 'del') + $this->_line .= '<span class="diff-deletedline"><del>'.$this->_group.'</del></span>'; else $this->_line .= $this->_group; } @@ -854,14 +849,14 @@ class _HWLDF_WordAccumulator { $this->_tag = $new_tag; } - function _flushLine ($new_tag) { + function _flushLine($new_tag) { $this->_flushGroup($new_tag); if ($this->_line != '') $this->_lines[] = $this->_line; $this->_line = ''; } - function addWords ($words, $tag = '') { + function addWords($words, $tag = '') { if ($tag != $this->_tag) $this->_flushGroup($tag); @@ -887,46 +882,80 @@ class _HWLDF_WordAccumulator { class WordLevelDiff extends MappedDiff { - function WordLevelDiff ($orig_lines, $closing_lines) { + function WordLevelDiff($orig_lines, $closing_lines) { list ($orig_words, $orig_stripped) = $this->_split($orig_lines); list ($closing_words, $closing_stripped) = $this->_split($closing_lines); - $this->MappedDiff($orig_words, $closing_words, - $orig_stripped, $closing_stripped); + $this->MappedDiff($orig_words, $closing_words, $orig_stripped, $closing_stripped); } function _split($lines) { - if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs', - implode("\n", $lines), - $m)) { + if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xsu', + implode("\n", $lines), $m)) { return array(array(''), array('')); - } - return array($m[0], $m[1]); - } + } + return array($m[0], $m[1]); + } - function orig () { - $orig = new _HWLDF_WordAccumulator; + function orig() { + $orig = new _HWLDF_WordAccumulator; - foreach ($this->edits as $edit) { + foreach ($this->edits as $edit) { if ($edit->type == 'copy') - $orig->addWords($edit->orig); + $orig->addWords($edit->orig); elseif ($edit->orig) - $orig->addWords($edit->orig, 'mark'); - } - return $orig->getLines(); - } + $orig->addWords($edit->orig, 'mark'); + } + return $orig->getLines(); + } - function closing () { - $closing = new _HWLDF_WordAccumulator; + function closing() { + $closing = new _HWLDF_WordAccumulator; - foreach ($this->edits as $edit) { - if ($edit->type == 'copy') - $closing->addWords($edit->closing); - elseif ($edit->closing) - $closing->addWords($edit->closing, 'mark'); - } - return $closing->getLines(); - } + foreach ($this->edits as $edit) { + if ($edit->type == 'copy') + $closing->addWords($edit->closing); + elseif ($edit->closing) + $closing->addWords($edit->closing, 'mark'); + } + return $closing->getLines(); + } +} + +class InlineWordLevelDiff extends MappedDiff { + + function InlineWordLevelDiff($orig_lines, $closing_lines) { + list ($orig_words, $orig_stripped) = $this->_split($orig_lines); + list ($closing_words, $closing_stripped) = $this->_split($closing_lines); + + $this->MappedDiff($orig_words, $closing_words, $orig_stripped, $closing_stripped); + } + + function _split($lines) { + if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xsu', + implode("\n", $lines), $m)) { + return array(array(''), array('')); + } + return array($m[0], $m[1]); + } + + function inline() { + $orig = new _HWLDF_WordAccumulator; + foreach ($this->edits as $edit) { + if ($edit->type == 'copy') + $orig->addWords($edit->closing); + elseif ($edit->type == 'change'){ + $orig->addWords($edit->orig, 'del'); + $orig->addWords($edit->closing, 'add'); + } elseif ($edit->type == 'delete') + $orig->addWords($edit->orig, 'del'); + elseif ($edit->type == 'add') + $orig->addWords($edit->closing, 'add'); + elseif ($edit->orig) + $orig->addWords($edit->orig, 'del'); + } + return $orig->getLines(); + } } /** @@ -986,78 +1015,148 @@ class TableDiffFormatter extends DiffFormatter { return $text; } - function _block_header( $xbeg, $xlen, $ybeg, $ylen ) { + function _block_header($xbeg, $xlen, $ybeg, $ylen) { global $lang; $l1 = $lang['line'].' '.$xbeg; $l2 = $lang['line'].' '.$ybeg; - $r = '<tr><td class="diff-blockheader" colspan="2">'.$l1.":</td>\n" . - '<td class="diff-blockheader" colspan="2">'.$l2.":</td></tr>\n"; + $r = '<tr><td class="diff-blockheader" colspan="2">'.$l1.":</td>\n". + ' <td class="diff-blockheader" colspan="2">'.$l2.":</td>\n". + "</tr>\n"; return $r; } - function _start_block( $header ) { - print( $header ); + function _start_block($header) { + print($header); } function _end_block() { } - function _lines( $lines, $prefix=' ', $color="white" ) { + function _lines($lines, $prefix=' ', $color="white") { } - function addedLine( $line ) { - return '<td>+</td><td class="diff-addedline">' . - $line.'</td>'; - + function addedLine($line) { + return '<td>+</td><td class="diff-addedline">' . $line.'</td>'; } - function deletedLine( $line ) { - return '<td>-</td><td class="diff-deletedline">' . - $line.'</td>'; + function deletedLine($line) { + return '<td>-</td><td class="diff-deletedline">' . $line.'</td>'; } function emptyLine() { return '<td colspan="2"> </td>'; } - function contextLine( $line ) { + function contextLine($line) { return '<td> </td><td class="diff-context">'.$line.'</td>'; } function _added($lines) { foreach ($lines as $line) { - print( '<tr>' . $this->emptyLine() . - $this->addedLine( $line ) . "</tr>\n" ); + print('<tr>' . $this->emptyLine() . $this->addedLine($line) . "</tr>\n"); } } function _deleted($lines) { foreach ($lines as $line) { - print( '<tr>' . $this->deletedLine( $line ) . - $this->emptyLine() . "</tr>\n" ); + print('<tr>' . $this->deletedLine($line) . $this->emptyLine() . "</tr>\n"); } } - function _context( $lines ) { + function _context($lines) { foreach ($lines as $line) { - print( '<tr>' . $this->contextLine( $line ) . - $this->contextLine( $line ) . "</tr>\n" ); + print('<tr>' . $this->contextLine($line) . $this->contextLine($line) . "</tr>\n"); } } - function _changed( $orig, $closing ) { - $diff = new WordLevelDiff( $orig, $closing ); + function _changed($orig, $closing) { + $diff = new WordLevelDiff($orig, $closing); $del = $diff->orig(); $add = $diff->closing(); - while ( $line = array_shift( $del ) ) { - $aline = array_shift( $add ); - print( '<tr>' . $this->deletedLine( $line ) . - $this->addedLine( $aline ) . "</tr>\n" ); + while ($line = array_shift($del)) { + $aline = array_shift($add); + print('<tr>' . $this->deletedLine($line) . $this->addedLine($aline) . "</tr>\n"); } - $this->_added( $add ); # If any leftovers + $this->_added($add); # If any leftovers + } +} + +/** + * Inline style diff formatter. + * + */ +class InlineDiffFormatter extends DiffFormatter { + var $colspan = 4; + + function InlineDiffFormatter() { + $this->leading_context_lines = 2; + $this->trailing_context_lines = 2; + } + + function format($diff) { + // Preserve whitespaces by converting some to non-breaking spaces. + // Do not convert all of them to allow word-wrap. + $val = parent::format($diff); + $val = str_replace(' ',' ', $val); + $val = preg_replace('/ (?=<)|(?<=[ >]) /', ' ', $val); + return $val; + } + + function _pre($text){ + $text = htmlspecialchars($text); + return $text; + } + + function _block_header($xbeg, $xlen, $ybeg, $ylen) { + global $lang; + if ($xlen != 1) + $xbeg .= "," . $xlen; + if ($ylen != 1) + $ybeg .= "," . $ylen; + $r = '<tr><td colspan="'.$this->colspan.'" class="diff-blockheader">@@ '.$lang['line']." -$xbeg +$ybeg @@"; + $r .= ' <span class="diff-deletedline"><del>'.$lang['deleted'].'</del></span>'; + $r .= ' <span class="diff-addedline">'.$lang['created'].'</span>'; + $r .= "</td></tr>\n"; + return $r; + } + + function _start_block($header) { + print($header."\n"); + } + + function _end_block() { + } + + function _lines($lines, $prefix=' ', $color="white") { + } + + function _added($lines) { + foreach ($lines as $line) { + print('<tr><td colspan="'.$this->colspan.'" class="diff-addedline">'. $line . "</td></tr>\n"); + } + } + + function _deleted($lines) { + foreach ($lines as $line) { + print('<tr><td colspan="'.$this->colspan.'" class="diff-deletedline"><del>' . $line . "</del></td></tr>\n"); + } + } + + function _context($lines) { + foreach ($lines as $line) { + print('<tr><td colspan="'.$this->colspan.'" class="diff-context">'.$line."</td></tr>\n"); + } + } + + function _changed($orig, $closing) { + $diff = new InlineWordLevelDiff($orig, $closing); + $add = $diff->inline(); + + foreach ($add as $line) + print('<tr><td colspan="'.$this->colspan.'">'.$line."</td></tr>\n"); } } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/EmailAddressValidator.php b/inc/EmailAddressValidator.php index 2ce2093e2..bb4ef0ca9 100644 --- a/inc/EmailAddressValidator.php +++ b/inc/EmailAddressValidator.php @@ -5,21 +5,38 @@ * @author Dave Child <dave@addedbytes.com> * @link http://code.google.com/p/php-email-address-validation/ * @license http://www.opensource.org/licenses/bsd-license.php + * @version SVN r10 + Issue 15 fix + Issue 12 fix */ class EmailAddressValidator { + /** + * Set true to allow addresses like me@localhost + */ + public $allowLocalAddresses = false; /** * Check email address validity * @param strEmailAddress Email address to be checked * @return True if email is valid, false if not */ - function check_email_address($strEmailAddress) { + public function check_email_address($strEmailAddress) { + + // If magic quotes is "on", email addresses with quote marks will + // fail validation because of added escape characters. Uncommenting + // the next three lines will allow for this issue. + //if (get_magic_quotes_gpc()) { + // $strEmailAddress = stripslashes($strEmailAddress); + //} // Control characters are not allowed if (preg_match('/[\x00-\x1F\x7F-\xFF]/', $strEmailAddress)) { return false; } + // Check email length - min 3 (a@a), max 256 + if (!$this->check_text_length($strEmailAddress, 3, 256)) { + return false; + } + // Split it into sections using last instance of "@" $intAtSymbol = strrpos($strEmailAddress, '@'); if ($intAtSymbol === false) { @@ -31,10 +48,15 @@ class EmailAddressValidator { // Count the "@" symbols. Only one is allowed, except where // contained in quote marks in the local part. Quickest way to - // check this is to remove anything in quotes. - $arrTempAddress[0] = preg_replace('/"[^"]+"/' + // check this is to remove anything in quotes. We also remove + // characters escaped with backslash, and the backslash + // character. + $arrTempAddress[0] = preg_replace('/\./' ,'' ,$arrEmailAddress[0]); + $arrTempAddress[0] = preg_replace('/"[^"]+"/' + ,'' + ,$arrTempAddress[0]); $arrTempAddress[1] = $arrEmailAddress[1]; $strTempAddress = $arrTempAddress[0] . $arrTempAddress[1]; // Then check - should be no "@" symbols. @@ -63,7 +85,7 @@ class EmailAddressValidator { * @param strLocalPortion Text to be checked * @return True if local portion is valid, false if not */ - function check_local_portion($strLocalPortion) { + protected function check_local_portion($strLocalPortion) { // Local portion can only be from 1 to 64 characters, inclusive. // Please note that servers are encouraged to accept longer local // parts than 64 characters. @@ -94,22 +116,39 @@ class EmailAddressValidator { * @param strDomainPortion Text to be checked * @return True if domain portion is valid, false if not */ - function check_domain_portion($strDomainPortion) { + protected function check_domain_portion($strDomainPortion) { // Total domain can only be from 1 to 255 characters, inclusive if (!$this->check_text_length($strDomainPortion, 1, 255)) { return false; } + + // some IPv4/v6 regexps borrowed from Feyd + // see: http://forums.devnetwork.net/viewtopic.php?f=38&t=53479 + $dec_octet = '(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[0-9])'; + $hex_digit = '[A-Fa-f0-9]'; + $h16 = "{$hex_digit}{1,4}"; + $IPv4Address = "$dec_octet\\.$dec_octet\\.$dec_octet\\.$dec_octet"; + $ls32 = "(?:$h16:$h16|$IPv4Address)"; + $IPv6Address = + "(?:(?:{$IPv4Address})|(?:". + "(?:$h16:){6}$ls32" . + "|::(?:$h16:){5}$ls32" . + "|(?:$h16)?::(?:$h16:){4}$ls32" . + "|(?:(?:$h16:){0,1}$h16)?::(?:$h16:){3}$ls32" . + "|(?:(?:$h16:){0,2}$h16)?::(?:$h16:){2}$ls32" . + "|(?:(?:$h16:){0,3}$h16)?::(?:$h16:){1}$ls32" . + "|(?:(?:$h16:){0,4}$h16)?::$ls32" . + "|(?:(?:$h16:){0,5}$h16)?::$h16" . + "|(?:(?:$h16:){0,6}$h16)?::" . + ")(?:\\/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))?)"; + // Check if domain is IP, possibly enclosed in square brackets. - if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])' - .'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/' - ,$strDomainPortion) || - preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])' - .'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/' - ,$strDomainPortion)) { + if (preg_match("/^($IPv4Address|\[$IPv4Address\]|\[$IPv6Address\])$/", + $strDomainPortion)){ return true; } else { $arrDomainPortion = explode('.', $strDomainPortion); - if (sizeof($arrDomainPortion) < 2) { + if (!$this->allowLocalAddresses && sizeof($arrDomainPortion) < 2) { return false; // Not enough parts to domain } for ($i = 0, $max = sizeof($arrDomainPortion); $i < $max; $i++) { @@ -121,6 +160,11 @@ class EmailAddressValidator { .'([A-Za-z0-9]+))$/', $arrDomainPortion[$i])) { return false; } + if ($i == $max - 1) { // TLD cannot be only numbers + if (strlen(preg_replace('/[0-9]/', '', $arrDomainPortion[$i])) <= 0) { + return false; + } + } } } return true; @@ -133,7 +177,7 @@ class EmailAddressValidator { * @param intMaximum Maximum acceptable length * @return True if string is within bounds (inclusive), false if not */ - function check_text_length($strText, $intMinimum, $intMaximum) { + protected function check_text_length($strText, $intMinimum, $intMaximum) { // Minimum and maximum are both inclusive $intTextLength = strlen($strText); if (($intTextLength < $intMinimum) || ($intTextLength > $intMaximum)) { @@ -142,5 +186,6 @@ class EmailAddressValidator { return true; } } + } diff --git a/inc/FeedParser.php b/inc/FeedParser.php index 9d00e7abf..b98350da7 100644 --- a/inc/FeedParser.php +++ b/inc/FeedParser.php @@ -49,6 +49,7 @@ class FeedParser_File extends SimplePie_File { */ function FeedParser_File($url, $timeout=10, $redirects=5, $headers=null, $useragent=null, $force_fsockopen=false) { + parent::__construct(); $this->http = new DokuHTTPClient(); $this->success = $this->http->sendRequest($url); diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php index e68679bde..372769b71 100644 --- a/inc/HTTPClient.php +++ b/inc/HTTPClient.php @@ -71,6 +71,7 @@ class DokuHTTPClient extends HTTPClient { * @link http://www.splitbrain.org/go/videodb * @author Andreas Goetz <cpuidle@gmx.de> * @author Andreas Gohr <andi@splitbrain.org> + * @author Tobias Sarnowski <sarnowski@new-thoughts.org> */ class HTTPClient { //set these if you like @@ -86,13 +87,14 @@ class HTTPClient { var $headers; var $debug; var $start = 0; // for timings + var $keep_alive = true; // keep alive rocks // don't set these, read on error var $error; var $redirect_count; // read these after a successful request - var $resp_status; + var $status; var $resp_body; var $resp_headers; @@ -108,6 +110,9 @@ class HTTPClient { var $proxy_ssl; //boolean set to true if your proxy needs SSL var $proxy_except; // regexp of URLs to exclude from proxy + // list of kept alive connections + static $connections = array(); + // what we use as boundary on multipart/form-data posts var $boundary = '---DokuWikiHTTPClient--4523452351'; @@ -222,7 +227,7 @@ class HTTPClient { $path = $uri['path']; if(empty($path)) $path = '/'; if(!empty($uri['query'])) $path .= '?'.$uri['query']; - $port = $uri['port']; + if(isset($uri['port']) && !empty($uri['port'])) $port = $uri['port']; if(isset($uri['user'])) $this->user = $uri['user']; if(isset($uri['pass'])) $this->pass = $uri['pass']; @@ -235,7 +240,7 @@ class HTTPClient { }else{ $request_url = $path; $server = $server; - if (empty($port)) $port = ($uri['scheme'] == 'https') ? 443 : 80; + if (!isset($port)) $port = ($uri['scheme'] == 'https') ? 443 : 80; } // add SSL stream prefix if needed - needs SSL support in PHP @@ -247,7 +252,11 @@ class HTTPClient { if($uri['port']) $headers['Host'].= ':'.$uri['port']; $headers['User-Agent'] = $this->agent; $headers['Referer'] = $this->referer; - $headers['Connection'] = 'Close'; + if ($this->keep_alive) { + $headers['Connection'] = 'Keep-Alive'; + } else { + $headers['Connection'] = 'Close'; + } if($method == 'POST'){ if(is_array($data)){ if($headers['Content-Type'] == 'multipart/form-data'){ @@ -273,15 +282,34 @@ class HTTPClient { // stop time $start = time(); - // open socket - $socket = @fsockopen($server,$port,$errno, $errstr, $this->timeout); - if (!$socket){ - $this->status = -100; - $this->error = "Could not connect to $server:$port\n$errstr ($errno)"; - return false; + // already connected? + $connectionId = $this->_uniqueConnectionId($server,$port); + $this->_debug('connection pool', $this->connections); + $socket = null; + if (isset($this->connections[$connectionId])) { + $this->_debug('reusing connection', $connectionId); + $socket = $this->connections[$connectionId]; } - //set non blocking - stream_set_blocking($socket,0); + if (is_null($socket) || feof($socket)) { + $this->_debug('opening connection', $connectionId); + // open socket + $socket = @fsockopen($server,$port,$errno, $errstr, $this->timeout); + if (!$socket){ + $this->status = -100; + $this->error = "Could not connect to $server:$port\n$errstr ($errno)"; + return false; + } + + // keep alive? + if ($this->keep_alive) { + $this->connections[$connectionId] = $socket; + } else { + unset($this->connections[$connectionId]); + } + } + + //set blocking + stream_set_blocking($socket,1); // build request $request = "$method $request_url HTTP/".$this->http.HTTP_NL; @@ -292,29 +320,52 @@ class HTTPClient { $this->_debug('request',$request); + // select parameters + $sel_r = null; + $sel_w = array($socket); + $sel_e = null; + // send request $towrite = strlen($request); $written = 0; while($written < $towrite){ - $ret = fwrite($socket, substr($request,$written)); + // check timeout + if(time()-$start > $this->timeout){ + $this->status = -100; + $this->error = sprintf('Timeout while sending request (%.3fs)',$this->_time() - $this->start); + unset($this->connections[$connectionId]); + return false; + } + + // wait for stream ready or timeout (1sec) + if(stream_select($sel_r,$sel_w,$sel_e,1) === false) continue; + + // write to stream + $ret = fwrite($socket, substr($request,$written,4096)); if($ret === false){ $this->status = -100; $this->error = 'Failed writing to socket'; + unset($this->connections[$connectionId]); return false; } $written += $ret; } + // continue non-blocking + stream_set_blocking($socket,0); + // read headers from socket $r_headers = ''; do{ if(time()-$start > $this->timeout){ $this->status = -100; $this->error = sprintf('Timeout while reading headers (%.3fs)',$this->_time() - $this->start); + unset($this->connections[$connectionId]); return false; } if(feof($socket)){ $this->error = 'Premature End of File (socket)'; + unset($this->connections[$connectionId]); return false; } $r_headers .= fgets($socket,1024); @@ -327,6 +378,7 @@ class HTTPClient { if($match[1] > $this->max_bodysize){ $this->error = 'Reported content length exceeds allowed response size'; if ($this->max_bodysize_abort) + unset($this->connections[$connectionId]); return false; } } @@ -334,6 +386,7 @@ class HTTPClient { // get Status if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m)) { $this->error = 'Server returned bad answer'; + unset($this->connections[$connectionId]); return false; } $this->status = $m[2]; @@ -359,6 +412,11 @@ class HTTPClient { // check server status code to follow redirect if($this->status == 301 || $this->status == 302 ){ + // close the connection because we don't handle content retrieval here + // that's the easiest way to clean up the connection + fclose($socket); + unset($this->connections[$connectionId]); + if (empty($this->resp_headers['location'])){ $this->error = 'Redirect but no Location Header found'; return false; @@ -386,6 +444,7 @@ class HTTPClient { // check if headers are as expected if($this->header_regexp && !preg_match($this->header_regexp,$r_headers)){ $this->error = 'The received headers did not match the given regexp'; + unset($this->connections[$connectionId]); return false; } @@ -397,11 +456,13 @@ class HTTPClient { do { if(feof($socket)){ $this->error = 'Premature End of File (socket)'; + unset($this->connections[$connectionId]); return false; } if(time()-$start > $this->timeout){ $this->status = -100; $this->error = sprintf('Timeout while reading chunk (%.3fs)',$this->_time() - $this->start); + unset($this->connections[$connectionId]); return false; } $byte = fread($socket,1); @@ -418,10 +479,12 @@ class HTTPClient { if($this->max_bodysize && strlen($r_body) > $this->max_bodysize){ $this->error = 'Allowed response size exceeded'; - if ($this->max_bodysize_abort) + if ($this->max_bodysize_abort){ + unset($this->connections[$connectionId]); return false; - else + } else { break; + } } } while ($chunk_size); }else{ @@ -430,16 +493,19 @@ class HTTPClient { if(time()-$start > $this->timeout){ $this->status = -100; $this->error = sprintf('Timeout while reading response (%.3fs)',$this->_time() - $this->start); + unset($this->connections[$connectionId]); return false; } $r_body .= fread($socket,4096); $r_size = strlen($r_body); if($this->max_bodysize && $r_size > $this->max_bodysize){ $this->error = 'Allowed response size exceeded'; - if ($this->max_bodysize_abort) + if ($this->max_bodysize_abort) { + unset($this->connections[$connectionId]); return false; - else + } else { break; + } } if(isset($this->resp_headers['content-length']) && !isset($this->resp_headers['transfer-encoding']) && @@ -450,9 +516,13 @@ class HTTPClient { } } - // close socket - $status = socket_get_status($socket); - fclose($socket); + if (!$this->keep_alive || + (isset($this->resp_headers['connection']) && $this->resp_headers['connection'] == 'Close')) { + // close socket + $status = socket_get_status($socket); + fclose($socket); + unset($this->connections[$connectionId]); + } // decode gzip if needed if(isset($this->resp_headers['content-encoding']) && @@ -506,12 +576,13 @@ class HTTPClient { */ function _parseHeaders($string){ $headers = array(); - $lines = explode("\n",$string); - foreach($lines as $line){ - list($key,$val) = explode(':',$line,2); - $key = strtolower(trim($key)); - $val = trim($val); - if(empty($val)) continue; + if (!preg_match_all('/^\s*([\w-]+)\s*:\s*([\S \t]+)\s*$/m', $string, + $matches, PREG_SET_ORDER)) { + return $headers; + } + foreach($matches as $match){ + list(, $key, $val) = $match; + $key = strtolower($key); if(isset($headers[$key])){ if(is_array($headers[$key])){ $headers[$key][] = $val; @@ -598,6 +669,14 @@ class HTTPClient { return $out; } + /** + * Generates a unique identifier for a connection. + * + * @return string unique identifier + */ + function _uniqueConnectionId($server, $port) { + return "$server:$port"; + } } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/IXR_Library.php b/inc/IXR_Library.php index c7f83a6d6..c8255e6d9 100644 --- a/inc/IXR_Library.php +++ b/inc/IXR_Library.php @@ -395,13 +395,8 @@ EOD; $this->output($error->getXml()); } function output($xml) { - $xml = '<?xml version="1.0"?>'."\n".$xml; - $length = strlen($xml); - header('Connection: close'); - header('Content-Length: '.$length); - header('Content-Type: text/xml'); - header('Date: '.date('r')); - echo $xml; + header('Content-Type: text/xml; charset=utf-8'); + echo '<?xml version="1.0"?>', "\n", $xml; exit; } function hasMethod($method) { diff --git a/inc/JSON.php b/inc/JSON.php index 332827f4c..2dea44003 100644 --- a/inc/JSON.php +++ b/inc/JSON.php @@ -112,6 +112,16 @@ define('JSON_STRICT_TYPE', 11); * @deprecated */ class JSON { + + /** + * Disables the use of PHP5's native json_decode() + * + * You shouldn't change this usually because the native function is much + * faster. However, this non-native will also parse slightly broken JSON + * which might be handy when talking to a non-conform endpoint + */ + public $skipnative = false; + /** * constructs a new JSON instance * @@ -130,6 +140,7 @@ class JSON { /** * encodes an arbitrary variable into JSON format + * If available the native PHP JSON implementation is used. * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to JSON() above for array-parsing behavior. @@ -140,6 +151,7 @@ class JSON { * @access public */ function encode($var) { + if (function_exists('json_encode')) return json_encode($var); switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; @@ -352,6 +364,7 @@ class JSON { /** * decodes a JSON string into appropriate variable + * If available the native PHP JSON implementation is used. * * @param string $str JSON-formatted string * @@ -363,6 +376,10 @@ class JSON { * @access public */ function decode($str) { + if (!$this->skipnative && function_exists('json_decode')){ + return json_decode($str,($this->use == JSON_LOOSE_TYPE)); + } + $str = $this->reduce_string($str); switch (strtolower($str)) { diff --git a/inc/JpegMeta.php b/inc/JpegMeta.php index fa05f6859..afa70168c 100644 --- a/inc/JpegMeta.php +++ b/inc/JpegMeta.php @@ -1466,16 +1466,21 @@ class JpegMeta { $parser = xml_parser_create(); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); - xml_parse_into_struct($parser, $data, $values, $tags); + $result = xml_parse_into_struct($parser, $data, $values, $tags); xml_parser_free($parser); + if ($result == 0) { + $this->_info['xmp'] = false; + return false; + } + $this->_info['xmp'] = array(); $count = count($values); for ($i = 0; $i < $count; $i++) { if ($values[$i]['tag'] == 'rdf:Description' && $values[$i]['type'] == 'open') { - while ($values[++$i]['tag'] != 'rdf:Description') { - $this->_parseXmpNode($values, $i, $this->_info['xmp'][$values[$i]['tag']]); + while ((++$i < $count) && ($values[$i]['tag'] != 'rdf:Description')) { + $this->_parseXmpNode($values, $i, $this->_info['xmp'][$values[$i]['tag']], $count); } } } @@ -1487,7 +1492,7 @@ class JpegMeta { * * @author Hakan Sandell <hakan.sandell@mydata.se> */ - function _parseXmpNode($values, &$i, &$meta) { + function _parseXmpNode($values, &$i, &$meta, $count) { if ($values[$i]['type'] == 'close') return; if ($values[$i]['type'] == 'complete') { @@ -1497,11 +1502,13 @@ class JpegMeta { } $i++; + if ($i >= $count) return; + if ($values[$i]['tag'] == 'rdf:Bag' || $values[$i]['tag'] == 'rdf:Seq') { // Array property $meta = array(); while ($values[++$i]['tag'] == 'rdf:li') { - $this->_parseXmpNode($values, $i, $meta[]); + $this->_parseXmpNode($values, $i, $meta[], $count); } $i++; // skip closing Bag/Seq tag @@ -1509,8 +1516,8 @@ class JpegMeta { // Language Alternative property, only the first (default) value is used if ($values[$i]['type'] == 'open') { $i++; - $this->_parseXmpNode($values, $i, $meta); - while ($values[++$i]['tag'] != 'rdf:Alt'); + $this->_parseXmpNode($values, $i, $meta, $count); + while ((++$i < $count) && ($values[$i]['tag'] != 'rdf:Alt')); $i++; // skip closing Alt tag } @@ -1519,8 +1526,8 @@ class JpegMeta { $meta = array(); $startTag = $values[$i-1]['tag']; do { - $this->_parseXmpNode($values, $i, $meta[$values[$i]['tag']]); - } while ($values[++$i]['tag'] != $startTag); + $this->_parseXmpNode($values, $i, $meta[$values[$i]['tag']], $count); + } while ((++$i < $count) && ($values[$i]['tag'] != $startTag)); } } diff --git a/inc/PassHash.class.php b/inc/PassHash.class.php new file mode 100644 index 000000000..cb46c5928 --- /dev/null +++ b/inc/PassHash.class.php @@ -0,0 +1,379 @@ +<?php +/** + * Password Hashing Class + * + * This class implements various mechanisms used to hash passwords + * + * @author Andreas Gohr <andi@splitbrain.org> + * @license LGPL2 + */ +class PassHash { + /** + * Verifies a cleartext password against a crypted hash + * + * The method and salt used for the crypted hash is determined automatically, + * then the clear text password is crypted using the same method. If both hashs + * match true is is returned else false + * + * @author Andreas Gohr <andi@splitbrain.org> + * @return bool + */ + function verify_hash($clear,$hash){ + $method=''; + $salt=''; + $magic=''; + + //determine the used method and salt + $len = strlen($hash); + if(preg_match('/^\$1\$([^\$]{0,8})\$/',$hash,$m)){ + $method = 'smd5'; + $salt = $m[1]; + $magic = '1'; + }elseif(preg_match('/^\$apr1\$([^\$]{0,8})\$/',$hash,$m)){ + $method = 'apr1'; + $salt = $m[1]; + $magic = 'apr1'; + }elseif(preg_match('/^\$P\$(.{31})$/',$hash,$m)){ + $method = 'pmd5'; + $salt = $m[1]; + $magic = 'P'; + }elseif(preg_match('/^\$H\$(.{31})$/',$hash,$m)){ + $method = 'pmd5'; + $salt = $m[1]; + $magic = 'H'; + }elseif(preg_match('/^sha1\$(.{5})\$/',$hash,$m)){ + $method = 'djangosha1'; + $salt = $m[1]; + }elseif(preg_match('/^md5\$(.{5})\$/',$hash,$m)){ + $method = 'djangomd5'; + $salt = $m[1]; + }elseif(substr($hash,0,6) == '{SSHA}'){ + $method = 'ssha'; + $salt = substr(base64_decode(substr($hash, 6)),20); + }elseif($len == 32){ + $method = 'md5'; + }elseif($len == 40){ + $method = 'sha1'; + }elseif($len == 16){ + $method = 'mysql'; + }elseif($len == 41 && $hash[0] == '*'){ + $method = 'my411'; + }elseif($len == 34){ + $method = 'kmd5'; + $salt = $hash; + }else{ + $method = 'crypt'; + $salt = substr($hash,0,2); + } + + //crypt and compare + $call = 'hash_'.$method; + if($this->$call($clear,$salt,$magic) === $hash){ + return true; + } + return false; + } + + /** + * Create a random salt + * + * @param int $len - The length of the salt + */ + public function gen_salt($len=32){ + $salt = ''; + $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + for($i=0;$i<$len,$i++;) $salt .= $chars[mt_rand(0,61)]; + return $salt; + } + + /** + * Initialize the passed variable with a salt if needed. + * + * If $salt is not null, the value is kept, but the lenght restriction is + * applied. + * + * @param stringref $salt - The salt, pass null if you want one generated + * @param int $len - The length of the salt + */ + public function init_salt(&$salt,$len=32){ + if(is_null($salt)) $salt = $this->gen_salt($len); + if(strlen($salt) > $len) $salt = substr($salt,0,$len); + } + + // Password hashing methods follow below + + /** + * Password hashing method 'smd5' + * + * Uses salted MD5 hashs. Salt is 8 bytes long. + * + * The same mechanism is used by Apache's 'apr1' method. This will + * fallback to a implementation in pure PHP if MD5 support is not + * available in crypt() + * + * @author Andreas Gohr <andi@splitbrain.org> + * @author <mikey_nich at hotmail dot com> + * @link http://de.php.net/manual/en/function.crypt.php#73619 + * @param string $clear - the clear text to hash + * @param string $salt - the salt to use, null for random + * @param string $magic - the hash identifier (apr1 or 1) + * @returns string - hashed password + */ + public function hash_smd5($clear, $salt=null){ + $this->init_salt($salt,8); + + if(defined('CRYPT_MD5') && CRYPT_MD5){ + return crypt($clear,'$1$'.$salt.'$'); + }else{ + // Fall back to PHP-only implementation + return $this->apr1($clear, $salt, '1'); + } + } + + /** + * Password hashing method 'apr1' + * + * Uses salted MD5 hashs. Salt is 8 bytes long. + * + * This is basically the same as smd1 above, but as used by Apache. + * + * @author <mikey_nich at hotmail dot com> + * @link http://de.php.net/manual/en/function.crypt.php#73619 + * @param string $clear - the clear text to hash + * @param string $salt - the salt to use, null for random + * @param string $magic - the hash identifier (apr1 or 1) + * @returns string - hashed password + */ + public function hash_apr1($clear, $salt=null, $magic='apr1'){ + $this->init_salt($salt,8); + + $len = strlen($clear); + $text = $clear.'$'.$magic.'$'.$salt; + $bin = pack("H32", md5($clear.$salt.$clear)); + for($i = $len; $i > 0; $i -= 16) { + $text .= substr($bin, 0, min(16, $i)); + } + for($i = $len; $i > 0; $i >>= 1) { + $text .= ($i & 1) ? chr(0) : $clear{0}; + } + $bin = pack("H32", md5($text)); + for($i = 0; $i < 1000; $i++) { + $new = ($i & 1) ? $clear : $bin; + if ($i % 3) $new .= $salt; + if ($i % 7) $new .= $clear; + $new .= ($i & 1) ? $bin : $clear; + $bin = pack("H32", md5($new)); + } + $tmp = ''; + for ($i = 0; $i < 5; $i++) { + $k = $i + 6; + $j = $i + 12; + if ($j == 16) $j = 5; + $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp; + } + $tmp = chr(0).chr(0).$bin[11].$tmp; + $tmp = strtr(strrev(substr(base64_encode($tmp), 2)), + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", + "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); + return '$'.$magic.'$'.$salt.'$'.$tmp; + } + + /** + * Password hashing method 'md5' + * + * Uses MD5 hashs. + * + * @param string $clear - the clear text to hash + * @returns string - hashed password + */ + public function hash_md5($clear){ + return md5($clear); + } + + /** + * Password hashing method 'sha1' + * + * Uses SHA1 hashs. + * + * @param string $clear - the clear text to hash + * @returns string - hashed password + */ + public function hash_sha1($clear){ + return sha1($clear); + } + + /** + * Password hashing method 'ssha' as used by LDAP + * + * Uses salted SHA1 hashs. Salt is 4 bytes long. + * + * @param string $clear - the clear text to hash + * @param string $salt - the salt to use, null for random + * @returns string - hashed password + */ + public function hash_ssha($clear, $salt=null){ + $this->init_salt($salt,4); + return '{SSHA}'.base64_encode(pack("H*", sha1($clear.$salt)).$salt); + } + + /** + * Password hashing method 'crypt' + * + * Uses salted crypt hashs. Salt is 2 bytes long. + * + * @param string $clear - the clear text to hash + * @param string $salt - the salt to use, null for random + * @returns string - hashed password + */ + public function hash_crypt($clear, $salt=null){ + $this->init_salt($salt,2); + return crypt($clear,$salt); + } + + /** + * Password hashing method 'mysql' + * + * This method was used by old MySQL systems + * + * @link http://www.php.net/mysql + * @author <soren at byu dot edu> + * @param string $clear - the clear text to hash + * @returns string - hashed password + */ + public function hash_mysql($clear){ + $nr=0x50305735; + $nr2=0x12345671; + $add=7; + $charArr = preg_split("//", $clear); + foreach ($charArr as $char) { + if (($char == '') || ($char == ' ') || ($char == '\t')) continue; + $charVal = ord($char); + $nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8); + $nr2 += ($nr2 << 8) ^ $nr; + $add += $charVal; + } + return sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff)); + } + + /** + * Password hashing method 'my411' + * + * Uses SHA1 hashs. This method is used by MySQL 4.11 and above + * + * @param string $clear - the clear text to hash + * @returns string - hashed password + */ + public function hash_my411($clear){ + return '*'.sha1(pack("H*", sha1($clear))); + } + + /** + * Password hashing method 'kmd5' + * + * Uses salted MD5 hashs. + * + * Salt is 2 bytes long, but stored at position 16, so you need to pass at + * least 18 bytes. You can pass the crypted hash as salt. + * + * @param string $clear - the clear text to hash + * @param string $salt - the salt to use, null for random + * @returns string - hashed password + */ + public function hash_kmd5($clear, $salt=null){ + $this->init_salt($salt); + + $key = substr($salt, 16, 2); + $hash1 = strtolower(md5($key . md5($clear))); + $hash2 = substr($hash1, 0, 16) . $key . substr($hash1, 16); + return $hash2; + } + + /** + * Password hashing method 'pmd5' + * + * Uses salted MD5 hashs. Salt is 1+8 bytes long, 1st byte is the + * iteration count. + * + * @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) + * @returns string - hashed password + */ + public function hash_pmd5($clear, $salt=null, $magic='P'){ + $this->init_salt($salt); + + $itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; + $iterc = $salt[0]; // pos 0 of salt is iteration count + $iter = strpos($itoa64,$iterc); + $iter = 1 << $iter; + $salt = substr($salt,1,8); + + // iterate + $hash = md5($salt . $clear, true); + do { + $hash = md5($hash . $clear, true); + } while (--$iter); + + // encode + $output = ''; + $count = 16; + $i = 0; + do { + $value = ord($hash[$i++]); + $output .= $itoa64[$value & 0x3f]; + if ($i < $count) + $value |= ord($hash[$i]) << 8; + $output .= $itoa64[($value >> 6) & 0x3f]; + if ($i++ >= $count) + break; + if ($i < $count) + $value |= ord($hash[$i]) << 16; + $output .= $itoa64[($value >> 12) & 0x3f]; + if ($i++ >= $count) + break; + $output .= $itoa64[($value >> 18) & 0x3f]; + } while ($i < $count); + + return '$'.$magic.'$'.$iterc.$salt.$output; + } + + /** + * Alias for hash_pmd5 + */ + public function hash_hmd5($clear, $salt=null, $magic='H'){ + return $this->hash_pmd5($clear, $salt, $magic); + } + + /** + * Password hashing method 'djangosha1' + * + * Uses salted SHA1 hashs. Salt is 5 bytes long. + * This is used by the Django Python framework + * + * @link http://docs.djangoproject.com/en/dev/topics/auth/#passwords + * @param string $clear - the clear text to hash + * @param string $salt - the salt to use, null for random + * @returns string - hashed password + */ + public function hash_djangosha1($clear, $salt=null){ + $this->init_salt($salt,5); + return 'sha1$'.$salt.'$'.sha1($salt.$clear); + } + + /** + * Password hashing method 'djangomd5' + * + * Uses salted MD5 hashs. Salt is 5 bytes long. + * This is used by the Django Python framework + * + * @link http://docs.djangoproject.com/en/dev/topics/auth/#passwords + * @param string $clear - the clear text to hash + * @param string $salt - the salt to use, null for random + * @returns string - hashed password + */ + public function hash_djangomd5($clear, $salt=null){ + $this->init_salt($salt,5); + return 'md5$'.$salt.'$'.md5($salt.$clear); + } + +} diff --git a/inc/SafeFN.class.php b/inc/SafeFN.class.php index b6e477fab..ac6698a63 100644 --- a/inc/SafeFN.class.php +++ b/inc/SafeFN.class.php @@ -114,6 +114,7 @@ class SafeFN { $converted = true; } } + if($converted) $safe .= self::$post_indicator; return $safe; } diff --git a/inc/SimplePie.php b/inc/SimplePie.php index 99c9f3226..d35443165 100644 --- a/inc/SimplePie.php +++ b/inc/SimplePie.php @@ -5,7 +5,7 @@ * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * - * Copyright (c) 2004-2007, Ryan Parman and Geoffrey Sneddon + * Copyright (c) 2004-2009, Ryan Parman and Geoffrey Sneddon * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are @@ -33,8 +33,8 @@ * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie - * @version "Razzleberry" - * @copyright 2004-2007 Ryan Parman, Geoffrey Sneddon + * @version 1.2.1-dev + * @copyright 2004-2009 Ryan Parman, Geoffrey Sneddon * @author Ryan Parman * @author Geoffrey Sneddon * @link http://simplepie.org/ SimplePie @@ -51,18 +51,18 @@ define('SIMPLEPIE_NAME', 'SimplePie'); /** * SimplePie Version */ -define('SIMPLEPIE_VERSION', '1.0.1'); +define('SIMPLEPIE_VERSION', '1.2.1-dev'); /** * SimplePie Build * @todo Hardcode for release (there's no need to have to call SimplePie_Misc::parse_date() only every load of simplepie.inc) */ -define('SIMPLEPIE_BUILD', 20070719221955); +define('SIMPLEPIE_BUILD', gmdate('YmdHis', SimplePie_Misc::parse_date(substr('$Date$', 7, 25)) ? SimplePie_Misc::parse_date(substr('$Date$', 7, 25)) : filemtime(__FILE__))); /** * SimplePie Website URL */ -define('SIMPLEPIE_URL', 'http://simplepie.org/'); +define('SIMPLEPIE_URL', 'http://simplepie.org'); /** * SimplePie Useragent @@ -243,9 +243,24 @@ define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32); define('SIMPLEPIE_CONSTRUCT_ALL', 63); /** + * Don't change case + */ +define('SIMPLEPIE_SAME_CASE', 1); + +/** + * Change to lowercase + */ +define('SIMPLEPIE_LOWERCASE', 2); + +/** + * Change to uppercase + */ +define('SIMPLEPIE_UPPERCASE', 4); + +/** * PCRE for HTML attributes */ -define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)(?:\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[a-z0-9\-._:]*)))?)*)\s*'); +define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*'); /** * PCRE for XML attributes @@ -288,6 +303,12 @@ define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/'); define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/'); /** + * RSS 2.0 Namespace + * (Stupid, I know, but I'm certain it will confuse people less with support.) + */ +define('SIMPLEPIE_NAMESPACE_RSS_20', ''); + +/** * DC 1.0 Namespace */ define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/'); @@ -313,6 +334,11 @@ define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss'); define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/'); /** + * Wrong Media RSS Namespace + */ +define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss'); + +/** * iTunes RSS Namespace */ define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); @@ -333,14 +359,39 @@ define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignment define('SIMPLEPIE_PHP5', version_compare(PHP_VERSION, '5.0.0', '>=')); /** + * No file source + */ +define('SIMPLEPIE_FILE_SOURCE_NONE', 0); + +/** + * Remote file source + */ +define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1); + +/** + * Local file source + */ +define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2); + +/** + * fsockopen() file source + */ +define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4); + +/** + * cURL file source + */ +define('SIMPLEPIE_FILE_SOURCE_CURL', 8); + +/** + * file_get_contents() file source + */ +define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16); + +/** * SimplePie * * @package SimplePie - * @version "Razzleberry" - * @copyright 2004-2007 Ryan Parman, Geoffrey Sneddon - * @author Ryan Parman - * @author Geoffrey Sneddon - * @todo Option for type of fetching (cache, not modified header, fetch, etc.) */ class SimplePie { @@ -407,6 +458,14 @@ class SimplePie var $force_fsockopen = false; /** + * @var bool Force the given data/URL to be treated as a feed no matter what + * it appears like + * @see SimplePie::force_feed() + * @access private + */ + var $force_feed = false; + + /** * @var bool Enable/Disable XML dump * @see SimplePie::enable_xml_dump() * @access private @@ -562,6 +621,20 @@ class SimplePie var $restriction_class = 'SimplePie_Restriction'; /** + * @var string Class used for content-type sniffing + * @see SimplePie::set_content_type_sniffer_class() + * @access private + */ + var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer'; + + /** + * @var string Class used for item sources. + * @see SimplePie::set_source_class() + * @access private + */ + var $source_class = 'SimplePie_Source'; + + /** * @var mixed Set javascript query string parameter (false, or * anything type-cast to false, disables this feature) * @see SimplePie::set_javascript() @@ -577,6 +650,13 @@ class SimplePie var $max_checked_feeds = 10; /** + * @var array All the feeds found during the autodiscovery process + * @see SimplePie::get_all_discovered_feeds() + * @access private + */ + var $all_discovered_feeds = array(); + + /** * @var string Web-accessible path to the handler_favicon.php file. * @see SimplePie::set_favicon_handler() * @access private @@ -611,6 +691,13 @@ class SimplePie var $config_settings = null; /** + * @var integer Stores the number of items to return per-feed with multifeeds. + * @see SimplePie::set_item_limit() + * @access private + */ + var $item_limit = 0; + + /** * @var array Stores the default attributes to be stripped by strip_attributes(). * @see SimplePie::strip_attributes() * @access private @@ -678,6 +765,45 @@ class SimplePie } /** + * Remove items that link back to this before destroying this object + */ + function __destruct() + { + if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) + { + if (!empty($this->data['items'])) + { + foreach ($this->data['items'] as $item) + { + $item->__destruct(); + } + unset($item, $this->data['items']); + } + if (!empty($this->data['ordered_items'])) + { + foreach ($this->data['ordered_items'] as $item) + { + $item->__destruct(); + } + unset($item, $this->data['ordered_items']); + } + } + } + + /** + * Force the given data/URL to be treated as a feed no matter what it + * appears like + * + * @access public + * @since 1.1 + * @param bool $enable Force the given data/URL to be treated as a feed + */ + function force_feed($enable = false) + { + $this->force_feed = (bool) $enable; + } + + /** * This is the URL of the feed you want to parse. * * This allows you to enter the URL of the feed you want to parse, or the @@ -718,7 +844,7 @@ class SimplePie */ function set_file(&$file) { - if (SimplePie_Misc::is_a($file, 'SimplePie_File')) + if (is_a($file, 'SimplePie_File')) { $this->feed_url = $file->url; $this->file =& $file; @@ -741,7 +867,7 @@ class SimplePie */ function set_raw_data($data) { - $this->raw_data = trim($data); + $this->raw_data = $data; } /** @@ -1157,6 +1283,44 @@ class SimplePie } /** + * Allows you to change which class SimplePie uses for content-type sniffing. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Content_Type_Sniffer')) + { + $this->content_type_sniffer_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses item sources. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_source_class($class = 'SimplePie_Source') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Source')) + { + $this->source_class = $class; + return true; + } + return false; + } + + /** * Allows you to override the default user agent string. * * @access public @@ -1294,7 +1458,7 @@ class SimplePie */ function set_favicon_handler($page = false, $qs = 'i') { - if ($page != false) + if ($page !== false) { $this->favicon_handler = $page . '?' . $qs . '='; } @@ -1313,7 +1477,7 @@ class SimplePie */ function set_image_handler($page = false, $qs = 'i') { - if ($page != false) + if ($page !== false) { $this->sanitize->set_image_handler($page . '?' . $qs . '='); } @@ -1323,47 +1487,44 @@ class SimplePie } } + /** + * Set the limit for items returned per-feed with multifeeds. + * + * @access public + * @param integer $limit The maximum number of items to return. + */ + function set_item_limit($limit = 0) + { + $this->item_limit = (int) $limit; + } + function init() { - if ((function_exists('version_compare') && version_compare(PHP_VERSION, '4.1.0', '<')) || !extension_loaded('xml') || !extension_loaded('pcre')) + // Check absolute bare minimum requirements. + if ((function_exists('version_compare') && version_compare(PHP_VERSION, '4.3.0', '<')) || !extension_loaded('xml') || !extension_loaded('pcre')) { return false; } - if (isset($_GET[$this->javascript])) + // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader. + elseif (!extension_loaded('xmlreader')) { - if (function_exists('ob_gzhandler')) + static $xml_is_sane = null; + if ($xml_is_sane === null) { - ob_start('ob_gzhandler'); + $parser_check = xml_parser_create(); + xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); + xml_parser_free($parser_check); + $xml_is_sane = isset($values[0]['value']); } - header('Content-type: text/javascript; charset: UTF-8'); - header('Cache-Control: must-revalidate'); - header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days - ?> -function embed_odeo(link) { - document.writeln('<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url='+link+'"></embed>'); -} - -function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) { - if (placeholder != '') { - document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); - } - else { - document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); - } -} - -function embed_flash(bgcolor, width, height, link, loop, type) { - document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>'); -} - -function embed_flv(width, height, link, placeholder, loop, player) { - document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>'); -} + if (!$xml_is_sane) + { + return false; + } + } -function embed_wmedia(width, height, link) { - document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>'); -} - <?php + if (isset($_GET[$this->javascript])) + { + SimplePie_Misc::output_javascript(); exit; } @@ -1383,7 +1544,7 @@ function embed_wmedia(width, height, link) { // Decide whether to enable caching if ($this->cache && $parsed_feed_url['scheme'] !== '') { - $cache = new $this->cache_class($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'); + $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'); } // If it's enabled and we don't want an XML dump, use the cache if ($cache && !$this->xml_dump) @@ -1393,13 +1554,13 @@ function embed_wmedia(width, height, link) { if (!empty($this->data)) { // If the cache is for an outdated build of SimplePie - if (!isset($this->data['build']) || $this->data['build'] != SIMPLEPIE_BUILD) + if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD) { $cache->unlink(); $this->data = array(); } // If we've hit a collision just rerun it with caching disabled - elseif (isset($this->data['url']) && $this->data['url'] != $this->feed_url) + elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url) { $cache = false; $this->data = array(); @@ -1411,7 +1572,7 @@ function embed_wmedia(width, height, link) { if ($cache->mtime() + $this->autodiscovery_cache_duration > time()) { // Do not need to do feed autodiscovery yet. - if ($this->data['feed_url'] == $this->data['url']) + if ($this->data['feed_url'] === $this->data['url']) { $cache->unlink(); $this->data = array(); @@ -1436,12 +1597,12 @@ function embed_wmedia(width, height, link) { } if (isset($this->data['headers']['etag'])) { - $headers['if-none-match'] = $this->data['headers']['etag']; + $headers['if-none-match'] = '"' . $this->data['headers']['etag'] . '"'; } $file = new $this->file_class($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen); if ($file->success) { - if ($file->status_code == 304) + if ($file->status_code === 304) { $cache->touch(); return true; @@ -1473,7 +1634,7 @@ function embed_wmedia(width, height, link) { // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it. if (!isset($file)) { - if (SimplePie_Misc::is_a($this->file, 'SimplePie_File') && $this->file->url == $this->feed_url) + if (is_a($this->file, 'SimplePie_File') && $this->file->url === $this->feed_url) { $file =& $this->file; } @@ -1483,7 +1644,7 @@ function embed_wmedia(width, height, link) { } } // If the file connection has an error, set SimplePie::error to that and quit - if (!$file->success) + if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) { $this->error = $file->error; if (!empty($this->data)) @@ -1496,148 +1657,150 @@ function embed_wmedia(width, height, link) { } } - // Check if the supplied URL is a feed, if it isn't, look for it. - $locate = new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds); - if (!$locate->is_feed($file)) + if (!$this->force_feed) { - // We need to unset this so that if SimplePie::set_file() has been called that object is untouched - unset($file); - if ($file = $locate->find($this->autodiscovery)) + // Check if the supplied URL is a feed, if it isn't, look for it. + $locate = new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds, $this->content_type_sniffer_class); + if (!$locate->is_feed($file)) { - if ($cache) + // We need to unset this so that if SimplePie::set_file() has been called that object is untouched + unset($file); + if ($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds)) { - if (!$cache->save(array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD))) + if ($cache) { - trigger_error("$cache->name is not writeable", E_USER_WARNING); + $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD); + if (!$cache->save($this)) + { + trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); + } + $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'); } - $cache = new $this->cache_class($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'); + $this->feed_url = $file->url; + } + else + { + $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed."; + SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); + return false; } - $this->feed_url = $file->url; - } - else - { - $this->error = "A feed could not be found at $this->feed_url"; - SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); - return false; } + $locate = null; } - $locate = null; $headers = $file->headers; - $data = trim($file->body); - unset($file); + $data = $file->body; + $sniffer = new $this->content_type_sniffer_class($file); + $sniffed = $sniffer->get_type(); } else { $data = $this->raw_data; } + // Set up array of possible encodings + $encodings = array(); + // First check to see if input has been overridden. if ($this->input_encoding !== false) { - $encoding = $this->input_encoding; - } - // Second try HTTP headers - elseif (isset($headers['content-type']) && preg_match('/;[\x09\x20]*charset=([^;]*)/i', $headers['content-type'], $charset)) - { - $encoding = $charset[1]; - } - // Then prolog, if at the very start of the document - elseif (preg_match("/^<\?xml[\x20\x9\xD\xA]+version([\x20\x9\xD\xA]+)?=([\x20\x9\xD\xA]+)?(\"1.0\"|'1.0'|\"1.1\"|'1.1')[\x20\x9\xD\xA]+encoding([\x20\x9\xD\xA]+)?=([\x20\x9\xD\xA]+)?(\"[A-Za-z][A-Za-z0-9._\-]*\"|'[A-Za-z][A-Za-z0-9._\-]*')([\x20\x9\xD\xA]+standalone([\x20\x9\xD\xA]+)?=([\x20\x9\xD\xA]+)?(\"(yes|no)\"|'(yes|no)'))?([\x20\x9\xD\xA]+)?\?>/", $data, $prolog)) - { - $encoding = substr($prolog[6], 1, -1); - } - // UTF-32 Big Endian BOM - elseif (strpos($data, "\x0\x0\xFE\xFF") === 0) - { - $encoding = 'UTF-32be'; - } - // UTF-32 Little Endian BOM - elseif (strpos($data, "\xFF\xFE\x0\x0") === 0) - { - $encoding = 'UTF-32'; - } - // UTF-16 Big Endian BOM - elseif (strpos($data, "\xFE\xFF") === 0) - { - $encoding = 'UTF-16be'; - } - // UTF-16 Little Endian BOM - elseif (strpos($data, "\xFF\xFE") === 0) - { - $encoding = 'UTF-16le'; - } - // UTF-8 BOM - elseif (strpos($data, "\xEF\xBB\xBF") === 0) - { - $encoding = 'UTF-8'; - } - // Fallback to the default (US-ASCII for text/xml, ISO-8859-1 for text/* MIME types, UTF-8 otherwise) - elseif (isset($headers['content-type']) && strtolower(SimplePie_Misc::parse_mime($headers['content-type'])) == 'text/xml') - { - $encoding = 'US-ASCII'; - } - elseif (isset($headers['content-type']) && SimplePie_Misc::stripos(SimplePie_Misc::parse_mime($headers['content-type']), 'text/') === 0) - { - $encoding = 'ISO-8859-1'; - } - else - { - $encoding = 'UTF-8'; + $encodings[] = $this->input_encoding; } - // Change the encoding to UTF-8 (as we always use UTF-8 internally) - if ($encoding != 'UTF-8') + $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity'); + $text_types = array('text/xml', 'text/xml-external-parsed-entity'); + + // RFC 3023 (only applies to sniffed content) + if (isset($sniffed)) { - $data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8'); + if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml') + { + if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) + { + $encodings[] = strtoupper($charset[1]); + } + $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data)); + $encodings[] = 'UTF-8'; + } + elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml') + { + if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) + { + $encodings[] = $charset[1]; + } + $encodings[] = 'US-ASCII'; + } + // Text MIME-type default + elseif (substr($sniffed, 0, 5) === 'text/') + { + $encodings[] = 'US-ASCII'; + } } - // Strip illegal characters - $data = SimplePie_Misc::utf8_bad_replace($data); + // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1 + $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data)); + $encodings[] = 'UTF-8'; + $encodings[] = 'ISO-8859-1'; + + // There's no point in trying an encoding twice + $encodings = array_unique($encodings); - $parser = new $this->parser_class(); - $parser->pre_process($data, 'UTF-8'); - // If we want the XML, just output that and quit + // If we want the XML, just output that with the most likely encoding and quit if ($this->xml_dump) { - header('Content-type: text/xml; charset=UTF-8'); + header('Content-type: text/xml; charset=' . $encodings[0]); echo $data; exit; } - // If it's parsed fine - elseif ($parser->parse($data)) + + // Loop through each possible encoding, till we return something, or run out of possibilities + foreach ($encodings as $encoding) { - unset($data); - $this->data = $parser->get_data(); - if (isset($this->data['child'])) + // Change the encoding to UTF-8 (as we always use UTF-8 internally) + if ($utf8_data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8')) { - if (isset($headers)) - { - $this->data['headers'] = $headers; - } - $this->data['build'] = SIMPLEPIE_BUILD; + // Create new parser + $parser = new $this->parser_class(); - // Cache the file if caching is enabled - if ($cache && !$cache->save($this->data)) + // If it's parsed fine + if ($parser->parse($utf8_data, 'UTF-8')) { - trigger_error("$cache->name is not writeable", E_USER_WARNING); + $this->data = $parser->get_data(); + if ($this->get_type() & ~SIMPLEPIE_TYPE_NONE) + { + if (isset($headers)) + { + $this->data['headers'] = $headers; + } + $this->data['build'] = SIMPLEPIE_BUILD; + + // Cache the file if caching is enabled + if ($cache && !$cache->save($this)) + { + trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); + } + return true; + } + else + { + $this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed."; + SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); + return false; + } } - return true; - } - else - { - $this->error = "A feed could not be found at $this->feed_url"; - SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); - return false; } } - // If we have an error, just set SimplePie::error to it and quit + if (isset($parser)) + { + // We have an error, just set SimplePie_Misc::error to it and quit + $this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column()); + } else { - $this->error = sprintf('XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column()); - SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); - return false; + $this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.'; } + SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); + return false; } elseif (!empty($this->multifeed_url)) { @@ -1730,18 +1893,18 @@ function embed_wmedia(width, height, link) { $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090; } } - elseif (isset($this->data['child']['']['rss'])) + elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'])) { $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL; - if (isset($this->data['child']['']['rss'][0]['attribs']['']['version'])) + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) { - switch (trim($this->data['child']['']['rss'][0]['attribs']['']['version'])) + switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) { case '0.91': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091; - if (isset($this->data['child']['']['rss'][0]['child']['']['skiphours']['hour'][0]['data'])) + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) { - switch (trim($this->data['child']['']['rss'][0]['child']['']['skiphours']['hour'][0]['data'])) + switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) { case '0': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE; @@ -1783,6 +1946,7 @@ function embed_wmedia(width, height, link) { /** * Returns the URL for the favicon of the feed's website. * + * @todo Cache atom:icon * @access public * @since 1.0 */ @@ -1798,26 +1962,36 @@ function embed_wmedia(width, height, link) { if ($this->cache && $this->favicon_handler) { - $cache = new $this->cache_class($this->cache_location, call_user_func($this->cache_name_function, $favicon), 'spi'); + $favicon_filename = call_user_func($this->cache_name_function, $favicon); + $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $favicon_filename, 'spi'); if ($cache->load()) { - return $this->sanitize($this->favicon_handler . rawurlencode($favicon), SIMPLEPIE_CONSTRUCT_IRI); + return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI); } else { $file = new $this->file_class($favicon, $this->timeout / 10, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen); - if ($file->success && ($file->status_code == 200 || ($file->status_code > 206 && $file->status_code < 300)) && strlen($file->body) > 0) + if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)) && strlen($file->body) > 0) { - if ($cache->save(array('headers' => $file->headers, 'body' => $file->body))) + $sniffer = new $this->content_type_sniffer_class($file); + if (substr($sniffer->get_type(), 0, 6) === 'image/') { - return $this->sanitize($this->favicon_handler . rawurlencode($favicon), SIMPLEPIE_CONSTRUCT_IRI); + if ($cache->save(array('headers' => $file->headers, 'body' => $file->body))) + { + return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + trigger_error("$cache->name is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); + return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI); + } } + // not an image else { - trigger_error("$cache->name is not writeable", E_USER_WARNING); - return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI); + return false; } } } @@ -1863,7 +2037,7 @@ function embed_wmedia(width, height, link) { { if ($this->feed_url !== null) { - return 'outlook' . $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI); + return $this->sanitize('outlook' . SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI); } else { @@ -1908,12 +2082,12 @@ function embed_wmedia(width, height, link) { { if ($this->subscribe_url()) { - $return = $this->sanitize($feed_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->subscribe_url()); + $return = $feed_url . rawurlencode($this->feed_url); if ($site_url !== null && $this->get_link() !== null) { - $return .= $this->sanitize($site_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->get_link()); + $return .= $site_url . rawurlencode($this->get_link()); } - return $return; + return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI); } else { @@ -1928,7 +2102,7 @@ function embed_wmedia(width, height, link) { function subscribe_bloglines() { - return urldecode($this->subscribe_service('http://www.bloglines.com/sub/')); + return $this->subscribe_service('http://www.bloglines.com/sub/'); } function subscribe_eskobo() @@ -2022,9 +2196,9 @@ function embed_wmedia(width, height, link) { } if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) { - if (isset($this->data['child']['']['rss'][0]['child'][$namespace][$tag])) + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag])) { - return $this->data['child']['']['rss'][0]['child'][$namespace][$tag]; + return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]; } } return null; @@ -2062,7 +2236,7 @@ function embed_wmedia(width, height, link) { } if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) { - if ($channel = $this->get_feed_tags('', 'channel')) + if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel')) { if (isset($channel[0]['child'][$namespace][$tag])) { @@ -2098,7 +2272,7 @@ function embed_wmedia(width, height, link) { } if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) { - if ($image = $this->get_channel_tags('', 'image')) + if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image')) { if (isset($image[0]['child'][$namespace][$tag])) { @@ -2119,10 +2293,6 @@ function embed_wmedia(width, height, link) { { return $this->get_link(); } - elseif (isset($this->data['headers']['content-location'])) - { - return SimplePie_Misc::absolutize_url($this->data['headers']['content-location'], $this->subscribe_url()); - } else { return $this->subscribe_url(); @@ -2152,7 +2322,7 @@ function embed_wmedia(width, height, link) { { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } - elseif ($return = $this->get_channel_tags('', 'title')) + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } @@ -2170,6 +2340,230 @@ function embed_wmedia(width, height, link) { } } + function get_category($key = 0) + { + $categories = $this->get_categories(); + if (isset($categories[$key])) + { + return $categories[$key]; + } + else + { + return null; + } + } + + function get_categories() + { + $categories = array(); + + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) + { + $term = null; + $scheme = null; + $label = null; + if (isset($category['attribs']['']['term'])) + { + $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories[] = new $this->category_class($term, $scheme, $label); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) + { + // This is really the label, but keep this as the term also for BC. + // Label will also work on retrieving because that falls back to term. + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + if (isset($category['attribs']['']['domain'])) + { + $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = null; + } + $categories[] = new $this->category_class($term, $scheme, null); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) + { + $categories[] = new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) + { + $categories[] = new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + + if (!empty($categories)) + { + return SimplePie_Misc::array_unique($categories); + } + else + { + return null; + } + } + + function get_author($key = 0) + { + $authors = $this->get_authors(); + if (isset($authors[$key])) + { + return $authors[$key]; + } + else + { + return null; + } + } + + function get_authors() + { + $authors = array(); + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) + { + $name = null; + $uri = null; + $email = null; + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $authors[] = new $this->author_class($name, $uri, $email); + } + } + if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) + { + $name = null; + $url = null; + $email = null; + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $authors[] = new $this->author_class($name, $url, $email); + } + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) + { + $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) + { + $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) + { + $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + + if (!empty($authors)) + { + return SimplePie_Misc::array_unique($authors); + } + else + { + return null; + } + } + + function get_contributor($key = 0) + { + $contributors = $this->get_contributors(); + if (isset($contributors[$key])) + { + return $contributors[$key]; + } + else + { + return null; + } + } + + function get_contributors() + { + $contributors = array(); + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) + { + $name = null; + $uri = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $contributors[] = new $this->author_class($name, $uri, $email); + } + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) + { + $name = null; + $url = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $contributors[] = new $this->author_class($name, $url, $email); + } + } + + if (!empty($contributors)) + { + return SimplePie_Misc::array_unique($contributors); + } + else + { + return null; + } + } + function get_link($key = 0, $rel = 'alternate') { $links = $this->get_links($rel); @@ -2227,7 +2621,7 @@ function embed_wmedia(width, height, link) { { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } - if ($links = $this->get_channel_tags('', 'link')) + if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } @@ -2247,7 +2641,7 @@ function embed_wmedia(width, height, link) { $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; } } - elseif (substr($key, 0, 41) == SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) + elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) { $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; } @@ -2265,6 +2659,11 @@ function embed_wmedia(width, height, link) { } } + function get_all_discovered_feeds() + { + return $this->all_discovered_feeds; + } + function get_description() { if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) @@ -2283,9 +2682,9 @@ function embed_wmedia(width, height, link) { { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } - elseif ($return = $this->get_channel_tags('', 'description')) + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) { @@ -2315,7 +2714,11 @@ function embed_wmedia(width, height, link) { { return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); } - elseif ($return = $this->get_channel_tags('', 'copyright')) + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } @@ -2335,7 +2738,7 @@ function embed_wmedia(width, height, link) { function get_language() { - if ($return = $this->get_channel_tags('', 'language')) + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } @@ -2371,11 +2774,12 @@ function embed_wmedia(width, height, link) { function get_latitude() { + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) { return (float) $return[0]['data']; } - elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) + elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[1]; } @@ -2395,7 +2799,7 @@ function embed_wmedia(width, height, link) { { return (float) $return[0]['data']; } - elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) + elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[2]; } @@ -2415,7 +2819,7 @@ function embed_wmedia(width, height, link) { { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } - elseif ($return = $this->get_image_tags('', 'title')) + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } @@ -2455,7 +2859,7 @@ function embed_wmedia(width, height, link) { { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } - elseif ($return = $this->get_image_tags('', 'url')) + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } @@ -2475,7 +2879,7 @@ function embed_wmedia(width, height, link) { { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } - elseif ($return = $this->get_image_tags('', 'link')) + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } @@ -2487,11 +2891,11 @@ function embed_wmedia(width, height, link) { function get_image_width() { - if ($return = $this->get_image_tags('', 'width')) + if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width')) { return round($return[0]['data']); } - elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags('', 'url')) + elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) { return 88.0; } @@ -2503,11 +2907,11 @@ function embed_wmedia(width, height, link) { function get_image_height() { - if ($return = $this->get_image_tags('', 'height')) + if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height')) { return round($return[0]['data']); } - elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags('', 'url')) + elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) { return 31.0; } @@ -2519,8 +2923,9 @@ function embed_wmedia(width, height, link) { function get_item_quantity($max = 0) { + $max = (int) $max; $qty = count($this->get_items()); - if ($max == 0) + if ($max === 0) { return $qty; } @@ -2545,50 +2950,54 @@ function embed_wmedia(width, height, link) { function get_items($start = 0, $end = 0) { - if (!empty($this->multifeed_objects)) + if (!isset($this->data['items'])) { - return SimplePie::merge_items($this->multifeed_objects, $start, $end); - } - elseif (!isset($this->data['items'])) - { - if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry')) + if (!empty($this->multifeed_objects)) { - $keys = array_keys($items); - foreach ($keys as $key) - { - $this->data['items'][] = new $this->item_class($this, $items[$key]); - } + $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit); } - if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry')) + else { - $keys = array_keys($items); - foreach ($keys as $key) + $this->data['items'] = array(); + if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry')) { - $this->data['items'][] = new $this->item_class($this, $items[$key]); + $keys = array_keys($items); + foreach ($keys as $key) + { + $this->data['items'][] = new $this->item_class($this, $items[$key]); + } } - } - if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item')) - { - $keys = array_keys($items); - foreach ($keys as $key) + if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry')) { - $this->data['items'][] = new $this->item_class($this, $items[$key]); + $keys = array_keys($items); + foreach ($keys as $key) + { + $this->data['items'][] = new $this->item_class($this, $items[$key]); + } } - } - if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item')) - { - $keys = array_keys($items); - foreach ($keys as $key) + if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item')) { - $this->data['items'][] = new $this->item_class($this, $items[$key]); + $keys = array_keys($items); + foreach ($keys as $key) + { + $this->data['items'][] = new $this->item_class($this, $items[$key]); + } } - } - if ($items = $this->get_channel_tags('', 'item')) - { - $keys = array_keys($items); - foreach ($keys as $key) + if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item')) { - $this->data['items'][] = new $this->item_class($this, $items[$key]); + $keys = array_keys($items); + foreach ($keys as $key) + { + $this->data['items'][] = new $this->item_class($this, $items[$key]); + } + } + if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item')) + { + $keys = array_keys($items); + foreach ($keys as $key) + { + $this->data['items'][] = new $this->item_class($this, $items[$key]); + } } } } @@ -2596,7 +3005,7 @@ function embed_wmedia(width, height, link) { if (!empty($this->data['items'])) { // If we want to order it by date, check if all items have a date, and then sort it - if ($this->order_by_date) + if ($this->order_by_date && empty($this->multifeed_objects)) { if (!isset($this->data['ordered_items'])) { @@ -2624,7 +3033,7 @@ function embed_wmedia(width, height, link) { } // Slice the data as desired - if ($end == 0) + if ($end === 0) { return array_slice($items, $start); } @@ -2639,21 +3048,27 @@ function embed_wmedia(width, height, link) { } } + /** + * @static + */ function sort_items($a, $b) { return $a->get_date('U') <= $b->get_date('U'); } - function merge_items($urls, $start = 0, $end = 0) + /** + * @static + */ + function merge_items($urls, $start = 0, $end = 0, $limit = 0) { if (is_array($urls) && sizeof($urls) > 0) { $items = array(); foreach ($urls as $arg) { - if (SimplePie_Misc::is_a($arg, 'SimplePie')) + if (is_a($arg, 'SimplePie')) { - $items = array_merge($items, $arg->get_items()); + $items = array_merge($items, $arg->get_items(0, $limit)); } else { @@ -2676,7 +3091,7 @@ function embed_wmedia(width, height, link) { usort($items, array('SimplePie', 'sort_items')); } - if ($end == 0) + if ($end === 0) { return array_slice($items, $start); } @@ -2709,6 +3124,17 @@ class SimplePie_Item return md5(serialize($this->data)); } + /** + * Remove items that link back to this before destroying this object + */ + function __destruct() + { + if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) + { + unset($this->feed); + } + } + function get_item_tags($namespace, $tag) { if (isset($this->data['child'][$namespace][$tag])) @@ -2738,78 +3164,85 @@ class SimplePie_Item function get_id($hash = false) { - if ($hash) + if (!$hash) { - return $this->__toString(); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags('', 'guid')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (($return = $this->get_permalink()) !== null) - { - return $return; + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (($return = $this->get_permalink()) !== null) + { + return $return; + } + elseif (($return = $this->get_title()) !== null) + { + return $return; + } } - elseif (($return = $this->get_title()) !== null) + if ($this->get_permalink() !== null || $this->get_title() !== null) { - return $return; + return md5($this->get_permalink() . $this->get_title()); } else { - return $this->__toString(); + return md5(serialize($this->data)); } } function get_title() { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) - { - return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) - { - return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags('', 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else + if (!isset($this->data['title'])) { - return null; + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $this->data['title'] = null; + } } + return $this->data['title']; } function get_description($description_only = false) @@ -2826,7 +3259,7 @@ class SimplePie_Item { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } - elseif ($return = $this->get_item_tags('', 'description')) + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); } @@ -2916,9 +3349,20 @@ class SimplePie_Item } $categories[] = new $this->feed->category_class($term, $scheme, $label); } - foreach ((array) $this->get_item_tags('', 'category') as $category) + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) { - $categories[] = new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + // This is really the label, but keep this as the term also for BC. + // Label will also work on retrieving because that falls back to term. + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + if (isset($category['attribs']['']['domain'])) + { + $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = null; + } + $categories[] = new $this->feed->category_class($term, $scheme, null); } foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) { @@ -2952,9 +3396,77 @@ class SimplePie_Item } } - /** - * @todo Atom inheritance (item author, source author, feed author) - */ + function get_contributor($key = 0) + { + $contributors = $this->get_contributors(); + if (isset($contributors[$key])) + { + return $contributors[$key]; + } + else + { + return null; + } + } + + function get_contributors() + { + $contributors = array(); + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) + { + $name = null; + $uri = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $contributors[] = new $this->feed->author_class($name, $uri, $email); + } + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) + { + $name = null; + $url = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $contributors[] = new $this->feed->author_class($name, $url, $email); + } + } + + if (!empty($contributors)) + { + return SimplePie_Misc::array_unique($contributors); + } + else + { + return null; + } + } + function get_authors() { $authors = array(); @@ -2991,18 +3503,18 @@ class SimplePie_Item } if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) { - $uri = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); } if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } - if ($name !== null || $email !== null || $uri !== null) + if ($name !== null || $email !== null || $url !== null) { $authors[] = new $this->feed->author_class($name, $url, $email); } } - if ($author = $this->get_item_tags('', 'author')) + if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author')) { $authors[] = new $this->feed->author_class(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); } @@ -3023,6 +3535,34 @@ class SimplePie_Item { return SimplePie_Misc::array_unique($authors); } + elseif (($source = $this->get_source()) && ($authors = $source->get_authors())) + { + return $authors; + } + elseif ($authors = $this->feed->get_authors()) + { + return $authors; + } + else + { + return null; + } + } + + function get_copyright() + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } else { return null; @@ -3053,7 +3593,7 @@ class SimplePie_Item { $this->data['date']['raw'] = $return[0]['data']; } - elseif ($return = $this->get_item_tags('', 'pubDate')) + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate')) { $this->data['date']['raw'] = $return[0]['data']; } @@ -3068,7 +3608,8 @@ class SimplePie_Item if (!empty($this->data['date']['raw'])) { - $this->data['date']['parsed'] = SimplePie_Misc::parse_date($this->data['date']['raw']); + $parser = SimplePie_Parse_Date::get(); + $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']); } else { @@ -3173,13 +3714,13 @@ class SimplePie_Item { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } - if ($links = $this->get_item_tags('', 'link')) + if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } - if ($links = $this->get_item_tags('', 'guid')) + if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) { - if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) == 'true') + if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true') { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } @@ -3200,7 +3741,7 @@ class SimplePie_Item $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; } } - elseif (substr($key, 0, 41) == SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) + elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) { $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; } @@ -3241,7 +3782,6 @@ class SimplePie_Item * At this point, we're pretty much assuming that all enclosures for an item are the same content. Anything else is too complicated to properly support. * * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4). - * @todo Add support for itunes: tags. These should be relatively simple compared to media:. * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists). */ function get_enclosures() @@ -3767,7 +4307,7 @@ class SimplePie_Item $restriction_relationship = 'allow'; $restriction_type = null; $restriction_value = 'itunes'; - if (isset($restriction['data']) && strtolower($restriction['data']) == 'yes') + if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') { $restriction_relationship = 'deny'; } @@ -3803,7 +4343,7 @@ class SimplePie_Item $restriction_relationship = 'allow'; $restriction_type = null; $restriction_value = 'itunes'; - if (isset($restriction['data']) && strtolower($restriction['data']) == 'yes') + if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') { $restriction_relationship = 'deny'; } @@ -3856,624 +4396,657 @@ class SimplePie_Item // Clear the memory unset($parent); + // Attributes + $bitrate = null; + $channels = null; + $duration = null; + $expression = null; + $framerate = null; + $height = null; + $javascript = null; + $lang = null; + $length = null; + $medium = null; + $samplingrate = null; + $type = null; + $url = null; + $width = null; + + // Elements + $captions = null; + $categories = null; + $copyrights = null; + $credits = null; + $description = null; + $hashes = null; + $keywords = null; + $player = null; + $ratings = null; + $restrictions = null; + $thumbnails = null; + $title = null; + // If we have media:group tags, loop through them. foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group) { - // If we have media:content tags, loop through them. - foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) + if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) { - if (isset($content['attribs']['']['url'])) + // If we have media:content tags, loop through them. + foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) { - // Attributes - $bitrate = null; - $channels = null; - $duration = null; - $expression = null; - $framerate = null; - $height = null; - $javascript = null; - $lang = null; - $length = null; - $medium = null; - $samplingrate = null; - $type = null; - $url = null; - $width = null; - - // Elements - $captions = null; - $categories = null; - $copyrights = null; - $credits = null; - $description = null; - $hashes = null; - $keywords = null; - $player = null; - $ratings = null; - $restrictions = null; - $thumbnails = null; - $title = null; - - // Start checking the attributes of media:content - if (isset($content['attribs']['']['bitrate'])) - { - $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['channels'])) + if (isset($content['attribs']['']['url'])) { - $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['duration'])) - { - $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $duration = $duration_parent; - } - if (isset($content['attribs']['']['expression'])) - { - $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['framerate'])) - { - $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['height'])) - { - $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['lang'])) - { - $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['fileSize'])) - { - $length = ceil($content['attribs']['']['fileSize']); - } - if (isset($content['attribs']['']['medium'])) - { - $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['samplingrate'])) - { - $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['type'])) - { - $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['width'])) - { - $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + // Attributes + $bitrate = null; + $channels = null; + $duration = null; + $expression = null; + $framerate = null; + $height = null; + $javascript = null; + $lang = null; + $length = null; + $medium = null; + $samplingrate = null; + $type = null; + $url = null; + $width = null; + + // Elements + $captions = null; + $categories = null; + $copyrights = null; + $credits = null; + $description = null; + $hashes = null; + $keywords = null; + $player = null; + $ratings = null; + $restrictions = null; + $thumbnails = null; + $title = null; + + // Start checking the attributes of media:content + if (isset($content['attribs']['']['bitrate'])) + { + $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['channels'])) + { + $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['duration'])) + { + $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $duration = $duration_parent; + } + if (isset($content['attribs']['']['expression'])) + { + $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['framerate'])) + { + $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['height'])) + { + $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['lang'])) + { + $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['fileSize'])) + { + $length = ceil($content['attribs']['']['fileSize']); + } + if (isset($content['attribs']['']['medium'])) + { + $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['samplingrate'])) + { + $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['type'])) + { + $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['width'])) + { + $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - // Checking the other optional media: elements. Priority: media:content, media:group, item, channel + // Checking the other optional media: elements. Priority: media:content, media:group, item, channel - // CAPTIONS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) + // CAPTIONS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) { - $caption_type = null; - $caption_lang = null; - $caption_startTime = null; - $caption_endTime = null; - $caption_text = null; - if (isset($caption['attribs']['']['type'])) + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) { - $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['lang'])) - { - $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + $caption_type = null; + $caption_lang = null; + $caption_startTime = null; + $caption_endTime = null; + $caption_text = null; + if (isset($caption['attribs']['']['type'])) + { + $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['lang'])) + { + $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['start'])) + { + $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['end'])) + { + $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['data'])) + { + $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); } - if (isset($caption['attribs']['']['start'])) + if (is_array($captions)) { - $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); + $captions = array_values(SimplePie_Misc::array_unique($captions)); } - if (isset($caption['attribs']['']['end'])) + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) + { + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) { - $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); + $caption_type = null; + $caption_lang = null; + $caption_startTime = null; + $caption_endTime = null; + $caption_text = null; + if (isset($caption['attribs']['']['type'])) + { + $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['lang'])) + { + $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['start'])) + { + $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['end'])) + { + $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['data'])) + { + $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); } - if (isset($caption['data'])) + if (is_array($captions)) { - $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $captions = array_values(SimplePie_Misc::array_unique($captions)); } - $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); } - if (is_array($captions)) + else { - $captions = array_values(SimplePie_Misc::array_unique($captions)); + $captions = $captions_parent; } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) + + // CATEGORIES + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) { - $caption_type = null; - $caption_lang = null; - $caption_startTime = null; - $caption_endTime = null; - $caption_text = null; - if (isset($caption['attribs']['']['type'])) - { - $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['lang'])) - { - $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['start'])) - { - $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['end'])) + foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) { - $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); + $term = null; + $scheme = null; + $label = null; + if (isset($category['data'])) + { + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = 'http://search.yahoo.com/mrss/category_schema'; + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories[] = new $this->feed->category_class($term, $scheme, $label); } - if (isset($caption['data'])) + } + if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) + { + foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) { - $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $term = null; + $scheme = null; + $label = null; + if (isset($category['data'])) + { + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = 'http://search.yahoo.com/mrss/category_schema'; + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories[] = new $this->feed->category_class($term, $scheme, $label); } - $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); } - if (is_array($captions)) + if (is_array($categories) && is_array($categories_parent)) { - $captions = array_values(SimplePie_Misc::array_unique($captions)); + $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent))); + } + elseif (is_array($categories)) + { + $categories = array_values(SimplePie_Misc::array_unique($categories)); + } + elseif (is_array($categories_parent)) + { + $categories = array_values(SimplePie_Misc::array_unique($categories_parent)); } - } - else - { - $captions = $captions_parent; - } - // CATEGORIES - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) - { - foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) + // COPYRIGHTS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) { - $term = null; - $scheme = null; - $label = null; - if (isset($category['data'])) + $copyright_url = null; + $copyright_label = null; + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) { - $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); } - if (isset($category['attribs']['']['scheme'])) + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) { - $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } - else + $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label); + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) + { + $copyright_url = null; + $copyright_label = null; + if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) { - $scheme = 'http://search.yahoo.com/mrss/category_schema'; + $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); } - if (isset($category['attribs']['']['label'])) + if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) { - $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } - $categories[] = new $this->feed->category_class($term, $scheme, $label); + $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label); } - } - if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) - { - foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) + else { - $term = null; - $scheme = null; - $label = null; - if (isset($category['data'])) + $copyrights = $copyrights_parent; + } + + // CREDITS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) { - $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $credit_role = null; + $credit_scheme = null; + $credit_name = null; + if (isset($credit['attribs']['']['role'])) + { + $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($credit['attribs']['']['scheme'])) + { + $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $credit_scheme = 'urn:ebu'; + } + if (isset($credit['data'])) + { + $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); } - if (isset($category['attribs']['']['scheme'])) + if (is_array($credits)) { - $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + $credits = array_values(SimplePie_Misc::array_unique($credits)); } - else + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) + { + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) { - $scheme = 'http://search.yahoo.com/mrss/category_schema'; + $credit_role = null; + $credit_scheme = null; + $credit_name = null; + if (isset($credit['attribs']['']['role'])) + { + $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($credit['attribs']['']['scheme'])) + { + $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $credit_scheme = 'urn:ebu'; + } + if (isset($credit['data'])) + { + $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); } - if (isset($category['attribs']['']['label'])) + if (is_array($credits)) { - $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + $credits = array_values(SimplePie_Misc::array_unique($credits)); } - $categories[] = new $this->feed->category_class($term, $scheme, $label); } - } - if (is_array($categories) && is_array($categories_parent)) - { - $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent))); - } - elseif (is_array($categories)) - { - $categories = array_values(SimplePie_Misc::array_unique($categories)); - } - elseif (is_array($categories_parent)) - { - $categories = array_values(SimplePie_Misc::array_unique($categories_parent)); - } - - // COPYRIGHTS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) - { - $copyright_url = null; - $copyright_label = null; - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) + else { - $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); + $credits = $credits_parent; } - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) + + // DESCRIPTION + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) { - $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } - $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label); - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) - { - $copyright_url = null; - $copyright_label = null; - if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) { - $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); + $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } - if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) + else { - $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $description = $description_parent; } - $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label); - } - else - { - $copyrights = $copyrights_parent; - } - // CREDITS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) + // HASHES + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) { - $credit_role = null; - $credit_scheme = null; - $credit_name = null; - if (isset($credit['attribs']['']['role'])) + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) { - $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); + $value = null; + $algo = null; + if (isset($hash['data'])) + { + $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($hash['attribs']['']['algo'])) + { + $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $algo = 'md5'; + } + $hashes[] = $algo.':'.$value; } - if (isset($credit['attribs']['']['scheme'])) + if (is_array($hashes)) { - $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + $hashes = array_values(SimplePie_Misc::array_unique($hashes)); } - else + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) + { + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) { - $credit_scheme = 'urn:ebu'; + $value = null; + $algo = null; + if (isset($hash['data'])) + { + $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($hash['attribs']['']['algo'])) + { + $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $algo = 'md5'; + } + $hashes[] = $algo.':'.$value; } - if (isset($credit['data'])) + if (is_array($hashes)) { - $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $hashes = array_values(SimplePie_Misc::array_unique($hashes)); } - $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); } - if (is_array($credits)) + else { - $credits = array_values(SimplePie_Misc::array_unique($credits)); + $hashes = $hashes_parent; } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) + + // KEYWORDS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) { - $credit_role = null; - $credit_scheme = null; - $credit_name = null; - if (isset($credit['attribs']['']['role'])) + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) { - $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); + $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + foreach ($temp as $word) + { + $keywords[] = trim($word); + } + unset($temp); } - if (isset($credit['attribs']['']['scheme'])) + if (is_array($keywords)) { - $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + $keywords = array_values(SimplePie_Misc::array_unique($keywords)); } - else + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) + { + if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) { - $credit_scheme = 'urn:ebu'; + $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + foreach ($temp as $word) + { + $keywords[] = trim($word); + } + unset($temp); } - if (isset($credit['data'])) + if (is_array($keywords)) { - $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $keywords = array_values(SimplePie_Misc::array_unique($keywords)); } - $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); } - if (is_array($credits)) + else { - $credits = array_values(SimplePie_Misc::array_unique($credits)); + $keywords = $keywords_parent; } - } - else - { - $credits = $credits_parent; - } - // DESCRIPTION - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) - { - $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) - { - $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $description = $description_parent; - } - - // HASHES - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) + // PLAYER + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) { - $value = null; - $algo = null; - if (isset($hash['data'])) - { - $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($hash['attribs']['']['algo'])) - { - $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $algo = 'md5'; - } - $hashes[] = $algo.':'.$value; + $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } - if (is_array($hashes)) + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) { - $hashes = array_values(SimplePie_Misc::array_unique($hashes)); + $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) + else { - $value = null; - $algo = null; - if (isset($hash['data'])) - { - $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($hash['attribs']['']['algo'])) + $player = $player_parent; + } + + // RATINGS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) { - $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); + $rating_scheme = null; + $rating_value = null; + if (isset($rating['attribs']['']['scheme'])) + { + $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $rating_scheme = 'urn:simple'; + } + if (isset($rating['data'])) + { + $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value); } - else + if (is_array($ratings)) { - $algo = 'md5'; + $ratings = array_values(SimplePie_Misc::array_unique($ratings)); } - $hashes[] = $algo.':'.$value; } - if (is_array($hashes)) - { - $hashes = array_values(SimplePie_Misc::array_unique($hashes)); - } - } - else - { - $hashes = $hashes_parent; - } - - // KEYWORDS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) - { - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) { - $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); - foreach ($temp as $word) + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) { - $keywords[] = trim($word); + $rating_scheme = null; + $rating_value = null; + if (isset($rating['attribs']['']['scheme'])) + { + $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $rating_scheme = 'urn:simple'; + } + if (isset($rating['data'])) + { + $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value); } - unset($temp); - } - if (is_array($keywords)) - { - $keywords = array_values(SimplePie_Misc::array_unique($keywords)); - } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) - { - if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) - { - $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); - foreach ($temp as $word) + if (is_array($ratings)) { - $keywords[] = trim($word); + $ratings = array_values(SimplePie_Misc::array_unique($ratings)); } - unset($temp); } - if (is_array($keywords)) + else { - $keywords = array_values(SimplePie_Misc::array_unique($keywords)); + $ratings = $ratings_parent; } - } - else - { - $keywords = $keywords_parent; - } - // PLAYER - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) - { - $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) - { - $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - else - { - $player = $player_parent; - } - - // RATINGS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) + // RESTRICTIONS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) { - $rating_scheme = null; - $rating_value = null; - if (isset($rating['attribs']['']['scheme'])) - { - $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) { - $rating_scheme = 'urn:simple'; + $restriction_relationship = null; + $restriction_type = null; + $restriction_value = null; + if (isset($restriction['attribs']['']['relationship'])) + { + $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['attribs']['']['type'])) + { + $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['data'])) + { + $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); } - if (isset($rating['data'])) + if (is_array($restrictions)) { - $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $restrictions = array_values(SimplePie_Misc::array_unique($restrictions)); } - $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value); } - if (is_array($ratings)) + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) { - $ratings = array_values(SimplePie_Misc::array_unique($ratings)); - } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) - { - $rating_scheme = null; - $rating_value = null; - if (isset($rating['attribs']['']['scheme'])) + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) { - $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $rating_scheme = 'urn:simple'; + $restriction_relationship = null; + $restriction_type = null; + $restriction_value = null; + if (isset($restriction['attribs']['']['relationship'])) + { + $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['attribs']['']['type'])) + { + $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['data'])) + { + $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); } - if (isset($rating['data'])) + if (is_array($restrictions)) { - $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $restrictions = array_values(SimplePie_Misc::array_unique($restrictions)); } - $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value); } - if (is_array($ratings)) + else { - $ratings = array_values(SimplePie_Misc::array_unique($ratings)); + $restrictions = $restrictions_parent; } - } - else - { - $ratings = $ratings_parent; - } - // RESTRICTIONS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) + // THUMBNAILS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) { - $restriction_relationship = null; - $restriction_type = null; - $restriction_value = null; - if (isset($restriction['attribs']['']['relationship'])) - { - $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['attribs']['']['type'])) + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) { - $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } - if (isset($restriction['data'])) + if (is_array($thumbnails)) { - $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails)); } - $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); - } - if (is_array($restrictions)) - { - $restrictions = array_values(SimplePie_Misc::array_unique($restrictions)); } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) { - $restriction_relationship = null; - $restriction_type = null; - $restriction_value = null; - if (isset($restriction['attribs']['']['relationship'])) + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) { - $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); + $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } - if (isset($restriction['attribs']['']['type'])) + if (is_array($thumbnails)) { - $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails)); } - if (isset($restriction['data'])) - { - $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); } - if (is_array($restrictions)) + else { - $restrictions = array_values(SimplePie_Misc::array_unique($restrictions)); + $thumbnails = $thumbnails_parent; } - } - else - { - $restrictions = $restrictions_parent; - } - // THUMBNAILS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) + // TITLES + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) { - $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } - if (is_array($thumbnails)) + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) { - $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails)); + $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) + else { - $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + $title = $title_parent; } - if (is_array($thumbnails)) - { - $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails)); - } - } - else - { - $thumbnails = $thumbnails_parent; - } - // TITLES - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) - { - $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width); } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) - { - $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $title = $title_parent; - } - - $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width); } } } @@ -4884,7 +5457,7 @@ class SimplePie_Item foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) { - if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] == 'enclosure') + if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') { // Attributes $bitrate = null; @@ -4919,7 +5492,7 @@ class SimplePie_Item foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) { - if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] == 'enclosure') + if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') { // Attributes $bitrate = null; @@ -4952,7 +5525,7 @@ class SimplePie_Item } } - if ($enclosure = $this->get_item_tags('', 'enclosure')) + if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure')) { if (isset($enclosure[0]['attribs']['']['url'])) { @@ -4986,6 +5559,13 @@ class SimplePie_Item $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width); } } + + if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width)) + { + // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor + $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width); + } + $this->data['enclosures'] = array_values(SimplePie_Misc::array_unique($this->data['enclosures'])); } if (!empty($this->data['enclosures'])) @@ -5004,7 +5584,7 @@ class SimplePie_Item { return (float) $return[0]['data']; } - elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) + elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[1]; } @@ -5024,7 +5604,7 @@ class SimplePie_Item { return (float) $return[0]['data']; } - elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) + elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[2]; } @@ -5034,6 +5614,18 @@ class SimplePie_Item } } + function get_source() + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source')) + { + return new $this->feed->source_class($this, $return[0]); + } + else + { + return null; + } + } + /** * Creates the add_to_* methods' return data * @@ -5043,16 +5635,20 @@ class SimplePie_Item * (and suffix to the item permalink) * @return mixed URL if feed exists, false otherwise */ - function add_to_service($item_url, $title_url = null) + function add_to_service($item_url, $title_url = null, $summary_url = null) { if ($this->get_permalink() !== null) { - $return = $this->sanitize($item_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->get_permalink()); + $return = $item_url . rawurlencode($this->get_permalink()); if ($title_url !== null && $this->get_title() !== null) { - $return .= $this->sanitize($title_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->get_title()); + $return .= $title_url . rawurlencode($this->get_title()); } - return $return; + if ($summary_url !== null && $this->get_description() !== null) + { + $return .= $summary_url . rawurlencode($this->get_description()); + } + return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI); } else { @@ -5072,12 +5668,12 @@ class SimplePie_Item function add_to_delicious() { - return $this->add_to_service('http://del.icio.us/post/?v=3&url=', '&title='); + return $this->add_to_service('http://del.icio.us/post/?v=4&url=', '&title='); } function add_to_digg() { - return $this->add_to_service('http://digg.com/submit?phase=2&URL='); + return $this->add_to_service('http://digg.com/submit?url=', '&title=', '&bodytext='); } function add_to_furl() @@ -5131,6 +5727,557 @@ class SimplePie_Item } } +class SimplePie_Source +{ + var $item; + var $data = array(); + + function SimplePie_Source($item, $data) + { + $this->item = $item; + $this->data = $data; + } + + function __toString() + { + return md5(serialize($this->data)); + } + + function get_source_tags($namespace, $tag) + { + if (isset($this->data['child'][$namespace][$tag])) + { + return $this->data['child'][$namespace][$tag]; + } + else + { + return null; + } + } + + function get_base($element = array()) + { + return $this->item->get_base($element); + } + + function sanitize($data, $type, $base = '') + { + return $this->item->sanitize($data, $type, $base); + } + + function get_item() + { + return $this->item; + } + + function get_title() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + function get_category($key = 0) + { + $categories = $this->get_categories(); + if (isset($categories[$key])) + { + return $categories[$key]; + } + else + { + return null; + } + } + + function get_categories() + { + $categories = array(); + + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) + { + $term = null; + $scheme = null; + $label = null; + if (isset($category['attribs']['']['term'])) + { + $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories[] = new $this->item->feed->category_class($term, $scheme, $label); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) + { + // This is really the label, but keep this as the term also for BC. + // Label will also work on retrieving because that falls back to term. + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + if (isset($category['attribs']['']['domain'])) + { + $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = null; + } + $categories[] = new $this->item->feed->category_class($term, $scheme, null); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) + { + $categories[] = new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) + { + $categories[] = new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + + if (!empty($categories)) + { + return SimplePie_Misc::array_unique($categories); + } + else + { + return null; + } + } + + function get_author($key = 0) + { + $authors = $this->get_authors(); + if (isset($authors[$key])) + { + return $authors[$key]; + } + else + { + return null; + } + } + + function get_authors() + { + $authors = array(); + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) + { + $name = null; + $uri = null; + $email = null; + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $authors[] = new $this->item->feed->author_class($name, $uri, $email); + } + } + if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) + { + $name = null; + $url = null; + $email = null; + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $authors[] = new $this->item->feed->author_class($name, $url, $email); + } + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) + { + $authors[] = new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) + { + $authors[] = new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) + { + $authors[] = new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + + if (!empty($authors)) + { + return SimplePie_Misc::array_unique($authors); + } + else + { + return null; + } + } + + function get_contributor($key = 0) + { + $contributors = $this->get_contributors(); + if (isset($contributors[$key])) + { + return $contributors[$key]; + } + else + { + return null; + } + } + + function get_contributors() + { + $contributors = array(); + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) + { + $name = null; + $uri = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $contributors[] = new $this->item->feed->author_class($name, $uri, $email); + } + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) + { + $name = null; + $url = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $contributors[] = new $this->item->feed->author_class($name, $url, $email); + } + } + + if (!empty($contributors)) + { + return SimplePie_Misc::array_unique($contributors); + } + else + { + return null; + } + } + + function get_link($key = 0, $rel = 'alternate') + { + $links = $this->get_links($rel); + if (isset($links[$key])) + { + return $links[$key]; + } + else + { + return null; + } + } + + /** + * Added for parity between the parent-level and the item/entry-level. + */ + function get_permalink() + { + return $this->get_link(0); + } + + function get_links($rel = 'alternate') + { + if (!isset($this->data['links'])) + { + $this->data['links'] = array(); + if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) + { + foreach ($links as $link) + { + if (isset($link['attribs']['']['href'])) + { + $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; + $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); + } + } + } + if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) + { + foreach ($links as $link) + { + if (isset($link['attribs']['']['href'])) + { + $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; + $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); + + } + } + } + if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + + $keys = array_keys($this->data['links']); + foreach ($keys as $key) + { + if (SimplePie_Misc::is_isegment_nz_nc($key)) + { + if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) + { + $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); + $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; + } + else + { + $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; + } + } + elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) + { + $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; + } + $this->data['links'][$key] = array_unique($this->data['links'][$key]); + } + } + + if (isset($this->data['links'][$rel])) + { + return $this->data['links'][$rel]; + } + else + { + return null; + } + } + + function get_description() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); + } + else + { + return null; + } + } + + function get_copyright() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + function get_language() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (isset($this->data['xml_lang'])) + { + return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + function get_latitude() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) + { + return (float) $return[0]['data']; + } + elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) + { + return (float) $match[1]; + } + else + { + return null; + } + } + + function get_longitude() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) + { + return (float) $return[0]['data']; + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) + { + return (float) $return[0]['data']; + } + elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) + { + return (float) $match[2]; + } + else + { + return null; + } + } + + function get_image_url() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) + { + return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + else + { + return null; + } + } +} + class SimplePie_Author { var $name; @@ -5851,11 +6998,11 @@ class SimplePie_Enclosure $mime = $mime[0]; // Process values for 'auto' - if ($width == 'auto') + if ($width === 'auto') { - if ($mime == 'video') + if ($mime === 'video') { - if ($height == 'auto') + if ($height === 'auto') { $width = 480; } @@ -5874,15 +7021,15 @@ class SimplePie_Enclosure } } - if ($height == 'auto') + if ($height === 'auto') { - if ($mime == 'audio') + if ($mime === 'audio') { $height = 0; } - elseif ($mime == 'video') + elseif ($mime === 'video') { - if ($width == 'auto') + if ($width === 'auto') { if ($widescreen) { @@ -5907,17 +7054,17 @@ class SimplePie_Enclosure $height = 376; } } - elseif ($mime == 'audio') + elseif ($mime === 'audio') { $height = 0; } // Set proper placeholder value - if ($mime == 'audio') + if ($mime === 'audio') { $placeholder = $audio; } - elseif ($mime == 'video') + elseif ($mime === 'video') { $placeholder = $video; } @@ -5936,7 +7083,7 @@ class SimplePie_Enclosure } // Odeo Feed MP3's - if ($handler == 'odeo') + if ($handler === 'odeo') { if ($native) { @@ -5949,7 +7096,7 @@ class SimplePie_Enclosure } // Flash - elseif ($handler == 'flash') + elseif ($handler === 'flash') { if ($native) { @@ -5963,7 +7110,7 @@ class SimplePie_Enclosure // Flash Media Player file types. // Preferred handler for MP3 file types. - elseif ($handler == 'fmedia' || ($handler == 'mp3' && $mediaplayer != '')) + elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== '')) { $height += 20; if ($native) @@ -5978,15 +7125,17 @@ class SimplePie_Enclosure // QuickTime 7 file types. Need to test with QuickTime 6. // Only handle MP3's if the Flash Media Player is not present. - elseif ($handler == 'quicktime' || ($handler == 'mp3' && $mediaplayer == '')) + elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === '')) { $height += 16; if ($native) { - if ($placeholder != ""){ + if ($placeholder !== '') + { $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>"; } - else { + else + { $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>"; } } @@ -5997,7 +7146,7 @@ class SimplePie_Enclosure } // Windows Media - elseif ($handler == 'wmedia') + elseif ($handler === 'wmedia') { $height += 45; if ($native) @@ -6019,14 +7168,14 @@ class SimplePie_Enclosure function get_real_type($find_handler = false) { // If it's Odeo, let's get it out of the way. - if (substr(strtolower($this->get_link()), 0, 15) == 'http://odeo.com') + if (substr(strtolower($this->get_link()), 0, 15) === 'http://odeo.com') { return 'odeo'; } // Mime-types by handler. $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash - $types_fmedia = array('video/flv', 'video/x-flv'); // Flash Media Player + $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3 @@ -6236,9 +7385,9 @@ class SimplePie_Caption function get_language() { - if ($this->language !== null) + if ($this->lang !== null) { - return $this->language; + return $this->lang; } else { @@ -6496,7 +7645,7 @@ class SimplePie_File var $status_code; var $redirects = 0; var $error; - var $method; + var $method = SIMPLEPIE_FILE_SOURCE_NONE; function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) { @@ -6519,9 +7668,9 @@ class SimplePie_File { $headers = array(); } - if (!$force_fsockopen && extension_loaded('curl')) + if (!$force_fsockopen && function_exists('curl_exec')) { - $this->method = 'curl'; + $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL; $fp = curl_init(); $headers2 = array(); foreach ($headers as $key => $value) @@ -6547,7 +7696,7 @@ class SimplePie_File } $this->headers = curl_exec($fp); - if (curl_errno($fp) == 23 || curl_errno($fp) == 61) + if (curl_errno($fp) === 23 || curl_errno($fp) === 61) { curl_setopt($fp, CURLOPT_ENCODING, 'none'); $this->headers = curl_exec($fp); @@ -6569,17 +7718,10 @@ class SimplePie_File $this->headers = $parser->headers; $this->body = $parser->body; $this->status_code = $parser->status_code; - if (($this->status_code == 300 || $this->status_code == 301 || $this->status_code == 302 || $this->status_code == 303 || $this->status_code == 307 || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) + if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) { $this->redirects++; - if (isset($this->headers['content-location'])) - { - $location = SimplePie_Misc::absolutize_url($this->headers['location'], SimplePie_Misc::absolutize_url($this->headers['content-location'], $url)); - } - else - { - $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); - } + $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); } } @@ -6587,9 +7729,9 @@ class SimplePie_File } else { - $this->method = 'fsockopen'; + $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN; $url_parts = parse_url($url); - if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) == 'https') + if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') { $url_parts['host'] = "ssl://$url_parts[host]"; $url_parts['port'] = 443; @@ -6598,7 +7740,7 @@ class SimplePie_File { $url_parts['port'] = 80; } - $fp = fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout); + $fp = @fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout); if (!$fp) { $this->error = 'fsockopen error: ' . $errstr; @@ -6606,14 +7748,7 @@ class SimplePie_File } else { - if (function_exists('stream_set_timeout')) - { - stream_set_timeout($fp, $timeout); - } - else - { - socket_set_timeout($fp, $timeout); - } + stream_set_timeout($fp, $timeout); if (isset($url_parts['path'])) { if (isset($url_parts['query'])) @@ -6632,9 +7767,9 @@ class SimplePie_File $out = "GET $get HTTP/1.0\r\n"; $out .= "Host: $url_parts[host]\r\n"; $out .= "User-Agent: $useragent\r\n"; - if (function_exists('gzinflate')) + if (extension_loaded('zlib')) { - $out .= "Accept-Encoding: gzip,deflate\r\n"; + $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n"; } if (isset($url_parts['user']) && isset($url_parts['pass'])) @@ -6648,27 +7783,13 @@ class SimplePie_File $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); - if (function_exists('stream_get_meta_data')) - { - $info = stream_get_meta_data($fp); - } - else - { - $info = socket_get_status($fp); - } + $info = stream_get_meta_data($fp); $this->headers = ''; while (!$info['eof'] && !$info['timed_out']) { $this->headers .= fread($fp, 1160); - if (function_exists('stream_get_meta_data')) - { - $info = stream_get_meta_data($fp); - } - else - { - $info = socket_get_status($fp); - } + $info = stream_get_meta_data($fp); } if (!$info['timed_out']) { @@ -6678,26 +7799,47 @@ class SimplePie_File $this->headers = $parser->headers; $this->body = $parser->body; $this->status_code = $parser->status_code; - if (($this->status_code == 300 || $this->status_code == 301 || $this->status_code == 302 || $this->status_code == 303 || $this->status_code == 307 || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) + if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) { $this->redirects++; - if (isset($this->headers['content-location'])) - { - $location = SimplePie_Misc::absolutize_url($this->headers['location'], SimplePie_Misc::absolutize_url($this->headers['content-location'], $url)); - } - else - { - $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); - } + $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); } - if (isset($this->headers['content-encoding']) && ($this->headers['content-encoding'] == 'gzip' || $this->headers['content-encoding'] == 'deflate')) + if (isset($this->headers['content-encoding'])) { - if (substr($this->body, 0, 8) == "\x1f\x8b\x08\x00\x00\x00\x00\x00") + // Hey, we act dumb elsewhere, so let's do that here too + switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20"))) { - $this->body = substr($this->body, 10); + case 'gzip': + case 'x-gzip': + $decoder = new SimplePie_gzdecode($this->body); + if (!$decoder->parse()) + { + $this->error = 'Unable to decode HTTP "gzip" stream'; + $this->success = false; + } + else + { + $this->body = $decoder->data; + } + break; + + case 'deflate': + if (($body = gzuncompress($this->body)) === false) + { + if (($body = gzinflate($this->body)) === false) + { + $this->error = 'Unable to decode HTTP "deflate" stream'; + $this->success = false; + } + } + $this->body = $body; + break; + + default: + $this->error = 'Unknown content coding'; + $this->success = false; } - $this->body = gzinflate($this->body); } } } @@ -6710,33 +7852,15 @@ class SimplePie_File } } } - elseif (function_exists('file_get_contents')) + else { - $this->method = 'file_get_contents'; + $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS; if (!$this->body = file_get_contents($url)) { $this->error = 'file_get_contents could not read the file'; $this->success = false; } } - else - { - $this->method = 'fopen'; - if (($fp = fopen($url, 'rb')) === false) - { - $this->error = 'failed to open stream: No such file or directory'; - $this->success = false; - } - else - { - $this->body = ''; - while (!feof($fp)) - { - $this->body .= fread($fp, 8192); - } - fclose($fp); - } - } } } @@ -6744,7 +7868,6 @@ class SimplePie_File * HTTP Response Parser * * @package SimplePie - * @todo Support HTTP Requests */ class SimplePie_HTTP_Parser { @@ -6752,17 +7875,17 @@ class SimplePie_HTTP_Parser * HTTP Version * * @access public - * @var string + * @var float */ - var $http_version = ''; + var $http_version = 0.0; /** * Status code * * @access public - * @var string + * @var int */ - var $status_code = ''; + var $status_code = 0; /** * Reason phrase @@ -6794,7 +7917,7 @@ class SimplePie_HTTP_Parser * @access private * @var string */ - var $state = 'start'; + var $state = 'http_version'; /** * Input data @@ -6815,8 +7938,8 @@ class SimplePie_HTTP_Parser /** * Current position of the pointer * - * @access private * @var int + * @access private */ var $position = 0; @@ -6856,13 +7979,13 @@ class SimplePie_HTTP_Parser */ function parse() { - while ($this->state && $this->state != 'emit' && $this->has_data()) + while ($this->state && $this->state !== 'emit' && $this->has_data()) { $state = $this->state; $this->$state(); } $this->data = ''; - if ($this->state == 'emit') + if ($this->state === 'emit' || $this->state === 'body') { return true; } @@ -6870,6 +7993,7 @@ class SimplePie_HTTP_Parser { $this->http_version = ''; $this->status_code = ''; + $this->reason = ''; $this->headers = array(); $this->body = ''; return false; @@ -6895,92 +8019,133 @@ class SimplePie_HTTP_Parser */ function is_linear_whitespace() { - return (bool) (strspn($this->data, "\x09\x20", $this->position, 1) - || (substr($this->data, $this->position, 2) == "\r\n" && strspn($this->data, "\x09\x20", $this->position + 2, 1)) - || (strspn($this->data, "\r\n", $this->position, 1) && strspn($this->data, "\x09\x20", $this->position + 1, 1))); + return (bool) ($this->data[$this->position] === "\x09" + || $this->data[$this->position] === "\x20" + || ($this->data[$this->position] === "\x0A" + && isset($this->data[$this->position + 1]) + && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20"))); } /** - * The starting state of the state machine, see if the data is a response or request + * Parse the HTTP version * * @access private */ - function start() + function http_version() { - $this->state = 'http_version_response'; + if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/') + { + $len = strspn($this->data, '0123456789.', 5); + $this->http_version = substr($this->data, 5, $len); + $this->position += 5 + $len; + if (substr_count($this->http_version, '.') <= 1) + { + $this->http_version = (float) $this->http_version; + $this->position += strspn($this->data, "\x09\x20", $this->position); + $this->state = 'status'; + } + else + { + $this->state = false; + } + } + else + { + $this->state = false; + } } /** - * Parse an HTTP-version string + * Parse the status code * * @access private */ - function http_version() + function status() { - if (preg_match('/^HTTP\/([0-9]+\.[0-9]+)/i', substr($this->data, $this->position, strcspn($this->data, "\r\n", $this->position)), $match)) + if ($len = strspn($this->data, '0123456789', $this->position)) { - $this->position += strlen($match[0]); - $this->http_version = $match[1]; - return true; + $this->status_code = (int) substr($this->data, $this->position, $len); + $this->position += $len; + $this->state = 'reason'; } else { - return false; + $this->state = false; } } /** - * Parse LWS, replacing consecutive characters with a single space + * Parse the reason phrase * * @access private */ - function linear_whitespace() + function reason() { - do - { - if (substr($this->data, $this->position, 2) == "\r\n") - { - $this->position += 2; - } - elseif (strspn($this->data, "\r\n", $this->position, 1)) - { - $this->position++; - } - $this->position += strspn($this->data, "\x09\x20", $this->position); - } while ($this->is_linear_whitespace()); - $this->value .= "\x20"; + $len = strcspn($this->data, "\x0A", $this->position); + $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20"); + $this->position += $len + 1; + $this->state = 'new_line'; } /** - * Parse an HTTP-version string within a response + * Deal with a new line, shifting data around as needed * * @access private */ - function http_version_response() + function new_line() { - if ($this->http_version() && $this->data[$this->position] == "\x20") + $this->value = trim($this->value, "\x0D\x20"); + if ($this->name !== '' && $this->value !== '') + { + $this->name = strtolower($this->name); + if (isset($this->headers[$this->name])) + { + $this->headers[$this->name] .= ', ' . $this->value; + } + else + { + $this->headers[$this->name] = $this->value; + } + } + $this->name = ''; + $this->value = ''; + if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A") + { + $this->position += 2; + $this->state = 'body'; + } + elseif ($this->data[$this->position] === "\x0A") { - $this->state = 'status_code'; $this->position++; + $this->state = 'body'; } else { - $this->state = false; + $this->state = 'name'; } } /** - * Parse a status code + * Parse a header name * * @access private */ - function status_code() + function name() { - if (strspn($this->data, '1234567890', $this->position, 3) == 3) + $len = strcspn($this->data, "\x0A:", $this->position); + if (isset($this->data[$this->position + $len])) { - $this->status_code = substr($this->data, $this->position, 3); - $this->state = 'reason_phrase'; - $this->position += 3; + if ($this->data[$this->position + $len] === "\x0A") + { + $this->position += $len; + $this->state = 'new_line'; + } + else + { + $this->name = substr($this->data, $this->position, $len); + $this->position += $len + 1; + $this->state = 'value'; + } } else { @@ -6989,80 +8154,56 @@ class SimplePie_HTTP_Parser } /** - * Skip over the reason phrase (it has no normative value, and you can send absolutely anything here) + * Parse LWS, replacing consecutive LWS characters with a single space * * @access private */ - function reason_phrase() + function linear_whitespace() { - $len = strcspn($this->data, "\r\n", $this->position); - $this->reason = substr($this->data, $this->position, $len); - $this->position += $len; - if ($this->has_data()) + do { - if (substr($this->data, $this->position, 2) == "\r\n") + if (substr($this->data, $this->position, 2) === "\x0D\x0A") { $this->position += 2; } - elseif (strspn($this->data, "\r\n", $this->position, 1)) + elseif ($this->data[$this->position] === "\x0A") { $this->position++; } - $this->state = 'name'; - } - } - - /** - * Parse a header name - * - * @access private - */ - function name() - { - $len = strcspn($this->data, ':', $this->position); - $this->name = substr($this->data, $this->position, $len); - $this->position += $len; - - if ($this->has_data() && $this->data[$this->position] == ':') - { - $this->state = 'value_next'; - $this->position++; - } - else - { - $this->state = false; - } + $this->position += strspn($this->data, "\x09\x20", $this->position); + } while ($this->has_data() && $this->is_linear_whitespace()); + $this->value .= "\x20"; } /** - * See what state to move the state machine to while within non-quoted header values + * See what state to move to while within non-quoted header values * * @access private */ - function value_next() + function value() { if ($this->is_linear_whitespace()) { - $this->state = 'value_linear_whitespace'; - } - elseif ($this->data[$this->position] == '"') - { - $this->state = 'value_quote_next'; - $this->position++; - } - elseif (substr($this->data, $this->position, 2) == "\r\n") - { - $this->state = 'end_crlf'; - $this->position += 2; - } - elseif (strspn($this->data, "\r\n", $this->position, 1)) - { - $this->state = 'end_crlf'; - $this->position++; + $this->linear_whitespace(); } else { - $this->state = 'value_no_quote'; + switch ($this->data[$this->position]) + { + case '"': + $this->position++; + $this->state = 'quote'; + break; + + case "\x0A": + $this->position++; + $this->state = 'new_line'; + break; + + default: + $this->state = 'value_char'; + break; + } } } @@ -7071,52 +8212,46 @@ class SimplePie_HTTP_Parser * * @access private */ - function value_no_quote() + function value_char() { - $len = strcspn($this->data, "\x09\x20\r\n\"", $this->position); + $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position); $this->value .= substr($this->data, $this->position, $len); - $this->state = 'value_next'; $this->position += $len; + $this->state = 'value'; } /** - * Parse LWS outside quotes - * - * @access private - */ - function value_linear_whitespace() - { - $this->linear_whitespace(); - $this->state = 'value_next'; - } - - /** - * See what state to move the state machine to while within quoted header values + * See what state to move to while within quoted header values * * @access private */ - function value_quote_next() + function quote() { if ($this->is_linear_whitespace()) { - $this->state = 'value_linear_whitespace_quote'; + $this->linear_whitespace(); } else { switch ($this->data[$this->position]) { case '"': - $this->state = 'value_next'; $this->position++; + $this->state = 'value'; + break; + + case "\x0A": + $this->position++; + $this->state = 'new_line'; break; case '\\': - $this->state = 'value_quote_char'; $this->position++; + $this->state = 'quote_escaped'; break; default: - $this->state = 'value_quote'; + $this->state = 'quote_char'; break; } } @@ -7127,12 +8262,12 @@ class SimplePie_HTTP_Parser * * @access private */ - function value_quote() + function quote_char() { - $len = strcspn($this->data, "\x09\x20\r\n\"\\", $this->position); + $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position); $this->value .= substr($this->data, $this->position, $len); $this->position += $len; - $this->state = 'value_quote_next'; + $this->state = 'value'; } /** @@ -7140,90 +8275,407 @@ class SimplePie_HTTP_Parser * * @access private */ - function value_quote_char() + function quote_escaped() { $this->value .= $this->data[$this->position]; - $this->state = 'value_quote_next'; $this->position++; + $this->state = 'quote'; } /** - * Parse LWS within quotes + * Parse the body * * @access private */ - function value_linear_whitespace_quote() + function body() { - $this->linear_whitespace(); - $this->state = 'value_quote_next'; + $this->body = substr($this->data, $this->position); + $this->state = 'emit'; } +} + +/** + * gzdecode + * + * @package SimplePie + */ +class SimplePie_gzdecode +{ + /** + * Compressed data + * + * @access private + * @see gzdecode::$data + */ + var $compressed_data; /** - * Parse a CRLF, and see whether we have a further header, or whether we are followed by the body + * Size of compressed data * * @access private */ - function end_crlf() + var $compressed_size; + + /** + * Minimum size of a valid gzip string + * + * @access private + */ + var $min_compressed_size = 18; + + /** + * Current position of pointer + * + * @access private + */ + var $position = 0; + + /** + * Flags (FLG) + * + * @access private + */ + var $flags; + + /** + * Uncompressed data + * + * @access public + * @see gzdecode::$compressed_data + */ + var $data; + + /** + * Modified time + * + * @access public + */ + var $MTIME; + + /** + * Extra Flags + * + * @access public + */ + var $XFL; + + /** + * Operating System + * + * @access public + */ + var $OS; + + /** + * Subfield ID 1 + * + * @access public + * @see gzdecode::$extra_field + * @see gzdecode::$SI2 + */ + var $SI1; + + /** + * Subfield ID 2 + * + * @access public + * @see gzdecode::$extra_field + * @see gzdecode::$SI1 + */ + var $SI2; + + /** + * Extra field content + * + * @access public + * @see gzdecode::$SI1 + * @see gzdecode::$SI2 + */ + var $extra_field; + + /** + * Original filename + * + * @access public + */ + var $filename; + + /** + * Human readable comment + * + * @access public + */ + var $comment; + + /** + * Don't allow anything to be set + * + * @access public + */ + function __set($name, $value) + { + trigger_error("Cannot write property $name", E_USER_ERROR); + } + + /** + * Set the compressed string and related properties + * + * @access public + */ + function SimplePie_gzdecode($data) { - $this->name = strtolower($this->name); - $this->value = trim($this->value, "\x20"); - if (isset($this->headers[$this->name])) + $this->compressed_data = $data; + $this->compressed_size = strlen($data); + } + + /** + * Decode the GZIP stream + * + * @access public + */ + function parse() + { + if ($this->compressed_size >= $this->min_compressed_size) { - $this->headers[$this->name] .= ', ' . $this->value; + // Check ID1, ID2, and CM + if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08") + { + return false; + } + + // Get the FLG (FLaGs) + $this->flags = ord($this->compressed_data[3]); + + // FLG bits above (1 << 4) are reserved + if ($this->flags > 0x1F) + { + return false; + } + + // Advance the pointer after the above + $this->position += 4; + + // MTIME + $mtime = substr($this->compressed_data, $this->position, 4); + // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness + if (current(unpack('S', "\x00\x01")) === 1) + { + $mtime = strrev($mtime); + } + $this->MTIME = current(unpack('l', $mtime)); + $this->position += 4; + + // Get the XFL (eXtra FLags) + $this->XFL = ord($this->compressed_data[$this->position++]); + + // Get the OS (Operating System) + $this->OS = ord($this->compressed_data[$this->position++]); + + // Parse the FEXTRA + if ($this->flags & 4) + { + // Read subfield IDs + $this->SI1 = $this->compressed_data[$this->position++]; + $this->SI2 = $this->compressed_data[$this->position++]; + + // SI2 set to zero is reserved for future use + if ($this->SI2 === "\x00") + { + return false; + } + + // Get the length of the extra field + $len = current(unpack('v', substr($this->compressed_data, $this->position, 2))); + $position += 2; + + // Check the length of the string is still valid + $this->min_compressed_size += $len + 4; + if ($this->compressed_size >= $this->min_compressed_size) + { + // Set the extra field to the given data + $this->extra_field = substr($this->compressed_data, $this->position, $len); + $this->position += $len; + } + else + { + return false; + } + } + + // Parse the FNAME + if ($this->flags & 8) + { + // Get the length of the filename + $len = strcspn($this->compressed_data, "\x00", $this->position); + + // Check the length of the string is still valid + $this->min_compressed_size += $len + 1; + if ($this->compressed_size >= $this->min_compressed_size) + { + // Set the original filename to the given string + $this->filename = substr($this->compressed_data, $this->position, $len); + $this->position += $len + 1; + } + else + { + return false; + } + } + + // Parse the FCOMMENT + if ($this->flags & 16) + { + // Get the length of the comment + $len = strcspn($this->compressed_data, "\x00", $this->position); + + // Check the length of the string is still valid + $this->min_compressed_size += $len + 1; + if ($this->compressed_size >= $this->min_compressed_size) + { + // Set the original comment to the given string + $this->comment = substr($this->compressed_data, $this->position, $len); + $this->position += $len + 1; + } + else + { + return false; + } + } + + // Parse the FHCRC + if ($this->flags & 2) + { + // Check the length of the string is still valid + $this->min_compressed_size += $len + 2; + if ($this->compressed_size >= $this->min_compressed_size) + { + // Read the CRC + $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2))); + + // Check the CRC matches + if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc) + { + $this->position += 2; + } + else + { + return false; + } + } + else + { + return false; + } + } + + // Decompress the actual data + if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false) + { + return false; + } + else + { + $this->position = $this->compressed_size - 8; + } + + // Check CRC of data + $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4))); + $this->position += 4; + /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc)) + { + return false; + }*/ + + // Check ISIZE of data + $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4))); + $this->position += 4; + if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize)) + { + return false; + } + + // Wow, against all odds, we've actually got a valid gzip string + return true; } else { - $this->headers[$this->name] = $this->value; + return false; } + } +} - if (substr($this->data, $this->position, 2) == "\r\n") - { - $this->body = substr($this->data, $this->position + 2); - $this->state = 'emit'; - } - elseif (strspn($this->data, "\r\n", $this->position, 1)) - { - $this->body = substr($this->data, $this->position + 1); - $this->state = 'emit'; - } - else +class SimplePie_Cache +{ + /** + * Don't call the constructor. Please. + * + * @access private + */ + function SimplePie_Cache() + { + trigger_error('Please call SimplePie_Cache::create() instead of the constructor', E_USER_ERROR); + } + + /** + * Create a new SimplePie_Cache object + * + * @static + * @access public + */ + function create($location, $filename, $extension) + { + $location_iri = new SimplePie_IRI($location); + switch ($location_iri->get_scheme()) { - $this->name = ''; - $this->value = ''; - $this->state = 'name'; + case 'mysql': + if (extension_loaded('mysql')) + { + return new SimplePie_Cache_MySQL($location_iri, $filename, $extension); + } + break; + + default: + return new SimplePie_Cache_File($location, $filename, $extension); } } } -class SimplePie_Cache +class SimplePie_Cache_File { var $location; var $filename; var $extension; var $name; - function SimplePie_Cache($location, $filename, $extension) + function SimplePie_Cache_File($location, $filename, $extension) { $this->location = $location; - $this->filename = rawurlencode($filename); - $this->extension = rawurlencode($extension); - $this->name = "$location/$this->filename.$this->extension"; + $this->filename = $filename; + $this->extension = $extension; + $this->name = "$this->location/$this->filename.$this->extension"; } function save($data) { if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location)) { + if (is_a($data, 'SimplePie')) + { + $data = $data->data; + } + + $data = serialize($data); + if (function_exists('file_put_contents')) { - return (bool) file_put_contents($this->name, serialize($data)); + return (bool) file_put_contents($this->name, $data); } else { $fp = fopen($this->name, 'wb'); if ($fp) { - fwrite($fp, serialize($data)); + fwrite($fp, $data); fclose($fp); return true; } @@ -7236,20 +8688,7 @@ class SimplePie_Cache { if (file_exists($this->name) && is_readable($this->name)) { - if (function_exists('file_get_contents')) - { - return unserialize(file_get_contents($this->name)); - } - elseif (($fp = fopen($this->name, 'rb')) !== false) - { - $data = ''; - while (!feof($fp)) - { - $data .= fread($fp, 8192); - } - fclose($fp); - return unserialize($data); - } + return unserialize(file_get_contents($this->name)); } return false; } @@ -7282,121 +8721,398 @@ class SimplePie_Cache } } -class SimplePie_Misc +class SimplePie_Cache_DB { - function time_hms($seconds) + function prepare_simplepie_object_for_cache($data) { - $time = ''; + $items = $data->get_items(); + $items_by_id = array(); - $hours = floor($seconds / 3600); - $remainder = $seconds % 3600; - if ($hours > 0) + if (!empty($items)) { - $time .= $hours.':'; + foreach ($items as $item) + { + $items_by_id[$item->get_id()] = $item; + } + + if (count($items_by_id) !== count($items)) + { + $items_by_id = array(); + foreach ($items as $item) + { + $items_by_id[$item->get_id(true)] = $item; + } + } + + if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0])) + { + $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; + } + elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0])) + { + $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; + } + elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0])) + { + $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; + } + elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0])) + { + $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]; + } + else + { + $channel = null; + } + + if ($channel !== null) + { + if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'])) + { + unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']); + } + if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry'])) + { + unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']); + } + if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])) + { + unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']); + } + if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])) + { + unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']); + } + if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item'])) + { + unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']); + } + } + if (isset($data->data['items'])) + { + unset($data->data['items']); + } + if (isset($data->data['ordered_items'])) + { + unset($data->data['ordered_items']); + } } + return array(serialize($data->data), $items_by_id); + } +} - $minutes = floor($remainder / 60); - $seconds = $remainder % 60; - if ($minutes < 10 && $hours > 0) +class SimplePie_Cache_MySQL extends SimplePie_Cache_DB +{ + var $mysql; + var $options; + var $id; + + function SimplePie_Cache_MySQL($mysql_location, $name, $extension) + { + $host = $mysql_location->get_host(); + if (SimplePie_Misc::stripos($host, 'unix(') === 0 && substr($host, -1) === ')') { - $minutes = '0' . $minutes; + $server = ':' . substr($host, 5, -1); } - if ($seconds < 10) + else { - $seconds = '0' . $seconds; + $server = $host; + if ($mysql_location->get_port() !== null) + { + $server .= ':' . $mysql_location->get_port(); + } } - $time .= $minutes.':'; - $time .= $seconds; + if (strpos($mysql_location->get_userinfo(), ':') !== false) + { + list($username, $password) = explode(':', $mysql_location->get_userinfo(), 2); + } + else + { + $username = $mysql_location->get_userinfo(); + $password = null; + } - return $time; + if ($this->mysql = mysql_connect($server, $username, $password)) + { + $this->id = $name . $extension; + $this->options = SimplePie_Misc::parse_str($mysql_location->get_query()); + if (!isset($this->options['prefix'][0])) + { + $this->options['prefix'][0] = ''; + } + + if (mysql_select_db(ltrim($mysql_location->get_path(), '/')) + && mysql_query('SET NAMES utf8') + && ($query = mysql_unbuffered_query('SHOW TABLES'))) + { + $db = array(); + while ($row = mysql_fetch_row($query)) + { + $db[] = $row[0]; + } + + if (!in_array($this->options['prefix'][0] . 'cache_data', $db)) + { + if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))')) + { + $this->mysql = null; + } + } + + if (!in_array($this->options['prefix'][0] . 'items', $db)) + { + if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` TEXT CHARACTER SET utf8 NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))')) + { + $this->mysql = null; + } + } + } + else + { + $this->mysql = null; + } + } } - function absolutize_url($relative, $base) + function save($data) { - if ($relative !== '') + if ($this->mysql) { - $relative = SimplePie_Misc::parse_url($relative); - if ($relative['scheme'] !== '') - { - $target = $relative; - } - elseif ($base !== '') + $feed_id = "'" . mysql_real_escape_string($this->id) . "'"; + + if (is_a($data, 'SimplePie')) { - $base = SimplePie_Misc::parse_url($base); - $target = SimplePie_Misc::parse_url(''); - if ($relative['authority'] !== '') + if (SIMPLEPIE_PHP5) { - $target = $relative; - $target['scheme'] = $base['scheme']; + // This keyword needs to defy coding standards for PHP4 compatibility + $data = clone($data); } - else + + $prepared = $this->prepare_simplepie_object_for_cache($data); + + if ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql)) { - $target['scheme'] = $base['scheme']; - $target['authority'] = $base['authority']; - if ($relative['path'] !== '') + if (mysql_num_rows($query)) { - if (strpos($relative['path'], '/') === 0) - { - $target['path'] = $relative['path']; - } - elseif (($target['path'] = dirname("$base[path].")) == '/') + $items = count($prepared[1]); + if ($items) { - $target['path'] .= $relative['path']; + $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = ' . $items . ', `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id; } else { - $target['path'] .= '/' . $relative['path']; + $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id; } - if ($relative['query'] !== '') + + if (!mysql_query($sql, $this->mysql)) { - $target['query'] = $relative['query']; + return false; } } - else + elseif (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(' . $feed_id . ', ' . count($prepared[1]) . ', \'' . mysql_real_escape_string($prepared[0]) . '\', ' . time() . ')', $this->mysql)) { - if ($base['path'] !== '') - { - $target['path'] = $base['path']; - } - else - { - $target['path'] = '/'; - } - if ($relative['query'] !== '') + return false; + } + + $ids = array_keys($prepared[1]); + if (!empty($ids)) + { + foreach ($ids as $id) { - $target['query'] = $relative['query']; + $database_ids[] = mysql_real_escape_string($id); } - elseif ($base['query'] !== '') + + if ($query = mysql_unbuffered_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'items` WHERE `id` = \'' . implode('\' OR `id` = \'', $database_ids) . '\' AND `feed_id` = ' . $feed_id, $this->mysql)) { - $target['query'] = $base['query']; + $existing_ids = array(); + while ($row = mysql_fetch_row($query)) + { + $existing_ids[] = $row[0]; + } + + $new_ids = array_diff($ids, $existing_ids); + + foreach ($new_ids as $new_id) + { + if (!($date = $prepared[1][$new_id]->get_date('U'))) + { + $date = time(); + } + + if (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(' . $feed_id . ', \'' . mysql_real_escape_string($new_id) . '\', \'' . mysql_real_escape_string(serialize($prepared[1][$new_id]->data)) . '\', ' . $date . ')', $this->mysql)) + { + return false; + } + } + return true; } } + else + { + return true; + } + } + } + elseif ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql)) + { + if (mysql_num_rows($query)) + { + if (mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = 0, `data` = \'' . mysql_real_escape_string(serialize($data)) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id, $this->mysql)) + { + return true; + } } - if ($relative['fragment'] !== '') + elseif (mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(\'' . mysql_real_escape_string($this->id) . '\', 0, \'' . mysql_real_escape_string(serialize($data)) . '\', ' . time() . ')', $this->mysql)) { - $target['fragment'] = $relative['fragment']; + return true; } } + } + return false; + } + + function load() + { + if ($this->mysql && ($query = mysql_query('SELECT `items`, `data` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query))) + { + $data = unserialize($row[1]); + + if (isset($this->options['items'][0])) + { + $items = (int) $this->options['items'][0]; + } else { - // No base URL, just return the relative URL - $target = $relative; + $items = (int) $row[0]; + } + + if ($items !== 0) + { + if (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0])) + { + $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; + } + elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0])) + { + $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; + } + elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0])) + { + $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; + } + elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0])) + { + $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]; + } + else + { + $feed = null; + } + + if ($feed !== null) + { + $sql = 'SELECT `data` FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . '\' ORDER BY `posted` DESC'; + if ($items > 0) + { + $sql .= ' LIMIT ' . $items; + } + + if ($query = mysql_unbuffered_query($sql, $this->mysql)) + { + while ($row = mysql_fetch_row($query)) + { + $feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row[0]); + } + } + else + { + return false; + } + } } - $return = SimplePie_Misc::compress_parse_url($target['scheme'], $target['authority'], $target['path'], $target['query'], $target['fragment']); + return $data; + } + return false; + } + + function mtime() + { + if ($this->mysql && ($query = mysql_query('SELECT `mtime` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query))) + { + return $row[0]; } else { - $return = $base; + return false; } - $return = SimplePie_Misc::normalize_url($return); - return $return; + } + + function touch() + { + if ($this->mysql && ($query = mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `mtime` = ' . time() . ' WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && mysql_affected_rows($this->mysql)) + { + return true; + } + else + { + return false; + } + } + + function unlink() + { + if ($this->mysql && ($query = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($query2 = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql))) + { + return true; + } + else + { + return false; + } + } +} + +class SimplePie_Misc +{ + function time_hms($seconds) + { + $time = ''; + + $hours = floor($seconds / 3600); + $remainder = $seconds % 3600; + if ($hours > 0) + { + $time .= $hours.':'; + } + + $minutes = floor($remainder / 60); + $seconds = $remainder % 60; + if ($minutes < 10 && $hours > 0) + { + $minutes = '0' . $minutes; + } + if ($seconds < 10) + { + $seconds = '0' . $seconds; + } + + $time .= $minutes.':'; + $time .= $seconds; + + return $time; + } + + function absolutize_url($relative, $base) + { + $iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative); + return $iri->get_iri(); } function remove_dot_segments($input) { $output = ''; - while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input == '.' || $input == '..') + while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') { // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise, if (strpos($input, '../') === 0) @@ -7412,7 +9128,7 @@ class SimplePie_Misc { $input = substr_replace($input, '/', 0, 3); } - elseif ($input == '/.') + elseif ($input === '/.') { $input = '/'; } @@ -7422,13 +9138,13 @@ class SimplePie_Misc $input = substr_replace($input, '/', 0, 4); $output = substr_replace($output, '', strrpos($output, '/')); } - elseif ($input == '/..') + elseif ($input === '/..') { $input = '/'; $output = substr_replace($output, '', strrpos($output, '/')); } // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise, - elseif ($input == '.' || $input == '..') + elseif ($input === '.' || $input === '..') { $input = ''; } @@ -7468,11 +9184,11 @@ class SimplePie_Misc $return[$i]['content'] = $matches[$i][4][0]; } $return[$i]['attribs'] = array(); - if (isset($matches[$i][2][0]) && preg_match_all('/((?:[^\s:]+:)?[^\s:]+)(?:\s*=\s*(?:"([^"]*)"|\'([^\']*)\'|([a-z0-9\-._:]*)))?\s/U', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER)) + if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER)) { for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++) { - if (count($attribs[$j]) == 2) + if (count($attribs[$j]) === 2) { $attribs[$j][2] = $attribs[$j][1]; } @@ -7505,22 +9221,42 @@ class SimplePie_Misc function error($message, $level, $file, $line) { - switch ($level) + if ((ini_get('error_reporting') & $level) > 0) { - case E_USER_ERROR: - $note = 'PHP Error'; - break; - case E_USER_WARNING: - $note = 'PHP Warning'; - break; - case E_USER_NOTICE: - $note = 'PHP Notice'; - break; - default: - $note = 'Unknown Error'; - break; + switch ($level) + { + case E_USER_ERROR: + $note = 'PHP Error'; + break; + case E_USER_WARNING: + $note = 'PHP Warning'; + break; + case E_USER_NOTICE: + $note = 'PHP Notice'; + break; + default: + $note = 'Unknown Error'; + break; + } + + $log_error = true; + if (!function_exists('error_log')) + { + $log_error = false; + } + + $log_file = @ini_get('error_log'); + if (!empty($log_file) && ('syslog' != $log_file) && !@is_writable($log_file)) + { + $log_error = false; + } + + if ($log_error) + { + @error_log("$note: $message in $file on line $line", 0); + } } - error_log("$note: $message in $file on line $line", 0); + return $message; } @@ -7543,16 +9279,23 @@ class SimplePie_Misc * @param str $cache_class Name of the cache-handling class being used * in SimplePie. Defaults to 'SimplePie_Cache', and should be left * as-is unless you've overloaded the class. - * @param str $cache_name_function Function that converts the filename - * for saving. Defaults to 'md5'. + * @param str $cache_name_function Obsolete. Exists for backwards + * compatibility reasons only. */ function display_cached_file($identifier_url, $cache_location = './cache', $cache_extension = 'spc', $cache_class = 'SimplePie_Cache', $cache_name_function = 'md5') { - $cache = new $cache_class($cache_location, call_user_func($cache_name_function, $identifier_url), $cache_extension); + $cache = call_user_func(array($cache_class, 'create'), $cache_location, $identifier_url, $cache_extension); if ($file = $cache->load()) { - header('Content-type:' . $file['headers']['content-type']); + if (isset($file['headers']['content-type'])) + { + header('Content-type:' . $file['headers']['content-type']); + } + else + { + header('Content-type: application/octet-stream'); + } header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days echo $file['body']; exit; @@ -7565,7 +9308,7 @@ class SimplePie_Misc { $url = SimplePie_Misc::normalize_url($url); $parsed = SimplePie_Misc::parse_url($url); - if ($parsed['scheme'] !== '' && $parsed['scheme'] != 'http' && $parsed['scheme'] != 'https') + if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https') { return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http); } @@ -7575,15 +9318,15 @@ class SimplePie_Misc return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http); } - if ($http == 2 && $parsed['scheme'] !== '') + if ($http === 2 && $parsed['scheme'] !== '') { return "feed:$url"; } - elseif ($http == 3 && strtolower($parsed['scheme']) == 'http') + elseif ($http === 3 && strtolower($parsed['scheme']) === 'http') { return substr_replace($url, 'podcast', 0, 4); } - elseif ($http == 4 && strtolower($parsed['scheme']) == 'http') + elseif ($http === 4 && strtolower($parsed['scheme']) === 'http') { return substr_replace($url, 'itpc', 0, 4); } @@ -7595,68 +9338,37 @@ class SimplePie_Misc function parse_url($url) { - static $cache = array(); - if (isset($cache[$url])) - { - return $cache[$url]; - } - elseif (preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/', $url, $match)) - { - for ($i = count($match); $i <= 9; $i++) - { - $match[$i] = ''; - } - return $cache[$url] = array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[7], 'fragment' => $match[9]); - } - else - { - return $cache[$url] = array('scheme' => '', 'authority' => '', 'path' => '', 'query' => '', 'fragment' => ''); - } + $iri = new SimplePie_IRI($url); + return array( + 'scheme' => (string) $iri->get_scheme(), + 'authority' => (string) $iri->get_authority(), + 'path' => (string) $iri->get_path(), + 'query' => (string) $iri->get_query(), + 'fragment' => (string) $iri->get_fragment() + ); } function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '') { - $return = ''; - if ($scheme !== '') - { - $return .= "$scheme:"; - } - if ($authority !== '') - { - $return .= "//$authority"; - } - if ($path !== '') - { - $return .= $path; - } - if ($query !== '') - { - $return .= "?$query"; - } - if ($fragment !== '') - { - $return .= "#$fragment"; - } - return $return; + $iri = new SimplePie_IRI(''); + $iri->set_scheme($scheme); + $iri->set_authority($authority); + $iri->set_path($path); + $iri->set_query($query); + $iri->set_fragment($fragment); + return $iri->get_iri(); } function normalize_url($url) { - $url = preg_replace_callback('/%([0-9A-Fa-f]{2})/', array('SimplePie_Misc', 'percent_encoding_normalization'), $url); - $url = SimplePie_Misc::parse_url($url); - $url['scheme'] = strtolower($url['scheme']); - if ($url['authority'] !== '') - { - $url['authority'] = strtolower($url['authority']); - $url['path'] = SimplePie_Misc::remove_dot_segments($url['path']); - } - return SimplePie_Misc::compress_parse_url($url['scheme'], $url['authority'], $url['path'], $url['query'], $url['fragment']); + $iri = new SimplePie_IRI($url); + return $iri->get_iri(); } function percent_encoding_normalization($match) { $integer = hexdec($match[1]); - if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer == 0x2D || $integer == 0x2E || $integer == 0x5F || $integer == 0x7E) + if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E) { return chr($integer); } @@ -7679,16 +9391,15 @@ class SimplePie_Misc */ function utf8_bad_replace($str) { - if (function_exists('iconv')) + if (function_exists('iconv') && ($return = @iconv('UTF-8', 'UTF-8//IGNORE', $str))) { - $out = iconv('UTF-8', 'UTF-8//IGNORE', $str); - if($out !== false) return $out; + return $return; } - if (function_exists('mb_convert_encoding')) + elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($str, 'UTF-8', 'UTF-8'))) { - return mb_convert_encoding($str, 'UTF-8', 'UTF-8'); + return $return; } - elseif (preg_match_all('/([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})/', $str, $matches)) + elseif (preg_match_all('/(?:[\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})+/', $str, $matches)) { return implode("\xEF\xBF\xBD", $matches[0]); } @@ -7702,1372 +9413,1375 @@ class SimplePie_Misc } } + /** + * Converts a Windows-1252 encoded string to a UTF-8 encoded string + * + * @static + * @access public + * @param string $string Windows-1252 encoded string + * @return string UTF-8 encoded string + */ + function windows_1252_to_utf8($string) + { + static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF"); + + return strtr($string, $convert_table); + } + function change_encoding($data, $input, $output) { $input = SimplePie_Misc::encoding($input); $output = SimplePie_Misc::encoding($output); - if (function_exists('iconv') && ($return = @iconv($input, "$output//IGNORE", $data))) + // We fail to fail on non US-ASCII bytes + if ($input === 'US-ASCII') { - return $return; + static $non_ascii_octects = ''; + if (!$non_ascii_octects) + { + for ($i = 0x80; $i <= 0xFF; $i++) + { + $non_ascii_octects .= chr($i); + } + } + $data = substr($data, 0, strcspn($data, $non_ascii_octects)); } - elseif (function_exists('iconv') && ($return = @iconv($input, $output, $data))) + + // This is first, as behaviour of this is completely predictable + if ($input === 'Windows-1252' && $output === 'UTF-8') { - return $return; + return SimplePie_Misc::windows_1252_to_utf8($data); } - elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($data, $output, $input))) + // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported). + elseif (function_exists('mb_convert_encoding') && @mb_convert_encoding("\x80", 'UTF-16BE', $input) !== "\x00\x80" && ($return = @mb_convert_encoding($data, $output, $input))) { return $return; } - elseif ($input == 'ISO-8859-1' && $output == 'UTF-8') + // This is last, as behaviour of this varies with OS userland and PHP version + elseif (function_exists('iconv') && ($return = @iconv($input, $output, $data))) { - return utf8_encode($data); + return $return; } - elseif ($input == 'UTF-8' && $output == 'ISO-8859-1') + // If we can't do anything, just fail + else { - return utf8_decode($data); + return false; } - return $data; } - function encoding($encoding) + function encoding($charset) { - // Character sets are case-insensitive (though we'll return them in the form given in their registration) - switch (strtoupper($encoding)) + // Normalization from UTS #22 + switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset))) { - case 'ANSI_X3.4-1968': - case 'ISO-IR-6': - case 'ANSI_X3.4-1986': - case 'ISO_646.IRV:1991': - case 'ASCII': - case 'ISO646-US': - case 'US-ASCII': - case 'US': - case 'IBM367': - case 'CP367': - case 'CSASCII': - return 'US-ASCII'; - - case 'ISO_8859-1:1987': - case 'ISO-IR-100': - case 'ISO_8859-1': - case 'ISO-8859-1': - case 'LATIN1': - case 'L1': - case 'IBM819': - case 'CP819': - case 'CSISOLATIN1': - return 'ISO-8859-1'; - - case 'ISO_8859-2:1987': - case 'ISO-IR-101': - case 'ISO_8859-2': - case 'ISO-8859-2': - case 'LATIN2': - case 'L2': - case 'CSISOLATIN2': - return 'ISO-8859-2'; - - case 'ISO_8859-3:1988': - case 'ISO-IR-109': - case 'ISO_8859-3': - case 'ISO-8859-3': - case 'LATIN3': - case 'L3': - case 'CSISOLATIN3': - return 'ISO-8859-3'; + case 'adobestandardencoding': + case 'csadobestandardencoding': + return 'Adobe-Standard-Encoding'; - case 'ISO_8859-4:1988': - case 'ISO-IR-110': - case 'ISO_8859-4': - case 'ISO-8859-4': - case 'LATIN4': - case 'L4': - case 'CSISOLATIN4': - return 'ISO-8859-4'; + case 'adobesymbolencoding': + case 'cshppsmath': + return 'Adobe-Symbol-Encoding'; - case 'ISO_8859-5:1988': - case 'ISO-IR-144': - case 'ISO_8859-5': - case 'ISO-8859-5': - case 'CYRILLIC': - case 'CSISOLATINCYRILLIC': - return 'ISO-8859-5'; + case 'ami1251': + case 'amiga1251': + return 'Amiga-1251'; - case 'ISO_8859-6:1987': - case 'ISO-IR-127': - case 'ISO_8859-6': - case 'ISO-8859-6': - case 'ECMA-114': - case 'ASMO-708': - case 'ARABIC': - case 'CSISOLATINARABIC': - return 'ISO-8859-6'; + case 'ansix31101983': + case 'csat5001983': + case 'csiso99naplps': + case 'isoir99': + case 'naplps': + return 'ANSI_X3.110-1983'; - case 'ISO_8859-7:1987': - case 'ISO-IR-126': - case 'ISO_8859-7': - case 'ISO-8859-7': - case 'ELOT_928': - case 'ECMA-118': - case 'GREEK': - case 'GREEK8': - case 'CSISOLATINGREEK': - return 'ISO-8859-7'; + case 'arabic7': + case 'asmo449': + case 'csiso89asmo449': + case 'iso9036': + case 'isoir89': + return 'ASMO_449'; - case 'ISO_8859-8:1988': - case 'ISO-IR-138': - case 'ISO_8859-8': - case 'ISO-8859-8': - case 'HEBREW': - case 'CSISOLATINHEBREW': - return 'ISO-8859-8'; + case 'big5': + case 'csbig5': + case 'xxbig5': + return 'Big5'; - case 'ISO_8859-9:1989': - case 'ISO-IR-148': - case 'ISO_8859-9': - case 'ISO-8859-9': - case 'LATIN5': - case 'L5': - case 'CSISOLATIN5': - return 'ISO-8859-9'; - - case 'ISO-8859-10': - case 'ISO-IR-157': - case 'L6': - case 'ISO_8859-10:1992': - case 'CSISOLATIN6': - case 'LATIN6': - return 'ISO-8859-10'; + case 'big5hkscs': + return 'Big5-HKSCS'; - case 'ISO_6937-2-ADD': - case 'ISO-IR-142': - case 'CSISOTEXTCOMM': - return 'ISO_6937-2-add'; + case 'bocu1': + case 'csbocu1': + return 'BOCU-1'; - case 'JIS_X0201': - case 'X0201': - case 'CSHALFWIDTHKATAKANA': - return 'JIS_X0201'; + case 'brf': + case 'csbrf': + return 'BRF'; - case 'JIS_ENCODING': - case 'CSJISENCODING': - return 'JIS_Encoding'; + case 'bs4730': + case 'csiso4unitedkingdom': + case 'gb': + case 'iso646gb': + case 'isoir4': + case 'uk': + return 'BS_4730'; - case 'SHIFT_JIS': - case 'MS_KANJI': - case 'CSSHIFTJIS': - return 'Shift_JIS'; + case 'bsviewdata': + case 'csiso47bsviewdata': + case 'isoir47': + return 'BS_viewdata'; - case 'EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE': - case 'CSEUCPKDFMTJAPANESE': - case 'EUC-JP': - return 'EUC-JP'; + case 'cesu8': + case 'cscesu8': + return 'CESU-8'; - case 'EXTENDED_UNIX_CODE_FIXED_WIDTH_FOR_JAPANESE': - case 'CSEUCFIXWIDJAPANESE': - return 'Extended_UNIX_Code_Fixed_Width_for_Japanese'; + case 'ca': + case 'csa71': + case 'csaz243419851': + case 'csiso121canadian1': + case 'iso646ca': + case 'isoir121': + return 'CSA_Z243.4-1985-1'; - case 'BS_4730': - case 'ISO-IR-4': - case 'ISO646-GB': - case 'GB': - case 'UK': - case 'CSISO4UNITEDKINGDOM': - return 'BS_4730'; + case 'csa72': + case 'csaz243419852': + case 'csiso122canadian2': + case 'iso646ca2': + case 'isoir122': + return 'CSA_Z243.4-1985-2'; - case 'SEN_850200_C': - case 'ISO-IR-11': - case 'ISO646-SE2': - case 'SE2': - case 'CSISO11SWEDISHFORNAMES': - return 'SEN_850200_C'; + case 'csaz24341985gr': + case 'csiso123csaz24341985gr': + case 'isoir123': + return 'CSA_Z243.4-1985-gr'; - case 'IT': - case 'ISO-IR-15': - case 'ISO646-IT': - case 'CSISO15ITALIAN': - return 'IT'; + case 'csiso139csn369103': + case 'csn369103': + case 'isoir139': + return 'CSN_369103'; - case 'ES': - case 'ISO-IR-17': - case 'ISO646-ES': - case 'CSISO17SPANISH': - return 'ES'; + case 'csdecmcs': + case 'dec': + case 'decmcs': + return 'DEC-MCS'; - case 'DIN_66003': - case 'ISO-IR-21': - case 'DE': - case 'ISO646-DE': - case 'CSISO21GERMAN': + case 'csiso21german': + case 'de': + case 'din66003': + case 'iso646de': + case 'isoir21': return 'DIN_66003'; - case 'NS_4551-1': - case 'ISO-IR-60': - case 'ISO646-NO': - case 'NO': - case 'CSISO60DANISHNORWEGIAN': - case 'CSISO60NORWEGIAN1': - return 'NS_4551-1'; + case 'csdkus': + case 'dkus': + return 'dk-us'; - case 'NF_Z_62-010': - case 'ISO-IR-69': - case 'ISO646-FR': - case 'FR': - case 'CSISO69FRENCH': - return 'NF_Z_62-010'; + case 'csiso646danish': + case 'dk': + case 'ds2089': + case 'iso646dk': + return 'DS_2089'; - case 'ISO-10646-UTF-1': - case 'CSISO10646UTF1': - return 'ISO-10646-UTF-1'; + case 'csibmebcdicatde': + case 'ebcdicatde': + return 'EBCDIC-AT-DE'; - case 'ISO_646.BASIC:1983': - case 'REF': - case 'CSISO646BASIC1983': - return 'ISO_646.basic:1983'; + case 'csebcdicatdea': + case 'ebcdicatdea': + return 'EBCDIC-AT-DE-A'; - case 'INVARIANT': - case 'CSINVARIANT': - return 'INVARIANT'; + case 'csebcdiccafr': + case 'ebcdiccafr': + return 'EBCDIC-CA-FR'; - case 'ISO_646.IRV:1983': - case 'ISO-IR-2': - case 'IRV': - case 'CSISO2INTLREFVERSION': - return 'ISO_646.irv:1983'; + case 'csebcdicdkno': + case 'ebcdicdkno': + return 'EBCDIC-DK-NO'; - case 'NATS-SEFI': - case 'ISO-IR-8-1': - case 'CSNATSSEFI': - return 'NATS-SEFI'; + case 'csebcdicdknoa': + case 'ebcdicdknoa': + return 'EBCDIC-DK-NO-A'; - case 'NATS-SEFI-ADD': - case 'ISO-IR-8-2': - case 'CSNATSSEFIADD': - return 'NATS-SEFI-ADD'; + case 'csebcdices': + case 'ebcdices': + return 'EBCDIC-ES'; - case 'NATS-DANO': - case 'ISO-IR-9-1': - case 'CSNATSDANO': - return 'NATS-DANO'; + case 'csebcdicesa': + case 'ebcdicesa': + return 'EBCDIC-ES-A'; - case 'NATS-DANO-ADD': - case 'ISO-IR-9-2': - case 'CSNATSDANOADD': - return 'NATS-DANO-ADD'; + case 'csebcdicess': + case 'ebcdicess': + return 'EBCDIC-ES-S'; - case 'SEN_850200_B': - case 'ISO-IR-10': - case 'FI': - case 'ISO646-FI': - case 'ISO646-SE': - case 'SE': - case 'CSISO10SWEDISH': - return 'SEN_850200_B'; + case 'csebcdicfise': + case 'ebcdicfise': + return 'EBCDIC-FI-SE'; - case 'KS_C_5601-1987': - case 'ISO-IR-149': - case 'KS_C_5601-1989': - case 'KSC_5601': - case 'KOREAN': - case 'CSKSC56011987': - return 'KS_C_5601-1987'; + case 'csebcdicfisea': + case 'ebcdicfisea': + return 'EBCDIC-FI-SE-A'; - case 'ISO-2022-KR': - case 'CSISO2022KR': - return 'ISO-2022-KR'; + case 'csebcdicfr': + case 'ebcdicfr': + return 'EBCDIC-FR'; - case 'EUC-KR': - case 'CSEUCKR': - return 'EUC-KR'; + case 'csebcdicit': + case 'ebcdicit': + return 'EBCDIC-IT'; - case 'ISO-2022-JP': - case 'CSISO2022JP': - return 'ISO-2022-JP'; + case 'csebcdicpt': + case 'ebcdicpt': + return 'EBCDIC-PT'; - case 'ISO-2022-JP-2': - case 'CSISO2022JP2': - return 'ISO-2022-JP-2'; + case 'csebcdicuk': + case 'ebcdicuk': + return 'EBCDIC-UK'; - case 'JIS_C6220-1969-JP': - case 'JIS_C6220-1969': - case 'ISO-IR-13': - case 'KATAKANA': - case 'X0201-7': - case 'CSISO13JISC6220JP': - return 'JIS_C6220-1969-jp'; + case 'csebcdicus': + case 'ebcdicus': + return 'EBCDIC-US'; - case 'JIS_C6220-1969-RO': - case 'ISO-IR-14': - case 'JP': - case 'ISO646-JP': - case 'CSISO14JISC6220RO': - return 'JIS_C6220-1969-ro'; + case 'csiso111ecmacyrillic': + case 'ecmacyrillic': + case 'isoir111': + case 'koi8e': + return 'ECMA-cyrillic'; - case 'PT': - case 'ISO-IR-16': - case 'ISO646-PT': - case 'CSISO16PORTUGUESE': - return 'PT'; + case 'csiso17spanish': + case 'es': + case 'iso646es': + case 'isoir17': + return 'ES'; - case 'GREEK7-OLD': - case 'ISO-IR-18': - case 'CSISO18GREEK7OLD': - return 'greek7-old'; + case 'csiso85spanish2': + case 'es2': + case 'iso646es2': + case 'isoir85': + return 'ES2'; - case 'LATIN-GREEK': - case 'ISO-IR-19': - case 'CSISO19LATINGREEK': - return 'latin-greek'; + case 'cseucfixwidjapanese': + case 'extendedunixcodefixedwidthforjapanese': + return 'Extended_UNIX_Code_Fixed_Width_for_Japanese'; - case 'NF_Z_62-010_(1973)': - case 'ISO-IR-25': - case 'ISO646-FR1': - case 'CSISO25FRENCH': - return 'NF_Z_62-010_(1973)'; + case 'cseucpkdfmtjapanese': + case 'eucjp': + case 'extendedunixcodepackedformatforjapanese': + return 'Extended_UNIX_Code_Packed_Format_for_Japanese'; - case 'LATIN-GREEK-1': - case 'ISO-IR-27': - case 'CSISO27LATINGREEK1': - return 'Latin-greek-1'; + case 'gb18030': + return 'GB18030'; - case 'ISO_5427': - case 'ISO-IR-37': - case 'CSISO5427CYRILLIC': - return 'ISO_5427'; + case 'chinese': + case 'cp936': + case 'csgb2312': + case 'csiso58gb231280': + case 'gb2312': + case 'gb231280': + case 'gbk': + case 'isoir58': + case 'ms936': + case 'windows936': + return 'GBK'; - case 'JIS_C6226-1978': - case 'ISO-IR-42': - case 'CSISO42JISC62261978': - return 'JIS_C6226-1978'; + case 'cn': + case 'csiso57gb1988': + case 'gb198880': + case 'iso646cn': + case 'isoir57': + return 'GB_1988-80'; - case 'BS_VIEWDATA': - case 'ISO-IR-47': - case 'CSISO47BSVIEWDATA': - return 'BS_viewdata'; + case 'csiso153gost1976874': + case 'gost1976874': + case 'isoir153': + case 'stsev35888': + return 'GOST_19768-74'; - case 'INIS': - case 'ISO-IR-49': - case 'CSISO49INIS': - return 'INIS'; + case 'csiso150': + case 'csiso150greekccitt': + case 'greekccitt': + case 'isoir150': + return 'greek-ccitt'; - case 'INIS-8': - case 'ISO-IR-50': - case 'CSISO50INIS8': - return 'INIS-8'; + case 'csiso88greek7': + case 'greek7': + case 'isoir88': + return 'greek7'; - case 'INIS-CYRILLIC': - case 'ISO-IR-51': - case 'CSISO51INISCYRILLIC': - return 'INIS-cyrillic'; + case 'csiso18greek7old': + case 'greek7old': + case 'isoir18': + return 'greek7-old'; - case 'ISO_5427:1981': - case 'ISO-IR-54': - case 'ISO5427CYRILLIC1981': - return 'ISO_5427:1981'; + case 'cshpdesktop': + case 'hpdesktop': + return 'HP-DeskTop'; - case 'ISO_5428:1980': - case 'ISO-IR-55': - case 'CSISO5428GREEK': - return 'ISO_5428:1980'; + case 'cshplegal': + case 'hplegal': + return 'HP-Legal'; - case 'GB_1988-80': - case 'ISO-IR-57': - case 'CN': - case 'ISO646-CN': - case 'CSISO57GB1988': - return 'GB_1988-80'; + case 'cshpmath8': + case 'hpmath8': + return 'HP-Math8'; - case 'GB_2312-80': - case 'ISO-IR-58': - case 'CHINESE': - case 'CSISO58GB231280': - return 'GB_2312-80'; - - case 'NS_4551-2': - case 'ISO646-NO2': - case 'ISO-IR-61': - case 'NO2': - case 'CSISO61NORWEGIAN2': - return 'NS_4551-2'; + case 'cshppifont': + case 'hppifont': + return 'HP-Pi-font'; - case 'VIDEOTEX-SUPPL': - case 'ISO-IR-70': - case 'CSISO70VIDEOTEXSUPP1': - return 'videotex-suppl'; + case 'cshproman8': + case 'hproman8': + case 'r8': + case 'roman8': + return 'hp-roman8'; - case 'PT2': - case 'ISO-IR-84': - case 'ISO646-PT2': - case 'CSISO84PORTUGUESE2': - return 'PT2'; + case 'hzgb2312': + return 'HZ-GB-2312'; - case 'ES2': - case 'ISO-IR-85': - case 'ISO646-ES2': - case 'CSISO85SPANISH2': - return 'ES2'; + case 'csibmsymbols': + case 'ibmsymbols': + return 'IBM-Symbols'; - case 'MSZ_7795.3': - case 'ISO-IR-86': - case 'ISO646-HU': - case 'HU': - case 'CSISO86HUNGARIAN': - return 'MSZ_7795.3'; + case 'csibmthai': + case 'ibmthai': + return 'IBM-Thai'; - case 'JIS_C6226-1983': - case 'ISO-IR-87': - case 'X0208': - case 'JIS_X0208-1983': - case 'CSISO87JISX0208': - return 'JIS_C6226-1983'; + case 'ccsid858': + case 'cp858': + case 'ibm858': + case 'pcmultilingual850euro': + return 'IBM00858'; - case 'GREEK7': - case 'ISO-IR-88': - case 'CSISO88GREEK7': - return 'greek7'; + case 'ccsid924': + case 'cp924': + case 'ebcdiclatin9euro': + case 'ibm924': + return 'IBM00924'; - case 'ASMO_449': - case 'ISO_9036': - case 'ARABIC7': - case 'ISO-IR-89': - case 'CSISO89ASMO449': - return 'ASMO_449'; + case 'ccsid1140': + case 'cp1140': + case 'ebcdicus37euro': + case 'ibm1140': + return 'IBM01140'; - case 'ISO-IR-90': - case 'CSISO90': - return 'iso-ir-90'; + case 'ccsid1141': + case 'cp1141': + case 'ebcdicde273euro': + case 'ibm1141': + return 'IBM01141'; - case 'JIS_C6229-1984-A': - case 'ISO-IR-91': - case 'JP-OCR-A': - case 'CSISO91JISC62291984A': - return 'JIS_C6229-1984-a'; + case 'ccsid1142': + case 'cp1142': + case 'ebcdicdk277euro': + case 'ebcdicno277euro': + case 'ibm1142': + return 'IBM01142'; - case 'JIS_C6229-1984-B': - case 'ISO-IR-92': - case 'ISO646-JP-OCR-B': - case 'JP-OCR-B': - case 'CSISO92JISC62991984B': - return 'JIS_C6229-1984-b'; + case 'ccsid1143': + case 'cp1143': + case 'ebcdicfi278euro': + case 'ebcdicse278euro': + case 'ibm1143': + return 'IBM01143'; - case 'JIS_C6229-1984-B-ADD': - case 'ISO-IR-93': - case 'JP-OCR-B-ADD': - case 'CSISO93JIS62291984BADD': - return 'JIS_C6229-1984-b-add'; + case 'ccsid1144': + case 'cp1144': + case 'ebcdicit280euro': + case 'ibm1144': + return 'IBM01144'; - case 'JIS_C6229-1984-HAND': - case 'ISO-IR-94': - case 'JP-OCR-HAND': - case 'CSISO94JIS62291984HAND': - return 'JIS_C6229-1984-hand'; + case 'ccsid1145': + case 'cp1145': + case 'ebcdices284euro': + case 'ibm1145': + return 'IBM01145'; - case 'JIS_C6229-1984-HAND-ADD': - case 'ISO-IR-95': - case 'JP-OCR-HAND-ADD': - case 'CSISO95JIS62291984HANDADD': - return 'JIS_C6229-1984-hand-add'; + case 'ccsid1146': + case 'cp1146': + case 'ebcdicgb285euro': + case 'ibm1146': + return 'IBM01146'; - case 'JIS_C6229-1984-KANA': - case 'ISO-IR-96': - case 'CSISO96JISC62291984KANA': - return 'JIS_C6229-1984-kana'; + case 'ccsid1147': + case 'cp1147': + case 'ebcdicfr297euro': + case 'ibm1147': + return 'IBM01147'; - case 'ISO_2033-1983': - case 'ISO-IR-98': - case 'E13B': - case 'CSISO2033': - return 'ISO_2033-1983'; + case 'ccsid1148': + case 'cp1148': + case 'ebcdicinternational500euro': + case 'ibm1148': + return 'IBM01148'; - case 'ANSI_X3.110-1983': - case 'ISO-IR-99': - case 'CSA_T500-1983': - case 'NAPLPS': - case 'CSISO99NAPLPS': - return 'ANSI_X3.110-1983'; + case 'ccsid1149': + case 'cp1149': + case 'ebcdicis871euro': + case 'ibm1149': + return 'IBM01149'; - case 'T.61-7BIT': - case 'ISO-IR-102': - case 'CSISO102T617BIT': - return 'T.61-7bit'; + case 'cp37': + case 'csibm37': + case 'ebcdiccpca': + case 'ebcdiccpnl': + case 'ebcdiccpus': + case 'ebcdiccpwt': + case 'ibm37': + return 'IBM037'; - case 'T.61-8BIT': - case 'T.61': - case 'ISO-IR-103': - case 'CSISO103T618BIT': - return 'T.61-8bit'; + case 'cp38': + case 'csibm38': + case 'ebcdicint': + case 'ibm38': + return 'IBM038'; - case 'ECMA-CYRILLIC': - case 'ISO-IR-111': - case 'KOI8-E': - case 'CSISO111ECMACYRILLIC': - return 'ECMA-cyrillic'; + case 'cp273': + case 'csibm273': + case 'ibm273': + return 'IBM273'; - case 'CSA_Z243.4-1985-1': - case 'ISO-IR-121': - case 'ISO646-CA': - case 'CSA7-1': - case 'CA': - case 'CSISO121CANADIAN1': - return 'CSA_Z243.4-1985-1'; + case 'cp274': + case 'csibm274': + case 'ebcdicbe': + case 'ibm274': + return 'IBM274'; - case 'CSA_Z243.4-1985-2': - case 'ISO-IR-122': - case 'ISO646-CA2': - case 'CSA7-2': - case 'CSISO122CANADIAN2': - return 'CSA_Z243.4-1985-2'; + case 'cp275': + case 'csibm275': + case 'ebcdicbr': + case 'ibm275': + return 'IBM275'; - case 'CSA_Z243.4-1985-GR': - case 'ISO-IR-123': - case 'CSISO123CSAZ24341985GR': - return 'CSA_Z243.4-1985-gr'; + case 'csibm277': + case 'ebcdiccpdk': + case 'ebcdiccpno': + case 'ibm277': + return 'IBM277'; - case 'ISO_8859-6-E': - case 'CSISO88596E': - case 'ISO-8859-6-E': - return 'ISO-8859-6-E'; + case 'cp278': + case 'csibm278': + case 'ebcdiccpfi': + case 'ebcdiccpse': + case 'ibm278': + return 'IBM278'; - case 'ISO_8859-6-I': - case 'CSISO88596I': - case 'ISO-8859-6-I': - return 'ISO-8859-6-I'; + case 'cp280': + case 'csibm280': + case 'ebcdiccpit': + case 'ibm280': + return 'IBM280'; - case 'T.101-G2': - case 'ISO-IR-128': - case 'CSISO128T101G2': - return 'T.101-G2'; + case 'cp281': + case 'csibm281': + case 'ebcdicjpe': + case 'ibm281': + return 'IBM281'; - case 'ISO_8859-8-E': - case 'CSISO88598E': - case 'ISO-8859-8-E': - return 'ISO-8859-8-E'; + case 'cp284': + case 'csibm284': + case 'ebcdiccpes': + case 'ibm284': + return 'IBM284'; - case 'ISO_8859-8-I': - case 'CSISO88598I': - case 'ISO-8859-8-I': - return 'ISO-8859-8-I'; + case 'cp285': + case 'csibm285': + case 'ebcdiccpgb': + case 'ibm285': + return 'IBM285'; - case 'CSN_369103': - case 'ISO-IR-139': - case 'CSISO139CSN369103': - return 'CSN_369103'; + case 'cp290': + case 'csibm290': + case 'ebcdicjpkana': + case 'ibm290': + return 'IBM290'; - case 'JUS_I.B1.002': - case 'ISO-IR-141': - case 'ISO646-YU': - case 'JS': - case 'YU': - case 'CSISO141JUSIB1002': - return 'JUS_I.B1.002'; + case 'cp297': + case 'csibm297': + case 'ebcdiccpfr': + case 'ibm297': + return 'IBM297'; - case 'IEC_P27-1': - case 'ISO-IR-143': - case 'CSISO143IECP271': - return 'IEC_P27-1'; + case 'cp420': + case 'csibm420': + case 'ebcdiccpar1': + case 'ibm420': + return 'IBM420'; - case 'JUS_I.B1.003-SERB': - case 'ISO-IR-146': - case 'SERBIAN': - case 'CSISO146SERBIAN': - return 'JUS_I.B1.003-serb'; + case 'cp423': + case 'csibm423': + case 'ebcdiccpgr': + case 'ibm423': + return 'IBM423'; - case 'JUS_I.B1.003-MAC': - case 'MACEDONIAN': - case 'ISO-IR-147': - case 'CSISO147MACEDONIAN': - return 'JUS_I.B1.003-mac'; + case 'cp424': + case 'csibm424': + case 'ebcdiccphe': + case 'ibm424': + return 'IBM424'; - case 'GREEK-CCITT': - case 'ISO-IR-150': - case 'CSISO150': - case 'CSISO150GREEKCCITT': - return 'greek-ccitt'; + case '437': + case 'cp437': + case 'cspc8codepage437': + case 'ibm437': + return 'IBM437'; - case 'NC_NC00-10:81': - case 'CUBA': - case 'ISO-IR-151': - case 'ISO646-CU': - case 'CSISO151CUBA': - return 'NC_NC00-10:81'; + case 'cp500': + case 'csibm500': + case 'ebcdiccpbe': + case 'ebcdiccpch': + case 'ibm500': + return 'IBM500'; - case 'ISO_6937-2-25': - case 'ISO-IR-152': - case 'CSISO6937ADD': - return 'ISO_6937-2-25'; + case 'cp775': + case 'cspc775baltic': + case 'ibm775': + return 'IBM775'; - case 'GOST_19768-74': - case 'ST_SEV_358-88': - case 'ISO-IR-153': - case 'CSISO153GOST1976874': - return 'GOST_19768-74'; + case '850': + case 'cp850': + case 'cspc850multilingual': + case 'ibm850': + return 'IBM850'; - case 'ISO_8859-SUPP': - case 'ISO-IR-154': - case 'LATIN1-2-5': - case 'CSISO8859SUPP': - return 'ISO_8859-supp'; + case '851': + case 'cp851': + case 'csibm851': + case 'ibm851': + return 'IBM851'; - case 'ISO_10367-BOX': - case 'ISO-IR-155': - case 'CSISO10367BOX': - return 'ISO_10367-box'; + case '852': + case 'cp852': + case 'cspcp852': + case 'ibm852': + return 'IBM852'; - case 'LATIN-LAP': - case 'LAP': - case 'ISO-IR-158': - case 'CSISO158LAP': - return 'latin-lap'; + case '855': + case 'cp855': + case 'csibm855': + case 'ibm855': + return 'IBM855'; - case 'JIS_X0212-1990': - case 'X0212': - case 'ISO-IR-159': - case 'CSISO159JISX02121990': - return 'JIS_X0212-1990'; + case '857': + case 'cp857': + case 'csibm857': + case 'ibm857': + return 'IBM857'; - case 'DS_2089': - case 'DS2089': - case 'ISO646-DK': - case 'DK': - case 'CSISO646DANISH': - return 'DS_2089'; + case '860': + case 'cp860': + case 'csibm860': + case 'ibm860': + return 'IBM860'; - case 'US-DK': - case 'CSUSDK': - return 'us-dk'; + case '861': + case 'cp861': + case 'cpis': + case 'csibm861': + case 'ibm861': + return 'IBM861'; - case 'DK-US': - case 'CSDKUS': - return 'dk-us'; + case '862': + case 'cp862': + case 'cspc862latinhebrew': + case 'ibm862': + return 'IBM862'; - case 'KSC5636': - case 'ISO646-KR': - case 'CSKSC5636': - return 'KSC5636'; + case '863': + case 'cp863': + case 'csibm863': + case 'ibm863': + return 'IBM863'; - case 'UNICODE-1-1-UTF-7': - case 'CSUNICODE11UTF7': - return 'UNICODE-1-1-UTF-7'; + case 'cp864': + case 'csibm864': + case 'ibm864': + return 'IBM864'; - case 'ISO-2022-CN': - return 'ISO-2022-CN'; + case '865': + case 'cp865': + case 'csibm865': + case 'ibm865': + return 'IBM865'; - case 'ISO-2022-CN-EXT': - return 'ISO-2022-CN-EXT'; + case '866': + case 'cp866': + case 'csibm866': + case 'ibm866': + return 'IBM866'; - case 'UTF-8': - return 'UTF-8'; + case 'cp868': + case 'cpar': + case 'csibm868': + case 'ibm868': + return 'IBM868'; - case 'ISO-8859-13': - return 'ISO-8859-13'; + case '869': + case 'cp869': + case 'cpgr': + case 'csibm869': + case 'ibm869': + return 'IBM869'; - case 'ISO-8859-14': - case 'ISO-IR-199': - case 'ISO_8859-14:1998': - case 'ISO_8859-14': - case 'LATIN8': - case 'ISO-CELTIC': - case 'L8': - return 'ISO-8859-14'; + case 'cp870': + case 'csibm870': + case 'ebcdiccproece': + case 'ebcdiccpyu': + case 'ibm870': + return 'IBM870'; - case 'ISO-8859-15': - case 'ISO_8859-15': - case 'LATIN-9': - return 'ISO-8859-15'; + case 'cp871': + case 'csibm871': + case 'ebcdiccpis': + case 'ibm871': + return 'IBM871'; - case 'ISO-8859-16': - case 'ISO-IR-226': - case 'ISO_8859-16:2001': - case 'ISO_8859-16': - case 'LATIN10': - case 'L10': - return 'ISO-8859-16'; + case 'cp880': + case 'csibm880': + case 'ebcdiccyrillic': + case 'ibm880': + return 'IBM880'; - case 'GBK': - case 'CP936': - case 'MS936': - case 'WINDOWS-936': - return 'GBK'; + case 'cp891': + case 'csibm891': + case 'ibm891': + return 'IBM891'; - case 'GB18030': - return 'GB18030'; + case 'cp903': + case 'csibm903': + case 'ibm903': + return 'IBM903'; - case 'OSD_EBCDIC_DF04_15': - return 'OSD_EBCDIC_DF04_15'; + case '904': + case 'cp904': + case 'csibbm904': + case 'ibm904': + return 'IBM904'; - case 'OSD_EBCDIC_DF03_IRV': - return 'OSD_EBCDIC_DF03_IRV'; + case 'cp905': + case 'csibm905': + case 'ebcdiccptr': + case 'ibm905': + return 'IBM905'; - case 'OSD_EBCDIC_DF04_1': - return 'OSD_EBCDIC_DF04_1'; + case 'cp918': + case 'csibm918': + case 'ebcdiccpar2': + case 'ibm918': + return 'IBM918'; - case 'ISO-11548-1': - case 'ISO_11548-1': - case 'ISO_TR_11548-1': - case 'CSISO115481': - return 'ISO-11548-1'; + case 'cp1026': + case 'csibm1026': + case 'ibm1026': + return 'IBM1026'; - case 'KZ-1048': - case 'STRK1048-2002': - case 'RK1048': - case 'CSKZ1048': - return 'KZ-1048'; + case 'ibm1047': + return 'IBM1047'; - case 'ISO-10646-UCS-2': - case 'CSUNICODE': - return 'ISO-10646-UCS-2'; + case 'csiso143iecp271': + case 'iecp271': + case 'isoir143': + return 'IEC_P27-1'; - case 'ISO-10646-UCS-4': - case 'CSUCS4': - return 'ISO-10646-UCS-4'; + case 'csiso49inis': + case 'inis': + case 'isoir49': + return 'INIS'; - case 'ISO-10646-UCS-BASIC': - case 'CSUNICODEASCII': - return 'ISO-10646-UCS-Basic'; + case 'csiso50inis8': + case 'inis8': + case 'isoir50': + return 'INIS-8'; - case 'ISO-10646-UNICODE-LATIN1': - case 'CSUNICODELATIN1': - case 'ISO-10646': - return 'ISO-10646-Unicode-Latin1'; + case 'csiso51iniscyrillic': + case 'iniscyrillic': + case 'isoir51': + return 'INIS-cyrillic'; - case 'ISO-10646-J-1': - return 'ISO-10646-J-1'; + case 'csinvariant': + case 'invariant': + return 'INVARIANT'; - case 'ISO-UNICODE-IBM-1261': - case 'CSUNICODEIBM1261': - return 'ISO-Unicode-IBM-1261'; + case 'iso2022cn': + return 'ISO-2022-CN'; - case 'ISO-UNICODE-IBM-1268': - case 'CSUNICODEIBM1268': - return 'ISO-Unicode-IBM-1268'; + case 'iso2022cnext': + return 'ISO-2022-CN-EXT'; - case 'ISO-UNICODE-IBM-1276': - case 'CSUNICODEIBM1276': - return 'ISO-Unicode-IBM-1276'; + case 'csiso2022jp': + case 'iso2022jp': + return 'ISO-2022-JP'; - case 'ISO-UNICODE-IBM-1264': - case 'CSUNICODEIBM1264': - return 'ISO-Unicode-IBM-1264'; + case 'csiso2022jp2': + case 'iso2022jp2': + return 'ISO-2022-JP-2'; - case 'ISO-UNICODE-IBM-1265': - case 'CSUNICODEIBM1265': - return 'ISO-Unicode-IBM-1265'; + case 'csiso2022kr': + case 'iso2022kr': + return 'ISO-2022-KR'; - case 'UNICODE-1-1': - case 'CSUNICODE11': - return 'UNICODE-1-1'; + case 'cswindows30latin1': + case 'iso88591windows30latin1': + return 'ISO-8859-1-Windows-3.0-Latin-1'; - case 'SCSU': - return 'SCSU'; + case 'cswindows31latin1': + case 'iso88591windows31latin1': + return 'ISO-8859-1-Windows-3.1-Latin-1'; - case 'UTF-7': - return 'UTF-7'; + case 'csisolatin2': + case 'iso88592': + case 'iso885921987': + case 'isoir101': + case 'l2': + case 'latin2': + return 'ISO-8859-2'; - case 'UTF-16BE': - return 'UTF-16BE'; + case 'cswindows31latin2': + case 'iso88592windowslatin2': + return 'ISO-8859-2-Windows-Latin-2'; - case 'UTF-16LE': - return 'UTF-16LE'; + case 'csisolatin3': + case 'iso88593': + case 'iso885931988': + case 'isoir109': + case 'l3': + case 'latin3': + return 'ISO-8859-3'; - case 'UTF-16': - return 'UTF-16'; + case 'csisolatin4': + case 'iso88594': + case 'iso885941988': + case 'isoir110': + case 'l4': + case 'latin4': + return 'ISO-8859-4'; - case 'CESU-8': - case 'CSCESU-8': - return 'CESU-8'; + case 'csisolatincyrillic': + case 'cyrillic': + case 'iso88595': + case 'iso885951988': + case 'isoir144': + return 'ISO-8859-5'; - case 'UTF-32': - return 'UTF-32'; + case 'arabic': + case 'asmo708': + case 'csisolatinarabic': + case 'ecma114': + case 'iso88596': + case 'iso885961987': + case 'isoir127': + return 'ISO-8859-6'; - case 'UTF-32BE': - return 'UTF-32BE'; + case 'csiso88596e': + case 'iso88596e': + return 'ISO-8859-6-E'; - case 'UTF-32LE': - return 'UTF-32LE'; + case 'csiso88596i': + case 'iso88596i': + return 'ISO-8859-6-I'; - case 'BOCU-1': - case 'CSBOCU-1': - return 'BOCU-1'; + case 'csisolatingreek': + case 'ecma118': + case 'elot928': + case 'greek': + case 'greek8': + case 'iso88597': + case 'iso885971987': + case 'isoir126': + return 'ISO-8859-7'; - case 'ISO-8859-1-WINDOWS-3.0-LATIN-1': - case 'CSWINDOWS30LATIN1': - return 'ISO-8859-1-Windows-3.0-Latin-1'; + case 'csisolatinhebrew': + case 'hebrew': + case 'iso88598': + case 'iso885981988': + case 'isoir138': + return 'ISO-8859-8'; - case 'ISO-8859-1-WINDOWS-3.1-LATIN-1': - case 'CSWINDOWS31LATIN1': - return 'ISO-8859-1-Windows-3.1-Latin-1'; + case 'csiso88598e': + case 'iso88598e': + return 'ISO-8859-8-E'; - case 'ISO-8859-2-WINDOWS-LATIN-2': - case 'CSWINDOWS31LATIN2': - return 'ISO-8859-2-Windows-Latin-2'; + case 'csiso88598i': + case 'iso88598i': + return 'ISO-8859-8-I'; - case 'ISO-8859-9-WINDOWS-LATIN-5': - case 'CSWINDOWS31LATIN5': + case 'cswindows31latin5': + case 'iso88599windowslatin5': return 'ISO-8859-9-Windows-Latin-5'; - case 'HP-ROMAN8': - case 'ROMAN8': - case 'R8': - case 'CSHPROMAN8': - return 'hp-roman8'; - - case 'ADOBE-STANDARD-ENCODING': - case 'CSADOBESTANDARDENCODING': - return 'Adobe-Standard-Encoding'; + case 'csisolatin6': + case 'iso885910': + case 'iso8859101992': + case 'isoir157': + case 'l6': + case 'latin6': + return 'ISO-8859-10'; - case 'VENTURA-US': - case 'CSVENTURAUS': - return 'Ventura-US'; + case 'iso885913': + return 'ISO-8859-13'; - case 'VENTURA-INTERNATIONAL': - case 'CSVENTURAINTERNATIONAL': - return 'Ventura-International'; + case 'iso885914': + case 'iso8859141998': + case 'isoceltic': + case 'isoir199': + case 'l8': + case 'latin8': + return 'ISO-8859-14'; - case 'DEC-MCS': - case 'DEC': - case 'CSDECMCS': - return 'DEC-MCS'; + case 'iso885915': + case 'latin9': + return 'ISO-8859-15'; - case 'IBM850': - case 'CP850': - case '850': - case 'CSPC850MULTILINGUAL': - return 'IBM850'; + case 'iso885916': + case 'iso8859162001': + case 'isoir226': + case 'l10': + case 'latin10': + return 'ISO-8859-16'; - case 'PC8-DANISH-NORWEGIAN': - case 'CSPC8DANISHNORWEGIAN': - return 'PC8-Danish-Norwegian'; + case 'iso10646j1': + return 'ISO-10646-J-1'; - case 'IBM862': - case 'CP862': - case '862': - case 'CSPC862LATINHEBREW': - return 'IBM862'; + case 'csunicode': + case 'iso10646ucs2': + return 'ISO-10646-UCS-2'; - case 'PC8-TURKISH': - case 'CSPC8TURKISH': - return 'PC8-Turkish'; + case 'csucs4': + case 'iso10646ucs4': + return 'ISO-10646-UCS-4'; - case 'IBM-SYMBOLS': - case 'CSIBMSYMBOLS': - return 'IBM-Symbols'; + case 'csunicodeascii': + case 'iso10646ucsbasic': + return 'ISO-10646-UCS-Basic'; - case 'IBM-THAI': - case 'CSIBMTHAI': - return 'IBM-Thai'; + case 'csunicodelatin1': + case 'iso10646': + case 'iso10646unicodelatin1': + return 'ISO-10646-Unicode-Latin1'; - case 'HP-LEGAL': - case 'CSHPLEGAL': - return 'HP-Legal'; + case 'csiso10646utf1': + case 'iso10646utf1': + return 'ISO-10646-UTF-1'; - case 'HP-PI-FONT': - case 'CSHPPIFONT': - return 'HP-Pi-font'; + case 'csiso115481': + case 'iso115481': + case 'isotr115481': + return 'ISO-11548-1'; - case 'HP-MATH8': - case 'CSHPMATH8': - return 'HP-Math8'; + case 'csiso90': + case 'isoir90': + return 'iso-ir-90'; - case 'ADOBE-SYMBOL-ENCODING': - case 'CSHPPSMATH': - return 'Adobe-Symbol-Encoding'; + case 'csunicodeibm1261': + case 'isounicodeibm1261': + return 'ISO-Unicode-IBM-1261'; - case 'HP-DESKTOP': - case 'CSHPDESKTOP': - return 'HP-DeskTop'; + case 'csunicodeibm1264': + case 'isounicodeibm1264': + return 'ISO-Unicode-IBM-1264'; - case 'VENTURA-MATH': - case 'CSVENTURAMATH': - return 'Ventura-Math'; + case 'csunicodeibm1265': + case 'isounicodeibm1265': + return 'ISO-Unicode-IBM-1265'; - case 'MICROSOFT-PUBLISHING': - case 'CSMICROSOFTPUBLISHING': - return 'Microsoft-Publishing'; + case 'csunicodeibm1268': + case 'isounicodeibm1268': + return 'ISO-Unicode-IBM-1268'; - case 'WINDOWS-31J': - case 'CSWINDOWS31J': - return 'Windows-31J'; + case 'csunicodeibm1276': + case 'isounicodeibm1276': + return 'ISO-Unicode-IBM-1276'; - case 'GB2312': - case 'CSGB2312': - return 'GB2312'; + case 'csiso646basic1983': + case 'iso646basic1983': + case 'ref': + return 'ISO_646.basic:1983'; - case 'BIG5': - case 'CSBIG5': - return 'Big5'; + case 'csiso2intlrefversion': + case 'irv': + case 'iso646irv1983': + case 'isoir2': + return 'ISO_646.irv:1983'; - case 'MACINTOSH': - case 'MAC': - case 'CSMACINTOSH': - return 'macintosh'; + case 'csiso2033': + case 'e13b': + case 'iso20331983': + case 'isoir98': + return 'ISO_2033-1983'; - case 'IBM037': - case 'CP037': - case 'EBCDIC-CP-US': - case 'EBCDIC-CP-CA': - case 'EBCDIC-CP-WT': - case 'EBCDIC-CP-NL': - case 'CSIBM037': - return 'IBM037'; + case 'csiso5427cyrillic': + case 'iso5427': + case 'isoir37': + return 'ISO_5427'; - case 'IBM038': - case 'EBCDIC-INT': - case 'CP038': - case 'CSIBM038': - return 'IBM038'; + case 'iso5427cyrillic1981': + case 'iso54271981': + case 'isoir54': + return 'ISO_5427:1981'; - case 'IBM273': - case 'CP273': - case 'CSIBM273': - return 'IBM273'; + case 'csiso5428greek': + case 'iso54281980': + case 'isoir55': + return 'ISO_5428:1980'; - case 'IBM274': - case 'EBCDIC-BE': - case 'CP274': - case 'CSIBM274': - return 'IBM274'; + case 'csiso6937add': + case 'iso6937225': + case 'isoir152': + return 'ISO_6937-2-25'; - case 'IBM275': - case 'EBCDIC-BR': - case 'CP275': - case 'CSIBM275': - return 'IBM275'; + case 'csisotextcomm': + case 'iso69372add': + case 'isoir142': + return 'ISO_6937-2-add'; - case 'IBM277': - case 'EBCDIC-CP-DK': - case 'EBCDIC-CP-NO': - case 'CSIBM277': - return 'IBM277'; + case 'csiso8859supp': + case 'iso8859supp': + case 'isoir154': + case 'latin125': + return 'ISO_8859-supp'; - case 'IBM278': - case 'CP278': - case 'EBCDIC-CP-FI': - case 'EBCDIC-CP-SE': - case 'CSIBM278': - return 'IBM278'; + case 'csiso10367box': + case 'iso10367box': + case 'isoir155': + return 'ISO_10367-box'; - case 'IBM280': - case 'CP280': - case 'EBCDIC-CP-IT': - case 'CSIBM280': - return 'IBM280'; + case 'csiso15italian': + case 'iso646it': + case 'isoir15': + case 'it': + return 'IT'; - case 'IBM281': - case 'EBCDIC-JP-E': - case 'CP281': - case 'CSIBM281': - return 'IBM281'; + case 'csiso13jisc6220jp': + case 'isoir13': + case 'jisc62201969': + case 'jisc62201969jp': + case 'katakana': + case 'x2017': + return 'JIS_C6220-1969-jp'; - case 'IBM284': - case 'CP284': - case 'EBCDIC-CP-ES': - case 'CSIBM284': - return 'IBM284'; + case 'csiso14jisc6220ro': + case 'iso646jp': + case 'isoir14': + case 'jisc62201969ro': + case 'jp': + return 'JIS_C6220-1969-ro'; - case 'IBM285': - case 'CP285': - case 'EBCDIC-CP-GB': - case 'CSIBM285': - return 'IBM285'; + case 'csiso42jisc62261978': + case 'isoir42': + case 'jisc62261978': + return 'JIS_C6226-1978'; - case 'IBM290': - case 'CP290': - case 'EBCDIC-JP-KANA': - case 'CSIBM290': - return 'IBM290'; + case 'csiso87jisx208': + case 'isoir87': + case 'jisc62261983': + case 'jisx2081983': + case 'x208': + return 'JIS_C6226-1983'; - case 'IBM297': - case 'CP297': - case 'EBCDIC-CP-FR': - case 'CSIBM297': - return 'IBM297'; + case 'csiso91jisc62291984a': + case 'isoir91': + case 'jisc62291984a': + case 'jpocra': + return 'JIS_C6229-1984-a'; - case 'IBM420': - case 'CP420': - case 'EBCDIC-CP-AR1': - case 'CSIBM420': - return 'IBM420'; + case 'csiso92jisc62991984b': + case 'iso646jpocrb': + case 'isoir92': + case 'jisc62291984b': + case 'jpocrb': + return 'JIS_C6229-1984-b'; - case 'IBM423': - case 'CP423': - case 'EBCDIC-CP-GR': - case 'CSIBM423': - return 'IBM423'; + case 'csiso93jis62291984badd': + case 'isoir93': + case 'jisc62291984badd': + case 'jpocrbadd': + return 'JIS_C6229-1984-b-add'; - case 'IBM424': - case 'CP424': - case 'EBCDIC-CP-HE': - case 'CSIBM424': - return 'IBM424'; + case 'csiso94jis62291984hand': + case 'isoir94': + case 'jisc62291984hand': + case 'jpocrhand': + return 'JIS_C6229-1984-hand'; - case 'IBM437': - case 'CP437': - case '437': - case 'CSPC8CODEPAGE437': - return 'IBM437'; + case 'csiso95jis62291984handadd': + case 'isoir95': + case 'jisc62291984handadd': + case 'jpocrhandadd': + return 'JIS_C6229-1984-hand-add'; - case 'IBM500': - case 'CP500': - case 'EBCDIC-CP-BE': - case 'EBCDIC-CP-CH': - case 'CSIBM500': - return 'IBM500'; + case 'csiso96jisc62291984kana': + case 'isoir96': + case 'jisc62291984kana': + return 'JIS_C6229-1984-kana'; - case 'IBM851': - case 'CP851': - case '851': - case 'CSIBM851': - return 'IBM851'; + case 'csjisencoding': + case 'jisencoding': + return 'JIS_Encoding'; - case 'IBM852': - case 'CP852': - case '852': - case 'CSPCP852': - return 'IBM852'; + case 'cshalfwidthkatakana': + case 'jisx201': + case 'x201': + return 'JIS_X0201'; - case 'IBM855': - case 'CP855': - case '855': - case 'CSIBM855': - return 'IBM855'; + case 'csiso159jisx2121990': + case 'isoir159': + case 'jisx2121990': + case 'x212': + return 'JIS_X0212-1990'; - case 'IBM857': - case 'CP857': - case '857': - case 'CSIBM857': - return 'IBM857'; + case 'csiso141jusib1002': + case 'iso646yu': + case 'isoir141': + case 'js': + case 'jusib1002': + case 'yu': + return 'JUS_I.B1.002'; - case 'IBM860': - case 'CP860': - case '860': - case 'CSIBM860': - return 'IBM860'; + case 'csiso147macedonian': + case 'isoir147': + case 'jusib1003mac': + case 'macedonian': + return 'JUS_I.B1.003-mac'; - case 'IBM861': - case 'CP861': - case '861': - case 'CP-IS': - case 'CSIBM861': - return 'IBM861'; + case 'csiso146serbian': + case 'isoir146': + case 'jusib1003serb': + case 'serbian': + return 'JUS_I.B1.003-serb'; - case 'IBM863': - case 'CP863': - case '863': - case 'CSIBM863': - return 'IBM863'; + case 'koi7switched': + return 'KOI7-switched'; - case 'IBM864': - case 'CP864': - case 'CSIBM864': - return 'IBM864'; + case 'cskoi8r': + case 'koi8r': + return 'KOI8-R'; - case 'IBM865': - case 'CP865': - case '865': - case 'CSIBM865': - return 'IBM865'; + case 'koi8u': + return 'KOI8-U'; - case 'IBM868': - case 'CP868': - case 'CP-AR': - case 'CSIBM868': - return 'IBM868'; + case 'csksc5636': + case 'iso646kr': + case 'ksc5636': + return 'KSC5636'; - case 'IBM869': - case 'CP869': - case '869': - case 'CP-GR': - case 'CSIBM869': - return 'IBM869'; + case 'cskz1048': + case 'kz1048': + case 'rk1048': + case 'strk10482002': + return 'KZ-1048'; - case 'IBM870': - case 'CP870': - case 'EBCDIC-CP-ROECE': - case 'EBCDIC-CP-YU': - case 'CSIBM870': - return 'IBM870'; + case 'csiso19latingreek': + case 'isoir19': + case 'latingreek': + return 'latin-greek'; - case 'IBM871': - case 'CP871': - case 'EBCDIC-CP-IS': - case 'CSIBM871': - return 'IBM871'; + case 'csiso27latingreek1': + case 'isoir27': + case 'latingreek1': + return 'Latin-greek-1'; - case 'IBM880': - case 'CP880': - case 'EBCDIC-CYRILLIC': - case 'CSIBM880': - return 'IBM880'; + case 'csiso158lap': + case 'isoir158': + case 'lap': + case 'latinlap': + return 'latin-lap'; - case 'IBM891': - case 'CP891': - case 'CSIBM891': - return 'IBM891'; + case 'csmacintosh': + case 'mac': + case 'macintosh': + return 'macintosh'; - case 'IBM903': - case 'CP903': - case 'CSIBM903': - return 'IBM903'; + case 'csmicrosoftpublishing': + case 'microsoftpublishing': + return 'Microsoft-Publishing'; - case 'IBM904': - case 'CP904': - case '904': - case 'CSIBBM904': - return 'IBM904'; + case 'csmnem': + case 'mnem': + return 'MNEM'; - case 'IBM905': - case 'CP905': - case 'EBCDIC-CP-TR': - case 'CSIBM905': - return 'IBM905'; + case 'csmnemonic': + case 'mnemonic': + return 'MNEMONIC'; - case 'IBM918': - case 'CP918': - case 'EBCDIC-CP-AR2': - case 'CSIBM918': - return 'IBM918'; + case 'csiso86hungarian': + case 'hu': + case 'iso646hu': + case 'isoir86': + case 'msz77953': + return 'MSZ_7795.3'; - case 'IBM1026': - case 'CP1026': - case 'CSIBM1026': - return 'IBM1026'; + case 'csnatsdano': + case 'isoir91': + case 'natsdano': + return 'NATS-DANO'; - case 'EBCDIC-AT-DE': - case 'CSIBMEBCDICATDE': - return 'EBCDIC-AT-DE'; + case 'csnatsdanoadd': + case 'isoir92': + case 'natsdanoadd': + return 'NATS-DANO-ADD'; - case 'EBCDIC-AT-DE-A': - case 'CSEBCDICATDEA': - return 'EBCDIC-AT-DE-A'; + case 'csnatssefi': + case 'isoir81': + case 'natssefi': + return 'NATS-SEFI'; - case 'EBCDIC-CA-FR': - case 'CSEBCDICCAFR': - return 'EBCDIC-CA-FR'; + case 'csnatssefiadd': + case 'isoir82': + case 'natssefiadd': + return 'NATS-SEFI-ADD'; - case 'EBCDIC-DK-NO': - case 'CSEBCDICDKNO': - return 'EBCDIC-DK-NO'; + case 'csiso151cuba': + case 'cuba': + case 'iso646cu': + case 'isoir151': + case 'ncnc1081': + return 'NC_NC00-10:81'; - case 'EBCDIC-DK-NO-A': - case 'CSEBCDICDKNOA': - return 'EBCDIC-DK-NO-A'; + case 'csiso69french': + case 'fr': + case 'iso646fr': + case 'isoir69': + case 'nfz62010': + return 'NF_Z_62-010'; - case 'EBCDIC-FI-SE': - case 'CSEBCDICFISE': - return 'EBCDIC-FI-SE'; + case 'csiso25french': + case 'iso646fr1': + case 'isoir25': + case 'nfz620101973': + return 'NF_Z_62-010_(1973)'; - case 'EBCDIC-FI-SE-A': - case 'CSEBCDICFISEA': - return 'EBCDIC-FI-SE-A'; + case 'csiso60danishnorwegian': + case 'csiso60norwegian1': + case 'iso646no': + case 'isoir60': + case 'no': + case 'ns45511': + return 'NS_4551-1'; - case 'EBCDIC-FR': - case 'CSEBCDICFR': - return 'EBCDIC-FR'; + case 'csiso61norwegian2': + case 'iso646no2': + case 'isoir61': + case 'no2': + case 'ns45512': + return 'NS_4551-2'; - case 'EBCDIC-IT': - case 'CSEBCDICIT': - return 'EBCDIC-IT'; + case 'osdebcdicdf3irv': + return 'OSD_EBCDIC_DF03_IRV'; - case 'EBCDIC-PT': - case 'CSEBCDICPT': - return 'EBCDIC-PT'; + case 'osdebcdicdf41': + return 'OSD_EBCDIC_DF04_1'; - case 'EBCDIC-ES': - case 'CSEBCDICES': - return 'EBCDIC-ES'; + case 'osdebcdicdf415': + return 'OSD_EBCDIC_DF04_15'; - case 'EBCDIC-ES-A': - case 'CSEBCDICESA': - return 'EBCDIC-ES-A'; + case 'cspc8danishnorwegian': + case 'pc8danishnorwegian': + return 'PC8-Danish-Norwegian'; - case 'EBCDIC-ES-S': - case 'CSEBCDICESS': - return 'EBCDIC-ES-S'; + case 'cspc8turkish': + case 'pc8turkish': + return 'PC8-Turkish'; - case 'EBCDIC-UK': - case 'CSEBCDICUK': - return 'EBCDIC-UK'; + case 'csiso16portuguese': + case 'iso646pt': + case 'isoir16': + case 'pt': + return 'PT'; - case 'EBCDIC-US': - case 'CSEBCDICUS': - return 'EBCDIC-US'; + case 'csiso84portuguese2': + case 'iso646pt2': + case 'isoir84': + case 'pt2': + return 'PT2'; - case 'UNKNOWN-8BIT': - case 'CSUNKNOWN8BIT': - return 'UNKNOWN-8BIT'; + case 'cp154': + case 'csptcp154': + case 'cyrillicasian': + case 'pt154': + case 'ptcp154': + return 'PTCP154'; - case 'MNEMONIC': - case 'CSMNEMONIC': - return 'MNEMONIC'; + case 'scsu': + return 'SCSU'; - case 'MNEM': - case 'CSMNEM': - return 'MNEM'; + case 'csiso10swedish': + case 'fi': + case 'iso646fi': + case 'iso646se': + case 'isoir10': + case 'se': + case 'sen850200b': + return 'SEN_850200_B'; - case 'VISCII': - case 'CSVISCII': - return 'VISCII'; + case 'csiso11swedishfornames': + case 'iso646se2': + case 'isoir11': + case 'se2': + case 'sen850200c': + return 'SEN_850200_C'; - case 'VIQR': - case 'CSVIQR': - return 'VIQR'; + case 'csshiftjis': + case 'mskanji': + case 'shiftjis': + return 'Shift_JIS'; - case 'KOI8-R': - case 'CSKOI8R': - return 'KOI8-R'; + case 'csiso102t617bit': + case 'isoir102': + case 't617bit': + return 'T.61-7bit'; - case 'HZ-GB-2312': - return 'HZ-GB-2312'; + case 'csiso103t618bit': + case 'isoir103': + case 't61': + case 't618bit': + return 'T.61-8bit'; - case 'IBM866': - case 'CP866': - case '866': - case 'CSIBM866': - return 'IBM866'; + case 'csiso128t101g2': + case 'isoir128': + case 't101g2': + return 'T.101-G2'; - case 'IBM775': - case 'CP775': - case 'CSPC775BALTIC': - return 'IBM775'; + case 'cstscii': + case 'tscii': + return 'TSCII'; - case 'KOI8-U': - return 'KOI8-U'; + case 'csunicode11': + case 'unicode11': + return 'UNICODE-1-1'; - case 'IBM00858': - case 'CCSID00858': - case 'CP00858': - case 'PC-MULTILINGUAL-850+EURO': - return 'IBM00858'; + case 'csunicode11utf7': + case 'unicode11utf7': + return 'UNICODE-1-1-UTF-7'; - case 'IBM00924': - case 'CCSID00924': - case 'CP00924': - case 'EBCDIC-LATIN9--EURO': - return 'IBM00924'; + case 'csunknown8bit': + case 'unknown8bit': + return 'UNKNOWN-8BIT'; - case 'IBM01140': - case 'CCSID01140': - case 'CP01140': - case 'EBCDIC-US-37+EURO': - return 'IBM01140'; + case 'ansix341968': + case 'ansix341986': + case 'ascii': + case 'cp367': + case 'csascii': + case 'ibm367': + case 'iso646irv1991': + case 'iso646us': + case 'isoir6': + case 'us': + case 'usascii': + return 'US-ASCII'; - case 'IBM01141': - case 'CCSID01141': - case 'CP01141': - case 'EBCDIC-DE-273+EURO': - return 'IBM01141'; + case 'csusdk': + case 'usdk': + return 'us-dk'; - case 'IBM01142': - case 'CCSID01142': - case 'CP01142': - case 'EBCDIC-DK-277+EURO': - case 'EBCDIC-NO-277+EURO': - return 'IBM01142'; + case 'utf7': + return 'UTF-7'; - case 'IBM01143': - case 'CCSID01143': - case 'CP01143': - case 'EBCDIC-FI-278+EURO': - case 'EBCDIC-SE-278+EURO': - return 'IBM01143'; + case 'utf8': + return 'UTF-8'; - case 'IBM01144': - case 'CCSID01144': - case 'CP01144': - case 'EBCDIC-IT-280+EURO': - return 'IBM01144'; + case 'utf16': + return 'UTF-16'; - case 'IBM01145': - case 'CCSID01145': - case 'CP01145': - case 'EBCDIC-ES-284+EURO': - return 'IBM01145'; + case 'utf16be': + return 'UTF-16BE'; - case 'IBM01146': - case 'CCSID01146': - case 'CP01146': - case 'EBCDIC-GB-285+EURO': - return 'IBM01146'; + case 'utf16le': + return 'UTF-16LE'; - case 'IBM01147': - case 'CCSID01147': - case 'CP01147': - case 'EBCDIC-FR-297+EURO': - return 'IBM01147'; + case 'utf32': + return 'UTF-32'; - case 'IBM01148': - case 'CCSID01148': - case 'CP01148': - case 'EBCDIC-INTERNATIONAL-500+EURO': - return 'IBM01148'; + case 'utf32be': + return 'UTF-32BE'; - case 'IBM01149': - case 'CCSID01149': - case 'CP01149': - case 'EBCDIC-IS-871+EURO': - return 'IBM01149'; + case 'utf32le': + return 'UTF-32LE'; - case 'BIG5-HKSCS': - return 'Big5-HKSCS'; + case 'csventurainternational': + case 'venturainternational': + return 'Ventura-International'; - case 'IBM1047': - case 'IBM-1047': - return 'IBM1047'; + case 'csventuramath': + case 'venturamath': + return 'Ventura-Math'; - case 'PTCP154': - case 'CSPTCP154': - case 'PT154': - case 'CP154': - case 'CYRILLIC-ASIAN': - return 'PTCP154'; + case 'csventuraus': + case 'venturaus': + return 'Ventura-US'; - case 'AMIGA-1251': - case 'AMI1251': - case 'AMIGA1251': - case 'AMI-1251': - return 'Amiga-1251'; + case 'csiso70videotexsupp1': + case 'isoir70': + case 'videotexsuppl': + return 'videotex-suppl'; - case 'KOI7-SWITCHED': - return 'KOI7-switched'; + case 'csviqr': + case 'viqr': + return 'VIQR'; - case 'BRF': - case 'CSBRF': - return 'BRF'; + case 'csviscii': + case 'viscii': + return 'VISCII'; - case 'TSCII': - case 'CSTSCII': - return 'TSCII'; + case 'cswindows31j': + case 'windows31j': + return 'Windows-31J'; - case 'WINDOWS-1250': + case 'iso885911': + case 'tis620': + return 'windows-874'; + + case 'cseuckr': + case 'csksc56011987': + case 'euckr': + case 'isoir149': + case 'korean': + case 'ksc5601': + case 'ksc56011987': + case 'ksc56011989': + case 'windows949': + return 'windows-949'; + + case 'windows1250': return 'windows-1250'; - case 'WINDOWS-1251': + case 'windows1251': return 'windows-1251'; - case 'WINDOWS-1252': + case 'cp819': + case 'csisolatin1': + case 'ibm819': + case 'iso88591': + case 'iso885911987': + case 'isoir100': + case 'l1': + case 'latin1': + case 'windows1252': return 'windows-1252'; - case 'WINDOWS-1253': + case 'windows1253': return 'windows-1253'; - case 'WINDOWS-1254': + case 'csisolatin5': + case 'iso88599': + case 'iso885991989': + case 'isoir148': + case 'l5': + case 'latin5': + case 'windows1254': return 'windows-1254'; - case 'WINDOWS-1255': + case 'windows1255': return 'windows-1255'; - case 'WINDOWS-1256': + case 'windows1256': return 'windows-1256'; - case 'WINDOWS-1257': + case 'windows1257': return 'windows-1257'; - case 'WINDOWS-1258': + case 'windows1258': return 'windows-1258'; default: - return (string) $encoding; + return $charset; } } @@ -9077,11 +10791,11 @@ class SimplePie_Misc { $curl = $curl['version']; } - elseif (substr($curl, 0, 5) == 'curl/') + elseif (substr($curl, 0, 5) === 'curl/') { $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5)); } - elseif (substr($curl, 0, 8) == 'libcurl/') + elseif (substr($curl, 0, 8) === 'libcurl/') { $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8)); } @@ -9094,7 +10808,7 @@ class SimplePie_Misc function is_subclass_of($class1, $class2) { - if (func_num_args() != 2) + if (func_num_args() !== 2) { trigger_error('Wrong parameter count for SimplePie_Misc::is_subclass_of()', E_USER_WARNING); } @@ -9111,7 +10825,7 @@ class SimplePie_Misc $class2 = strtolower($class2); while ($class1 = strtolower(get_parent_class($class1))) { - if ($class1 == $class2) + if ($class1 === $class2) { return true; } @@ -9120,7 +10834,7 @@ class SimplePie_Misc } else { - trigger_error('Unknown class passed as parameter', E_USER_WARNING); + trigger_error('Unknown class passed as parameter', E_USER_WARNNG); } } return false; @@ -9151,303 +10865,10 @@ class SimplePie_Misc return $output . $data; } - function parse_date($dt, $rfc822_tz = true) + function parse_date($dt) { - static $cache = array(); - if (!isset($cache[$dt][$rfc822_tz])) - { - $dt = SimplePie_Misc::uncomment_rfc822($dt); - /* - Capturing subpatterns: - 1: RFC 822 date - 2: RFC 822 day - 3: RFC 822 month - 4: RFC 822 year - 5: ISO 8601 date - 6: ISO 8601 century - 7: ISO 8601 year - 8: ISO 8601 month - 9: ISO 8601 day - 10: ISO 8601 ordinal day - 11: ISO 8601 month - 12: ISO 8601 day - 13: ISO 8601 week - 14: ISO 8601 day of week - 15: Time - 16: Hour - 17: Hour Decimal - 18: Minute - 19: Minute Decimal - 20: Second - 21: Second Decimal - 22: Timezone - 23: Diff ± - 24: Hour - 25: Hour Decimal - 26: Minute - 27: Minute Decimal - 28: Alphabetic Timezone - */ - if (preg_match('/^(?:(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)[,\s]+)?(([0-9]{1,2})\s*(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s*([0-9]{4}|[0-9]{2}))|(([0-9]{2})(?:([0-9]{2})(?:(?:-|\s)*(?:([0-9]{2})([0-9]{2})|([0-9]{3})|([0-9]{2})(?:(?:-|\s)*([0-9]{2}))?|W([0-9]{2})(?:(?:-|\s)*([0-9]))?))?)?))((?:T|\s)+([0-9]{2})(?:(?:,|\.)([0-9]*)|(?:\:|\s)*([0-9]{2})(?:(?:,|\.)([0-9]*)|(?:\:|\s)*([0-9]{2})(?:(?:,|\.)([0-9]*))?)?)?(?:\s)*((?:(\+|-)([0-9]{2})(?:(?:,|\.)([0-9]*)|(?:\:|\s)*(?:([0-9]{2})(?:(?:,|\.)([0-9]*))?))?)|(UTC|GMT|EST|CST|MST|PST|EDT|CDT|MDT|PDT|UT|[A-IK-Z]))?)?$/i', $dt, $match)) - { - // Fill all matches - for ($i = count($match); $i <= 28; $i++) - { - $match[$i] = ''; - } - - // Set blank vars - $year = 1970; - $month = 1; - $day = 1; - $hour = 0; - $minute = 0; - $second = 0; - $timezone = false; - - // RFC 822 - if ($match[1] !== '') - { - if (strlen($match[4]) == 2) - { - $year = ($match[4] < 70) ? "20$match[4]" : "19$match[4]"; - } - else - { - $year = $match[4]; - } - switch (strtolower($match[3])) - { - case 'jan': - $month = 1; - break; - - case 'feb': - $month = 2; - break; - - case 'mar': - $month = 3; - break; - - case 'apr': - $month = 4; - break; - - case 'may': - $month = 5; - break; - - case 'jun': - $month = 6; - break; - - case 'jul': - $month = 7; - break; - - case 'aug': - $month = 8; - break; - - case 'sep': - $month = 9; - break; - - case 'oct': - $month = 10; - break; - - case 'nov': - $month = 11; - break; - - case 'dec': - $month = 12; - break; - } - $day = $match[2]; - } - // ISO 8601 - else - { - // Year - if ($match[7] !== '') - { - $year = "$match[6]$match[7]"; - - // Two Digit Month/Day - if ($match[11] !== '') - { - $month = $match[11]; - if ($match[12] !== '') - { - $day = $match[12]; - } - } - - // Four Digit Month/Day - elseif ($match[8] !== '') - { - $month = $match[8]; - $day = $match[9]; - } - - // Ordinal Day - elseif ($match[10] !== '') - { - $day = $match[10]; - } - - // Week Date - elseif ($match[13] !== '') - { - // Week Day - if ($match[14] !== '') - { - $day = $match[14]; - } - - $first_day_of_year = date('w', mktime(0, 0, 0, 1, 1, $year)); - if ($first_day_of_year == 0) - { - $first_day_of_year = 7; - } - - $day = 7 * ($match[13] - 1) + $day - ($first_day_of_year - 1); - } - } - else - { - $year = "$match[6]00"; - } - } - // Time - if ($match[15] !== '') - { - $time = 0; - $time += ($match[16] + ('.' . $match[17])) * 3600; - $time += ($match[18] + ('.' . $match[19])) * 60; - $time += $match[20] + ('.' . $match[21]); - $hour = floor($time / 3600); - $time -= $hour * 3600; - $minute = floor($time / 60); - $time -= $minute * 60; - $second = round($time); - - // Timezone - if ($match[22] !== '') - { - // Alphabetic Timezone - if ($match[28] !== '') - { - // Military - if (strlen($match[28]) == 1) - { - if ($match[28] == 'Z' || $match[28] == 'z' || !$rfc822_tz) - { - $timezone = 0; - } - else - { - $timezone = ord(strtoupper($match[28])); - - if ($timezone > 74) - { - $timezone--; - } - - if ($timezone <= 76) - { - $timezone = -($timezone - 64); - } - else - { - $timezone -= 76; - } - - $timezone *= 3600; - } - } - // Code - else - { - switch (strtoupper($match[28])) - { - case 'UT': - case 'UTC': - case 'GMT': - $timezone = 0; - break; - - case 'EST': - $timezone = -18000; - break; - - case 'CST': - $timezone = -21600; - break; - - case 'MST': - $timezone = -25200; - break; - - case 'PST': - $timezone = -28800; - break; - - case 'EDT': - $timezone = -14400; - break; - - case 'CDT': - $timezone = -18000; - break; - - case 'MDT': - $timezone = -21600; - break; - - case 'PDT': - $timezone = -25200; - break; - } - } - } - // Timezone difference from UTC - else - { - $timezone = 0; - $timezone += ($match[24] + ('.' . $match[25])) * 3600; - $timezone += ($match[26] + ('.' . $match[27])) * 60; - $timezone = (int) round($timezone); - - if ($match[23] == '-') - { - $timezone = -$timezone; - } - } - } - } - if ($timezone === false) - { - $cache[$dt][$rfc822_tz] = mktime($hour, $minute, $second, $month, $day, $year); - } - else - { - $cache[$dt][$rfc822_tz] = gmmktime($hour, $minute, $second, $month, $day, $year) - $timezone; - } - } - elseif (($time = strtotime($dt)) > 0) - { - $cache[$dt][$rfc822_tz] = $time; - } - else - { - $cache[$dt][$rfc822_tz] = false; - } - } - return $cache[$dt][$rfc822_tz]; + $parser = SimplePie_Parse_Date::get(); + return $parser->parse($dt); } /** @@ -9467,27 +10888,62 @@ class SimplePie_Misc /** * Remove RFC822 comments * - * @author Tomas V.V.Cox <cox@idecnet.com> - * @author Pierre-Alain Joye <pajoye@php.net> - * @author Amir Mohammad Saied <amir@php.net> - * @copyright 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox,Amir Mohammad Saied - * @license http://www.opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Validate.php,v 1.104 2006/11/17 16:32:06 amir Exp $ - * @link http://pear.php.net/package/Validate * @access public * @param string $data Data to strip comments from * @return string Comment stripped string */ - function uncomment_rfc822($data) + function uncomment_rfc822($string) { - if ((version_compare(PHP_VERSION, '4.4.6', '>=') && version_compare(PHP_VERSION, '5', '<')) || version_compare(PHP_VERSION, '5.2.2', '>=')) - { - return $data; - } - else + $string = (string) $string; + $position = 0; + $length = strlen($string); + $depth = 0; + + $output = ''; + + while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) { - return preg_replace('/((?:(?:\\\\"|[^("])*(?:"(?:[^"\\\\\r]|\\\\.)*"\s*)?)*)((?<!\\\\)\((?:(?2)|.)*?(?<!\\\\)\))/', '$1', $data); + $output .= substr($string, $position, $pos - $position); + $position = $pos + 1; + if ($string[$pos - 1] !== '\\') + { + $depth++; + while ($depth && $position < $length) + { + $position += strcspn($string, '()', $position); + if ($string[$position - 1] === '\\') + { + $position++; + continue; + } + elseif (isset($string[$position])) + { + switch ($string[$position]) + { + case '(': + $depth++; + break; + + case ')': + $depth--; + break; + } + $position++; + } + else + { + break; + } + } + } + else + { + $output .= '('; + } } + $output .= substr($string, $position); + + return $output; } function parse_mime($mime) @@ -9516,7 +10972,7 @@ class SimplePie_Misc function atom_03_construct_type($attribs) { - if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) == 'base64')) + if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64')) { $mode = SIMPLEPIE_CONSTRUCT_BASE64; } @@ -9588,7 +11044,7 @@ class SimplePie_Misc case 'xhtml': return SIMPLEPIE_CONSTRUCT_XHTML; } - if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) == 'text/') + if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/') { return SIMPLEPIE_CONSTRUCT_NONE; } @@ -9679,69 +11135,35 @@ class SimplePie_Misc */ function codepoint_to_utf8($codepoint) { - static $cache = array(); $codepoint = (int) $codepoint; - if (isset($cache[$codepoint])) - { - return $cache[$codepoint]; - } - elseif ($codepoint < 0) + if ($codepoint < 0) { - return $cache[$codepoint] = false; + return false; } else if ($codepoint <= 0x7f) { - return $cache[$codepoint] = chr($codepoint); + return chr($codepoint); } else if ($codepoint <= 0x7ff) { - return $cache[$codepoint] = chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f)); + return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f)); } else if ($codepoint <= 0xffff) { - return $cache[$codepoint] = chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); + return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); } else if ($codepoint <= 0x10ffff) { - return $cache[$codepoint] = chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); + return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); } else { // U+FFFD REPLACEMENT CHARACTER - return $cache[$codepoint] = "\xEF\xBF\xBD"; + return "\xEF\xBF\xBD"; } } /** - * Re-implementation of PHP 4.2.0's is_a() - * - * @static - * @access public - * @param object $object The tested object - * @param string $class_name The class name - * @return bool Returns true if the object is of this class or has this class as one of its parents, false otherwise - */ - function is_a($object, $class_name) - { - if (function_exists('is_a')) - { - return is_a($object, $class_name); - } - elseif (!is_object($object)) - { - return false; - } - elseif (get_class($object) == strtolower($class_name)) - { - return true; - } - else - { - return is_subclass_of($object, $class_name); - } - } - - /** * Re-implementation of PHP 5's stripos() * * Returns the numeric position of the first occurrence of needle in the @@ -9758,31 +11180,207 @@ class SimplePie_Misc * relative to the beginning of haystack. * @return bool If needle is not found, stripos() will return boolean false. */ - function stripos($haystack, $needle, $offset = 0) - { - if (function_exists('stripos')) - { - return stripos($haystack, $needle, $offset); - } - else - { - if (is_string($needle)) - { - $needle = strtolower($needle); - } - elseif (is_int($needle) || is_bool($needle) || is_double($needle)) - { - $needle = strtolower(chr($needle)); - } - else - { - trigger_error('needle is not a string or an integer', E_USER_WARNING); - return false; - } - - return strpos(strtolower($haystack), $needle, $offset); - } - } + function stripos($haystack, $needle, $offset = 0) + { + if (function_exists('stripos')) + { + return stripos($haystack, $needle, $offset); + } + else + { + if (is_string($needle)) + { + $needle = strtolower($needle); + } + elseif (is_int($needle) || is_bool($needle) || is_double($needle)) + { + $needle = strtolower(chr($needle)); + } + else + { + trigger_error('needle is not a string or an integer', E_USER_WARNING); + return false; + } + + return strpos(strtolower($haystack), $needle, $offset); + } + } + + /** + * Similar to parse_str() + * + * Returns an associative array of name/value pairs, where the value is an + * array of values that have used the same name + * + * @static + * @access string + * @param string $str The input string. + * @return array + */ + function parse_str($str) + { + $return = array(); + $str = explode('&', $str); + + foreach ($str as $section) + { + if (strpos($section, '=') !== false) + { + list($name, $value) = explode('=', $section, 2); + $return[urldecode($name)][] = urldecode($value); + } + else + { + $return[urldecode($section)][] = null; + } + } + + return $return; + } + + /** + * Detect XML encoding, as per XML 1.0 Appendix F.1 + * + * @todo Add support for EBCDIC + * @param string $data XML data + * @return array Possible encodings + */ + function xml_encoding($data) + { + // UTF-32 Big Endian BOM + if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") + { + $encoding[] = 'UTF-32BE'; + } + // UTF-32 Little Endian BOM + elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") + { + $encoding[] = 'UTF-32LE'; + } + // UTF-16 Big Endian BOM + elseif (substr($data, 0, 2) === "\xFE\xFF") + { + $encoding[] = 'UTF-16BE'; + } + // UTF-16 Little Endian BOM + elseif (substr($data, 0, 2) === "\xFF\xFE") + { + $encoding[] = 'UTF-16LE'; + } + // UTF-8 BOM + elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") + { + $encoding[] = 'UTF-8'; + } + // UTF-32 Big Endian Without BOM + elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C") + { + if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E")) + { + $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-32BE'; + } + // UTF-32 Little Endian Without BOM + elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00") + { + if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00")) + { + $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-32LE'; + } + // UTF-16 Big Endian Without BOM + elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C") + { + if ($pos = strpos($data, "\x00\x3F\x00\x3E")) + { + $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-16BE'; + } + // UTF-16 Little Endian Without BOM + elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00") + { + if ($pos = strpos($data, "\x3F\x00\x3E\x00")) + { + $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-16LE'; + } + // US-ASCII (or superset) + elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C") + { + if ($pos = strpos($data, "\x3F\x3E")) + { + $parser = new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5)); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-8'; + } + // Fallback to UTF-8 + else + { + $encoding[] = 'UTF-8'; + } + return $encoding; + } + + function output_javascript() + { + if (function_exists('ob_gzhandler')) + { + ob_start('ob_gzhandler'); + } + header('Content-type: text/javascript; charset: UTF-8'); + header('Cache-Control: must-revalidate'); + header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days + ?> +function embed_odeo(link) { + document.writeln('<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url='+link+'"></embed>'); +} + +function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) { + if (placeholder != '') { + document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); + } + else { + document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); + } +} + +function embed_flash(bgcolor, width, height, link, loop, type) { + document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>'); +} + +function embed_flv(width, height, link, placeholder, loop, player) { + document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>'); +} + +function embed_wmedia(width, height, link) { + document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>'); +} + <?php + } } /** @@ -9861,7 +11459,6 @@ class SimplePie_Decode_HTML_Entities } else { - $this->consumed = false; return false; } } @@ -9884,7 +11481,6 @@ class SimplePie_Decode_HTML_Entities } else { - $this->consumed = false; return false; } } @@ -9958,7 +11554,7 @@ class SimplePie_Decode_HTML_Entities $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint); } - if ($this->consume() != ';') + if (!in_array($this->consume(), array(';', false), true)) { $this->unconsume(); } @@ -9972,7 +11568,7 @@ class SimplePie_Decode_HTML_Entities default: static $entities = array('Aacute' => "\xC3\x81", 'aacute' => "\xC3\xA1", 'Aacute;' => "\xC3\x81", 'aacute;' => "\xC3\xA1", 'Acirc' => "\xC3\x82", 'acirc' => "\xC3\xA2", 'Acirc;' => "\xC3\x82", 'acirc;' => "\xC3\xA2", 'acute' => "\xC2\xB4", 'acute;' => "\xC2\xB4", 'AElig' => "\xC3\x86", 'aelig' => "\xC3\xA6", 'AElig;' => "\xC3\x86", 'aelig;' => "\xC3\xA6", 'Agrave' => "\xC3\x80", 'agrave' => "\xC3\xA0", 'Agrave;' => "\xC3\x80", 'agrave;' => "\xC3\xA0", 'alefsym;' => "\xE2\x84\xB5", 'Alpha;' => "\xCE\x91", 'alpha;' => "\xCE\xB1", 'AMP' => "\x26", 'amp' => "\x26", 'AMP;' => "\x26", 'amp;' => "\x26", 'and;' => "\xE2\x88\xA7", 'ang;' => "\xE2\x88\xA0", 'apos;' => "\x27", 'Aring' => "\xC3\x85", 'aring' => "\xC3\xA5", 'Aring;' => "\xC3\x85", 'aring;' => "\xC3\xA5", 'asymp;' => "\xE2\x89\x88", 'Atilde' => "\xC3\x83", 'atilde' => "\xC3\xA3", 'Atilde;' => "\xC3\x83", 'atilde;' => "\xC3\xA3", 'Auml' => "\xC3\x84", 'auml' => "\xC3\xA4", 'Auml;' => "\xC3\x84", 'auml;' => "\xC3\xA4", 'bdquo;' => "\xE2\x80\x9E", 'Beta;' => "\xCE\x92", 'beta;' => "\xCE\xB2", 'brvbar' => "\xC2\xA6", 'brvbar;' => "\xC2\xA6", 'bull;' => "\xE2\x80\xA2", 'cap;' => "\xE2\x88\xA9", 'Ccedil' => "\xC3\x87", 'ccedil' => "\xC3\xA7", 'Ccedil;' => "\xC3\x87", 'ccedil;' => "\xC3\xA7", 'cedil' => "\xC2\xB8", 'cedil;' => "\xC2\xB8", 'cent' => "\xC2\xA2", 'cent;' => "\xC2\xA2", 'Chi;' => "\xCE\xA7", 'chi;' => "\xCF\x87", 'circ;' => "\xCB\x86", 'clubs;' => "\xE2\x99\xA3", 'cong;' => "\xE2\x89\x85", 'COPY' => "\xC2\xA9", 'copy' => "\xC2\xA9", 'COPY;' => "\xC2\xA9", 'copy;' => "\xC2\xA9", 'crarr;' => "\xE2\x86\xB5", 'cup;' => "\xE2\x88\xAA", 'curren' => "\xC2\xA4", 'curren;' => "\xC2\xA4", 'Dagger;' => "\xE2\x80\xA1", 'dagger;' => "\xE2\x80\xA0", 'dArr;' => "\xE2\x87\x93", 'darr;' => "\xE2\x86\x93", 'deg' => "\xC2\xB0", 'deg;' => "\xC2\xB0", 'Delta;' => "\xCE\x94", 'delta;' => "\xCE\xB4", 'diams;' => "\xE2\x99\xA6", 'divide' => "\xC3\xB7", 'divide;' => "\xC3\xB7", 'Eacute' => "\xC3\x89", 'eacute' => "\xC3\xA9", 'Eacute;' => "\xC3\x89", 'eacute;' => "\xC3\xA9", 'Ecirc' => "\xC3\x8A", 'ecirc' => "\xC3\xAA", 'Ecirc;' => "\xC3\x8A", 'ecirc;' => "\xC3\xAA", 'Egrave' => "\xC3\x88", 'egrave' => "\xC3\xA8", 'Egrave;' => "\xC3\x88", 'egrave;' => "\xC3\xA8", 'empty;' => "\xE2\x88\x85", 'emsp;' => "\xE2\x80\x83", 'ensp;' => "\xE2\x80\x82", 'Epsilon;' => "\xCE\x95", 'epsilon;' => "\xCE\xB5", 'equiv;' => "\xE2\x89\xA1", 'Eta;' => "\xCE\x97", 'eta;' => "\xCE\xB7", 'ETH' => "\xC3\x90", 'eth' => "\xC3\xB0", 'ETH;' => "\xC3\x90", 'eth;' => "\xC3\xB0", 'Euml' => "\xC3\x8B", 'euml' => "\xC3\xAB", 'Euml;' => "\xC3\x8B", 'euml;' => "\xC3\xAB", 'euro;' => "\xE2\x82\xAC", 'exist;' => "\xE2\x88\x83", 'fnof;' => "\xC6\x92", 'forall;' => "\xE2\x88\x80", 'frac12' => "\xC2\xBD", 'frac12;' => "\xC2\xBD", 'frac14' => "\xC2\xBC", 'frac14;' => "\xC2\xBC", 'frac34' => "\xC2\xBE", 'frac34;' => "\xC2\xBE", 'frasl;' => "\xE2\x81\x84", 'Gamma;' => "\xCE\x93", 'gamma;' => "\xCE\xB3", 'ge;' => "\xE2\x89\xA5", 'GT' => "\x3E", 'gt' => "\x3E", 'GT;' => "\x3E", 'gt;' => "\x3E", 'hArr;' => "\xE2\x87\x94", 'harr;' => "\xE2\x86\x94", 'hearts;' => "\xE2\x99\xA5", 'hellip;' => "\xE2\x80\xA6", 'Iacute' => "\xC3\x8D", 'iacute' => "\xC3\xAD", 'Iacute;' => "\xC3\x8D", 'iacute;' => "\xC3\xAD", 'Icirc' => "\xC3\x8E", 'icirc' => "\xC3\xAE", 'Icirc;' => "\xC3\x8E", 'icirc;' => "\xC3\xAE", 'iexcl' => "\xC2\xA1", 'iexcl;' => "\xC2\xA1", 'Igrave' => "\xC3\x8C", 'igrave' => "\xC3\xAC", 'Igrave;' => "\xC3\x8C", 'igrave;' => "\xC3\xAC", 'image;' => "\xE2\x84\x91", 'infin;' => "\xE2\x88\x9E", 'int;' => "\xE2\x88\xAB", 'Iota;' => "\xCE\x99", 'iota;' => "\xCE\xB9", 'iquest' => "\xC2\xBF", 'iquest;' => "\xC2\xBF", 'isin;' => "\xE2\x88\x88", 'Iuml' => "\xC3\x8F", 'iuml' => "\xC3\xAF", 'Iuml;' => "\xC3\x8F", 'iuml;' => "\xC3\xAF", 'Kappa;' => "\xCE\x9A", 'kappa;' => "\xCE\xBA", 'Lambda;' => "\xCE\x9B", 'lambda;' => "\xCE\xBB", 'lang;' => "\xE3\x80\x88", 'laquo' => "\xC2\xAB", 'laquo;' => "\xC2\xAB", 'lArr;' => "\xE2\x87\x90", 'larr;' => "\xE2\x86\x90", 'lceil;' => "\xE2\x8C\x88", 'ldquo;' => "\xE2\x80\x9C", 'le;' => "\xE2\x89\xA4", 'lfloor;' => "\xE2\x8C\x8A", 'lowast;' => "\xE2\x88\x97", 'loz;' => "\xE2\x97\x8A", 'lrm;' => "\xE2\x80\x8E", 'lsaquo;' => "\xE2\x80\xB9", 'lsquo;' => "\xE2\x80\x98", 'LT' => "\x3C", 'lt' => "\x3C", 'LT;' => "\x3C", 'lt;' => "\x3C", 'macr' => "\xC2\xAF", 'macr;' => "\xC2\xAF", 'mdash;' => "\xE2\x80\x94", 'micro' => "\xC2\xB5", 'micro;' => "\xC2\xB5", 'middot' => "\xC2\xB7", 'middot;' => "\xC2\xB7", 'minus;' => "\xE2\x88\x92", 'Mu;' => "\xCE\x9C", 'mu;' => "\xCE\xBC", 'nabla;' => "\xE2\x88\x87", 'nbsp' => "\xC2\xA0", 'nbsp;' => "\xC2\xA0", 'ndash;' => "\xE2\x80\x93", 'ne;' => "\xE2\x89\xA0", 'ni;' => "\xE2\x88\x8B", 'not' => "\xC2\xAC", 'not;' => "\xC2\xAC", 'notin;' => "\xE2\x88\x89", 'nsub;' => "\xE2\x8A\x84", 'Ntilde' => "\xC3\x91", 'ntilde' => "\xC3\xB1", 'Ntilde;' => "\xC3\x91", 'ntilde;' => "\xC3\xB1", 'Nu;' => "\xCE\x9D", 'nu;' => "\xCE\xBD", 'Oacute' => "\xC3\x93", 'oacute' => "\xC3\xB3", 'Oacute;' => "\xC3\x93", 'oacute;' => "\xC3\xB3", 'Ocirc' => "\xC3\x94", 'ocirc' => "\xC3\xB4", 'Ocirc;' => "\xC3\x94", 'ocirc;' => "\xC3\xB4", 'OElig;' => "\xC5\x92", 'oelig;' => "\xC5\x93", 'Ograve' => "\xC3\x92", 'ograve' => "\xC3\xB2", 'Ograve;' => "\xC3\x92", 'ograve;' => "\xC3\xB2", 'oline;' => "\xE2\x80\xBE", 'Omega;' => "\xCE\xA9", 'omega;' => "\xCF\x89", 'Omicron;' => "\xCE\x9F", 'omicron;' => "\xCE\xBF", 'oplus;' => "\xE2\x8A\x95", 'or;' => "\xE2\x88\xA8", 'ordf' => "\xC2\xAA", 'ordf;' => "\xC2\xAA", 'ordm' => "\xC2\xBA", 'ordm;' => "\xC2\xBA", 'Oslash' => "\xC3\x98", 'oslash' => "\xC3\xB8", 'Oslash;' => "\xC3\x98", 'oslash;' => "\xC3\xB8", 'Otilde' => "\xC3\x95", 'otilde' => "\xC3\xB5", 'Otilde;' => "\xC3\x95", 'otilde;' => "\xC3\xB5", 'otimes;' => "\xE2\x8A\x97", 'Ouml' => "\xC3\x96", 'ouml' => "\xC3\xB6", 'Ouml;' => "\xC3\x96", 'ouml;' => "\xC3\xB6", 'para' => "\xC2\xB6", 'para;' => "\xC2\xB6", 'part;' => "\xE2\x88\x82", 'permil;' => "\xE2\x80\xB0", 'perp;' => "\xE2\x8A\xA5", 'Phi;' => "\xCE\xA6", 'phi;' => "\xCF\x86", 'Pi;' => "\xCE\xA0", 'pi;' => "\xCF\x80", 'piv;' => "\xCF\x96", 'plusmn' => "\xC2\xB1", 'plusmn;' => "\xC2\xB1", 'pound' => "\xC2\xA3", 'pound;' => "\xC2\xA3", 'Prime;' => "\xE2\x80\xB3", 'prime;' => "\xE2\x80\xB2", 'prod;' => "\xE2\x88\x8F", 'prop;' => "\xE2\x88\x9D", 'Psi;' => "\xCE\xA8", 'psi;' => "\xCF\x88", 'QUOT' => "\x22", 'quot' => "\x22", 'QUOT;' => "\x22", 'quot;' => "\x22", 'radic;' => "\xE2\x88\x9A", 'rang;' => "\xE3\x80\x89", 'raquo' => "\xC2\xBB", 'raquo;' => "\xC2\xBB", 'rArr;' => "\xE2\x87\x92", 'rarr;' => "\xE2\x86\x92", 'rceil;' => "\xE2\x8C\x89", 'rdquo;' => "\xE2\x80\x9D", 'real;' => "\xE2\x84\x9C", 'REG' => "\xC2\xAE", 'reg' => "\xC2\xAE", 'REG;' => "\xC2\xAE", 'reg;' => "\xC2\xAE", 'rfloor;' => "\xE2\x8C\x8B", 'Rho;' => "\xCE\xA1", 'rho;' => "\xCF\x81", 'rlm;' => "\xE2\x80\x8F", 'rsaquo;' => "\xE2\x80\xBA", 'rsquo;' => "\xE2\x80\x99", 'sbquo;' => "\xE2\x80\x9A", 'Scaron;' => "\xC5\xA0", 'scaron;' => "\xC5\xA1", 'sdot;' => "\xE2\x8B\x85", 'sect' => "\xC2\xA7", 'sect;' => "\xC2\xA7", 'shy' => "\xC2\xAD", 'shy;' => "\xC2\xAD", 'Sigma;' => "\xCE\xA3", 'sigma;' => "\xCF\x83", 'sigmaf;' => "\xCF\x82", 'sim;' => "\xE2\x88\xBC", 'spades;' => "\xE2\x99\xA0", 'sub;' => "\xE2\x8A\x82", 'sube;' => "\xE2\x8A\x86", 'sum;' => "\xE2\x88\x91", 'sup;' => "\xE2\x8A\x83", 'sup1' => "\xC2\xB9", 'sup1;' => "\xC2\xB9", 'sup2' => "\xC2\xB2", 'sup2;' => "\xC2\xB2", 'sup3' => "\xC2\xB3", 'sup3;' => "\xC2\xB3", 'supe;' => "\xE2\x8A\x87", 'szlig' => "\xC3\x9F", 'szlig;' => "\xC3\x9F", 'Tau;' => "\xCE\xA4", 'tau;' => "\xCF\x84", 'there4;' => "\xE2\x88\xB4", 'Theta;' => "\xCE\x98", 'theta;' => "\xCE\xB8", 'thetasym;' => "\xCF\x91", 'thinsp;' => "\xE2\x80\x89", 'THORN' => "\xC3\x9E", 'thorn' => "\xC3\xBE", 'THORN;' => "\xC3\x9E", 'thorn;' => "\xC3\xBE", 'tilde;' => "\xCB\x9C", 'times' => "\xC3\x97", 'times;' => "\xC3\x97", 'TRADE;' => "\xE2\x84\xA2", 'trade;' => "\xE2\x84\xA2", 'Uacute' => "\xC3\x9A", 'uacute' => "\xC3\xBA", 'Uacute;' => "\xC3\x9A", 'uacute;' => "\xC3\xBA", 'uArr;' => "\xE2\x87\x91", 'uarr;' => "\xE2\x86\x91", 'Ucirc' => "\xC3\x9B", 'ucirc' => "\xC3\xBB", 'Ucirc;' => "\xC3\x9B", 'ucirc;' => "\xC3\xBB", 'Ugrave' => "\xC3\x99", 'ugrave' => "\xC3\xB9", 'Ugrave;' => "\xC3\x99", 'ugrave;' => "\xC3\xB9", 'uml' => "\xC2\xA8", 'uml;' => "\xC2\xA8", 'upsih;' => "\xCF\x92", 'Upsilon;' => "\xCE\xA5", 'upsilon;' => "\xCF\x85", 'Uuml' => "\xC3\x9C", 'uuml' => "\xC3\xBC", 'Uuml;' => "\xC3\x9C", 'uuml;' => "\xC3\xBC", 'weierp;' => "\xE2\x84\x98", 'Xi;' => "\xCE\x9E", 'xi;' => "\xCE\xBE", 'Yacute' => "\xC3\x9D", 'yacute' => "\xC3\xBD", 'Yacute;' => "\xC3\x9D", 'yacute;' => "\xC3\xBD", 'yen' => "\xC2\xA5", 'yen;' => "\xC2\xA5", 'yuml' => "\xC3\xBF", 'Yuml;' => "\xC5\xB8", 'yuml;' => "\xC3\xBF", 'Zeta;' => "\xCE\x96", 'zeta;' => "\xCE\xB6", 'zwj;' => "\xE2\x80\x8D", 'zwnj;' => "\xE2\x80\x8C"); - for ($i = 0, $match = null; $i < 9 && $this->consume(); $i++) + for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++) { $consumed = substr($this->consumed, 1); if (isset($entities[$consumed])) @@ -9991,6 +11587,2489 @@ class SimplePie_Decode_HTML_Entities } } +/** + * IRI parser/serialiser + * + * @package SimplePie + */ +class SimplePie_IRI +{ + /** + * Scheme + * + * @access private + * @var string + */ + var $scheme; + + /** + * User Information + * + * @access private + * @var string + */ + var $userinfo; + + /** + * Host + * + * @access private + * @var string + */ + var $host; + + /** + * Port + * + * @access private + * @var string + */ + var $port; + + /** + * Path + * + * @access private + * @var string + */ + var $path; + + /** + * Query + * + * @access private + * @var string + */ + var $query; + + /** + * Fragment + * + * @access private + * @var string + */ + var $fragment; + + /** + * Whether the object represents a valid IRI + * + * @access private + * @var array + */ + var $valid = array(); + + /** + * Return the entire IRI when you try and read the object as a string + * + * @access public + * @return string + */ + function __toString() + { + return $this->get_iri(); + } + + /** + * Create a new IRI object, from a specified string + * + * @access public + * @param string $iri + * @return SimplePie_IRI + */ + function SimplePie_IRI($iri) + { + $iri = (string) $iri; + if ($iri !== '') + { + $parsed = $this->parse_iri($iri); + $this->set_scheme($parsed['scheme']); + $this->set_authority($parsed['authority']); + $this->set_path($parsed['path']); + $this->set_query($parsed['query']); + $this->set_fragment($parsed['fragment']); + } + } + + /** + * Create a new IRI object by resolving a relative IRI + * + * @static + * @access public + * @param SimplePie_IRI $base Base IRI + * @param string $relative Relative IRI + * @return SimplePie_IRI + */ + function absolutize($base, $relative) + { + $relative = (string) $relative; + if ($relative !== '') + { + $relative = new SimplePie_IRI($relative); + if ($relative->get_scheme() !== null) + { + $target = $relative; + } + elseif ($base->get_iri() !== null) + { + if ($relative->get_authority() !== null) + { + $target = $relative; + $target->set_scheme($base->get_scheme()); + } + else + { + $target = new SimplePie_IRI(''); + $target->set_scheme($base->get_scheme()); + $target->set_userinfo($base->get_userinfo()); + $target->set_host($base->get_host()); + $target->set_port($base->get_port()); + if ($relative->get_path() !== null) + { + if (strpos($relative->get_path(), '/') === 0) + { + $target->set_path($relative->get_path()); + } + elseif (($base->get_userinfo() !== null || $base->get_host() !== null || $base->get_port() !== null) && $base->get_path() === null) + { + $target->set_path('/' . $relative->get_path()); + } + elseif (($last_segment = strrpos($base->get_path(), '/')) !== false) + { + $target->set_path(substr($base->get_path(), 0, $last_segment + 1) . $relative->get_path()); + } + else + { + $target->set_path($relative->get_path()); + } + $target->set_query($relative->get_query()); + } + else + { + $target->set_path($base->get_path()); + if ($relative->get_query() !== null) + { + $target->set_query($relative->get_query()); + } + elseif ($base->get_query() !== null) + { + $target->set_query($base->get_query()); + } + } + } + $target->set_fragment($relative->get_fragment()); + } + else + { + // No base URL, just return the relative URL + $target = $relative; + } + } + else + { + $target = $base; + } + return $target; + } + + /** + * Parse an IRI into scheme/authority/path/query/fragment segments + * + * @access private + * @param string $iri + * @return array + */ + function parse_iri($iri) + { + preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/', $iri, $match); + for ($i = count($match); $i <= 9; $i++) + { + $match[$i] = ''; + } + return array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[7], 'fragment' => $match[9]); + } + + /** + * Remove dot segments from a path + * + * @access private + * @param string $input + * @return string + */ + function remove_dot_segments($input) + { + $output = ''; + while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') + { + // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise, + if (strpos($input, '../') === 0) + { + $input = substr($input, 3); + } + elseif (strpos($input, './') === 0) + { + $input = substr($input, 2); + } + // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise, + elseif (strpos($input, '/./') === 0) + { + $input = substr_replace($input, '/', 0, 3); + } + elseif ($input === '/.') + { + $input = '/'; + } + // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise, + elseif (strpos($input, '/../') === 0) + { + $input = substr_replace($input, '/', 0, 4); + $output = substr_replace($output, '', strrpos($output, '/')); + } + elseif ($input === '/..') + { + $input = '/'; + $output = substr_replace($output, '', strrpos($output, '/')); + } + // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise, + elseif ($input === '.' || $input === '..') + { + $input = ''; + } + // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer + elseif (($pos = strpos($input, '/', 1)) !== false) + { + $output .= substr($input, 0, $pos); + $input = substr_replace($input, '', 0, $pos); + } + else + { + $output .= $input; + $input = ''; + } + } + return $output . $input; + } + + /** + * Replace invalid character with percent encoding + * + * @access private + * @param string $string Input string + * @param string $valid_chars Valid characters + * @param int $case Normalise case + * @return string + */ + function replace_invalid_with_pct_encoding($string, $valid_chars, $case = SIMPLEPIE_SAME_CASE) + { + // Normalise case + if ($case & SIMPLEPIE_LOWERCASE) + { + $string = strtolower($string); + } + elseif ($case & SIMPLEPIE_UPPERCASE) + { + $string = strtoupper($string); + } + + // Store position and string length (to avoid constantly recalculating this) + $position = 0; + $strlen = strlen($string); + + // Loop as long as we have invalid characters, advancing the position to the next invalid character + while (($position += strspn($string, $valid_chars, $position)) < $strlen) + { + // If we have a % character + if ($string[$position] === '%') + { + // If we have a pct-encoded section + if ($position + 2 < $strlen && strspn($string, '0123456789ABCDEFabcdef', $position + 1, 2) === 2) + { + // Get the the represented character + $chr = chr(hexdec(substr($string, $position + 1, 2))); + + // If the character is valid, replace the pct-encoded with the actual character while normalising case + if (strpos($valid_chars, $chr) !== false) + { + if ($case & SIMPLEPIE_LOWERCASE) + { + $chr = strtolower($chr); + } + elseif ($case & SIMPLEPIE_UPPERCASE) + { + $chr = strtoupper($chr); + } + $string = substr_replace($string, $chr, $position, 3); + $strlen -= 2; + $position++; + } + + // Otherwise just normalise the pct-encoded to uppercase + else + { + $string = substr_replace($string, strtoupper(substr($string, $position + 1, 2)), $position + 1, 2); + $position += 3; + } + } + // If we don't have a pct-encoded section, just replace the % with its own esccaped form + else + { + $string = substr_replace($string, '%25', $position, 1); + $strlen += 2; + $position += 3; + } + } + // If we have an invalid character, change into its pct-encoded form + else + { + $replacement = sprintf("%%%02X", ord($string[$position])); + $string = str_replace($string[$position], $replacement, $string); + $strlen = strlen($string); + } + } + return $string; + } + + /** + * Check if the object represents a valid IRI + * + * @access public + * @return bool + */ + function is_valid() + { + return array_sum($this->valid) === count($this->valid); + } + + /** + * Set the scheme. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @access public + * @param string $scheme + * @return bool + */ + function set_scheme($scheme) + { + if ($scheme === null || $scheme === '') + { + $this->scheme = null; + } + else + { + $len = strlen($scheme); + switch (true) + { + case $len > 1: + if (!strspn($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-.', 1)) + { + $this->scheme = null; + $this->valid[__FUNCTION__] = false; + return false; + } + + case $len > 0: + if (!strspn($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 0, 1)) + { + $this->scheme = null; + $this->valid[__FUNCTION__] = false; + return false; + } + } + $this->scheme = strtolower($scheme); + } + $this->valid[__FUNCTION__] = true; + return true; + } + + /** + * Set the authority. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @access public + * @param string $authority + * @return bool + */ + function set_authority($authority) + { + if (($userinfo_end = strrpos($authority, '@')) !== false) + { + $userinfo = substr($authority, 0, $userinfo_end); + $authority = substr($authority, $userinfo_end + 1); + } + else + { + $userinfo = null; + } + + if (($port_start = strpos($authority, ':')) !== false) + { + $port = substr($authority, $port_start + 1); + $authority = substr($authority, 0, $port_start); + } + else + { + $port = null; + } + + return $this->set_userinfo($userinfo) && $this->set_host($authority) && $this->set_port($port); + } + + /** + * Set the userinfo. + * + * @access public + * @param string $userinfo + * @return bool + */ + function set_userinfo($userinfo) + { + if ($userinfo === null || $userinfo === '') + { + $this->userinfo = null; + } + else + { + $this->userinfo = $this->replace_invalid_with_pct_encoding($userinfo, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:'); + } + $this->valid[__FUNCTION__] = true; + return true; + } + + /** + * Set the host. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @access public + * @param string $host + * @return bool + */ + function set_host($host) + { + if ($host === null || $host === '') + { + $this->host = null; + $this->valid[__FUNCTION__] = true; + return true; + } + elseif ($host[0] === '[' && substr($host, -1) === ']') + { + if (Net_IPv6::checkIPv6(substr($host, 1, -1))) + { + $this->host = $host; + $this->valid[__FUNCTION__] = true; + return true; + } + else + { + $this->host = null; + $this->valid[__FUNCTION__] = false; + return false; + } + } + else + { + $this->host = $this->replace_invalid_with_pct_encoding($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=', SIMPLEPIE_LOWERCASE); + $this->valid[__FUNCTION__] = true; + return true; + } + } + + /** + * Set the port. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @access public + * @param string $port + * @return bool + */ + function set_port($port) + { + if ($port === null || $port === '') + { + $this->port = null; + $this->valid[__FUNCTION__] = true; + return true; + } + elseif (strspn($port, '0123456789') === strlen($port)) + { + $this->port = (int) $port; + $this->valid[__FUNCTION__] = true; + return true; + } + else + { + $this->port = null; + $this->valid[__FUNCTION__] = false; + return false; + } + } + + /** + * Set the path. + * + * @access public + * @param string $path + * @return bool + */ + function set_path($path) + { + if ($path === null || $path === '') + { + $this->path = null; + $this->valid[__FUNCTION__] = true; + return true; + } + elseif (substr($path, 0, 2) === '//' && $this->userinfo === null && $this->host === null && $this->port === null) + { + $this->path = null; + $this->valid[__FUNCTION__] = false; + return false; + } + else + { + $this->path = $this->replace_invalid_with_pct_encoding($path, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=@/'); + if ($this->scheme !== null) + { + $this->path = $this->remove_dot_segments($this->path); + } + $this->valid[__FUNCTION__] = true; + return true; + } + } + + /** + * Set the query. + * + * @access public + * @param string $query + * @return bool + */ + function set_query($query) + { + if ($query === null || $query === '') + { + $this->query = null; + } + else + { + $this->query = $this->replace_invalid_with_pct_encoding($query, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$\'()*+,;:@/?&='); + } + $this->valid[__FUNCTION__] = true; + return true; + } + + /** + * Set the fragment. + * + * @access public + * @param string $fragment + * @return bool + */ + function set_fragment($fragment) + { + if ($fragment === null || $fragment === '') + { + $this->fragment = null; + } + else + { + $this->fragment = $this->replace_invalid_with_pct_encoding($fragment, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:@/?'); + } + $this->valid[__FUNCTION__] = true; + return true; + } + + /** + * Get the complete IRI + * + * @access public + * @return string + */ + function get_iri() + { + $iri = ''; + if ($this->scheme !== null) + { + $iri .= $this->scheme . ':'; + } + if (($authority = $this->get_authority()) !== null) + { + $iri .= '//' . $authority; + } + if ($this->path !== null) + { + $iri .= $this->path; + } + if ($this->query !== null) + { + $iri .= '?' . $this->query; + } + if ($this->fragment !== null) + { + $iri .= '#' . $this->fragment; + } + + if ($iri !== '') + { + return $iri; + } + else + { + return null; + } + } + + /** + * Get the scheme + * + * @access public + * @return string + */ + function get_scheme() + { + return $this->scheme; + } + + /** + * Get the complete authority + * + * @access public + * @return string + */ + function get_authority() + { + $authority = ''; + if ($this->userinfo !== null) + { + $authority .= $this->userinfo . '@'; + } + if ($this->host !== null) + { + $authority .= $this->host; + } + if ($this->port !== null) + { + $authority .= ':' . $this->port; + } + + if ($authority !== '') + { + return $authority; + } + else + { + return null; + } + } + + /** + * Get the user information + * + * @access public + * @return string + */ + function get_userinfo() + { + return $this->userinfo; + } + + /** + * Get the host + * + * @access public + * @return string + */ + function get_host() + { + return $this->host; + } + + /** + * Get the port + * + * @access public + * @return string + */ + function get_port() + { + return $this->port; + } + + /** + * Get the path + * + * @access public + * @return string + */ + function get_path() + { + return $this->path; + } + + /** + * Get the query + * + * @access public + * @return string + */ + function get_query() + { + return $this->query; + } + + /** + * Get the fragment + * + * @access public + * @return string + */ + function get_fragment() + { + return $this->fragment; + } +} + +/** + * Class to validate and to work with IPv6 addresses. + * + * @package SimplePie + * @copyright 2003-2005 The PHP Group + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/package/Net_IPv6 + * @author Alexander Merz <alexander.merz@web.de> + * @author elfrink at introweb dot nl + * @author Josh Peck <jmp at joshpeck dot org> + * @author Geoffrey Sneddon <geoffers@gmail.com> + */ +class SimplePie_Net_IPv6 +{ + /** + * Removes a possible existing netmask specification of an IP address. + * + * @param string $ip the (compressed) IP as Hex representation + * @return string the IP the without netmask + * @since 1.1.0 + * @access public + * @static + */ + function removeNetmaskSpec($ip) + { + if (strpos($ip, '/') !== false) + { + list($addr, $nm) = explode('/', $ip); + } + else + { + $addr = $ip; + } + return $addr; + } + + /** + * Uncompresses an IPv6 address + * + * RFC 2373 allows you to compress zeros in an address to '::'. This + * function expects an valid IPv6 address and expands the '::' to + * the required zeros. + * + * Example: FF01::101 -> FF01:0:0:0:0:0:0:101 + * ::1 -> 0:0:0:0:0:0:0:1 + * + * @access public + * @static + * @param string $ip a valid IPv6-address (hex format) + * @return string the uncompressed IPv6-address (hex format) + */ + function Uncompress($ip) + { + $uip = SimplePie_Net_IPv6::removeNetmaskSpec($ip); + $c1 = -1; + $c2 = -1; + if (strpos($ip, '::') !== false) + { + list($ip1, $ip2) = explode('::', $ip); + if ($ip1 === '') + { + $c1 = -1; + } + else + { + $pos = 0; + if (($pos = substr_count($ip1, ':')) > 0) + { + $c1 = $pos; + } + else + { + $c1 = 0; + } + } + if ($ip2 === '') + { + $c2 = -1; + } + else + { + $pos = 0; + if (($pos = substr_count($ip2, ':')) > 0) + { + $c2 = $pos; + } + else + { + $c2 = 0; + } + } + if (strstr($ip2, '.')) + { + $c2++; + } + // :: + if ($c1 === -1 && $c2 === -1) + { + $uip = '0:0:0:0:0:0:0:0'; + } + // ::xxx + else if ($c1 === -1) + { + $fill = str_repeat('0:', 7 - $c2); + $uip = str_replace('::', $fill, $uip); + } + // xxx:: + else if ($c2 === -1) + { + $fill = str_repeat(':0', 7 - $c1); + $uip = str_replace('::', $fill, $uip); + } + // xxx::xxx + else + { + $fill = str_repeat(':0:', 6 - $c2 - $c1); + $uip = str_replace('::', $fill, $uip); + $uip = str_replace('::', ':', $uip); + } + } + return $uip; + } + + /** + * Splits an IPv6 address into the IPv6 and a possible IPv4 part + * + * RFC 2373 allows you to note the last two parts of an IPv6 address as + * an IPv4 compatible address + * + * Example: 0:0:0:0:0:0:13.1.68.3 + * 0:0:0:0:0:FFFF:129.144.52.38 + * + * @access public + * @static + * @param string $ip a valid IPv6-address (hex format) + * @return array [0] contains the IPv6 part, [1] the IPv4 part (hex format) + */ + function SplitV64($ip) + { + $ip = SimplePie_Net_IPv6::Uncompress($ip); + if (strstr($ip, '.')) + { + $pos = strrpos($ip, ':'); + $ip[$pos] = '_'; + $ipPart = explode('_', $ip); + return $ipPart; + } + else + { + return array($ip, ''); + } + } + + /** + * Checks an IPv6 address + * + * Checks if the given IP is IPv6-compatible + * + * @access public + * @static + * @param string $ip a valid IPv6-address + * @return bool true if $ip is an IPv6 address + */ + function checkIPv6($ip) + { + $ipPart = SimplePie_Net_IPv6::SplitV64($ip); + $count = 0; + if (!empty($ipPart[0])) + { + $ipv6 = explode(':', $ipPart[0]); + for ($i = 0; $i < count($ipv6); $i++) + { + $dec = hexdec($ipv6[$i]); + $hex = strtoupper(preg_replace('/^[0]{1,3}(.*[0-9a-fA-F])$/', '\\1', $ipv6[$i])); + if ($ipv6[$i] >= 0 && $dec <= 65535 && $hex === strtoupper(dechex($dec))) + { + $count++; + } + } + if ($count === 8) + { + return true; + } + elseif ($count === 6 && !empty($ipPart[1])) + { + $ipv4 = explode('.', $ipPart[1]); + $count = 0; + foreach ($ipv4 as $ipv4_part) + { + if ($ipv4_part >= 0 && $ipv4_part <= 255 && preg_match('/^\d{1,3}$/', $ipv4_part)) + { + $count++; + } + } + if ($count === 4) + { + return true; + } + } + else + { + return false; + } + + } + else + { + return false; + } + } +} + +/** + * Date Parser + * + * @package SimplePie + */ +class SimplePie_Parse_Date +{ + /** + * Input data + * + * @access protected + * @var string + */ + var $date; + + /** + * List of days, calendar day name => ordinal day number in the week + * + * @access protected + * @var array + */ + var $day = array( + // English + 'mon' => 1, + 'monday' => 1, + 'tue' => 2, + 'tuesday' => 2, + 'wed' => 3, + 'wednesday' => 3, + 'thu' => 4, + 'thursday' => 4, + 'fri' => 5, + 'friday' => 5, + 'sat' => 6, + 'saturday' => 6, + 'sun' => 7, + 'sunday' => 7, + // Dutch + 'maandag' => 1, + 'dinsdag' => 2, + 'woensdag' => 3, + 'donderdag' => 4, + 'vrijdag' => 5, + 'zaterdag' => 6, + 'zondag' => 7, + // French + 'lundi' => 1, + 'mardi' => 2, + 'mercredi' => 3, + 'jeudi' => 4, + 'vendredi' => 5, + 'samedi' => 6, + 'dimanche' => 7, + // German + 'montag' => 1, + 'dienstag' => 2, + 'mittwoch' => 3, + 'donnerstag' => 4, + 'freitag' => 5, + 'samstag' => 6, + 'sonnabend' => 6, + 'sonntag' => 7, + // Italian + 'lunedì' => 1, + 'martedì' => 2, + 'mercoledì' => 3, + 'giovedì' => 4, + 'venerdì' => 5, + 'sabato' => 6, + 'domenica' => 7, + // Spanish + 'lunes' => 1, + 'martes' => 2, + 'miércoles' => 3, + 'jueves' => 4, + 'viernes' => 5, + 'sábado' => 6, + 'domingo' => 7, + // Finnish + 'maanantai' => 1, + 'tiistai' => 2, + 'keskiviikko' => 3, + 'torstai' => 4, + 'perjantai' => 5, + 'lauantai' => 6, + 'sunnuntai' => 7, + // Hungarian + 'hétfő' => 1, + 'kedd' => 2, + 'szerda' => 3, + 'csütörtok' => 4, + 'péntek' => 5, + 'szombat' => 6, + 'vasárnap' => 7, + // Greek + 'Δευ' => 1, + 'Τρι' => 2, + 'Τετ' => 3, + 'Πεμ' => 4, + 'Παρ' => 5, + 'Σαβ' => 6, + 'Κυρ' => 7, + ); + + /** + * List of months, calendar month name => calendar month number + * + * @access protected + * @var array + */ + var $month = array( + // English + 'jan' => 1, + 'january' => 1, + 'feb' => 2, + 'february' => 2, + 'mar' => 3, + 'march' => 3, + 'apr' => 4, + 'april' => 4, + 'may' => 5, + // No long form of May + 'jun' => 6, + 'june' => 6, + 'jul' => 7, + 'july' => 7, + 'aug' => 8, + 'august' => 8, + 'sep' => 9, + 'september' => 8, + 'oct' => 10, + 'october' => 10, + 'nov' => 11, + 'november' => 11, + 'dec' => 12, + 'december' => 12, + // Dutch + 'januari' => 1, + 'februari' => 2, + 'maart' => 3, + 'april' => 4, + 'mei' => 5, + 'juni' => 6, + 'juli' => 7, + 'augustus' => 8, + 'september' => 9, + 'oktober' => 10, + 'november' => 11, + 'december' => 12, + // French + 'janvier' => 1, + 'février' => 2, + 'mars' => 3, + 'avril' => 4, + 'mai' => 5, + 'juin' => 6, + 'juillet' => 7, + 'août' => 8, + 'septembre' => 9, + 'octobre' => 10, + 'novembre' => 11, + 'décembre' => 12, + // German + 'januar' => 1, + 'februar' => 2, + 'märz' => 3, + 'april' => 4, + 'mai' => 5, + 'juni' => 6, + 'juli' => 7, + 'august' => 8, + 'september' => 9, + 'oktober' => 10, + 'november' => 11, + 'dezember' => 12, + // Italian + 'gennaio' => 1, + 'febbraio' => 2, + 'marzo' => 3, + 'aprile' => 4, + 'maggio' => 5, + 'giugno' => 6, + 'luglio' => 7, + 'agosto' => 8, + 'settembre' => 9, + 'ottobre' => 10, + 'novembre' => 11, + 'dicembre' => 12, + // Spanish + 'enero' => 1, + 'febrero' => 2, + 'marzo' => 3, + 'abril' => 4, + 'mayo' => 5, + 'junio' => 6, + 'julio' => 7, + 'agosto' => 8, + 'septiembre' => 9, + 'setiembre' => 9, + 'octubre' => 10, + 'noviembre' => 11, + 'diciembre' => 12, + // Finnish + 'tammikuu' => 1, + 'helmikuu' => 2, + 'maaliskuu' => 3, + 'huhtikuu' => 4, + 'toukokuu' => 5, + 'kesäkuu' => 6, + 'heinäkuu' => 7, + 'elokuu' => 8, + 'suuskuu' => 9, + 'lokakuu' => 10, + 'marras' => 11, + 'joulukuu' => 12, + // Hungarian + 'január' => 1, + 'február' => 2, + 'március' => 3, + 'április' => 4, + 'május' => 5, + 'június' => 6, + 'július' => 7, + 'augusztus' => 8, + 'szeptember' => 9, + 'október' => 10, + 'november' => 11, + 'december' => 12, + // Greek + 'Ιαν' => 1, + 'Φεβ' => 2, + 'Μάώ' => 3, + 'Μαώ' => 3, + 'Απρ' => 4, + 'Μάι' => 5, + 'Μαϊ' => 5, + 'Μαι' => 5, + 'Ιούν' => 6, + 'Ιον' => 6, + 'Ιούλ' => 7, + 'Ιολ' => 7, + 'Αύγ' => 8, + 'Αυγ' => 8, + 'Σεπ' => 9, + 'Οκτ' => 10, + 'Νοέ' => 11, + 'Δεκ' => 12, + ); + + /** + * List of timezones, abbreviation => offset from UTC + * + * @access protected + * @var array + */ + var $timezone = array( + 'ACDT' => 37800, + 'ACIT' => 28800, + 'ACST' => 34200, + 'ACT' => -18000, + 'ACWDT' => 35100, + 'ACWST' => 31500, + 'AEDT' => 39600, + 'AEST' => 36000, + 'AFT' => 16200, + 'AKDT' => -28800, + 'AKST' => -32400, + 'AMDT' => 18000, + 'AMT' => -14400, + 'ANAST' => 46800, + 'ANAT' => 43200, + 'ART' => -10800, + 'AZOST' => -3600, + 'AZST' => 18000, + 'AZT' => 14400, + 'BIOT' => 21600, + 'BIT' => -43200, + 'BOT' => -14400, + 'BRST' => -7200, + 'BRT' => -10800, + 'BST' => 3600, + 'BTT' => 21600, + 'CAST' => 18000, + 'CAT' => 7200, + 'CCT' => 23400, + 'CDT' => -18000, + 'CEDT' => 7200, + 'CET' => 3600, + 'CGST' => -7200, + 'CGT' => -10800, + 'CHADT' => 49500, + 'CHAST' => 45900, + 'CIST' => -28800, + 'CKT' => -36000, + 'CLDT' => -10800, + 'CLST' => -14400, + 'COT' => -18000, + 'CST' => -21600, + 'CVT' => -3600, + 'CXT' => 25200, + 'DAVT' => 25200, + 'DTAT' => 36000, + 'EADT' => -18000, + 'EAST' => -21600, + 'EAT' => 10800, + 'ECT' => -18000, + 'EDT' => -14400, + 'EEST' => 10800, + 'EET' => 7200, + 'EGT' => -3600, + 'EKST' => 21600, + 'EST' => -18000, + 'FJT' => 43200, + 'FKDT' => -10800, + 'FKST' => -14400, + 'FNT' => -7200, + 'GALT' => -21600, + 'GEDT' => 14400, + 'GEST' => 10800, + 'GFT' => -10800, + 'GILT' => 43200, + 'GIT' => -32400, + 'GST' => 14400, + 'GST' => -7200, + 'GYT' => -14400, + 'HAA' => -10800, + 'HAC' => -18000, + 'HADT' => -32400, + 'HAE' => -14400, + 'HAP' => -25200, + 'HAR' => -21600, + 'HAST' => -36000, + 'HAT' => -9000, + 'HAY' => -28800, + 'HKST' => 28800, + 'HMT' => 18000, + 'HNA' => -14400, + 'HNC' => -21600, + 'HNE' => -18000, + 'HNP' => -28800, + 'HNR' => -25200, + 'HNT' => -12600, + 'HNY' => -32400, + 'IRDT' => 16200, + 'IRKST' => 32400, + 'IRKT' => 28800, + 'IRST' => 12600, + 'JFDT' => -10800, + 'JFST' => -14400, + 'JST' => 32400, + 'KGST' => 21600, + 'KGT' => 18000, + 'KOST' => 39600, + 'KOVST' => 28800, + 'KOVT' => 25200, + 'KRAST' => 28800, + 'KRAT' => 25200, + 'KST' => 32400, + 'LHDT' => 39600, + 'LHST' => 37800, + 'LINT' => 50400, + 'LKT' => 21600, + 'MAGST' => 43200, + 'MAGT' => 39600, + 'MAWT' => 21600, + 'MDT' => -21600, + 'MESZ' => 7200, + 'MEZ' => 3600, + 'MHT' => 43200, + 'MIT' => -34200, + 'MNST' => 32400, + 'MSDT' => 14400, + 'MSST' => 10800, + 'MST' => -25200, + 'MUT' => 14400, + 'MVT' => 18000, + 'MYT' => 28800, + 'NCT' => 39600, + 'NDT' => -9000, + 'NFT' => 41400, + 'NMIT' => 36000, + 'NOVST' => 25200, + 'NOVT' => 21600, + 'NPT' => 20700, + 'NRT' => 43200, + 'NST' => -12600, + 'NUT' => -39600, + 'NZDT' => 46800, + 'NZST' => 43200, + 'OMSST' => 25200, + 'OMST' => 21600, + 'PDT' => -25200, + 'PET' => -18000, + 'PETST' => 46800, + 'PETT' => 43200, + 'PGT' => 36000, + 'PHOT' => 46800, + 'PHT' => 28800, + 'PKT' => 18000, + 'PMDT' => -7200, + 'PMST' => -10800, + 'PONT' => 39600, + 'PST' => -28800, + 'PWT' => 32400, + 'PYST' => -10800, + 'PYT' => -14400, + 'RET' => 14400, + 'ROTT' => -10800, + 'SAMST' => 18000, + 'SAMT' => 14400, + 'SAST' => 7200, + 'SBT' => 39600, + 'SCDT' => 46800, + 'SCST' => 43200, + 'SCT' => 14400, + 'SEST' => 3600, + 'SGT' => 28800, + 'SIT' => 28800, + 'SRT' => -10800, + 'SST' => -39600, + 'SYST' => 10800, + 'SYT' => 7200, + 'TFT' => 18000, + 'THAT' => -36000, + 'TJT' => 18000, + 'TKT' => -36000, + 'TMT' => 18000, + 'TOT' => 46800, + 'TPT' => 32400, + 'TRUT' => 36000, + 'TVT' => 43200, + 'TWT' => 28800, + 'UYST' => -7200, + 'UYT' => -10800, + 'UZT' => 18000, + 'VET' => -14400, + 'VLAST' => 39600, + 'VLAT' => 36000, + 'VOST' => 21600, + 'VUT' => 39600, + 'WAST' => 7200, + 'WAT' => 3600, + 'WDT' => 32400, + 'WEST' => 3600, + 'WFT' => 43200, + 'WIB' => 25200, + 'WIT' => 32400, + 'WITA' => 28800, + 'WKST' => 18000, + 'WST' => 28800, + 'YAKST' => 36000, + 'YAKT' => 32400, + 'YAPT' => 36000, + 'YEKST' => 21600, + 'YEKT' => 18000, + ); + + /** + * Cached PCRE for SimplePie_Parse_Date::$day + * + * @access protected + * @var string + */ + var $day_pcre; + + /** + * Cached PCRE for SimplePie_Parse_Date::$month + * + * @access protected + * @var string + */ + var $month_pcre; + + /** + * Array of user-added callback methods + * + * @access private + * @var array + */ + var $built_in = array(); + + /** + * Array of user-added callback methods + * + * @access private + * @var array + */ + var $user = array(); + + /** + * Create new SimplePie_Parse_Date object, and set self::day_pcre, + * self::month_pcre, and self::built_in + * + * @access private + */ + function SimplePie_Parse_Date() + { + $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')'; + $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')'; + + static $cache; + if (!isset($cache[get_class($this)])) + { + $all_methods = get_class_methods($this); + + foreach ($all_methods as $method) + { + if (strtolower(substr($method, 0, 5)) === 'date_') + { + $cache[get_class($this)][] = $method; + } + } + } + + foreach ($cache[get_class($this)] as $method) + { + $this->built_in[] = $method; + } + } + + /** + * Get the object + * + * @access public + */ + function get() + { + static $object; + if (!$object) + { + $object = new SimplePie_Parse_Date; + } + return $object; + } + + /** + * Parse a date + * + * @final + * @access public + * @param string $date Date to parse + * @return int Timestamp corresponding to date string, or false on failure + */ + function parse($date) + { + foreach ($this->user as $method) + { + if (($returned = call_user_func($method, $date)) !== false) + { + return $returned; + } + } + + foreach ($this->built_in as $method) + { + if (($returned = call_user_func(array(&$this, $method), $date)) !== false) + { + return $returned; + } + } + + return false; + } + + /** + * Add a callback method to parse a date + * + * @final + * @access public + * @param callback $callback + */ + function add_callback($callback) + { + if (is_callable($callback)) + { + $this->user[] = $callback; + } + else + { + trigger_error('User-supplied function must be a valid callback', E_USER_WARNING); + } + } + + /** + * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as + * well as allowing any of upper or lower case "T", horizontal tabs, or + * spaces to be used as the time seperator (including more than one)) + * + * @access protected + * @return int Timestamp + */ + function date_w3cdtf($date) + { + static $pcre; + if (!$pcre) + { + $year = '([0-9]{4})'; + $month = $day = $hour = $minute = $second = '([0-9]{2})'; + $decimal = '([0-9]*)'; + $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))'; + $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/'; + } + if (preg_match($pcre, $date, $match)) + { + /* + Capturing subpatterns: + 1: Year + 2: Month + 3: Day + 4: Hour + 5: Minute + 6: Second + 7: Decimal fraction of a second + 8: Zulu + 9: Timezone ± + 10: Timezone hours + 11: Timezone minutes + */ + + // Fill in empty matches + for ($i = count($match); $i <= 3; $i++) + { + $match[$i] = '1'; + } + + for ($i = count($match); $i <= 7; $i++) + { + $match[$i] = '0'; + } + + // Numeric timezone + if (isset($match[9]) && $match[9] !== '') + { + $timezone = $match[10] * 3600; + $timezone += $match[11] * 60; + if ($match[9] === '-') + { + $timezone = 0 - $timezone; + } + } + else + { + $timezone = 0; + } + + // Convert the number of seconds to an integer, taking decimals into account + $second = round($match[6] + $match[7] / pow(10, strlen($match[7]))); + + return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone; + } + else + { + return false; + } + } + + /** + * Remove RFC822 comments + * + * @access protected + * @param string $data Data to strip comments from + * @return string Comment stripped string + */ + function remove_rfc2822_comments($string) + { + $string = (string) $string; + $position = 0; + $length = strlen($string); + $depth = 0; + + $output = ''; + + while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) + { + $output .= substr($string, $position, $pos - $position); + $position = $pos + 1; + if ($string[$pos - 1] !== '\\') + { + $depth++; + while ($depth && $position < $length) + { + $position += strcspn($string, '()', $position); + if ($string[$position - 1] === '\\') + { + $position++; + continue; + } + elseif (isset($string[$position])) + { + switch ($string[$position]) + { + case '(': + $depth++; + break; + + case ')': + $depth--; + break; + } + $position++; + } + else + { + break; + } + } + } + else + { + $output .= '('; + } + } + $output .= substr($string, $position); + + return $output; + } + + /** + * Parse RFC2822's date format + * + * @access protected + * @return int Timestamp + */ + function date_rfc2822($date) + { + static $pcre; + if (!$pcre) + { + $wsp = '[\x09\x20]'; + $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)'; + $optional_fws = $fws . '?'; + $day_name = $this->day_pcre; + $month = $this->month_pcre; + $day = '([0-9]{1,2})'; + $hour = $minute = $second = '([0-9]{2})'; + $year = '([0-9]{2,4})'; + $num_zone = '([+\-])([0-9]{2})([0-9]{2})'; + $character_zone = '([A-Z]{1,5})'; + $zone = '(?:' . $num_zone . '|' . $character_zone . ')'; + $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i'; + } + if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match)) + { + /* + Capturing subpatterns: + 1: Day name + 2: Day + 3: Month + 4: Year + 5: Hour + 6: Minute + 7: Second + 8: Timezone ± + 9: Timezone hours + 10: Timezone minutes + 11: Alphabetic timezone + */ + + // Find the month number + $month = $this->month[strtolower($match[3])]; + + // Numeric timezone + if ($match[8] !== '') + { + $timezone = $match[9] * 3600; + $timezone += $match[10] * 60; + if ($match[8] === '-') + { + $timezone = 0 - $timezone; + } + } + // Character timezone + elseif (isset($this->timezone[strtoupper($match[11])])) + { + $timezone = $this->timezone[strtoupper($match[11])]; + } + // Assume everything else to be -0000 + else + { + $timezone = 0; + } + + // Deal with 2/3 digit years + if ($match[4] < 50) + { + $match[4] += 2000; + } + elseif ($match[4] < 1000) + { + $match[4] += 1900; + } + + // Second is optional, if it is empty set it to zero + if ($match[7] !== '') + { + $second = $match[7]; + } + else + { + $second = 0; + } + + return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone; + } + else + { + return false; + } + } + + /** + * Parse RFC850's date format + * + * @access protected + * @return int Timestamp + */ + function date_rfc850($date) + { + static $pcre; + if (!$pcre) + { + $space = '[\x09\x20]+'; + $day_name = $this->day_pcre; + $month = $this->month_pcre; + $day = '([0-9]{1,2})'; + $year = $hour = $minute = $second = '([0-9]{2})'; + $zone = '([A-Z]{1,5})'; + $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i'; + } + if (preg_match($pcre, $date, $match)) + { + /* + Capturing subpatterns: + 1: Day name + 2: Day + 3: Month + 4: Year + 5: Hour + 6: Minute + 7: Second + 8: Timezone + */ + + // Month + $month = $this->month[strtolower($match[3])]; + + // Character timezone + if (isset($this->timezone[strtoupper($match[8])])) + { + $timezone = $this->timezone[strtoupper($match[8])]; + } + // Assume everything else to be -0000 + else + { + $timezone = 0; + } + + // Deal with 2 digit year + if ($match[4] < 50) + { + $match[4] += 2000; + } + else + { + $match[4] += 1900; + } + + return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone; + } + else + { + return false; + } + } + + /** + * Parse C99's asctime()'s date format + * + * @access protected + * @return int Timestamp + */ + function date_asctime($date) + { + static $pcre; + if (!$pcre) + { + $space = '[\x09\x20]+'; + $wday_name = $this->day_pcre; + $mon_name = $this->month_pcre; + $day = '([0-9]{1,2})'; + $hour = $sec = $min = '([0-9]{2})'; + $year = '([0-9]{4})'; + $terminator = '\x0A?\x00?'; + $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i'; + } + if (preg_match($pcre, $date, $match)) + { + /* + Capturing subpatterns: + 1: Day name + 2: Month + 3: Day + 4: Hour + 5: Minute + 6: Second + 7: Year + */ + + $month = $this->month[strtolower($match[2])]; + return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]); + } + else + { + return false; + } + } + + /** + * Parse dates using strtotime() + * + * @access protected + * @return int Timestamp + */ + function date_strtotime($date) + { + $strtotime = strtotime($date); + if ($strtotime === -1 || $strtotime === false) + { + return false; + } + else + { + return $strtotime; + } + } +} + +/** + * Content-type sniffing + * + * @package SimplePie + */ +class SimplePie_Content_Type_Sniffer +{ + /** + * File object + * + * @var SimplePie_File + * @access private + */ + var $file; + + /** + * Create an instance of the class with the input file + * + * @access public + * @param SimplePie_Content_Type_Sniffer $file Input file + */ + function SimplePie_Content_Type_Sniffer($file) + { + $this->file = $file; + } + + /** + * Get the Content-Type of the specified file + * + * @access public + * @return string Actual Content-Type + */ + function get_type() + { + if (isset($this->file->headers['content-type'])) + { + if (!isset($this->file->headers['content-encoding']) + && ($this->file->headers['content-type'] === 'text/plain' + || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1' + || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1')) + { + return $this->text_or_binary(); + } + + if (($pos = strpos($this->file->headers['content-type'], ';')) !== false) + { + $official = substr($this->file->headers['content-type'], 0, $pos); + } + else + { + $official = $this->file->headers['content-type']; + } + $official = strtolower($official); + + if ($official === 'unknown/unknown' + || $official === 'application/unknown') + { + return $this->unknown(); + } + elseif (substr($official, -4) === '+xml' + || $official === 'text/xml' + || $official === 'application/xml') + { + return $official; + } + elseif (substr($official, 0, 6) === 'image/') + { + if ($return = $this->image()) + { + return $return; + } + else + { + return $official; + } + } + elseif ($official === 'text/html') + { + return $this->feed_or_html(); + } + else + { + return $official; + } + } + else + { + return $this->unknown(); + } + } + + /** + * Sniff text or binary + * + * @access private + * @return string Actual Content-Type + */ + function text_or_binary() + { + if (substr($this->file->body, 0, 2) === "\xFE\xFF" + || substr($this->file->body, 0, 2) === "\xFF\xFE" + || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF" + || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF") + { + return 'text/plain'; + } + elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body)) + { + return 'application/octect-stream'; + } + else + { + return 'text/plain'; + } + } + + /** + * Sniff unknown + * + * @access private + * @return string Actual Content-Type + */ + function unknown() + { + $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20"); + if (strtolower(substr($this->file->body, $ws, 14)) === '<!doctype html' + || strtolower(substr($this->file->body, $ws, 5)) === '<html' + || strtolower(substr($this->file->body, $ws, 7)) === '<script') + { + return 'text/html'; + } + elseif (substr($this->file->body, 0, 5) === '%PDF-') + { + return 'application/pdf'; + } + elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-') + { + return 'application/postscript'; + } + elseif (substr($this->file->body, 0, 6) === 'GIF87a' + || substr($this->file->body, 0, 6) === 'GIF89a') + { + return 'image/gif'; + } + elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") + { + return 'image/png'; + } + elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") + { + return 'image/jpeg'; + } + elseif (substr($this->file->body, 0, 2) === "\x42\x4D") + { + return 'image/bmp'; + } + else + { + return $this->text_or_binary(); + } + } + + /** + * Sniff images + * + * @access private + * @return string Actual Content-Type + */ + function image() + { + if (substr($this->file->body, 0, 6) === 'GIF87a' + || substr($this->file->body, 0, 6) === 'GIF89a') + { + return 'image/gif'; + } + elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") + { + return 'image/png'; + } + elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") + { + return 'image/jpeg'; + } + elseif (substr($this->file->body, 0, 2) === "\x42\x4D") + { + return 'image/bmp'; + } + else + { + return false; + } + } + + /** + * Sniff HTML + * + * @access private + * @return string Actual Content-Type + */ + function feed_or_html() + { + $len = strlen($this->file->body); + $pos = strspn($this->file->body, "\x09\x0A\x0D\x20"); + + while ($pos < $len) + { + switch ($this->file->body[$pos]) + { + case "\x09": + case "\x0A": + case "\x0D": + case "\x20": + $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos); + continue 2; + + case '<': + $pos++; + break; + + default: + return 'text/html'; + } + + if (substr($this->file->body, $pos, 3) === '!--') + { + $pos += 3; + if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false) + { + $pos += 3; + } + else + { + return 'text/html'; + } + } + elseif (substr($this->file->body, $pos, 1) === '!') + { + if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false) + { + $pos++; + } + else + { + return 'text/html'; + } + } + elseif (substr($this->file->body, $pos, 1) === '?') + { + if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false) + { + $pos += 2; + } + else + { + return 'text/html'; + } + } + elseif (substr($this->file->body, $pos, 3) === 'rss' + || substr($this->file->body, $pos, 7) === 'rdf:RDF') + { + return 'application/rss+xml'; + } + elseif (substr($this->file->body, $pos, 4) === 'feed') + { + return 'application/atom+xml'; + } + else + { + return 'text/html'; + } + } + + return 'text/html'; + } +} + +/** + * Parses the XML Declaration + * + * @package SimplePie + */ +class SimplePie_XML_Declaration_Parser +{ + /** + * XML Version + * + * @access public + * @var string + */ + var $version = '1.0'; + + /** + * Encoding + * + * @access public + * @var string + */ + var $encoding = 'UTF-8'; + + /** + * Standalone + * + * @access public + * @var bool + */ + var $standalone = false; + + /** + * Current state of the state machine + * + * @access private + * @var string + */ + var $state = 'before_version_name'; + + /** + * Input data + * + * @access private + * @var string + */ + var $data = ''; + + /** + * Input data length (to avoid calling strlen() everytime this is needed) + * + * @access private + * @var int + */ + var $data_length = 0; + + /** + * Current position of the pointer + * + * @var int + * @access private + */ + var $position = 0; + + /** + * Create an instance of the class with the input data + * + * @access public + * @param string $data Input data + */ + function SimplePie_XML_Declaration_Parser($data) + { + $this->data = $data; + $this->data_length = strlen($this->data); + } + + /** + * Parse the input data + * + * @access public + * @return bool true on success, false on failure + */ + function parse() + { + while ($this->state && $this->state !== 'emit' && $this->has_data()) + { + $state = $this->state; + $this->$state(); + } + $this->data = ''; + if ($this->state === 'emit') + { + return true; + } + else + { + $this->version = ''; + $this->encoding = ''; + $this->standalone = ''; + return false; + } + } + + /** + * Check whether there is data beyond the pointer + * + * @access private + * @return bool true if there is further data, false if not + */ + function has_data() + { + return (bool) ($this->position < $this->data_length); + } + + /** + * Advance past any whitespace + * + * @return int Number of whitespace characters passed + */ + function skip_whitespace() + { + $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position); + $this->position += $whitespace; + return $whitespace; + } + + /** + * Read value + */ + function get_value() + { + $quote = substr($this->data, $this->position, 1); + if ($quote === '"' || $quote === "'") + { + $this->position++; + $len = strcspn($this->data, $quote, $this->position); + if ($this->has_data()) + { + $value = substr($this->data, $this->position, $len); + $this->position += $len + 1; + return $value; + } + } + return false; + } + + function before_version_name() + { + if ($this->skip_whitespace()) + { + $this->state = 'version_name'; + } + else + { + $this->state = false; + } + } + + function version_name() + { + if (substr($this->data, $this->position, 7) === 'version') + { + $this->position += 7; + $this->skip_whitespace(); + $this->state = 'version_equals'; + } + else + { + $this->state = false; + } + } + + function version_equals() + { + if (substr($this->data, $this->position, 1) === '=') + { + $this->position++; + $this->skip_whitespace(); + $this->state = 'version_value'; + } + else + { + $this->state = false; + } + } + + function version_value() + { + if ($this->version = $this->get_value()) + { + $this->skip_whitespace(); + if ($this->has_data()) + { + $this->state = 'encoding_name'; + } + else + { + $this->state = 'emit'; + } + } + else + { + $this->state = false; + } + } + + function encoding_name() + { + if (substr($this->data, $this->position, 8) === 'encoding') + { + $this->position += 8; + $this->skip_whitespace(); + $this->state = 'encoding_equals'; + } + else + { + $this->state = 'standalone_name'; + } + } + + function encoding_equals() + { + if (substr($this->data, $this->position, 1) === '=') + { + $this->position++; + $this->skip_whitespace(); + $this->state = 'encoding_value'; + } + else + { + $this->state = false; + } + } + + function encoding_value() + { + if ($this->encoding = $this->get_value()) + { + $this->skip_whitespace(); + if ($this->has_data()) + { + $this->state = 'standalone_name'; + } + else + { + $this->state = 'emit'; + } + } + else + { + $this->state = false; + } + } + + function standalone_name() + { + if (substr($this->data, $this->position, 10) === 'standalone') + { + $this->position += 10; + $this->skip_whitespace(); + $this->state = 'standalone_equals'; + } + else + { + $this->state = false; + } + } + + function standalone_equals() + { + if (substr($this->data, $this->position, 1) === '=') + { + $this->position++; + $this->skip_whitespace(); + $this->state = 'standalone_value'; + } + else + { + $this->state = false; + } + } + + function standalone_value() + { + if ($standalone = $this->get_value()) + { + switch ($standalone) + { + case 'yes': + $this->standalone = true; + break; + + case 'no': + $this->standalone = false; + break; + + default: + $this->state = false; + return; + } + + $this->skip_whitespace(); + if ($this->has_data()) + { + $this->state = false; + } + else + { + $this->state = 'emit'; + } + } + else + { + $this->state = false; + } + } +} + class SimplePie_Locator { var $useragent; @@ -10005,23 +14084,34 @@ class SimplePie_Locator var $base_location = 0; var $checked_feeds = 0; var $max_checked_feeds = 10; + var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer'; - function SimplePie_Locator(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10) + function SimplePie_Locator(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10, $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer') { $this->file =& $file; $this->file_class = $file_class; $this->useragent = $useragent; $this->timeout = $timeout; $this->max_checked_feeds = $max_checked_feeds; + $this->content_type_sniffer_class = $content_type_sniffer_class; } - function find($type = SIMPLEPIE_LOCATOR_ALL) + function find($type = SIMPLEPIE_LOCATOR_ALL, &$working) { if ($this->is_feed($this->file)) { return $this->file; } + if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) + { + $sniffer = new $this->content_type_sniffer_class($this->file); + if ($sniffer->get_type() !== 'text/html') + { + return null; + } + } + if ($type & ~SIMPLEPIE_LOCATOR_NONE) { $this->get_base(); @@ -10029,7 +14119,7 @@ class SimplePie_Locator if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery()) { - return $working; + return $working[0]; } if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links()) @@ -10059,24 +14149,32 @@ class SimplePie_Locator function is_feed(&$file) { - $body = SimplePie_Misc::strip_comments($file->body); - if (preg_match('/<([^\s:]+:)?(rss|RDF|feed)' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/i', $body)) + if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) { - return true; + $sniffer = new $this->content_type_sniffer_class($file); + $sniffed = $sniffer->get_type(); + if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml'))) + { + return true; + } + else + { + return false; + } } - return false; - } - - function get_base() - { - if (isset($this->file->headers['content-location'])) + elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL) { - $this->http_base = SimplePie_Misc::absolutize_url(trim($this->file->headers['content-location']), $this->file->url); + return true; } else { - $this->http_base = $this->file->url; + return false; } + } + + function get_base() + { + $this->http_base = $this->file->url; $this->base = $this->http_base; $elements = SimplePie_Misc::get_element('base', $this->file->body); foreach ($elements as $element) @@ -10094,9 +14192,10 @@ class SimplePie_Locator { $links = array_merge(SimplePie_Misc::get_element('link', $this->file->body), SimplePie_Misc::get_element('a', $this->file->body), SimplePie_Misc::get_element('area', $this->file->body)); $done = array(); + $feeds = array(); foreach ($links as $link) { - if ($this->checked_feeds == $this->max_checked_feeds) + if ($this->checked_feeds === $this->max_checked_feeds) { break; } @@ -10113,19 +14212,26 @@ class SimplePie_Locator $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base); } - if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !empty($link['attribs']['type']['data']) && in_array(strtolower(SimplePie_Misc::parse_mime($link['attribs']['type']['data'])), array('application/rss+xml', 'application/atom+xml')))) + if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !empty($link['attribs']['type']['data']) && in_array(strtolower(SimplePie_Misc::parse_mime($link['attribs']['type']['data'])), array('application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href])) { $this->checked_feeds++; $feed = new $this->file_class($href, $this->timeout, 5, null, $this->useragent); - if ($this->is_feed($feed)) + if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) { - return $feed; + $feeds[$href] = $feed; } } $done[] = $href; } } - return null; + + if (!empty($feeds)) + { + return array_values($feeds); + } + else { + return null; + } } function get_links() @@ -10150,7 +14256,7 @@ class SimplePie_Locator $current = SimplePie_Misc::parse_url($this->file->url); - if ($parsed['authority'] === '' || $parsed['authority'] == $current['authority']) + if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority']) { $this->local[] = $href; } @@ -10174,7 +14280,7 @@ class SimplePie_Locator { foreach ($array as $key => $value) { - if ($this->checked_feeds == $this->max_checked_feeds) + if ($this->checked_feeds === $this->max_checked_feeds) { break; } @@ -10182,7 +14288,7 @@ class SimplePie_Locator { $this->checked_feeds++; $feed = new $this->file_class($value, $this->timeout, 5, null, $this->useragent); - if ($this->is_feed($feed)) + if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) { return $feed; } @@ -10199,7 +14305,7 @@ class SimplePie_Locator { foreach ($array as $key => $value) { - if ($this->checked_feeds == $this->max_checked_feeds) + if ($this->checked_feeds === $this->max_checked_feeds) { break; } @@ -10207,7 +14313,7 @@ class SimplePie_Locator { $this->checked_feeds++; $feed = new $this->file_class($value, $this->timeout, 5, null, $this->useragent); - if ($this->is_feed($feed)) + if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) { return $feed; } @@ -10223,14 +14329,12 @@ class SimplePie_Locator class SimplePie_Parser { - var $xml; var $error_code; var $error_string; var $current_line; var $current_column; var $current_byte; var $separator = ' '; - var $feed = false; var $namespace = array(''); var $element = array(''); var $xml_base = array(''); @@ -10241,10 +14345,10 @@ class SimplePie_Parser var $current_xhtml_construct = -1; var $encoding; - function pre_process(&$data, $encoding) + function parse(&$data, $encoding) { // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character - if (strtoupper($encoding) == 'US-ASCII') + if (strtoupper($encoding) === 'US-ASCII') { $this->encoding = 'UTF-8'; } @@ -10255,68 +14359,150 @@ class SimplePie_Parser // Strip BOM: // UTF-32 Big Endian BOM - if (strpos($data, "\x0\x0\xFE\xFF") === 0) + if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") { $data = substr($data, 4); } // UTF-32 Little Endian BOM - elseif (strpos($data, "\xFF\xFE\x0\x0") === 0) + elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") { $data = substr($data, 4); } // UTF-16 Big Endian BOM - elseif (strpos($data, "\xFE\xFF") === 0) + elseif (substr($data, 0, 2) === "\xFE\xFF") { $data = substr($data, 2); } // UTF-16 Little Endian BOM - elseif (strpos($data, "\xFF\xFE") === 0) + elseif (substr($data, 0, 2) === "\xFF\xFE") { $data = substr($data, 2); } // UTF-8 BOM - elseif (strpos($data, "\xEF\xBB\xBF") === 0) + elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") { $data = substr($data, 3); } - // Make sure the XML prolog is sane and has the correct encoding - $data = preg_replace("/^<\?xml[\x20\x9\xD\xA]+version([\x20\x9\xD\xA]+)?=([\x20\x9\xD\xA]+)?(\"1.0\"|'1.0'|\"1.1\"|'1.1')([\x20\x9\xD\xA]+encoding([\x20\x9\xD\xA]+)?=([\x20\x9\xD\xA]+)?(\"[A-Za-z][A-Za-z0-9._\-]*\"|'[A-Za-z][A-Za-z0-9._\-]*'))?([\x20\x9\xD\xA]+standalone([\x20\x9\xD\xA]+)?=([\x20\x9\xD\xA]+)?(\"(yes|no)\"|'(yes|no)'))?([\x20\x9\xD\xA]+)?\?>/", '', $data); - $data = "<?xml version='1.0' encoding='$encoding'?>\n" . $data; - } + if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false) + { + $declaration = new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5)); + if ($declaration->parse()) + { + $data = substr($data, $pos + 2); + $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data; + } + else + { + $this->error_string = 'SimplePie bug! Please report this!'; + return false; + } + } - function parse(&$data) - { $return = true; + static $xml_is_sane = null; + if ($xml_is_sane === null) + { + $parser_check = xml_parser_create(); + xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); + xml_parser_free($parser_check); + $xml_is_sane = isset($values[0]['value']); + } + // Create the parser - $this->xml = xml_parser_create_ns($this->encoding, $this->separator); - xml_parser_set_option($this->xml, XML_OPTION_SKIP_WHITE, 1); - xml_parser_set_option($this->xml, XML_OPTION_CASE_FOLDING, 0); - xml_set_object($this->xml, $this); - xml_set_character_data_handler($this->xml, 'cdata'); - xml_set_element_handler($this->xml, 'tag_open', 'tag_close'); - - // workound for a bug in PHP/libxml2 as described on http://bugs.simplepie.org/issues/show/101 - $data = str_replace('<', '<', $data); - $data = str_replace('>', '>', $data); - $data = str_replace('&', '&', $data); - $data = str_replace(''', ''', $data); - $data = str_replace('"', '"', $data); - - // Parse! - if (!xml_parse($this->xml, $data, true)) - { - $this->data = null; - $this->error_code = xml_get_error_code($this->xml); - $this->error_string = xml_error_string($this->error_code); - $return = false; - } - $this->current_line = xml_get_current_line_number($this->xml); - $this->current_column = xml_get_current_column_number($this->xml); - $this->current_byte = xml_get_current_byte_index($this->xml); - xml_parser_free($this->xml); - return $return; + if ($xml_is_sane) + { + $xml = xml_parser_create_ns($this->encoding, $this->separator); + xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0); + xml_set_object($xml, $this); + xml_set_character_data_handler($xml, 'cdata'); + xml_set_element_handler($xml, 'tag_open', 'tag_close'); + + // Parse! + if (!xml_parse($xml, $data, true)) + { + $this->error_code = xml_get_error_code($xml); + $this->error_string = xml_error_string($this->error_code); + $return = false; + } + $this->current_line = xml_get_current_line_number($xml); + $this->current_column = xml_get_current_column_number($xml); + $this->current_byte = xml_get_current_byte_index($xml); + xml_parser_free($xml); + return $return; + } + else + { + libxml_clear_errors(); + $xml = new XMLReader(); + $xml->xml($data); + while (@$xml->read()) + { + switch ($xml->nodeType) + { + + case constant('XMLReader::END_ELEMENT'): + if ($xml->namespaceURI !== '') + { + $tagName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}"; + } + else + { + $tagName = $xml->localName; + } + $this->tag_close(null, $tagName); + break; + case constant('XMLReader::ELEMENT'): + $empty = $xml->isEmptyElement; + if ($xml->namespaceURI !== '') + { + $tagName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}"; + } + else + { + $tagName = $xml->localName; + } + $attributes = array(); + while ($xml->moveToNextAttribute()) + { + if ($xml->namespaceURI !== '') + { + $attrName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}"; + } + else + { + $attrName = $xml->localName; + } + $attributes[$attrName] = $xml->value; + } + $this->tag_open(null, $tagName, $attributes); + if ($empty) + { + $this->tag_close(null, $tagName); + } + break; + case constant('XMLReader::TEXT'): + + case constant('XMLReader::CDATA'): + $this->cdata(null, $xml->value); + break; + } + } + if ($error = libxml_get_last_error()) + { + $this->error_code = $error->code; + $this->error_string = $error->message; + $this->current_line = $error->line; + $this->current_column = $error->column; + return false; + } + else + { + return true; + } + } } function get_error_code() @@ -10351,27 +14537,6 @@ class SimplePie_Parser function tag_open($parser, $tag, $attributes) { - if ($this->feed === 0) - { - return; - } - elseif ($this->feed == false) - { - if (in_array($tag, array( - SIMPLEPIE_NAMESPACE_ATOM_10 . $this->separator . 'feed', - SIMPLEPIE_NAMESPACE_ATOM_03 . $this->separator . 'feed', - 'rss', - SIMPLEPIE_NAMESPACE_RDF . $this->separator . 'RDF' - ))) - { - $this->feed = 1; - } - } - else - { - $this->feed++; - } - list($this->namespace[], $this->element[]) = $this->split_ns($tag); $attribs = array(); @@ -10404,7 +14569,7 @@ class SimplePie_Parser if ($this->current_xhtml_construct >= 0) { $this->current_xhtml_construct++; - if (end($this->namespace) == SIMPLEPIE_NAMESPACE_XHTML) + if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML) { $this->data['data'] .= '<' . end($this->element); if (isset($attribs[''])) @@ -10422,8 +14587,8 @@ class SimplePie_Parser $this->datas[] =& $this->data; $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][]; $this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang)); - if ((end($this->namespace) == SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] == 'xml') - || (end($this->namespace) == SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] == 'xhtml')) + if ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml') + || (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml')) { $this->current_xhtml_construct = 0; } @@ -10436,7 +14601,7 @@ class SimplePie_Parser { $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding); } - elseif ($this->feed > 1) + else { $this->data['data'] .= $cdata; } @@ -10444,22 +14609,17 @@ class SimplePie_Parser function tag_close($parser, $tag) { - if (!$this->feed) - { - return; - } - if ($this->current_xhtml_construct >= 0) { $this->current_xhtml_construct--; - if (end($this->namespace) == SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param'))) + if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param'))) { $this->data['data'] .= '</' . end($this->element) . '>'; } } - if ($this->current_xhtml_construct == -1) + if ($this->current_xhtml_construct === -1) { - $this->data =& $this->datas[$this->feed]; + $this->data =& $this->datas[count($this->datas) - 1]; array_pop($this->datas); } @@ -10468,7 +14628,6 @@ class SimplePie_Parser array_pop($this->xml_base); array_pop($this->xml_base_explicit); array_pop($this->xml_lang); - $this->feed--; } function split_ns($string) @@ -10483,7 +14642,19 @@ class SimplePie_Parser { $separator_length = strlen($this->separator); } - $cache[$string] = array(substr($string, 0, $pos), substr($string, $pos + $separator_length)); + $namespace = substr($string, 0, $pos); + $local_name = substr($string, $pos + $separator_length); + if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES) + { + $namespace = SIMPLEPIE_NAMESPACE_ITUNES; + } + + // Normalize the Media RSS namespaces + if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG) + { + $namespace = SIMPLEPIE_NAMESPACE_MEDIARSS; + } + $cache[$string] = array($namespace, $local_name); } else { @@ -10495,7 +14666,7 @@ class SimplePie_Parser } /** - * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shortern a string while preserving HTML tags + * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags */ class SimplePie_Sanitize { @@ -10667,7 +14838,7 @@ class SimplePie_Sanitize { if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML) { - if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/(\w+)' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data)) + if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data)) { $type |= SIMPLEPIE_CONSTRUCT_HTML; } @@ -10722,9 +14893,7 @@ class SimplePie_Sanitize { foreach ($this->strip_attributes as $attrib) { - $data = preg_replace('/ '. trim($attrib) .'=("|")(\w|\s|=|-|:|;|\/|\.|\?|&|,|#|!|\(|\)|\'|'|<|>|\+|{|})*("|")/i', '', $data); - $data = preg_replace('/ '. trim($attrib) .'=(\'|')(\w|\s|=|-|:|;|\/|\.|\?|&|,|#|!|\(|\)|"|"|<|>|\+|{|})*(\'|')/i', '', $data); - $data = preg_replace('/ '. trim($attrib) .'=(\w|\s|=|-|:|;|\/|\.|\?|&|,|#|!|\(|\)|\+|{|})*/i', '', $data); + $data = preg_replace('/(<[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*)' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . trim($attrib) . '(?:\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>/', '\1\2\3>', $data); } } @@ -10743,27 +14912,30 @@ class SimplePie_Sanitize { if (isset($img['attribs']['src']['data'])) { - $image_url = $img['attribs']['src']['data']; - $cache = new $this->cache_class($this->cache_location, call_user_func($this->cache_name_function, $image_url), 'spi'); + $image_url = call_user_func($this->cache_name_function, $img['attribs']['src']['data']); + $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $image_url, 'spi'); if ($cache->load()) { - $img['attribs']['src']['data'] = $this->image_handler . rawurlencode($img['attribs']['src']['data']); + $img['attribs']['src']['data'] = $this->image_handler . $image_url; $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data); } else { - $file = new $this->file_class($image_url, $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen); + $file = new $this->file_class($img['attribs']['src']['data'], $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen); $headers = $file->headers; - if ($file->success && ($file->status_code == 200 || ($file->status_code > 206 && $file->status_code < 300))) + if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) { - if (!$cache->save(array('headers' => $file->headers, 'body' => $file->body))) + if ($cache->save(array('headers' => $file->headers, 'body' => $file->body))) + { + $img['attribs']['src']['data'] = $this->image_handler . $image_url; + $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data); + } + else { - trigger_error("$cache->name is not writeable", E_USER_WARNING); + trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); } - $img['attribs']['src']['data'] = $this->image_handler . rawurlencode($img['attribs']['src']['data']); - $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data); } } } @@ -10784,7 +14956,7 @@ class SimplePie_Sanitize $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8'); } - if ($this->output_encoding != 'UTF-8') + if ($this->output_encoding !== 'UTF-8') { $data = SimplePie_Misc::change_encoding($data, 'UTF-8', $this->output_encoding); } @@ -10806,7 +14978,9 @@ class SimplePie_Sanitize if (isset($element['attribs'][$attribute]['data'])) { $element['attribs'][$attribute]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attribute]['data'], $this->base); - $data = str_replace($element['full'], SimplePie_Misc::element_implode($element), $data); + $new_element = SimplePie_Misc::element_implode($element); + $data = str_replace($element['full'], $new_element, $data); + $element['full'] = $new_element; } } } diff --git a/inc/Sitemapper.php b/inc/Sitemapper.php new file mode 100644 index 000000000..bbe1caf26 --- /dev/null +++ b/inc/Sitemapper.php @@ -0,0 +1,203 @@ +<?php +/** + * Sitemap handling functions + * + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Michael Hamann <michael@content-space.de> + */ + +if(!defined('DOKU_INC')) die('meh.'); + +/** + * A class for building sitemaps and pinging search engines with the sitemap URL. + * + * @author Michael Hamann + */ +class Sitemapper { + /** + * Builds a Google Sitemap of all public pages known to the indexer + * + * The map is placed in the cache directory named sitemap.xml.gz - This + * file needs to be writable! + * + * @author Michael Hamann + * @author Andreas Gohr + * @link https://www.google.com/webmasters/sitemaps/docs/en/about.html + * @link http://www.sitemaps.org/ + */ + public function generate(){ + global $conf; + if($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) return false; + + $sitemap = Sitemapper::getFilePath(); + + if(@file_exists($sitemap)){ + if(!is_writable($sitemap)) return false; + }else{ + if(!is_writable(dirname($sitemap))) return false; + } + + if(@filesize($sitemap) && + @filemtime($sitemap) > (time()-($conf['sitemap']*86400))){ // 60*60*24=86400 + dbglog('Sitemapper::generate(): Sitemap up to date'); // FIXME: only in debug mode + return false; + } + + dbglog("Sitemapper::generate(): using $sitemap"); // FIXME: Only in debug mode + + $pages = idx_get_indexer()->getPages(); + dbglog('Sitemapper::generate(): creating sitemap using '.count($pages).' pages'); + $items = array(); + + // build the sitemap items + foreach($pages as $id){ + //skip hidden, non existing and restricted files + if(isHiddenPage($id)) continue; + if(auth_aclcheck($id,'','') < AUTH_READ) continue; + $item = SitemapItem::createFromID($id); + if ($item !== NULL) + $items[] = $item; + } + + $eventData = array('items' => &$items, 'sitemap' => &$sitemap); + $event = new Doku_Event('SITEMAP_GENERATE', $eventData); + if ($event->advise_before(true)) { + //save the new sitemap + $result = io_saveFile($sitemap, Sitemapper::getXML($items)); + } + $event->advise_after(); + + return $result; + } + + /** + * Builds the sitemap XML string from the given array auf SitemapItems. + * + * @param $items array The SitemapItems that shall be included in the sitemap. + * @return string The sitemap XML. + * @author Michael Hamann + */ + private function getXML($items) { + ob_start(); + echo '<?xml version="1.0" encoding="UTF-8"?>'.NL; + echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'.NL; + foreach ($items as $item) { + echo $item->toXML(); + } + echo '</urlset>'.NL; + $result = ob_get_contents(); + ob_end_clean(); + return $result; + } + + /** + * Helper function for getting the path to the sitemap file. + * + * @return The path to the sitemap file. + * @author Michael Hamann + */ + public function getFilePath() { + global $conf; + + $sitemap = $conf['cachedir'].'/sitemap.xml'; + if($conf['compression'] === 'bz2' || $conf['compression'] === 'gz'){ + $sitemap .= '.gz'; + } + + return $sitemap; + } + + /** + * Pings search engines with the sitemap url. Plugins can add or remove + * urls to ping using the SITEMAP_PING event. + * + * @author Michael Hamann + */ + public function pingSearchEngines() { + //ping search engines... + $http = new DokuHTTPClient(); + $http->timeout = 8; + + $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, + 'microsoft' => 'http://www.bing.com/webmaster/ping.aspx?siteMap='.$encoded_sitemap_url, + ); + + $data = array('ping_urls' => $ping_urls, + 'encoded_sitemap_url' => $encoded_sitemap_url + ); + $event = new Doku_Event('SITEMAP_PING', $data); + if ($event->advise_before(true)) { + foreach ($data['ping_urls'] as $name => $url) { + dbglog("Sitemapper::PingSearchEngines(): pinging $name"); + $resp = $http->get($url); + if($http->error) dbglog("Sitemapper:pingSearchengines(): $http->error"); + dbglog('Sitemapper:pingSearchengines(): '.preg_replace('/[\n\r]/',' ',strip_tags($resp))); + } + } + $event->advise_after(); + + return true; + } +} + +/** + * An item of a sitemap. + * + * @author Michael Hamann + */ +class SitemapItem { + public $url; + public $lastmod; + public $changefreq; + public $priority; + + /** + * 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 $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) { + $this->url = $url; + $this->lastmod = $lastmod; + $this->changefreq = $changefreq; + $this->priority = $priority; + } + + /** + * 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. + * @return The sitemap item. + */ + public static function createFromID($id, $changefreq = null, $priority = null) { + $id = trim($id); + $date = @filemtime(wikiFN($id)); + if(!$date) return NULL; + return new SitemapItem(wl($id, '', true), $date, $changefreq, $priority); + } + + /** + * Get the XML representation of the sitemap item. + * + * @return The XML representation. + */ + public function toXML() { + $result = ' <url>'.NL + .' <loc>'.hsc($this->url).'</loc>'.NL + .' <lastmod>'.date_iso8601($this->lastmod).'</lastmod>'.NL; + if ($this->changefreq !== NULL) + $result .= ' <changefreq>'.hsc($this->changefreq).'</changefreq>'.NL; + if ($this->priority !== NULL) + $result .= ' <priority>'.hsc($this->priority).'</priority>'.NL; + $result .= ' </url>'.NL; + return $result; + } +} diff --git a/inc/TarLib.class.php b/inc/TarLib.class.php index 7a7acdbdb..12418c48d 100644 --- a/inc/TarLib.class.php +++ b/inc/TarLib.class.php @@ -7,7 +7,7 @@ * * Modified for Dokuwiki * - * @license GPL + * @license LGPL-2.1 * @link http://docs.maxg.info * @author Bouchon <tarlib@bouchon.org> (Maxg) * @author Christopher Smith <chris@jalakai.co.uk> diff --git a/inc/actions.php b/inc/actions.php index 0a6e6d8c7..fa11bb7f1 100644 --- a/inc/actions.php +++ b/inc/actions.php @@ -18,8 +18,10 @@ if(!defined('DOKU_INC')) die('meh.'); function act_dispatch(){ global $ACT; global $ID; + global $INFO; global $QUERY; global $lang; + global $conf; $preact = $ACT; @@ -50,9 +52,20 @@ function act_dispatch(){ } } + //display some infos + if($ACT == 'check'){ + check(); + $ACT = 'show'; + } + //check permissions $ACT = act_permcheck($ACT); + //sitemap + if ($ACT == 'sitemap'){ + $ACT = act_sitemap($ACT); + } + //register if($ACT == 'register' && $_POST['save'] && register()){ $ACT = 'login'; @@ -115,12 +128,6 @@ function act_dispatch(){ if(substr($ACT,0,7) == 'export_') $ACT = act_export($ACT); - //display some infos - if($ACT == 'check'){ - check(); - $ACT = 'show'; - } - //handle admin tasks if($ACT == 'admin'){ // retrieve admin plugin name from $_REQUEST['page'] @@ -128,8 +135,15 @@ function act_dispatch(){ $pluginlist = plugin_list('admin'); if (in_array($_REQUEST['page'], $pluginlist)) { // attempt to load the plugin - if ($plugin =& plugin_load('admin',$_REQUEST['page']) !== null) - $plugin->handle(); + if ($plugin =& plugin_load('admin',$_REQUEST['page']) !== null){ + if($plugin->forAdminOnly() && !$INFO['isadmin']){ + // a manager tried to load a plugin that's for admins only + unset($_REQUEST['page']); + msg('For admins only',-1); + }else{ + $plugin->handle(); + } + } } } } @@ -138,6 +152,10 @@ function act_dispatch(){ $ACT = act_permcheck($ACT); } // end event ACTION_ACT_PREPROCESS default action $evt->advise_after(); + // Make sure plugs can handle 'denied' + if($conf['send404'] && $ACT == 'denied') { + header('HTTP/1.0 403 Forbidden'); + } unset($evt); // when action 'show', the intial not 'show' and POST, do a redirect @@ -205,7 +223,7 @@ function act_clean($act){ 'preview','search','show','check','index','revisions', 'diff','recent','backlink','admin','subscribe','revert', 'unsubscribe','profile','resendpwd','recover', - 'draftdel','subscribens','unsubscribens',)) && substr($act,0,7) != 'export_' ) { + 'draftdel','subscribens','unsubscribens','sitemap')) && substr($act,0,7) != 'export_' ) { msg('Command unknown: '.htmlspecialchars($act),-1); return 'show'; } @@ -233,7 +251,7 @@ function act_permcheck($act){ }else{ $permneed = AUTH_CREATE; } - }elseif(in_array($act,array('login','search','recent','profile','index'))){ + }elseif(in_array($act,array('login','search','recent','profile','index', 'sitemap'))){ $permneed = AUTH_NONE; }elseif($act == 'revert'){ $permneed = AUTH_ADMIN; @@ -281,10 +299,10 @@ function act_draftsave($act){ global $conf; if($conf['usedraft'] && $_POST['wikitext']){ $draft = array('id' => $ID, - 'prefix' => $_POST['prefix'], + 'prefix' => substr($_POST['prefix'], 0, -1), 'text' => $_POST['wikitext'], 'suffix' => $_POST['suffix'], - 'date' => $_POST['date'], + 'date' => (int) $_POST['date'], 'client' => $INFO['client'], ); $cname = getCacheName($draft['client'].$ID,'.draft'); @@ -587,6 +605,52 @@ function act_export($act){ } /** + * Handle sitemap delivery + * + * @author Michael Hamann <michael@content-space.de> + */ +function act_sitemap($act) { + global $conf; + + if ($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) { + header("HTTP/1.0 404 Not Found"); + print "Sitemap generation is disabled."; + exit; + } + + $sitemap = Sitemapper::getFilePath(); + if(strrchr($sitemap, '.') === '.gz'){ + $mime = 'application/x-gzip'; + }else{ + $mime = 'application/xml; charset=utf-8'; + } + + // Check if sitemap file exists, otherwise create it + if (!is_readable($sitemap)) { + Sitemapper::generate(); + } + + if (is_readable($sitemap)) { + // Send headers + header('Content-Type: '.$mime); + header('Content-Disposition: attachment; filename='.basename($sitemap)); + + http_conditionalRequest(filemtime($sitemap)); + + // Send file + //use x-sendfile header to pass the delivery to compatible webservers + if (http_sendfile($sitemap)) exit; + + readfile($sitemap); + exit; + } + + header("HTTP/1.0 500 Internal Server Error"); + print "Could not read the sitemap file - bad permissions?"; + exit; +} + +/** * Handle page 'subscribe' * * Throws exception on error. @@ -687,4 +751,4 @@ function subscription_handle_post(&$params) { $params = compact('target', 'style', 'data', 'action'); } -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/adLDAP.php b/inc/adLDAP.php index 94cd8a50d..a64096b85 100644 --- a/inc/adLDAP.php +++ b/inc/adLDAP.php @@ -1,7 +1,7 @@ <?php /** * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY - * Version 3.3.1 + * Version 3.3.2 * * PHP Version 5 with SSL and LDAP support * @@ -9,7 +9,7 @@ * email: scott@wiggumworld.com, adldap@richardhyland.com * http://adldap.sourceforge.net/ * - * Copyright (c) 2006-2009 Scott Barnett, Richard Hyland + * Copyright (c) 2006-2010 Scott Barnett, Richard Hyland * * We'd appreciate any improvements or additions to be submitted back * to benefit the entire community :) @@ -27,10 +27,10 @@ * @category ToolsAndUtilities * @package adLDAP * @author Scott Barnett, Richard Hyland - * @copyright (c) 2006-2009 Scott Barnett, Richard Hyland + * @copyright (c) 2006-2010 Scott Barnett, Richard Hyland * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1 - * @revision $Revision: 67 $ - * @version 3.3.1 + * @revision $Revision: 91 $ + * @version 3.3.2 * @link http://adldap.sourceforge.net/ */ @@ -409,25 +409,26 @@ class adLDAP { * @param bool optional $prevent_rebind * @return bool */ - public function authenticate($username,$password,$prevent_rebind=false){ + public function authenticate($username, $password, $prevent_rebind = false) { // Prevent null binding - if ($username===NULL || $password===NULL){ return (false); } - if (empty($username) || empty($password)){ return (false); } + if ($username === NULL || $password === NULL) { return false; } + if (empty($username) || empty($password)) { return false; } // Bind as the user - $this->_bind = @ldap_bind($this->_conn,$username.$this->_account_suffix,$password); - if (!$this->_bind){ return (false); } + $ret = true; + $this->_bind = @ldap_bind($this->_conn, $username . $this->_account_suffix, $password); + if (!$this->_bind){ $ret = false; } // Cnce we've checked their details, kick back into admin mode if we have it - if ($this->_ad_username!=NULL && !$prevent_rebind){ - $this->_bind = @ldap_bind($this->_conn,$this->_ad_username.$this->_account_suffix,$this->_ad_password); + if ($this->_ad_username !== NULL && !$prevent_rebind) { + $this->_bind = @ldap_bind($this->_conn, $this->_ad_username . $this->_account_suffix , $this->_ad_password); if (!$this->_bind){ // This should never happen in theory throw new adLDAPException('Rebind to Active Directory failed. AD said: ' . $this->get_last_error()); } } - return (true); + return $ret; } //***************************************************************************************************************** @@ -758,7 +759,7 @@ class adLDAP { $ret_groups=array(); $groups=$this->group_info($group,array("memberof")); - if (is_array($groups[0]["memberof"])) { + if (isset($groups[0]["memberof"]) && is_array($groups[0]["memberof"])) { $groups=$groups[0]["memberof"]; if ($groups){ @@ -861,7 +862,7 @@ class adLDAP { * @param array $attributes The attributes to set to the user account * @return bool */ - public function user_create($attributes){ + public function user_create($attributes){ // Check for compulsory fields if (!array_key_exists("username",$attributes)){ return ("Missing compulsory field [username]"); } if (!array_key_exists("firstname",$attributes)){ return ("Missing compulsory field [firstname]"); } @@ -963,25 +964,36 @@ class adLDAP { $username = $this->strguid2hex($username); $filter="objectguid=".$username; } + else if (strstr($username, "@")) { + $filter="userPrincipalName=".$username; + } else { - $filter="samaccountname=".$username; + $filter="samaccountname=".$username; } + $filter = "(&(objectCategory=person)({$filter}))"; if ($fields===NULL){ $fields=array("samaccountname","mail","memberof","department","displayname","telephonenumber","primarygroupid","objectsid"); } + if (!in_array("objectsid",$fields)){ + $fields[] = "objectsid"; + } $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields); $entries = ldap_get_entries($this->_conn, $sr); - if ($entries[0]['count'] >= 1) { - // AD does not return the primary group in the ldap query, we may need to fudge it - if ($this->_real_primarygroup && isset($entries[0]["primarygroupid"][0]) && isset($entries[0]["objectsid"][0])){ - //$entries[0]["memberof"][]=$this->group_cn($entries[0]["primarygroupid"][0]); - $entries[0]["memberof"][]=$this->get_primary_group($entries[0]["primarygroupid"][0], $entries[0]["objectsid"][0]); - } else { - $entries[0]["memberof"][]="CN=Domain Users,CN=Users,".$this->_base_dn; + if (isset($entries[0])) { + if ($entries[0]['count'] >= 1) { + if (in_array("memberof", $fields)) { + // AD does not return the primary group in the ldap query, we may need to fudge it + if ($this->_real_primarygroup && isset($entries[0]["primarygroupid"][0]) && isset($entries[0]["objectsid"][0])){ + //$entries[0]["memberof"][]=$this->group_cn($entries[0]["primarygroupid"][0]); + $entries[0]["memberof"][]=$this->get_primary_group($entries[0]["primarygroupid"][0], $entries[0]["objectsid"][0]); + } else { + $entries[0]["memberof"][]="CN=Domain Users,CN=Users,".$this->_base_dn; + } + $entries[0]["memberof"]["count"]++; + } } + return $entries; } - - $entries[0]["memberof"]["count"]++; - return ($entries); + return false; } /** @@ -1171,8 +1183,17 @@ class adLDAP { $add=array(); $add["unicodePwd"][0]=$this->encode_password($password); - $result=ldap_mod_replace($this->_conn,$user_dn,$add); - if ($result==false){ return (false); } + $result=@ldap_mod_replace($this->_conn,$user_dn,$add); + if ($result==false){ + $err = ldap_errno($this->_conn); + if($err){ + $msg = 'Error '.$err.': '.ldap_err2str($err).'.'; + if($err == 53) $msg .= ' Your password might not match the password policy.'; + throw new adLDAPException($msg); + }else{ + return false; + } + } return (true); } @@ -1232,6 +1253,33 @@ class adLDAP { } } + /** + * Move a user account to a different OU + * + * @param string $username The username to move (please be careful here!) + * @param array $container The container or containers to move the user to (please be careful here!). + * accepts containers in 1. parent 2. child order + * @return array + */ + public function user_move($username, $container) { + if (!$this->_bind){ return (false); } + if ($username === null){ return ("Missing compulsory field [username]"); } + if ($container === null){ return ("Missing compulsory field [container]"); } + if (!is_array($container)){ return ("Container must be an array"); } + + $userinfo = $this->user_info($username, array("*")); + $dn = $userinfo[0]['distinguishedname'][0]; + $newrdn = "cn=" . $username; + $container = array_reverse($container); + $newcontainer = "ou=" . implode(",ou=",$container); + $newbasedn = strtolower($newcontainer) . "," . $this->_base_dn; + $result=@ldap_rename($this->_conn,$dn,$newrdn,$newbasedn,true); + if ($result !== true) { + return (false); + } + return (true); + } + //***************************************************************************************************************** // CONTACT FUNCTIONS // * Still work to do in this area, and new functions to write @@ -1568,6 +1616,32 @@ class adLDAP { } //************************************************************************************************************ + // ORGANIZATIONAL UNIT FUNCTIONS + + /** + * Create an organizational unit + * + * @param array $attributes Default attributes of the ou + * @return bool + */ + public function ou_create($attributes){ + if (!is_array($attributes)){ return ("Attributes must be an array"); } + if (!array_key_exists("ou_name",$attributes)){ return ("Missing compulsory field [ou_name]"); } + if (!array_key_exists("container",$attributes)){ return ("Missing compulsory field [container]"); } + if (!is_array($attributes["container"])){ return ("Container attribute must be an array."); } + $attributes["container"]=array_reverse($attributes["container"]); + + $add=array(); + $add["objectClass"] = "organizationalUnit"; + + $container="OU=".implode(",OU=",$attributes["container"]); + $result=ldap_add($this->_conn,"CN=".$add["cn"].", ".$container.",".$this->_base_dn,$add); + if ($result!=true){ return (false); } + + return (true); + } + + //************************************************************************************************************ // EXCHANGE FUNCTIONS /** @@ -1998,6 +2072,7 @@ class adLDAP { if ($attributes["exchange_usedefaults"]){ $mod["mDBUseDefaults"][0]=$attributes["exchange_usedefaults"]; } if ($attributes["exchange_policyexclude"]){ $mod["msExchPoliciesExcluded"][0]=$attributes["exchange_policyexclude"]; } if ($attributes["exchange_policyinclude"]){ $mod["msExchPoliciesIncluded"][0]=$attributes["exchange_policyinclude"]; } + if ($attributes["exchange_addressbook"]){ $mod["showInAddressBook"][0]=$attributes["exchange_addressbook"]; } // This schema is designed for contacts if ($attributes["exchange_hidefromlists"]){ $mod["msExchHideFromAddressLists"][0]=$attributes["exchange_hidefromlists"]; } diff --git a/inc/auth.php b/inc/auth.php index a2844a732..53376be34 100644 --- a/inc/auth.php +++ b/inc/auth.php @@ -70,6 +70,12 @@ function auth_setup(){ $_REQUEST['http_credentials'] = false; if (!$conf['rememberme']) $_REQUEST['r'] = false; + // handle renamed HTTP_AUTHORIZATION variable (can happen when a fix like + // the one presented at + // http://www.besthostratings.com/articles/http-auth-php-cgi.html is used + // for enabling HTTP authentication with CGI/SuExec) + if(isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) + $_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; // streamline HTTP auth credentials (IIS/rewrite -> mod_php) if(isset($_SERVER['HTTP_AUTHORIZATION'])){ list($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']) = @@ -183,7 +189,9 @@ function auth_login($user,$pass,$sticky=false,$silent=false){ if ($auth->checkPass($user,$pass)){ // make logininfo globally available $_SERVER['REMOTE_USER'] = $user; - auth_setCookie($user,PMA_blowfish_encrypt($pass,auth_cookiesalt()),$sticky); + $secret = auth_cookiesalt(); + if(!$sticky) $secret .= session_id; //bind non-sticky to session + auth_setCookie($user,PMA_blowfish_encrypt($pass,$secret),$sticky); return true; }else{ //invalid credentials - log off @@ -194,23 +202,27 @@ function auth_login($user,$pass,$sticky=false,$silent=false){ }else{ // read cookie information list($user,$sticky,$pass) = auth_getCookie(); - // get session info - $session = $_SESSION[DOKU_COOKIE]['auth']; if($user && $pass){ // we got a cookie - see if we can trust it + + // get session info + $session = $_SESSION[DOKU_COOKIE]['auth']; if(isset($session) && $auth->useSessionCache($user) && ($session['time'] >= time()-$conf['auth_security_timeout']) && ($session['user'] == $user) && - ($session['pass'] == $pass) && //still crypted + ($session['pass'] == sha1($pass)) && //still crypted ($session['buid'] == auth_browseruid()) ){ + // he has session, cookie and browser right - let him in $_SERVER['REMOTE_USER'] = $user; $USERINFO = $session['info']; //FIXME move all references to session return true; } // no we don't trust it yet - recheck pass but silent - $pass = PMA_blowfish_decrypt($pass,auth_cookiesalt()); + $secret = auth_cookiesalt(); + if(!$sticky) $secret .= session_id(); //bind non-sticky to session + $pass = PMA_blowfish_decrypt($pass,$secret); return auth_login($user,$pass,$sticky,true); } } @@ -371,63 +383,15 @@ function auth_ismanager($user=null,$groups=null,$adminonly=false){ $user = $_SERVER['REMOTE_USER']; } } - $user = trim($auth->cleanUser($user)); - if($user === '') return false; - if(is_null($groups)) $groups = (array) $USERINFO['grps']; - $groups = array_map(array($auth,'cleanGroup'),$groups); - $user = auth_nameencode($user); - - // check username against superuser and manager - $superusers = explode(',', $conf['superuser']); - $superusers = array_unique($superusers); - $superusers = array_map('trim', $superusers); - $superusers = array_filter($superusers); - // prepare an array containing only true values for array_map call - $alltrue = array_fill(0, count($superusers), true); - $superusers = array_map('auth_nameencode', $superusers, $alltrue); - - // case insensitive? - if(!$auth->isCaseSensitive()){ - $superusers = array_map('utf8_strtolower',$superusers); - $user = utf8_strtolower($user); + if(is_null($groups)){ + $groups = (array) $USERINFO['grps']; } - // check user match - if(in_array($user, $superusers)) return true; - + // check superuser match + if(auth_isMember($conf['superuser'],$user, $groups)) return true; + if($adminonly) return false; // check managers - if(!$adminonly){ - $managers = explode(',', $conf['manager']); - $managers = array_unique($managers); - $managers = array_map('trim', $managers); - $managers = array_filter($managers); - // prepare an array containing only true values for array_map call - $alltrue = array_fill(0, count($managers), true); - $managers = array_map('auth_nameencode', $managers, $alltrue); - if(!$auth->isCaseSensitive()) $managers = array_map('utf8_strtolower',$managers); - if(in_array($user, $managers)) return true; - } - - // check user's groups against superuser and manager - if (!empty($groups)) { - - //prepend groups with @ and nameencode - $cnt = count($groups); - for($i=0; $i<$cnt; $i++){ - $groups[$i] = '@'.auth_nameencode($groups[$i]); - if(!$auth->isCaseSensitive()){ - $groups[$i] = utf8_strtolower($groups[$i]); - } - } - - // check groups against superuser and manager - foreach($superusers as $supu) - if(in_array($supu, $groups)) return true; - if(!$adminonly){ - foreach($managers as $mana) - if(in_array($mana, $groups)) return true; - } - } + if(auth_isMember($conf['manager'],$user, $groups)) return true; return false; } @@ -446,6 +410,52 @@ function auth_isadmin($user=null,$groups=null){ return auth_ismanager($user,$groups,true); } + +/** + * Match a user and his groups against a comma separated list of + * users and groups to determine membership status + * + * 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 + * @returns bool true for membership acknowledged + */ +function auth_isMember($memberlist,$user,array $groups){ + global $auth; + if (!$auth) return false; + + // clean user and groups + if(!$auth->isCaseSensitive()){ + $user = utf8_strtolower($user); + $groups = array_map('utf8_strtolower',$groups); + } + $user = $auth->cleanUser($user); + $groups = array_map(array($auth,'cleanGroup'),$groups); + + // extract the memberlist + $members = explode(',',$memberlist); + $members = array_map('trim',$members); + $members = array_unique($members); + $members = array_filter($members); + + // compare cleaned values + foreach($members as $member){ + if(!$auth->isCaseSensitive()) $member = utf8_strtolower($member); + if($member[0] == '@'){ + $member = $auth->cleanGroup(substr($member,1)); + if(in_array($member, $groups)) return true; + }else{ + $member = $auth->cleanUser($member); + if($member == $user) return true; + } + } + + // still here? not a member! + return false; +} + /** * Convinience function for auth_aclcheck() * @@ -536,13 +546,13 @@ function auth_aclcheck($id,$user,$groups){ //still here? do the namespace checks if($ns){ - $path = $ns.':\*'; + $path = $ns.':*'; }else{ - $path = '\*'; //root document + $path = '*'; //root document } do{ - $matches = preg_grep('/^'.$path.'\s+('.$regexp.')\s+/'.$ci,$AUTH_ACL); + $matches = preg_grep('/^'.preg_quote($path,'/').'\s+('.$regexp.')\s+/'.$ci,$AUTH_ACL); if(count($matches)){ foreach($matches as $match){ $match = preg_replace('/#.*$/','',$match); //ignore comments @@ -559,9 +569,9 @@ function auth_aclcheck($id,$user,$groups){ //get next higher namespace $ns = getNS($ns); - if($path != '\*'){ - $path = $ns.':\*'; - if($path == ':\*') $path = '\*'; + if($path != '*'){ + $path = $ns.':*'; + if($path == ':*') $path = '*'; }else{ //we did this already //looks like there is something wrong with the ACL @@ -681,9 +691,8 @@ function register(){ global $conf; global $auth; - if (!$auth) return false; if(!$_POST['save']) return false; - if(!$auth->canDo('addUser')) return false; + if(!actionOK('register')) return false; //clean username $_POST['login'] = trim($auth->cleanUser($_POST['login'])); @@ -759,12 +768,10 @@ function updateprofile() { global $lang; global $auth; - if (!$auth) return false; if(empty($_POST['save'])) return false; if(!checkSecurityToken()) return false; - // should not be able to get here without Profile being possible... - if(!$auth->canDo('Profile')) { + if(!actionOK('profile')) { msg($lang['profna'],-1); return false; } @@ -835,11 +842,7 @@ function act_resendpwd(){ global $conf; global $auth; - if(!actionOK('resendpwd')) return false; - if (!$auth) return false; - - // should not be able to get here without modPass being possible... - if(!$auth->canDo('modPass')) { + if(!actionOK('resendpwd')) { msg($lang['resendna'],-1); return false; } @@ -927,18 +930,6 @@ function act_resendpwd(){ * If the selected method needs a salt and none was given, a random one * is chosen. * - * The following methods are understood: - * - * smd5 - Salted MD5 hashing - * apr1 - Apache salted MD5 hashing - * md5 - Simple MD5 hashing - * sha1 - SHA1 hashing - * ssha - Salted SHA1 hashing - * crypt - Unix crypt - * mysql - MySQL password (old method) - * my411 - MySQL 4.1.1 password - * kmd5 - Salted MD5 hashing as used by UNB - * * @author Andreas Gohr <andi@splitbrain.org> * @return string The crypted password */ @@ -946,128 +937,26 @@ function auth_cryptPassword($clear,$method='',$salt=null){ global $conf; if(empty($method)) $method = $conf['passcrypt']; - //prepare a salt - if(is_null($salt)) $salt = md5(uniqid(rand(), true)); - - switch(strtolower($method)){ - case 'smd5': - if(defined('CRYPT_MD5') && CRYPT_MD5) return crypt($clear,'$1$'.substr($salt,0,8).'$'); - // when crypt can't handle SMD5, falls through to pure PHP implementation - $magic = '1'; - case 'apr1': - //from http://de.php.net/manual/en/function.crypt.php#73619 comment by <mikey_nich at hotmail dot com> - if(!isset($magic)) $magic = 'apr1'; - $salt = substr($salt,0,8); - $len = strlen($clear); - $text = $clear.'$'.$magic.'$'.$salt; - $bin = pack("H32", md5($clear.$salt.$clear)); - for($i = $len; $i > 0; $i -= 16) { - $text .= substr($bin, 0, min(16, $i)); - } - for($i = $len; $i > 0; $i >>= 1) { - $text .= ($i & 1) ? chr(0) : $clear{0}; - } - $bin = pack("H32", md5($text)); - for($i = 0; $i < 1000; $i++) { - $new = ($i & 1) ? $clear : $bin; - if ($i % 3) $new .= $salt; - if ($i % 7) $new .= $clear; - $new .= ($i & 1) ? $bin : $clear; - $bin = pack("H32", md5($new)); - } - $tmp = ''; - for ($i = 0; $i < 5; $i++) { - $k = $i + 6; - $j = $i + 12; - if ($j == 16) $j = 5; - $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp; - } - $tmp = chr(0).chr(0).$bin[11].$tmp; - $tmp = strtr(strrev(substr(base64_encode($tmp), 2)), - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", - "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); - return '$'.$magic.'$'.$salt.'$'.$tmp; - case 'md5': - return md5($clear); - case 'sha1': - return sha1($clear); - case 'ssha': - $salt=substr($salt,0,4); - return '{SSHA}'.base64_encode(pack("H*", sha1($clear.$salt)).$salt); - case 'crypt': - return crypt($clear,substr($salt,0,2)); - case 'mysql': - //from http://www.php.net/mysql comment by <soren at byu dot edu> - $nr=0x50305735; - $nr2=0x12345671; - $add=7; - $charArr = preg_split("//", $clear); - foreach ($charArr as $char) { - if (($char == '') || ($char == ' ') || ($char == '\t')) continue; - $charVal = ord($char); - $nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8); - $nr2 += ($nr2 << 8) ^ $nr; - $add += $charVal; - } - return sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff)); - case 'my411': - return '*'.sha1(pack("H*", sha1($clear))); - case 'kmd5': - $key = substr($salt, 16, 2); - $hash1 = strtolower(md5($key . md5($clear))); - $hash2 = substr($hash1, 0, 16) . $key . substr($hash1, 16); - return $hash2; - default: - msg("Unsupported crypt method $method",-1); + $pass = new PassHash(); + $call = 'hash_'.$method; + + if(!method_exists($pass,$call)){ + msg("Unsupported crypt method $method",-1); + return false; } + + return $pass->$call($clear,$salt); } /** * Verifies a cleartext password against a crypted hash * - * The method and salt used for the crypted hash is determined automatically - * then the clear text password is crypted using the same method. If both hashs - * match true is is returned else false - * * @author Andreas Gohr <andi@splitbrain.org> * @return bool */ function auth_verifyPassword($clear,$crypt){ - $method=''; - $salt=''; - - //determine the used method and salt - $len = strlen($crypt); - if(preg_match('/^\$1\$([^\$]{0,8})\$/',$crypt,$m)){ - $method = 'smd5'; - $salt = $m[1]; - }elseif(preg_match('/^\$apr1\$([^\$]{0,8})\$/',$crypt,$m)){ - $method = 'apr1'; - $salt = $m[1]; - }elseif(substr($crypt,0,6) == '{SSHA}'){ - $method = 'ssha'; - $salt = substr(base64_decode(substr($crypt, 6)),20); - }elseif($len == 32){ - $method = 'md5'; - }elseif($len == 40){ - $method = 'sha1'; - }elseif($len == 16){ - $method = 'mysql'; - }elseif($len == 41 && $crypt[0] == '*'){ - $method = 'my411'; - }elseif($len == 34){ - $method = 'kmd5'; - $salt = $crypt; - }else{ - $method = 'crypt'; - $salt = substr($crypt,0,2); - } - - //crypt and compare - if(auth_cryptPassword($clear,$method,$salt) === $crypt){ - return true; - } - return false; + $pass = new PassHash(); + return $pass->verify_hash($clear,$crypt); } /** @@ -1095,7 +984,7 @@ function auth_setCookie($user,$pass,$sticky) { } // set session $_SESSION[DOKU_COOKIE]['auth']['user'] = $user; - $_SESSION[DOKU_COOKIE]['auth']['pass'] = $pass; + $_SESSION[DOKU_COOKIE]['auth']['pass'] = sha1($pass); $_SESSION[DOKU_COOKIE]['auth']['buid'] = auth_browseruid(); $_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO; $_SESSION[DOKU_COOKIE]['auth']['time'] = time(); @@ -1117,4 +1006,4 @@ function auth_getCookie(){ return array($user,$sticky,$pass); } -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/auth/ad.class.php b/inc/auth/ad.class.php index 90fe0266b..9ffd3e18b 100644 --- a/inc/auth/ad.class.php +++ b/inc/auth/ad.class.php @@ -24,6 +24,7 @@ * $conf['auth']['ad']['ad_password'] = 'pass'; * $conf['auth']['ad']['real_primarygroup'] = 1; * $conf['auth']['ad']['use_ssl'] = 1; + * $conf['auth']['ad']['use_tls'] = 1; * $conf['auth']['ad']['debug'] = 1; * * // get additional information to the userinfo array @@ -51,6 +52,7 @@ class auth_ad extends auth_basic { global $conf; $this->cnf = $conf['auth']['ad']; + // additional information fields if (isset($this->cnf['additional'])) { $this->cnf['additional'] = str_replace(' ', '', $this->cnf['additional']); @@ -60,7 +62,7 @@ class auth_ad extends auth_basic { // ldap extension is needed if (!function_exists('ldap_connect')) { if ($this->cnf['debug']) - msg("LDAP err: PHP LDAP extension not found.",-1); + msg("AD Auth: PHP LDAP extension not found.",-1); $this->success = false; return; } @@ -97,7 +99,12 @@ class auth_ad extends auth_basic { $this->opts['domain_controllers'] = array_map('trim',$this->opts['domain_controllers']); $this->opts['domain_controllers'] = array_filter($this->opts['domain_controllers']); - // we currently just handle authentication, so no capabilities are set + // we can change the password if SSL is set + if($this->opts['use_ssl'] || $this->opts['use_tls']){ + $this->cando['modPass'] = true; + } + $this->cando['modName'] = true; + $this->cando['modMail'] = true; } /** @@ -126,7 +133,7 @@ class auth_ad extends auth_basic { * at least these fields: * * name string full name of the user - * mail string email addres of the user + * mail string email address of the user * grps array list of groups the user is in * * This LDAP specific function returns the following @@ -247,6 +254,49 @@ class auth_ad extends auth_basic { } /** + * Modify user data + * + * @param $user nick of the user to be changed + * @param $changes array of field/value pairs to be changed + * @return bool + */ + function modifyUser($user, $changes) { + $return = true; + + // password changing + if(isset($changes['pass'])){ + try { + $return = $this->adldap->user_password($user,$changes['pass']); + } catch (adLDAPException $e) { + if ($this->cnf['debug']) msg('AD Auth: '.$e->getMessage(), -1); + $return = false; + } + if(!$return) msg('AD Auth: failed to change the password. Maybe the password policy was not met?',-1); + } + + // changing user data + $adchanges = array(); + if(isset($changes['name'])){ + // get first and last name + $parts = explode(' ',$changes['name']); + $adchanges['surname'] = array_pop($parts); + $adchanges['firstname'] = join(' ',$parts); + $adchanges['display_name'] = $changes['name']; + } + if(isset($changes['mail'])){ + $adchanges['email'] = $changes['mail']; + } + try { + $return = $return & $this->adldap->user_modify($user,$adchanges); + } catch (adLDAPException $e) { + if ($this->cnf['debug']) msg('AD Auth: '.$e->getMessage(), -1); + $return = false; + } + + return $return; + } + + /** * Initialize the AdLDAP library and connect to the server */ function _init(){ @@ -261,7 +311,7 @@ class auth_ad extends auth_basic { return true; } catch (adLDAPException $e) { if ($this->cnf['debug']) { - msg($e->getMessage(), -1); + msg('AD Auth: '.$e->getMessage(), -1); } $this->success = false; $this->adldap = null; @@ -296,4 +346,4 @@ class auth_ad extends auth_basic { } } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/auth/basic.class.php b/inc/auth/basic.class.php index fa38970ae..c7e7031bf 100644 --- a/inc/auth/basic.class.php +++ b/inc/auth/basic.class.php @@ -400,4 +400,4 @@ class auth_basic { } } -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/auth/ldap.class.php b/inc/auth/ldap.class.php index 5cc186ce2..420043238 100644 --- a/inc/auth/ldap.class.php +++ b/inc/auth/ldap.class.php @@ -222,12 +222,12 @@ class auth_ldap extends auth_basic { $base = $this->_makeFilter($this->cnf['grouptree'], $user_result); $filter = $this->_makeFilter($this->cnf['groupfilter'], $user_result); $sr = $this->_ldapsearch($this->con, $base, $filter, $this->cnf['groupscope'], array($this->cnf['groupkey'])); + if($this->cnf['debug']){ + msg('LDAP group search: '.htmlspecialchars(ldap_error($this->con)),0,__LINE__,__FILE__); + msg('LDAP search at: '.htmlspecialchars($base.' '.$filter),0,__LINE__,__FILE__); + } if(!$sr){ msg("LDAP: Reading group memberships failed",-1); - if($this->cnf['debug']){ - msg('LDAP group search: '.htmlspecialchars(ldap_error($this->con)),0,__LINE__,__FILE__); - msg('LDAP search at: '.htmlspecialchars($base.' '.$filter),0,__LINE__,__FILE__); - } return false; } $result = ldap_get_entries($this->con, $sr); @@ -457,4 +457,4 @@ class auth_ldap extends auth_basic { } } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/auth/mysql.class.php b/inc/auth/mysql.class.php index ca607ced5..653c725a3 100644 --- a/inc/auth/mysql.class.php +++ b/inc/auth/mysql.class.php @@ -46,7 +46,7 @@ class auth_mysql extends auth_basic { // set capabilities based upon config strings set if (empty($this->cnf['server']) || empty($this->cnf['user']) || - empty($this->cnf['password']) || empty($this->cnf['database'])){ + !isset($this->cnf['password']) || empty($this->cnf['database'])){ if ($this->cnf['debug']) msg("MySQL err: insufficient configuration.",-1,__LINE__,__FILE__); $this->success = false; @@ -936,4 +936,4 @@ class auth_mysql extends auth_basic { } } -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/auth/pgsql.class.php b/inc/auth/pgsql.class.php index 8e68e865e..cf8bf7600 100644 --- a/inc/auth/pgsql.class.php +++ b/inc/auth/pgsql.class.php @@ -407,4 +407,4 @@ class auth_pgsql extends auth_mysql { } -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/auth/plain.class.php b/inc/auth/plain.class.php index ec9e52beb..3941190e9 100644 --- a/inc/auth/plain.class.php +++ b/inc/auth/plain.class.php @@ -325,4 +325,4 @@ class auth_plain extends auth_basic { } } -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/cache.php b/inc/cache.php index 571b314cd..ff78e37ae 100644 --- a/inc/cache.php +++ b/inc/cache.php @@ -197,18 +197,6 @@ class cache_parser extends cache { } class cache_renderer extends cache_parser { - - function useCache($depends=array()) { - $use = parent::useCache($depends); - - // meta data needs to be kept in step with the cache - if (!$use && isset($this->page)) { - p_set_metadata($this->page,array(),true); - } - - return $use; - } - function _useCache() { global $conf; @@ -251,19 +239,12 @@ class cache_renderer extends cache_parser { if (isset($this->page)) { $metafile = metaFN($this->page,'.meta'); - if (@file_exists($metafile)) { - $files[] = $metafile; // ... the page's own metadata - $files[] = DOKU_INC.'inc/parser/metadata.php'; // ... the metadata renderer - - $valid = p_get_metadata($this->page, 'date valid'); - if (!empty($valid['age'])) { - $this->depends['age'] = isset($this->depends['age']) ? - min($this->depends['age'],$valid['age']) : $valid['age']; - } - - } else { - $this->depends['purge'] = true; // ... purging cache will generate metadata - return; + $files[] = $metafile; // ... the page's own metadata + + $valid = p_get_metadata($this->page, 'date valid'); // for xhtml this will render the metadata if needed + if (!empty($valid['age'])) { + $this->depends['age'] = isset($this->depends['age']) ? + min($this->depends['age'],$valid['age']) : $valid['age']; } } diff --git a/inc/changelog.php b/inc/changelog.php index bb00df76c..15cd46d77 100644 --- a/inc/changelog.php +++ b/inc/changelog.php @@ -37,6 +37,15 @@ function parseChangelogLine($line) { /** * Add's an entry to the changelog and saves the metadata for the page * + * @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. + * Availible flags: + * - ExternalEdit - mark as an external edit. + * * @author Andreas Gohr <andi@splitbrain.org> * @author Esther Brunner <wikidesign@gmail.com> * @author Ben Coburn <btcoburn@silicodon.net> @@ -75,7 +84,10 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr $meta = array(); if (!$INFO['exists'] && empty($oldmeta['persistent']['date']['created'])){ // newly created $meta['date']['created'] = $created; - if ($user) $meta['creator'] = $INFO['userinfo']['name']; + if ($user){ + $meta['creator'] = $INFO['userinfo']['name']; + $meta['user'] = $user; + } } elseif (!$INFO['exists'] && !empty($oldmeta['persistent']['date']['created'])) { // re-created / restored $meta['date']['created'] = $oldmeta['persistent']['date']['created']; $meta['date']['modified'] = $created; // use the files ctime here diff --git a/inc/common.php b/inc/common.php index 6af7f49de..ac7ddd653 100644 --- a/inc/common.php +++ b/inc/common.php @@ -242,13 +242,16 @@ function buildURLparams($params, $sep='&'){ */ function buildAttributes($params,$skipempty=false){ $url = ''; + $white = false; foreach($params as $key => $val){ if($key{0} == '_') continue; if($val === '' && $skipempty) continue; + if($white) $url .= ' '; $url .= $key.'="'; $url .= htmlspecialchars ($val); - $url .= '" '; + $url .= '"'; + $white = true; } return $url; } @@ -636,7 +639,7 @@ function clientIP($single=false){ // decide which IP to use, trying to avoid local addresses $ip = array_reverse($ip); foreach($ip as $i){ - if(preg_match('/^(127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/',$i)){ + if(preg_match('/^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/',$i)){ continue; }else{ return $i; @@ -801,7 +804,7 @@ function rawWiki($id,$rev=''){ /** * Returns the pagetemplate contents for the ID's namespace * - * @triggers COMMON_PAGE_FROMTEMPLATE + * @triggers COMMON_PAGETPL_LOAD * @author Andreas Gohr <andi@splitbrain.org> */ function pageTemplate($id){ @@ -809,29 +812,50 @@ function pageTemplate($id){ if (is_array($id)) $id = $id[0]; - $path = dirname(wikiFN($id)); - $tpl = ''; - if(@file_exists($path.'/_template.txt')){ - $tpl = io_readFile($path.'/_template.txt'); - }else{ - // search upper namespaces for templates - $len = strlen(rtrim($conf['datadir'],'/')); - while (strlen($path) >= $len){ - if(@file_exists($path.'/__template.txt')){ - $tpl = io_readFile($path.'/__template.txt'); - break; + // prepare initial event data + $data = array( + 'id' => $id, // the id of the page to be created + 'tpl' => '', // the text used as template + 'tplfile' => '', // the file above text was/should be loaded from + 'doreplace' => true // should wildcard replacements be done on the text? + ); + + $evt = new Doku_Event('COMMON_PAGETPL_LOAD',$data); + if($evt->advise_before(true)){ + // the before event might have loaded the content already + if(empty($data['tpl'])){ + // if the before event did not set a template file, try to find one + if(empty($data['tplfile'])){ + $path = dirname(wikiFN($id)); + $tpl = ''; + if(@file_exists($path.'/_template.txt')){ + $data['tplfile'] = $path.'/_template.txt'; + }else{ + // search upper namespaces for templates + $len = strlen(rtrim($conf['datadir'],'/')); + while (strlen($path) >= $len){ + if(@file_exists($path.'/__template.txt')){ + $data['tplfile'] = $path.'/__template.txt'; + break; + } + $path = substr($path, 0, strrpos($path, '/')); + } + } } - $path = substr($path, 0, strrpos($path, '/')); + // load the content + $data['tpl'] = io_readFile($data['tplfile']); } + if($data['doreplace']) parsePageTemplate(&$data); } - $data = compact('tpl', 'id'); - trigger_event('COMMON_PAGE_FROMTEMPLATE', $data, 'parsePageTemplate', true); + $evt->advise_after(); + unset($evt); + return $data['tpl']; } /** * Performs common page template replacements - * This is the default action for COMMON_PAGE_FROMTEMPLATE + * This works on data from COMMON_PAGETPL_LOAD * * @author Andreas Gohr <andi@splitbrain.org> */ @@ -843,7 +867,7 @@ function parsePageTemplate(&$data) { // replace placeholders $file = noNS($id); - $page = strtr($file,'_',' '); + $page = strtr($file, $conf['sepchar'], ' '); $tpl = str_replace(array( '@ID@', @@ -1128,18 +1152,16 @@ function notify($id,$who,$rev='',$summary='',$minor=false,$replace=array()){ $diff = rawWiki($id); } $text = str_replace('@DIFF@',$diff,$text); - if(utf8_strlen($conf['title']) < 20) { - $subject = '['.$conf['title'].'] '.$subject; + if(empty($conf['mailprefix'])) { + if(utf8_strlen($conf['title']) < 20) { + $subject = '['.$conf['title'].'] '.$subject; + }else{ + $subject = '['.utf8_substr($conf['title'], 0, 20).'...] '.$subject; + } }else{ - $subject = '['.utf8_substr($conf['title'], 0, 20).'...] '.$subject; + $subject = '['.$conf['mailprefix'].'] '.$subject; } - - $from = $conf['mailfrom']; - $from = str_replace('@USER@',$_SERVER['REMOTE_USER'],$from); - $from = str_replace('@NAME@',$INFO['userinfo']['name'],$from); - $from = str_replace('@MAIL@',$INFO['userinfo']['mail'],$from); - - mail_send($to,$subject,$text,$from,'',$bcc); + mail_send($to,$subject,$text,$conf['mailfrom'],'',$bcc); } /** @@ -1271,6 +1293,21 @@ function dformat($dt=null,$format=''){ } /** + * Formats a timestamp as ISO 8601 date + * + * @author <ungu at terong dot com> + * @link http://www.php.net/manual/en/function.date.php#54072 + */ +function date_iso8601($int_date) { + //$int_date: current date in UNIX timestamp + $date_mod = date('Y-m-d\TH:i:s', $int_date); + $pre_timezone = date('O', $int_date); + $time_zone = substr($pre_timezone, 0, 3).":".substr($pre_timezone, 3, 2); + $date_mod .= $time_zone; + return $date_mod; +} + +/** * return an obfuscated email address in line with $conf['mailguard'] setting * * @author Harry Fuecks <hfuecks@gmail.com> @@ -1528,4 +1565,4 @@ function valid_input_set($param, $valid_values, $array, $exc = '') { } } -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/config_cascade.php b/inc/config_cascade.php index 3ae68a000..48ed5a000 100644 --- a/inc/config_cascade.php +++ b/inc/config_cascade.php @@ -5,7 +5,8 @@ * This array configures the default locations of various files in the * DokuWiki directory hierarchy. It can be overriden in inc/preload.php */ -$config_cascade = array( +$config_cascade = array_merge( + array( 'main' => array( 'default' => array(DOKU_CONF.'dokuwiki.php'), 'local' => array(DOKU_CONF.'local.php'), @@ -48,10 +49,11 @@ $config_cascade = array( 'local' => array(DOKU_CONF.'wordblock.local.conf'), ), 'userstyle' => array( - 'default' => DOKU_CONF.'userstyle.css', - 'print' => DOKU_CONF.'printstyle.css', - 'feed' => DOKU_CONF.'feedstyle.css', - 'all' => DOKU_CONF.'allstyle.css', + 'screen' => DOKU_CONF.'userstyle.css', + 'rtl' => DOKU_CONF.'userrtl.css', + 'print' => DOKU_CONF.'userprint.css', + 'feed' => DOKU_CONF.'userfeed.css', + 'all' => DOKU_CONF.'userall.css', ), 'userscript' => array( 'default' => DOKU_CONF.'userscript.js' @@ -62,5 +64,7 @@ $config_cascade = array( 'plainauth.users' => array( 'default' => DOKU_CONF.'users.auth.php', ), + ), + $config_cascade ); diff --git a/inc/confutils.php b/inc/confutils.php index 4306dab8f..29ead1e9f 100644 --- a/inc/confutils.php +++ b/inc/confutils.php @@ -241,17 +241,24 @@ function actionOK($action){ // prepare disabled actions array and handle legacy options $disabled = explode(',',$conf['disableactions']); $disabled = array_map('trim',$disabled); - if(isset($conf['openregister']) && !$conf['openregister']) $disabled[] = 'register'; - if(isset($conf['resendpasswd']) && !$conf['resendpasswd']) $disabled[] = 'resendpwd'; - if(isset($conf['subscribers']) && !$conf['subscribers']) { - $disabled[] = 'subscribe'; - } - if (is_null($auth) || !$auth->canDo('addUser')) { + if((isset($conf['openregister']) && !$conf['openregister']) || is_null($auth) || !$auth->canDo('addUser')) { $disabled[] = 'register'; } - if (is_null($auth) || !$auth->canDo('modPass')) { + if((isset($conf['resendpasswd']) && !$conf['resendpasswd']) || is_null($auth) || !$auth->canDo('modPass')) { $disabled[] = 'resendpwd'; } + if((isset($conf['subscribers']) && !$conf['subscribers']) || is_null($auth)) { + $disabled[] = 'subscribe'; + } + if (is_null($auth) || !$auth->canDo('Profile')) { + $disabled[] = 'profile'; + } + if (is_null($auth)) { + $disabled[] = 'login'; + } + if (is_null($auth) || !$auth->canDo('logout')) { + $disabled[] = 'logout'; + } $disabled = array_unique($disabled); } @@ -324,4 +331,4 @@ function conf_decodeString($str) { return $str; } } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/feedcreator.class.php b/inc/feedcreator.class.php index 68b9bdd2b..435add6ac 100644 --- a/inc/feedcreator.class.php +++ b/inc/feedcreator.class.php @@ -50,11 +50,11 @@ * added a switch to select an external stylesheet (thanks to Pascal Van Hecke) * changed default content-type to application/xml * added character encoding setting - * fixed numerous smaller bugs (thanks to Sren Fuhrmann of golem.de) + * fixed numerous smaller bugs (thanks to Sören Fuhrmann of golem.de) * improved changing ATOM versions handling (thanks to August Trometer) - * improved the UniversalFeedCreator's useCached method (thanks to Sren Fuhrmann of golem.de) - * added charset output in HTTP headers (thanks to Sren Fuhrmann of golem.de) - * added Slashdot namespace to RSS 1.0 (thanks to Sren Fuhrmann of golem.de) + * improved the UniversalFeedCreator's useCached method (thanks to Sören Fuhrmann of golem.de) + * added charset output in HTTP headers (thanks to Sören Fuhrmann of golem.de) + * added Slashdot namespace to RSS 1.0 (thanks to Sören Fuhrmann of golem.de) * * See www.bitfolge.de for additional changelog info */ @@ -1577,4 +1577,4 @@ class DokuWikiFeedCreator extends UniversalFeedCreator{ -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/form.php b/inc/form.php index 70190d2b4..30e16b626 100644 --- a/inc/form.php +++ b/inc/form.php @@ -252,7 +252,7 @@ class Doku_Form { global $lang; $form = ''; $this->params['accept-charset'] = $lang['encoding']; - $form .= '<form ' . html_attbuild($this->params) . '><div class="no">' . DOKU_LF; + $form .= '<form ' . buildAttributes($this->params,true) . '><div class="no">' . DOKU_LF; if (!empty($this->_hidden)) { foreach ($this->_hidden as $name=>$value) $form .= form_hidden(array('name'=>$name, 'value'=>$value)); @@ -597,7 +597,7 @@ function form_makeListboxField($name, $values, $selected='', $label=null, $id='' * @author Tom N Harris <tnharris@whoopdedo.org> */ function form_tag($attrs) { - return '<'.$attrs['_tag'].' '.buildAttributes($attrs).'/>'; + return '<'.$attrs['_tag'].' '.buildAttributes($attrs,true).'/>'; } /** @@ -696,7 +696,7 @@ function form_wikitext($attrs) { */ function form_button($attrs) { $p = (!empty($attrs['_action'])) ? 'name="do['.$attrs['_action'].']" ' : ''; - return '<input '.$p.buildAttributes($attrs,true).'/>'; + return '<input '.$p.buildAttributes($attrs,true).' />'; } /** @@ -714,7 +714,7 @@ function form_field($attrs) { if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"'; if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"'; $s .= '><span>'.$attrs['_text'].'</span>'; - $s .= ' <input '.buildAttributes($attrs,true).'/></label>'; + $s .= ' <input '.buildAttributes($attrs,true).' /></label>'; if (preg_match('/(^| )block($| )/', $attrs['_class'])) $s .= '<br />'; return $s; @@ -734,7 +734,7 @@ function form_fieldright($attrs) { $s = '<label'; if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"'; if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"'; - $s .= '><input '.buildAttributes($attrs,true).'/>'; + $s .= '><input '.buildAttributes($attrs,true).' />'; $s .= ' <span>'.$attrs['_text'].'</span></label>'; if (preg_match('/(^| )block($| )/', $attrs['_class'])) $s .= '<br />'; @@ -758,7 +758,7 @@ function form_textfield($attrs) { if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"'; if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"'; $s .= '><span>'.$attrs['_text'].'</span> '; - $s .= '<input type="text" '.buildAttributes($attrs,true).'/></label>'; + $s .= '<input type="text" '.buildAttributes($attrs,true).' /></label>'; if (preg_match('/(^| )block($| )/', $attrs['_class'])) $s .= '<br />'; return $s; @@ -781,7 +781,7 @@ function form_passwordfield($attrs) { if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"'; if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"'; $s .= '><span>'.$attrs['_text'].'</span> '; - $s .= '<input type="password" '.buildAttributes($attrs,true).'/></label>'; + $s .= '<input type="password" '.buildAttributes($attrs,true).' /></label>'; if (preg_match('/(^| )block($| )/', $attrs['_class'])) $s .= '<br />'; return $s; @@ -807,7 +807,7 @@ function form_filefield($attrs) { $s .= '<input type="file" '.buildAttributes($attrs,true); if (!empty($attrs['_maxlength'])) $s .= ' maxlength="'.$attrs['_maxlength'].'"'; if (!empty($attrs['_accept'])) $s .= ' accept="'.$attrs['_accept'].'"'; - $s .= '/></label>'; + $s .= ' /></label>'; if (preg_match('/(^| )block($| )/', $attrs['_class'])) $s .= '<br />'; return $s; @@ -837,7 +837,7 @@ function form_checkboxfield($attrs) { . ' value="' . hsc($attrs['value'][1]) . '" />'; $attrs['value'] = $attrs['value'][0]; } - $s .= '<input type="checkbox" '.buildAttributes($attrs,true).'/>'; + $s .= '<input type="checkbox" '.buildAttributes($attrs,true).' />'; $s .= ' <span>'.$attrs['_text'].'</span></label>'; if (preg_match('/(^| )block($| )/', $attrs['_class'])) $s .= '<br />'; @@ -860,7 +860,7 @@ function form_radiofield($attrs) { $s = '<label'; if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"'; if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"'; - $s .= '><input type="radio" '.buildAttributes($attrs,true).'/>'; + $s .= '><input type="radio" '.buildAttributes($attrs,true).' />'; $s .= ' <span>'.$attrs['_text'].'</span></label>'; if (preg_match('/(^| )block($| )/', $attrs['_class'])) $s .= '<br />'; diff --git a/inc/fulltext.php b/inc/fulltext.php index 943a5d401..8155325ee 100644 --- a/inc/fulltext.php +++ b/inc/fulltext.php @@ -36,19 +36,21 @@ function ft_pageSearch($query,&$highlight){ * @author Kazutaka Miyasaka <kazmiya@gmail.com> */ function _ft_pageSearch(&$data) { + $Indexer = idx_get_indexer(); + // parse the given query - $q = ft_queryParser($data['query']); + $q = ft_queryParser($Indexer, $data['query']); $data['highlight'] = $q['highlight']; if (empty($q['parsed_ary'])) return array(); // lookup all words found in the query - $lookup = idx_lookup($q['words']); + $lookup = $Indexer->lookup($q['words']); // get all pages in this dokuwiki site (!: includes nonexistent pages) $pages_all = array(); - foreach (idx_getIndex('page', '') as $id) { - $pages_all[trim($id)] = 0; // base: 0 hit + foreach ($Indexer->getPages() as $id) { + $pages_all[$id] = 0; // base: 0 hit } // process the query @@ -122,29 +124,12 @@ function _ft_pageSearch(&$data) { /** * Returns the backlinks for a given page * - * Does a quick lookup with the fulltext index, then - * evaluates the instructions of the found pages + * Uses the metadata index. */ function ft_backlinks($id){ - global $conf; - $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt'; - $stopwords = @file_exists($swfile) ? file($swfile) : array(); - $result = array(); - // quick lookup of the pagename - $page = noNS($id); - $matches = idx_lookup(idx_tokenizer($page,$stopwords)); // pagename may contain specials (_ or .) - $docs = array_keys(ft_resultCombine(array_values($matches))); - $docs = array_filter($docs,'isVisiblePage'); // discard hidden pages - if(!count($docs)) return $result; - - // check metadata for matching links - foreach($docs as $match){ - // metadata relation reference links are already resolved - $links = p_get_metadata($match,'relation references'); - if (isset($links[$id])) $result[] = $match; - } + $result = idx_get_indexer()->lookupKey('relation_references', $id); if(!count($result)) return $result; @@ -168,17 +153,14 @@ function ft_backlinks($id){ * Aborts after $max found results */ function ft_mediause($id,$max){ - global $conf; - $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt'; - $stopwords = @file_exists($swfile) ? file($swfile) : array(); - if(!$max) $max = 1; // need to find at least one $result = array(); // quick lookup of the mediafile + // FIXME use metadata key lookup $media = noNS($id); - $matches = idx_lookup(idx_tokenizer($media,$stopwords)); + $matches = idx_lookup(idx_tokenizer($media)); $docs = array_keys(ft_resultCombine(array_values($matches))); if(!count($docs)) return $result; @@ -238,24 +220,32 @@ function _ft_pageLookup(&$data){ $in_ns = $data['in_ns']; $in_title = $data['in_title']; + $cleaned = cleanID($id); - $pages = array_map('rtrim', idx_getIndex('page', '')); - $titles = array_map('rtrim', idx_getIndex('title', '')); - $pages = array_combine($pages, $titles); + $Indexer = idx_get_indexer(); + $page_idx = $Indexer->getPages(); - $cleaned = cleanID($id); + $pages = array(); if ($id !== '' && $cleaned !== '') { - foreach ($pages as $p_id => $p_title) { - if ((strpos($in_ns ? $p_id : noNSorNS($p_id), $cleaned) === false) && - (!$in_title || (stripos($p_title, $id) === false)) ) { - unset($pages[$p_id]); + foreach ($page_idx as $p_id) { + if ((strpos($in_ns ? $p_id : noNSorNS($p_id), $cleaned) !== false)) { + if (!isset($pages[$p_id])) + $pages[$p_id] = p_get_first_heading($p_id, false); + } + } + if ($in_title) { + $wildcard_id = "*$id*"; + foreach ($Indexer->lookupKey('title', $wildcard_id) as $p_id) { + if (!isset($pages[$p_id])) + $pages[$p_id] = p_get_first_heading($p_id, false); } } } if (isset($ns)) { - foreach (array_keys($pages) as $p_id) { - if (strpos($p_id, $ns) !== 0) { - unset($pages[$p_id]); + foreach ($page_idx as $p_id) { + if (strpos($p_id, $ns) === 0) { + if (!isset($pages[$p_id])) + $pages[$p_id] = p_get_first_heading($p_id, false); } } } @@ -270,7 +260,7 @@ function _ft_pageLookup(&$data){ } } - uasort($pages,'ft_pagesorter'); + uksort($pages,'ft_pagesorter'); return $pages; } @@ -298,6 +288,7 @@ function ft_pagesorter($a, $b){ */ function ft_snippet($id,$highlight){ $text = rawWiki($id); + $text = str_replace("\xC2\xAD",'',$text); // remove soft-hyphens $evdata = array( 'id' => $id, 'text' => &$text, @@ -390,6 +381,11 @@ function ft_snippet($id,$highlight){ * Wraps a search term in regex boundary checks. */ function ft_snippet_re_preprocess($term) { + // do not process asian terms where word boundaries are not explicit + if(preg_match('/'.IDX_ASIAN.'/u',$term)){ + return $term; + } + if(substr($term,0,2) == '\\*'){ $term = substr($term,2); }else{ @@ -488,11 +484,7 @@ function ft_resultComplement($args) { * @author Andreas Gohr <andi@splitbrain.org> * @author Kazutaka Miyasaka <kazmiya@gmail.com> */ -function ft_queryParser($query){ - global $conf; - $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt'; - $stopwords = @file_exists($swfile) ? file($swfile) : array(); - +function ft_queryParser($Indexer, $query){ /** * parse a search query and transform it into intermediate representation * @@ -538,7 +530,7 @@ function ft_queryParser($query){ if (preg_match('/^(-?)"(.+)"$/u', $term, $matches)) { // phrase-include and phrase-exclude $not = $matches[1] ? 'NOT' : ''; - $parsed = $not.ft_termParser($matches[2], $stopwords, false, true); + $parsed = $not.ft_termParser($Indexer, $matches[2], false, true); } else { // fix incomplete phrase $term = str_replace('"', ' ', $term); @@ -585,10 +577,10 @@ function ft_queryParser($query){ $parsed .= '(N+:'.$matches[1].')'; } elseif (preg_match('/^-(.+)$/', $token, $matches)) { // word-exclude - $parsed .= 'NOT('.ft_termParser($matches[1], $stopwords).')'; + $parsed .= 'NOT('.ft_termParser($Indexer, $matches[1]).')'; } else { // word-include - $parsed .= ft_termParser($token, $stopwords); + $parsed .= ft_termParser($Indexer, $token); } } } @@ -722,18 +714,18 @@ function ft_queryParser($query){ * * @author Kazutaka Miyasaka <kazmiya@gmail.com> */ -function ft_termParser($term, &$stopwords, $consider_asian = true, $phrase_mode = false) { +function ft_termParser($Indexer, $term, $consider_asian = true, $phrase_mode = false) { $parsed = ''; if ($consider_asian) { // successive asian characters need to be searched as a phrase $words = preg_split('/('.IDX_ASIAN.'+)/u', $term, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); foreach ($words as $word) { - if (preg_match('/'.IDX_ASIAN.'/u', $word)) $phrase_mode = true; - $parsed .= ft_termParser($word, $stopwords, false, $phrase_mode); + $phrase_mode = $phrase_mode ? true : preg_match('/'.IDX_ASIAN.'/u', $word); + $parsed .= ft_termParser($Indexer, $word, false, $phrase_mode); } } else { $term_noparen = str_replace(array('(', ')'), ' ', $term); - $words = idx_tokenizer($term_noparen, $stopwords, true); + $words = $Indexer->tokenizer($term_noparen, true); // W_: no need to highlight if (empty($words)) { @@ -750,4 +742,4 @@ function ft_termParser($term, &$stopwords, $consider_asian = true, $phrase_mode return $parsed; } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/html.php b/inc/html.php index 02afa00e9..fcfa54b6c 100644 --- a/inc/html.php +++ b/inc/html.php @@ -26,6 +26,7 @@ function html_wikilink($id,$name=null,$search=''){ /** * Helps building long attribute lists * + * @deprecated Use buildAttributes instead * @author Andreas Gohr <andi@splitbrain.org> */ function html_attbuild($attributes){ @@ -61,17 +62,11 @@ function html_login(){ $form->endFieldset(); if(actionOK('register')){ - $form->addElement('<p>' - . $lang['reghere'] - . ': <a href="'.wl($ID,'do=register').'" rel="nofollow" class="wikilink1">'.$lang['register'].'</a>' - . '</p>'); + $form->addElement('<p>'.$lang['reghere'].': '.tpl_actionlink('register','','','',true).'</p>'); } if (actionOK('resendpwd')) { - $form->addElement('<p>' - . $lang['pwdforget'] - . ': <a href="'.wl($ID,'do=resendpwd').'" rel="nofollow" class="wikilink1">'.$lang['btn_resendpwd'].'</a>' - . '</p>'); + $form->addElement('<p>'.$lang['pwdforget'].': '.tpl_actionlink('resendpwd','','','',true).'</p>'); } html_form('login', $form); @@ -162,11 +157,12 @@ function html_topbtn(){ * * @author Andreas Gohr <andi@splitbrain.org> */ -function html_btn($name,$id,$akey,$params,$method='get',$tooltip=''){ +function html_btn($name,$id,$akey,$params,$method='get',$tooltip='',$label=false){ global $conf; global $lang; - $label = $lang['btn_'.$name]; + if (!$label) + $label = $lang['btn_'.$name]; $ret = ''; $tip = ''; @@ -288,7 +284,8 @@ function html_hilight($html,$phrases){ $regex = join('|',array_map('ft_snippet_re_preprocess', array_map('preg_quote_cb',$phrases))); if ($regex === '') return $html; - $html = preg_replace_callback("/((<[^>]*)|$regex)/ui",'html_hilight_callback',$html); + if (!utf8_check($regex)) return $html; + $html = @preg_replace_callback("/((<[^>]*)|$regex)/ui",'html_hilight_callback',$html); return $html; } @@ -316,7 +313,13 @@ function html_search(){ global $ID; global $lang; - print p_locale_xhtml('searchpage'); + $intro = p_locale_xhtml('searchpage'); + // allow use of placeholder in search intro + $intro = str_replace( + array('@QUERY@','@SEARCH@'), + array(hsc(rawurlencode($QUERY)),hsc($QUERY)), + $intro); + echo $intro; flush(); //show progressbar @@ -862,13 +865,18 @@ function html_backlinks(){ * show diff * * @author Andreas Gohr <andi@splitbrain.org> + * @param string $text - compare with this text with most current version + * @param bool $intr - display the intro text */ -function html_diff($text='',$intro=true){ +function html_diff($text='',$intro=true,$type=null){ global $ID; global $REV; global $lang; global $conf; + if(!$type) $type = $_REQUEST['difftype']; + if($type != 'inline') $type = 'sidebyside'; + // we're trying to be clever here, revisions to compare can be either // given as rev and rev2 parameters, with rev2 being optional. Or in an // array in rev2. @@ -886,6 +894,9 @@ function html_diff($text='',$intro=true){ $rev2 = (int) $_REQUEST['rev2']; } + $r_minor = ''; + $l_minor = ''; + if($text){ // compare text to the most current revision $l_rev = ''; $l_text = rawWiki($ID,''); @@ -982,17 +993,48 @@ function html_diff($text='',$intro=true){ $df = new Diff(explode("\n",htmlspecialchars($l_text)), explode("\n",htmlspecialchars($r_text))); - $tdf = new TableDiffFormatter(); + if($type == 'inline'){ + $tdf = new InlineDiffFormatter(); + } else { + $tdf = new TableDiffFormatter(); + } + + + if($intro) print p_locale_xhtml('diff'); if (!$text) { - $diffurl = wl($ID, array('do'=>'diff', 'rev2[0]'=>$l_rev, 'rev2[1]'=>$r_rev)); ptln('<p class="difflink">'); - ptln(' <a class="wikilink1" href="'.$diffurl.'">'.$lang['difflink'].'</a>'); + + $form = new Doku_Form(array('action'=>wl())); + $form->addHidden('id',$ID); + $form->addHidden('rev2[0]',$l_rev); + $form->addHidden('rev2[1]',$r_rev); + $form->addHidden('do','diff'); + $form->addElement(form_makeListboxField( + 'difftype', + array( + 'sidebyside' => $lang['diff_side'], + 'inline' => $lang['diff_inline']), + $type, + $lang['diff_type'], + '','', + array('class'=>'quickselect'))); + $form->addElement(form_makeButton('submit', 'diff','Go')); + $form->printForm(); + + + $diffurl = wl($ID, array( + 'do' => 'diff', + 'rev2[0]' => $l_rev, + 'rev2[1]' => $r_rev, + 'difftype' => $type, + )); + ptln('<br /><a class="wikilink1" href="'.$diffurl.'">'.$lang['difflink'].'</a>'); ptln('</p>'); } ?> - <table class="diff"> + <table class="diff diff_<?php echo $type?>"> <tr> <th colspan="2" <?php echo $l_minor?>> <?php echo $l_head?> @@ -1032,7 +1074,10 @@ function html_conflict($text,$summary){ * @author Andreas Gohr <andi@splitbrain.org> */ function html_msgarea(){ - global $MSG; + global $MSG, $MSG_shown; + // store if the global $MSG has already been shown and thus HTML output has been started + $MSG_shown = true; + if(!isset($MSG)) return; $shown = array(); @@ -1044,6 +1089,8 @@ function html_msgarea(){ print '</div>'; $shown[$hash] = 1; } + + unset($GLOBALS['MSG']); } /** @@ -1059,7 +1106,7 @@ function html_register(){ print p_locale_xhtml('register'); print '<div class="centeralign">'.NL; $form = new Doku_Form(array('id' => 'dw__register')); - $form->startFieldset($lang['register']); + $form->startFieldset($lang['btn_register']); $form->addHidden('do', 'register'); $form->addHidden('save', '1'); $form->addElement(form_makeTextField('login', $_POST['login'], $lang['user'], null, 'block', array('size'=>'50'))); @@ -1069,7 +1116,7 @@ function html_register(){ } $form->addElement(form_makeTextField('fullname', $_POST['fullname'], $lang['fullname'], '', 'block', array('size'=>'50'))); $form->addElement(form_makeTextField('email', $_POST['email'], $lang['email'], '', 'block', array('size'=>'50'))); - $form->addElement(form_makeButton('submit', '', $lang['register'])); + $form->addElement(form_makeButton('submit', '', $lang['btn_register'])); $form->endFieldset(); html_form('register', $form); @@ -1212,9 +1259,9 @@ function html_edit(){ if($wr && $conf['license']){ $form->addElement(form_makeOpenTag('div', array('class'=>'license'))); $out = $lang['licenseok']; - $out .= '<a href="'.$license[$conf['license']]['url'].'" rel="license" class="urlextern"'; + $out .= ' <a href="'.$license[$conf['license']]['url'].'" rel="license" class="urlextern"'; if(isset($conf['target']['extern'])) $out .= ' target="'.$conf['target']['extern'].'"'; - $out .= '> '.$license[$conf['license']]['name'].'</a>'; + $out .= '>'.$license[$conf['license']]['name'].'</a>'; $form->addElement($out); $form->addElement(form_makeCloseTag('div')); } @@ -1388,10 +1435,11 @@ function html_admin(){ } // data security check - echo '<a style="background: transparent url(data/security.png) left top no-repeat; - display: block; width:380px; height:73px; border:none; float:right" - target="_blank" - href="http://www.dokuwiki.org/security#web_access_security"></a>'; + // @todo: could be checked and only displayed if $conf['savedir'] is under the web root + echo '<a style="border:none; float:right;" target="_blank" + href="http://www.dokuwiki.org/security#web_access_security"> + <img src="data/security.png" alt="Your data directory seems to be protected properly." + onerror="this.parentNode.style.display=\'none\'" /></a>'; print p_locale_xhtml('admin'); diff --git a/inc/indexer.php b/inc/indexer.php index 01ba76b08..0fbd939be 100644 --- a/inc/indexer.php +++ b/inc/indexer.php @@ -4,10 +4,14 @@ * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Andreas Gohr <andi@splitbrain.org> + * @author Tom N Harris <tnharris@whoopdedo.org> */ if(!defined('DOKU_INC')) die('meh.'); +// Version tag used to force rebuild on upgrade +define('INDEXER_VERSION', 4); + // 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); @@ -23,6 +27,10 @@ define('IDX_ASIAN2','['. '\x{30FD}-\x{31EF}\x{3200}-\x{D7AF}'. '\x{F900}-\x{FAFF}'. // CJK Compatibility Ideographs '\x{FE30}-\x{FE4F}'. // CJK Compatibility Forms + "\xF0\xA0\x80\x80-\xF0\xAA\x9B\x9F". // CJK Extension B + "\xF0\xAA\x9C\x80-\xF0\xAB\x9C\xBF". // CJK Extension C + "\xF0\xAB\x9D\x80-\xF0\xAB\xA0\x9F". // CJK Extension D + "\xF0\xAF\xA0\x80-\xF0\xAF\xAB\xBF". // CJK Compatibility Supplement ']'); define('IDX_ASIAN3','['. // Hiragana/Katakana (can be two characters) '\x{3042}\x{3044}\x{3046}\x{3048}'. @@ -43,6 +51,36 @@ define('IDX_ASIAN3','['. // Hiragana/Katakana (can be two charact define('IDX_ASIAN', '(?:'.IDX_ASIAN1.'|'.IDX_ASIAN2.'|'.IDX_ASIAN3.')'); /** + * Version of the indexer taking into consideration the external tokenizer. + * The indexer is only compatible with data written by the same version. + * + * @triggers INDEXER_VERSION_GET + * Plugins that modify what gets indexed should hook this event and + * add their version info to the event data like so: + * $data[$plugin_name] = $plugin_version; + * + * @author Tom N Harris <tnharris@whoopdedo.org> + * @author Michael Hamann <michael@content-space.de> + */ +function idx_get_version(){ + static $indexer_version = null; + if ($indexer_version == null) { + global $conf; + $version = INDEXER_VERSION; + + // DokuWiki version is included for the convenience of plugins + $data = array('dokuwiki'=>$version); + trigger_event('INDEXER_VERSION_GET', $data, null, false); + unset($data['dokuwiki']); // this needs to be first + ksort($data); + foreach ($data as $plugin=>$vers) + $version .= '+'.$plugin.'='.$vers; + $indexer_version = $version; + } + return $indexer_version; +} + +/** * Measure the length of a string. * Differs from strlen in handling of asian characters. * @@ -52,368 +90,1179 @@ function wordlen($w){ $l = strlen($w); // If left alone, all chinese "words" will get put into w3.idx // So the "length" of a "word" is faked - if(preg_match('/'.IDX_ASIAN2.'/u',$w)) - $l += ord($w) - 0xE1; // Lead bytes from 0xE2-0xEF + if(preg_match_all('/[\xE2-\xEF]/',$w,$leadbytes)) { + foreach($leadbytes[0] as $b) + $l += ord($b) - 0xE1; + } return $l; } /** - * Write a list of strings to an index file. + * Class that encapsulates operations on the indexer database. * * @author Tom N Harris <tnharris@whoopdedo.org> */ -function idx_saveIndex($pre, $wlen, &$idx){ - global $conf; - $fn = $conf['indexdir'].'/'.$pre.$wlen; - $fh = @fopen($fn.'.tmp','w'); - if(!$fh) return false; - foreach ($idx as $line) { - fwrite($fh,$line); - } - fclose($fh); - if(isset($conf['fperm'])) chmod($fn.'.tmp', $conf['fperm']); - io_rename($fn.'.tmp', $fn.'.idx'); - return true; -} +class Doku_Indexer { -/** - * Append a given line to an index file. - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function idx_appendIndex($pre, $wlen, $line){ - global $conf; - $fn = $conf['indexdir'].'/'.$pre.$wlen; - $fh = @fopen($fn.'.idx','a'); - if(!$fh) return false; - fwrite($fh,$line); - fclose($fh); - return true; -} + /** + * Adds the contents of a page to the fulltext index + * + * The added text replaces previous words for the same page. + * An empty value erases the page. + * + * @param string $page a page name + * @param string $text the body of the page + * @return boolean the function completed successfully + * @author Tom N Harris <tnharris@whoopdedo.org> + * @author Andreas Gohr <andi@splitbrain.org> + */ + public function addPageWords($page, $text) { + if (!$this->_lock()) + return "locked"; -/** - * Read the list of words in an index (if it exists). - * - * @author Tom N Harris <tnharris@whoopdedo.org> - */ -function idx_getIndex($pre, $wlen){ - global $conf; - $fn = $conf['indexdir'].'/'.$pre.$wlen.'.idx'; - if(!@file_exists($fn)) return array(); - return file($fn); -} + // load known documents + $pid = $this->_addIndexKey('page', '', $page); + if ($pid === false) { + $this->_unlock(); + return false; + } -/** - * Create an empty index file if it doesn't exist yet. - * - * FIXME: This function isn't currently used. It will probably be removed soon. - * - * @author Tom N Harris <tnharris@whoopdedo.org> - */ -function idx_touchIndex($pre, $wlen){ - global $conf; - $fn = $conf['indexdir'].'/'.$pre.$wlen.'.idx'; - if(!@file_exists($fn)){ - touch($fn); - if($conf['fperm']) chmod($fn, $conf['fperm']); + $pagewords = array(); + // get word usage in page + $words = $this->_getPageWords($text); + if ($words === false) { + $this->_unlock(); + return false; + } + + if (!empty($words)) { + foreach (array_keys($words) as $wlen) { + $index = $this->_getIndex('i', $wlen); + foreach ($words[$wlen] as $wid => $freq) { + $idx = ($wid<count($index)) ? $index[$wid] : ''; + $index[$wid] = $this->_updateTuple($idx, $pid, $freq); + $pagewords[] = "$wlen*$wid"; + } + if (!$this->_saveIndex('i', $wlen, $index)) { + $this->_unlock(); + return false; + } + } + } + + // Remove obsolete index entries + $pageword_idx = $this->_getIndexKey('pageword', '', $pid); + if ($pageword_idx !== '') { + $oldwords = explode(':',$pageword_idx); + $delwords = array_diff($oldwords, $pagewords); + $upwords = array(); + foreach ($delwords as $word) { + if ($word != '') { + list($wlen,$wid) = explode('*', $word); + $wid = (int)$wid; + $upwords[$wlen][] = $wid; + } + } + foreach ($upwords as $wlen => $widx) { + $index = $this->_getIndex('i', $wlen); + foreach ($widx as $wid) { + $index[$wid] = $this->_updateTuple($index[$wid], $pid, 0); + } + $this->_saveIndex('i', $wlen, $index); + } + } + // Save the reverse index + $pageword_idx = join(':', $pagewords); + if (!$this->_saveIndexKey('pageword', '', $pid, $pageword_idx)) { + $this->_unlock(); + return false; + } + + $this->_unlock(); + return true; } -} -/** - * Read a line ending with \n. - * Returns false on EOF. - * - * @author Tom N Harris <tnharris@whoopdedo.org> - */ -function _freadline($fh) { - if (feof($fh)) return false; - $ln = ''; - while (($buf = fgets($fh,4096)) !== false) { - $ln .= $buf; - if (substr($buf,-1) == "\n") break; - } - if ($ln === '') return false; - if (substr($ln,-1) != "\n") $ln .= "\n"; - return $ln; -} + /** + * Split the words in a page and add them to the index. + * + * @author Andreas Gohr <andi@splitbrain.org> + * @author Christopher Smith <chris@jalakai.co.uk> + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _getPageWords($text) { + global $conf; -/** - * Write a line to an index file. - * - * @author Tom N Harris <tnharris@whoopdedo.org> - */ -function idx_saveIndexLine($pre, $wlen, $idx, $line){ - global $conf; - if(substr($line,-1) != "\n") $line .= "\n"; - $fn = $conf['indexdir'].'/'.$pre.$wlen; - $fh = @fopen($fn.'.tmp','w'); - if(!$fh) return false; - $ih = @fopen($fn.'.idx','r'); - if ($ih) { - $ln = -1; - while (($curline = _freadline($ih)) !== false) { - if (++$ln == $idx) { - fwrite($fh, $line); - } else { - fwrite($fh, $curline); + $tokens = $this->tokenizer($text); + $tokens = array_count_values($tokens); // count the frequency of each token + + $words = array(); + foreach ($tokens as $w=>$c) { + $l = wordlen($w); + if (isset($words[$l])){ + $words[$l][$w] = $c + (isset($words[$l][$w]) ? $words[$l][$w] : 0); + }else{ + $words[$l] = array($w => $c); } } - if ($idx > $ln) { - fwrite($fh,$line); + + // arrive here with $words = array(wordlen => array(word => frequency)) + $word_idx_modified = false; + $index = array(); //resulting index + foreach (array_keys($words) as $wlen) { + $word_idx = $this->_getIndex('w', $wlen); + foreach ($words[$wlen] as $word => $freq) { + $wid = array_search($word, $word_idx); + if ($wid === false) { + $wid = count($word_idx); + $word_idx[] = $word; + $word_idx_modified = true; + } + if (!isset($index[$wlen])) + $index[$wlen] = array(); + $index[$wlen][$wid] = $freq; + } + // save back the word index + if ($word_idx_modified && !$this->_saveIndex('w', $wlen, $word_idx)) + return false; } - fclose($ih); - } else { - fwrite($fh,$line); + + return $index; } - fclose($fh); - if($conf['fperm']) chmod($fn.'.tmp', $conf['fperm']); - io_rename($fn.'.tmp', $fn.'.idx'); - return true; -} -/** - * Read a single line from an index (if it exists). - * - * @author Tom N Harris <tnharris@whoopdedo.org> - */ -function idx_getIndexLine($pre, $wlen, $idx){ - global $conf; - $fn = $conf['indexdir'].'/'.$pre.$wlen.'.idx'; - if(!@file_exists($fn)) return ''; - $fh = @fopen($fn,'r'); - if(!$fh) return ''; - $ln = -1; - while (($line = _freadline($fh)) !== false) { - if (++$ln == $idx) break; - } - fclose($fh); - return "$line"; -} + /** + * Add/update keys to/of the metadata index. + * + * Adding new keys does not remove other keys for the page. + * An empty value will erase the key. + * The $key parameter can be an array to add multiple keys. $value will + * not be used if $key is an array. + * + * @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 + * @author Tom N Harris <tnharris@whoopdedo.org> + * @author Michael Hamann <michael@content-space.de> + */ + public function addMetaKeys($page, $key, $value=null) { + if (!is_array($key)) { + $key = array($key => $value); + } elseif (!is_null($value)) { + // $key is array, but $value is not null + trigger_error("array passed to addMetaKeys but value is not null", E_USER_WARNING); + } -/** - * Split a page into words - * - * Returns an array of word counts, false if an error occurred. - * Array is keyed on the word length, then the word index. - * - * @author Andreas Gohr <andi@splitbrain.org> - * @author Christopher Smith <chris@jalakai.co.uk> - */ -function idx_getPageWords($page){ - global $conf; - $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt'; - if(@file_exists($swfile)){ - $stopwords = file($swfile); - }else{ - $stopwords = array(); + if (!$this->_lock()) + return "locked"; + + // load known documents + $pid = $this->_addIndexKey('page', '', $page); + if ($pid === false) { + $this->_unlock(); + return false; + } + + // Special handling for titles so the index file is simpler + if (array_key_exists('title', $key)) { + $value = $key['title']; + if (is_array($value)) + $value = $value[0]; + $this->_saveIndexKey('title', '', $pid, $value); + unset($key['title']); + } + + foreach ($key as $name => $values) { + $metaname = idx_cleanName($name); + $this->_addIndexKey('metadata', '', $metaname); + $metaidx = $this->_getIndex($metaname, '_i'); + $metawords = $this->_getIndex($metaname, '_w'); + $addwords = false; + + if (!is_array($values)) $values = array($values); + + $val_idx = $this->_getIndexKey($metaname, '_p', $pid); + if ($val_idx != '') { + $val_idx = explode(':', $val_idx); + // -1 means remove, 0 keep, 1 add + $val_idx = array_combine($val_idx, array_fill(0, count($val_idx), -1)); + } else { + $val_idx = array(); + } + + + foreach ($values as $val) { + $val = (string)$val; + if ($val !== "") { + $id = array_search($val, $metawords); + if ($id === false) { + $id = count($metawords); + $metawords[$id] = $val; + $addwords = true; + } + // test if value is already in the index + if (isset($val_idx[$id]) && $val_idx[$id] <= 0) + $val_idx[$id] = 0; + else // else add it + $val_idx[$id] = 1; + } + } + + if ($addwords) + $this->_saveIndex($metaname.'_w', '', $metawords); + $vals_changed = false; + foreach ($val_idx as $id => $action) { + if ($action == -1) { + $metaidx[$id] = $this->_updateTuple($metaidx[$id], $pid, 0); + $vals_changed = true; + unset($val_idx[$id]); + } elseif ($action == 1) { + $metaidx[$id] = $this->_updateTuple($metaidx[$id], $pid, 1); + $vals_changed = true; + } + } + + if ($vals_changed) { + $this->_saveIndex($metaname.'_i', '', $metaidx); + $val_idx = implode(':', array_keys($val_idx)); + $this->_saveIndexKey($metaname.'_p', '', $pid, $val_idx); + } + + unset($metaidx); + unset($metawords); + } + + $this->_unlock(); + return true; } - $body = ''; - $data = array($page, $body); - $evt = new Doku_Event('INDEXER_PAGE_ADD', $data); - if ($evt->advise_before()) $data[1] .= rawWiki($page); - $evt->advise_after(); - unset($evt); + /** + * Remove a page from the index + * + * Erases entries in all known indexes. + * + * @param string $page a page name + * @return boolean the function completed successfully + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + public function deletePage($page) { + if (!$this->_lock()) + return "locked"; - list($page,$body) = $data; + // load known documents + $pid = $this->_getIndexKey('page', '', $page); + if ($pid === false) { + $this->_unlock(); + return false; + } - $body = strtr($body, "\r\n\t", ' '); - $tokens = explode(' ', $body); - $tokens = array_count_values($tokens); // count the frequency of each token + // Remove obsolete index entries + $pageword_idx = $this->_getIndexKey('pageword', '', $pid); + if ($pageword_idx !== '') { + $delwords = explode(':',$pageword_idx); + $upwords = array(); + foreach ($delwords as $word) { + if ($word != '') { + list($wlen,$wid) = explode('*', $word); + $wid = (int)$wid; + $upwords[$wlen][] = $wid; + } + } + foreach ($upwords as $wlen => $widx) { + $index = $this->_getIndex('i', $wlen); + foreach ($widx as $wid) { + $index[$wid] = $this->_updateTuple($index[$wid], $pid, 0); + } + $this->_saveIndex('i', $wlen, $index); + } + } + // Save the reverse index + if (!$this->_saveIndexKey('pageword', '', $pid, "")) { + $this->_unlock(); + return false; + } + + $this->_saveIndexKey('title', '', $pid, ""); + $keyidx = $this->_getIndex('metadata', ''); + foreach ($keyidx as $metaname) { + $val_idx = explode(':', $this->_getIndexKey($metaname.'_p', '', $pid)); + $meta_idx = $this->_getIndex($metaname.'_i', ''); + foreach ($val_idx as $id) { + $meta_idx[$id] = $this->_updateTuple($meta_idx[$id], $pid, 0); + } + $this->_saveIndex($metaname.'_i', '', $meta_idx); + $this->_saveIndexKey($metaname.'_p', '', $pid, ''); + } - // ensure the deaccented or romanised page names of internal links are added to the token array - // (this is necessary for the backlink function -- there maybe a better way!) - if ($conf['deaccent']) { - $links = p_get_metadata($page,'relation references'); + $this->_unlock(); + return true; + } - if (!empty($links)) { - $tmp = join(' ',array_keys($links)); // make a single string - $tmp = strtr($tmp, ':', ' '); // replace namespace separator with a space - $link_tokens = array_unique(explode(' ', $tmp)); // break into tokens + /** + * Split the text into words for fulltext search + * + * TODO: does this also need &$stopwords ? + * + * @triggers INDEXER_TEXT_PREPARE + * This event allows plugins to modify the text before it gets tokenized. + * Plugins intercepting this event should also intercept INDEX_VERSION_GET + * + * @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> + */ + public function tokenizer($text, $wc=false) { + global $conf; + $words = array(); + $wc = ($wc) ? '' : '\*'; + $stopwords =& idx_get_stopwords(); - foreach ($link_tokens as $link_token) { - if (isset($tokens[$link_token])) continue; - $tokens[$link_token] = 1; + // prepare the text to be tokenized + $evt = new Doku_Event('INDEXER_TEXT_PREPARE', $text); + if ($evt->advise_before(true)) { + if (preg_match('/[^0-9A-Za-z ]/u', $text)) { + // handle asian chars as single words (may fail on older PHP version) + $asia = @preg_replace('/('.IDX_ASIAN.')/u', ' \1 ', $text); + if (!is_null($asia)) $text = $asia; // recover from regexp falure } } + $evt->advise_after(); + unset($evt); + + $text = strtr($text, + array( + "\r" => ' ', + "\n" => ' ', + "\t" => ' ', + "\xC2\xAD" => '', //soft-hyphen + ) + ); + if (preg_match('/[^0-9A-Za-z ]/u', $text)) + $text = utf8_stripspecials($text, ' ', '\._\-:'.$wc); + + $wordlist = explode(' ', $text); + foreach ($wordlist as $i => &$word) { + $word = (preg_match('/[^0-9A-Za-z]/u', $word)) ? + utf8_strtolower($word) : strtolower($word); + if ((!is_numeric($word) && strlen($word) < IDX_MINWORDLENGTH) + || array_search($word, $stopwords) !== false) + unset($wordlist[$i]); + } + return array_values($wordlist); } - $words = array(); - foreach ($tokens as $word => $count) { - $arr = idx_tokenizer($word,$stopwords); - $arr = array_count_values($arr); - foreach ($arr as $w => $c) { - $l = wordlen($w); - if(isset($words[$l])){ - $words[$l][$w] = $c * $count + (isset($words[$l][$w]) ? $words[$l][$w] : 0); - }else{ - $words[$l] = array($w => $c * $count); + /** + * Find pages in the fulltext index containing the words, + * + * The search words must be pre-tokenized, meaning only letters and + * numbers with an optional wildcard + * + * The returned array will have the original tokens as key. The values + * in the returned list is an array with the page names as keys and the + * number of times that token appears on the page as value. + * + * @param arrayref $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> + */ + public function lookup(&$tokens) { + $result = array(); + $wids = $this->_getIndexWords($tokens, $result); + if (empty($wids)) return array(); + // load known words and documents + $page_idx = $this->_getIndex('page', ''); + $docs = array(); + foreach (array_keys($wids) as $wlen) { + $wids[$wlen] = array_unique($wids[$wlen]); + $index = $this->_getIndex('i', $wlen); + foreach($wids[$wlen] as $ixid) { + if ($ixid < count($index)) + $docs["$wlen*$ixid"] = $this->_parseTuples($page_idx, $index[$ixid]); } } + // merge found pages into final result array + $final = array(); + foreach ($result as $word => $res) { + $final[$word] = array(); + foreach ($res as $wid) { + $hits = &$docs[$wid]; + foreach ($hits as $hitkey => $hitcnt) { + // make sure the document still exists + if (!page_exists($hitkey, '', false)) continue; + if (!isset($final[$word][$hitkey])) + $final[$word][$hitkey] = $hitcnt; + else + $final[$word][$hitkey] += $hitcnt; + } + } + } + return $final; } - // arrive here with $words = array(wordlen => array(word => frequency)) + /** + * Find pages containing a metadata key. + * + * The metadata values are compared as case-sensitive strings. Pass a + * callback function that returns true or false to use a different + * comparison function. The function will be called with the $value being + * searched for as the first argument, and the word in the index as the + * second argument. The function preg_match can be used directly if the + * values are regexes. + * + * @param string $key name of the metadata key to look for + * @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> + */ + public function lookupKey($key, &$value, $func=null) { + if (!is_array($value)) + $value_array = array($value); + else + $value_array =& $value; + + // the matching ids for the provided value(s) + $value_ids = array(); + + $metaname = idx_cleanName($key); - $index = array(); //resulting index - foreach (array_keys($words) as $wlen){ - $word_idx = idx_getIndex('w',$wlen); - foreach ($words[$wlen] as $word => $freq) { - $wid = array_search("$word\n",$word_idx); - if(!is_int($wid)){ - $wid = count($word_idx); - $word_idx[] = "$word\n"; + // get all words in order to search the matching ids + if ($key == 'title') { + $words = $this->_getIndex('title', ''); + } else { + $words = $this->_getIndex($metaname, '_w'); + } + + if (!is_null($func)) { + foreach ($value_array as $val) { + foreach ($words as $i => $word) { + if (call_user_func_array($func, array($val, $word))) + $value_ids[$i][] = $val; + } + } + } else { + foreach ($value_array as $val) { + $xval = $val; + $caret = '^'; + $dollar = '$'; + // check for wildcards + if (substr($xval, 0, 1) == '*') { + $xval = substr($xval, 1); + $caret = ''; + } + if (substr($xval, -1, 1) == '*') { + $xval = substr($xval, 0, -1); + $dollar = ''; + } + if (!$caret || !$dollar) { + $re = $caret.preg_quote($xval, '/').$dollar; + foreach(array_keys(preg_grep('/'.$re.'/', $words)) as $i) + $value_ids[$i][] = $val; + } else { + if (($i = array_search($val, $words)) !== false) + $value_ids[$i][] = $val; + } } - if(!isset($index[$wlen])) - $index[$wlen] = array(); - $index[$wlen][$wid] = $freq; } - // save back word index - if(!idx_saveIndex('w',$wlen,$word_idx)){ - trigger_error("Failed to write word index", E_USER_ERROR); - return false; + unset($words); // free the used memory + + // initialize the result so it won't be null + $result = array(); + foreach ($value_array as $val) { + $result[$val] = array(); } + + $page_idx = $this->_getIndex('page', ''); + + // Special handling for titles + if ($key == 'title') { + foreach ($value_ids as $pid => $val_list) { + $page = $page_idx[$pid]; + foreach ($val_list as $val) { + $result[$val][] = $page; + } + } + } else { + // load all lines and pages so the used lines can be taken and matched with the pages + $lines = $this->_getIndex($metaname, '_i'); + + foreach ($value_ids as $value_id => $val_list) { + // parse the tuples of the form page_id*1:page2_id*1 and so on, return value + // is an array with page_id => 1, page2_id => 1 etc. so take the keys only + $pages = array_keys($this->_parseTuples($page_idx, $lines[$value_id])); + foreach ($val_list as $val) { + $result[$val] = array_merge($result[$val], $pages); + } + } + } + if (!is_array($value)) $result = $result[$value]; + return $result; } - return $index; -} + /** + * Find the index ID of each search term. + * + * The query terms should only contain valid characters, with a '*' at + * either the beginning or end of the word (or both). + * The $result parameter can be used to merge the index locations with + * the appropriate query term. + * + * @param arrayref $words The query terms. + * @param arrayref $result Set to word => array("length*id" ...) + * @return array Set to length => array(id ...) + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _getIndexWords(&$words, &$result) { + $tokens = array(); + $tokenlength = array(); + $tokenwild = array(); + foreach ($words as $word) { + $result[$word] = array(); + $caret = '^'; + $dollar = '$'; + $xword = $word; + $wlen = wordlen($word); -/** - * Adds/updates the search for the given page - * - * This is the core function of the indexer which does most - * of the work. This function needs to be called with proper - * locking! - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function idx_addPage($page){ - global $conf; + // check for wildcards + if (substr($xword, 0, 1) == '*') { + $xword = substr($xword, 1); + $caret = ''; + $wlen -= 1; + } + if (substr($xword, -1, 1) == '*') { + $xword = substr($xword, 0, -1); + $dollar = ''; + $wlen -= 1; + } + if ($wlen < IDX_MINWORDLENGTH && $caret && $dollar && !is_numeric($xword)) + continue; + if (!isset($tokens[$xword])) + $tokenlength[$wlen][] = $xword; + if (!$caret || !$dollar) { + $re = $caret.preg_quote($xword, '/').$dollar; + $tokens[$xword][] = array($word, '/'.$re.'/'); + if (!isset($tokenwild[$xword])) + $tokenwild[$xword] = $wlen; + } else { + $tokens[$xword][] = array($word, null); + } + } + asort($tokenwild); + // $tokens = array( base word => array( [ query term , regexp ] ... ) ... ) + // $tokenlength = array( base word length => base word ... ) + // $tokenwild = array( base word => base word length ... ) + $length_filter = empty($tokenwild) ? $tokenlength : min(array_keys($tokenlength)); + $indexes_known = $this->_indexLengths($length_filter); + if (!empty($tokenwild)) sort($indexes_known); + // get word IDs + $wids = array(); + foreach ($indexes_known as $ixlen) { + $word_idx = $this->_getIndex('w', $ixlen); + // handle exact search + if (isset($tokenlength[$ixlen])) { + foreach ($tokenlength[$ixlen] as $xword) { + $wid = array_search($xword, $word_idx); + if ($wid !== false) { + $wids[$ixlen][] = $wid; + foreach ($tokens[$xword] as $w) + $result[$w[0]][] = "$ixlen*$wid"; + } + } + } + // handle wildcard search + foreach ($tokenwild as $xword => $wlen) { + if ($wlen >= $ixlen) break; + foreach ($tokens[$xword] as $w) { + if (is_null($w[1])) continue; + foreach(array_keys(preg_grep($w[1], $word_idx)) as $wid) { + $wids[$ixlen][] = $wid; + $result[$w[0]][] = "$ixlen*$wid"; + } + } + } + } + return $wids; + } - // load known documents - $page_idx = idx_getIndex('page',''); + /** + * Return a list of all pages + * Warning: pages may not exist! + * + * @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) { + $page_idx = $this->_getIndex('page', ''); + if (is_null($key)) return $page_idx; - // get page id (this is the linenumber in page.idx) - $pid = array_search("$page\n",$page_idx); - if(!is_int($pid)){ - $pid = count($page_idx); - // page was new - write back - if (!idx_appendIndex('page','',"$page\n")){ - trigger_error("Failed to write page index", E_USER_ERROR); - return false; + $metaname = idx_cleanName($key); + + // Special handling for titles + if ($key == 'title') { + $title_idx = $this->_getIndex('title', ''); + array_splice($page_idx, count($title_idx)); + foreach ($title_idx as $i => $title) + if ($title === "") unset($page_idx[$i]); + return array_values($page_idx); + } + + $pages = array(); + $lines = $this->_getIndex($metaname, '_i'); + foreach ($lines as $line) { + $pages = array_merge($pages, $this->_parseTuples($page_idx, $line)); } + return array_keys($pages); } - unset($page_idx); // free memory - idx_saveIndexLine('title', '', $pid, p_get_first_heading($page, false)); + /** + * Return a list of words sorted by number of times used + * + * @param int $min bottom frequency threshold + * @param int $max upper frequency limit. No limit if $max<$min + * @param int $length 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) { + if ($min < 1) + $min = 1; + if ($max < $min) + $max = 0; + + $result = array(); + + if ($key == 'title') { + $index = $this->_getIndex('title', ''); + $index = array_count_values($index); + foreach ($index as $val => $cnt) { + if ($cnt >= $min && (!$max || $cnt <= $max) && strlen($val) >= $minlen) + $result[$val] = $cnt; + } + } + elseif (!is_null($key)) { + $metaname = idx_cleanName($key); + $index = $this->_getIndex($metaname.'_i', ''); + $val_idx = array(); + foreach ($index as $wid => $line) { + $freq = $this->_countTuples($line); + if ($freq >= $min && (!$max || $freq <= $max) && strlen($val) >= $minlen) + $val_idx[$wid] = $freq; + } + if (!empty($val_idx)) { + $words = $this->_getIndex($metaname.'_w', ''); + foreach ($val_idx as $wid => $freq) + $result[$words[$wid]] = $freq; + } + } + else { + $lengths = idx_listIndexLengths(); + foreach ($lengths as $length) { + if ($length < $minlen) continue; + $index = $this->_getIndex('i', $length); + $words = null; + foreach ($index as $wid => $line) { + $freq = $this->_countTuples($line); + if ($freq >= $min && (!$max || $freq <= $max)) { + if ($words === null) + $words = $this->_getIndex('w', $length); + $result[$words[$wid]] = $freq; + } + } + } + } - $pagewords = array(); - // get word usage in page - $words = idx_getPageWords($page); - if($words === false) return false; + arsort($result); + return $result; + } - if(!empty($words)) { - foreach(array_keys($words) as $wlen){ - $index = idx_getIndex('i',$wlen); - foreach($words[$wlen] as $wid => $freq){ - if($wid<count($index)){ - $index[$wid] = idx_updateIndexLine($index[$wid],$pid,$freq); - }else{ - // New words **should** have been added in increasing order - // starting with the first unassigned index. - // If someone can show how this isn't true, then I'll need to sort - // or do something special. - $index[$wid] = idx_updateIndexLine('',$pid,$freq); + /** + * Lock the indexer. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _lock() { + global $conf; + $status = true; + $run = 0; + $lock = $conf['lockdir'].'/_indexer.lock'; + while (!@mkdir($lock, $conf['dmode'])) { + usleep(50); + if(is_dir($lock) && time()-@filemtime($lock) > 60*5){ + // looks like a stale lock - remove it + if (!@rmdir($lock)) { + $status = "removing the stale lock failed"; + return false; + } else { + $status = "stale lock removed"; } - $pagewords[] = "$wlen*$wid"; + }elseif($run++ == 1000){ + // we waited 5 seconds for that lock + return false; } - // save back word index - if(!idx_saveIndex('i',$wlen,$index)){ - trigger_error("Failed to write index", E_USER_ERROR); + } + if ($conf['dperm']) + chmod($lock, $conf['dperm']); + return $status; + } + + /** + * Release the indexer lock. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _unlock() { + global $conf; + @rmdir($conf['lockdir'].'/_indexer.lock'); + return true; + } + + /** + * Retrieve the entire index. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _getIndex($idx, $suffix) { + global $conf; + $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx'; + if (!@file_exists($fn)) return array(); + return file($fn, FILE_IGNORE_NEW_LINES); + } + + /** + * Replace the contents of the index with an array. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _saveIndex($idx, $suffix, &$lines) { + global $conf; + $fn = $conf['indexdir'].'/'.$idx.$suffix; + $fh = @fopen($fn.'.tmp', 'w'); + if (!$fh) return false; + fwrite($fh, join("\n", $lines)); + fclose($fh); + if (isset($conf['fperm'])) + chmod($fn.'.tmp', $conf['fperm']); + io_rename($fn.'.tmp', $fn.'.idx'); + if ($suffix !== '') + $this->_cacheIndexDir($idx, $suffix, empty($lines)); + return true; + } + + /** + * Retrieve a line from the index. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _getIndexKey($idx, $suffix, $id) { + global $conf; + $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx'; + if (!@file_exists($fn)) return ''; + $fh = @fopen($fn, 'r'); + if (!$fh) return ''; + $ln = -1; + while (($line = fgets($fh)) !== false) { + if (++$ln == $id) break; + } + fclose($fh); + return rtrim((string)$line); + } + + /** + * Write a line into the index. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _saveIndexKey($idx, $suffix, $id, $line) { + global $conf; + if (substr($line, -1) != "\n") + $line .= "\n"; + $fn = $conf['indexdir'].'/'.$idx.$suffix; + $fh = @fopen($fn.'.tmp', 'w'); + if (!fh) return false; + $ih = @fopen($fn.'.idx', 'r'); + if ($ih) { + $ln = -1; + while (($curline = fgets($ih)) !== false) { + fwrite($fh, (++$ln == $id) ? $line : $curline); + } + if ($id > $ln) { + while ($id > ++$ln) + fwrite($fh, "\n"); + fwrite($fh, $line); + } + fclose($ih); + } else { + $ln = -1; + while ($id > ++$ln) + fwrite($fh, "\n"); + fwrite($fh, $line); + } + fclose($fh); + if (isset($conf['fperm'])) + chmod($fn.'.tmp', $conf['fperm']); + io_rename($fn.'.tmp', $fn.'.idx'); + if ($suffix !== '') + $this->_cacheIndexDir($idx, $suffix); + return true; + } + + /** + * Retrieve or insert a value in the index. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _addIndexKey($idx, $suffix, $value) { + $index = $this->_getIndex($idx, $suffix); + $id = array_search($value, $index); + if ($id === false) { + $id = count($index); + $index[$id] = $value; + if (!$this->_saveIndex($idx, $suffix, $index)) { + trigger_error("Failed to write $idx index", E_USER_ERROR); return false; } } + return $id; } - // Remove obsolete index entries - $pageword_idx = trim(idx_getIndexLine('pageword','',$pid)); - if ($pageword_idx !== '') { - $oldwords = explode(':',$pageword_idx); - $delwords = array_diff($oldwords, $pagewords); - $upwords = array(); - foreach ($delwords as $word) { - if($word=='') continue; - list($wlen,$wid) = explode('*',$word); - $wid = (int)$wid; - $upwords[$wlen][] = $wid; + private function _cacheIndexDir($idx, $suffix, $delete=false) { + global $conf; + if ($idx == 'i') + $cachename = $conf['indexdir'].'/lengths'; + else + $cachename = $conf['indexdir'].'/'.$idx.'lengths'; + $lengths = @file($cachename.'.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + if ($lengths === false) $lengths = array(); + $old = array_search((string)$suffix, $lengths); + if (empty($lines)) { + if ($old === false) return; + unset($lengths[$old]); + } else { + if ($old !== false) return; + $lengths[] = $suffix; + sort($lengths); + } + $fh = @fopen($cachename.'.tmp', 'w'); + if (!$fh) { + trigger_error("Failed to write index cache", E_USER_ERROR); + return; + } + @fwrite($fh, implode("\n", $lengths)); + @fclose($fh); + if (isset($conf['fperm'])) + chmod($cachename.'.tmp', $conf['fperm']); + io_rename($cachename.'.tmp', $cachename.'.idx'); + } + + /** + * Get the list of lengths indexed in the wiki. + * + * Read the index directory or a cache file and returns + * a sorted array of lengths of the words used in the wiki. + * + * @author YoBoY <yoboy.leguesh@gmail.com> + */ + private function _listIndexLengths() { + global $conf; + $cachename = $conf['indexdir'].'/lengths'; + clearstatcache(); + if (@file_exists($cachename.'.idx')) { + $lengths = @file($cachename.'.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + if ($lengths !== false) { + $idx = array(); + foreach ($lengths as $length) + $idx[] = (int)$length; + return $idx; + } } - foreach ($upwords as $wlen => $widx) { - $index = idx_getIndex('i',$wlen); - foreach ($widx as $wid) { - $index[$wid] = idx_updateIndexLine($index[$wid],$pid,0); + + $dir = @opendir($conf['indexdir']); + if ($dir === false) + return array(); + $lengths[] = array(); + while (($f = readdir($dir)) !== false) { + if (substr($f, 0, 1) == 'i' && substr($f, -4) == '.idx') { + $i = substr($f, 1, -4); + if (is_numeric($i)) + $lengths[] = (int)$i; } - idx_saveIndex('i',$wlen,$index); } + closedir($dir); + sort($lengths); + // save this in a file + $fh = @fopen($cachename.'.tmp', 'w'); + if (!$fh) { + trigger_error("Failed to write index cache", E_USER_ERROR); + return; + } + @fwrite($fh, implode("\n", $lengths)); + @fclose($fh); + if (isset($conf['fperm'])) + chmod($cachename.'.tmp', $conf['fperm']); + io_rename($cachename.'.tmp', $cachename.'.idx'); + + return $lengths; } - // Save the reverse index - $pageword_idx = join(':',$pagewords)."\n"; - if(!idx_saveIndexLine('pageword','',$pid,$pageword_idx)){ - trigger_error("Failed to write word index", E_USER_ERROR); - return false; + + /** + * Get the word lengths that have been indexed. + * + * Reads the index directory and returns an array of lengths + * that there are indices for. + * + * @author YoBoY <yoboy.leguesh@gmail.com> + */ + private function _indexLengths($filter) { + global $conf; + $idx = array(); + if (is_array($filter)) { + // testing if index files exist only + $path = $conf['indexdir']."/i"; + foreach ($filter as $key => $value) { + if (@file_exists($path.$key.'.idx')) + $idx[] = $key; + } + } else { + $lengths = idx_listIndexLengths(); + foreach ($lengths as $key => $length) { + // keep all the values equal or superior + if ((int)$length >= (int)$filter) + $idx[] = $length; + } + } + return $idx; + } + + /** + * Insert or replace a tuple in a line. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _updateTuple($line, $id, $count) { + $newLine = $line; + if ($newLine !== '') + $newLine = preg_replace('/(^|:)'.preg_quote($id,'/').'\*\d*/', '', $newLine); + $newLine = trim($newLine, ':'); + if ($count) { + if (strlen($newLine) > 0) + return "$id*$count:".$newLine; + else + return "$id*$count".$newLine; + } + return $newLine; + } + + /** + * Split a line into an array of tuples. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + * @author Andreas Gohr <andi@splitbrain.org> + */ + private function _parseTuples(&$keys, $line) { + $result = array(); + if ($line == '') return $result; + $parts = explode(':', $line); + foreach ($parts as $tuple) { + if ($tuple === '') continue; + list($key, $cnt) = explode('*', $tuple); + if (!$cnt) continue; + $key = $keys[$key]; + if (!$key) continue; + $result[$key] = $cnt; + } + return $result; } - return true; + /** + * Sum the counts in a list of tuples. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + private function _countTuples($line) { + $freq = 0; + $parts = explode(':', $line); + foreach ($parts as $tuple) { + if ($tuple === '') continue; + list($pid, $cnt) = explode('*', $tuple); + $freq += (int)$cnt; + } + return $freq; + } } /** - * Write a new index line to the filehandle + * Create an instance of the indexer. * - * This function writes an line for the index file to the - * given filehandle. It removes the given document from - * the given line and readds it when $count is >0. + * @return object a Doku_Indexer + * @author Tom N Harris <tnharris@whoopdedo.org> + */ +function idx_get_indexer() { + static $Indexer = null; + if (is_null($Indexer)) { + $Indexer = new Doku_Indexer(); + } + return $Indexer; +} + +/** + * Returns words that will be ignored. * - * @deprecated - see idx_updateIndexLine - * @author Andreas Gohr <andi@splitbrain.org> + * @return array list of stop words + * @author Tom N Harris <tnharris@whoopdedo.org> */ -function idx_writeIndexLine($fh,$line,$pid,$count){ - fwrite($fh,idx_updateIndexLine($line,$pid,$count)); +function & idx_get_stopwords() { + static $stopwords = null; + if (is_null($stopwords)) { + global $conf; + $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt'; + if(@file_exists($swfile)){ + $stopwords = file($swfile, FILE_IGNORE_NEW_LINES); + }else{ + $stopwords = array(); + } + } + return $stopwords; } /** - * Modify an index line with new information + * Adds/updates the search index for the given page * - * This returns a line of the index. It removes the - * given document from the line and readds it if - * $count is >0. + * Locking is handled internally. * + * @param string $page name of the page to index + * @param boolean $verbose print status messages + * @return boolean the function completed successfully * @author Tom N Harris <tnharris@whoopdedo.org> - * @author Andreas Gohr <andi@splitbrain.org> */ -function idx_updateIndexLine($line,$pid,$count){ - $line = trim($line); - $updated = array(); - if($line != ''){ - $parts = explode(':',$line); - // remove doc from given line - foreach($parts as $part){ - if($part == '') continue; - list($doc,$cnt) = explode('*',$part); - if($doc != $pid){ - $updated[] = $part; +function idx_addPage($page, $verbose=false) { + // check if indexing needed + $idxtag = metaFN($page,'.indexed'); + if(@file_exists($idxtag)){ + if(trim(io_readFile($idxtag)) == idx_get_version()){ + $last = @filemtime($idxtag); + if($last > @filemtime(wikiFN($ID))){ + if ($verbose) print("Indexer: index for $page up to date".DOKU_LF); + return false; } } } - // add doc - if ($count){ - $updated[] = "$pid*$count"; + if (!page_exists($page)) { + if (!@file_exists($idxtag)) { + if ($verbose) print("Indexer: $page does not exist, ignoring".DOKU_LF); + return false; + } + $Indexer = idx_get_indexer(); + $result = $Indexer->deletePage($page); + if ($result === "locked") { + if ($verbose) print("Indexer: locked".DOKU_LF); + return false; + } + @unlink($idxtag); + return $result; + } + $indexenabled = p_get_metadata($page, 'internal index', false); + if ($indexenabled === false) { + $result = false; + if (@file_exists($idxtag)) { + $Indexer = idx_get_indexer(); + $result = $Indexer->deletePage($page); + if ($result === "locked") { + if ($verbose) print("Indexer: locked".DOKU_LF); + return false; + } + @unlink($idxtag); + } + if ($verbose) print("Indexer: index disabled for $page".DOKU_LF); + return $result; + } + + $body = ''; + $metadata = array(); + $metadata['title'] = p_get_metadata($page, 'title', false); + if (($references = p_get_metadata($page, 'relation references', false)) !== null) + $metadata['relation_references'] = array_keys($references); + else + $metadata['relation_references'] = array(); + $data = compact('page', 'body', 'metadata'); + $evt = new Doku_Event('INDEXER_PAGE_ADD', $data); + if ($evt->advise_before()) $data['body'] = $data['body'] . " " . rawWiki($page); + $evt->advise_after(); + unset($evt); + extract($data); + + $Indexer = idx_get_indexer(); + $result = $Indexer->addPageWords($page, $body); + if ($result === "locked") { + if ($verbose) print("Indexer: locked".DOKU_LF); + return false; + } + + if ($result) { + $result = $Indexer->addMetaKeys($page, $metadata); + if ($result === "locked") { + if ($verbose) print("Indexer: locked".DOKU_LF); + return false; + } + } + + if ($result) + io_saveFile(metaFN($page,'.indexed'), idx_get_version()); + if ($verbose) { + print("Indexer: finished".DOKU_LF); + return true; } + return $result; +} - return join(':',$updated)."\n"; +/** + * Find tokens in the fulltext index + * + * Takes an array of words and will return a list of matching + * pages for each one. + * + * Important: No ACL checking is done here! All results are + * returned, regardless of permissions + * + * @param arrayref $words list of words to search for + * @return array list of pages found, associated with the search terms + */ +function idx_lookup(&$words) { + $Indexer = idx_get_indexer(); + return $Indexer->lookup($words); } /** - * Get the list of lenghts indexed in the wiki + * Split a string into tokens + * + */ +function idx_tokenizer($string, $wc=false) { + $Indexer = idx_get_indexer(); + return $Indexer->tokenizer($string, $wc); +} + +/* For compatibility */ + +/** + * Read the list of words in an index (if it exists). + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ +function idx_getIndex($idx, $suffix) { + global $conf; + $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx'; + if (!@file_exists($fn)) return array(); + return file($fn); +} + +/** + * Get the list of lengths indexed in the wiki. * * Read the index directory or a cache file and returns * a sorted array of lengths of the words used in the wiki. @@ -427,10 +1276,11 @@ function idx_listIndexLengths() { $docache = false; } else { clearstatcache(); - if (@file_exists($conf['indexdir'].'/lengths.idx') and (time() < @filemtime($conf['indexdir'].'/lengths.idx') + $conf['readdircache'])) { - if (($lengths = @file($conf['indexdir'].'/lengths.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) ) !== false) { + 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(); - foreach ( $lengths as $length) { + foreach ($lengths as $length) { $idx[] = (int)$length; } return $idx; @@ -439,24 +1289,24 @@ function idx_listIndexLengths() { $docache = true; } - if ($conf['readdircache'] == 0 or $docache ) { + if ($conf['readdircache'] == 0 || $docache) { $dir = @opendir($conf['indexdir']); - if($dir===false) + if ($dir === false) return array(); $idx[] = array(); while (($f = readdir($dir)) !== false) { - if (substr($f,0,1) == 'i' && substr($f,-4) == '.idx'){ - $i = substr($f,1,-4); + if (substr($f, 0, 1) == 'i' && substr($f, -4) == '.idx') { + $i = substr($f, 1, -4); if (is_numeric($i)) $idx[] = (int)$i; } } closedir($dir); sort($idx); - // we save this in a file. - if ($docache === true) { - $handle = @fopen($conf['indexdir'].'/lengths.idx','w'); - @fwrite($handle, implode("\n",$idx)); + // save this in a file + if ($docache) { + $handle = @fopen($conf['indexdir'].'/lengths.idx', 'w'); + @fwrite($handle, implode("\n", $idx)); @fclose($handle); } return $idx; @@ -473,277 +1323,40 @@ function idx_listIndexLengths() { * * @author YoBoY <yoboy.leguesh@gmail.com> */ -function idx_indexLengths(&$filter){ +function idx_indexLengths($filter) { global $conf; $idx = array(); - if (is_array($filter)){ - // testing if index files exists only + if (is_array($filter)) { + // testing if index files exist only + $path = $conf['indexdir']."/i"; foreach ($filter as $key => $value) { - if (@file_exists($conf['indexdir']."/i$key.idx")) { + if (@file_exists($path.$key.'.idx')) $idx[] = $key; - } } } else { $lengths = idx_listIndexLengths(); - foreach ( $lengths as $key => $length) { - // we keep all the values equal or superior - if ((int)$length >= (int)$filter) { + foreach ($lengths as $key => $length) { + // keep all the values equal or superior + if ((int)$length >= (int)$filter) $idx[] = $length; - } } } return $idx; } /** - * Find the the index number of each search term. - * - * This will group together words that appear in the same index. - * So it should perform better, because it only opens each index once. - * Actually, it's not that great. (in my experience) Probably because of the disk cache. - * And the sorted function does more work, making it slightly slower in some cases. - * - * @param array $words The query terms. Words should only contain valid characters, - * with a '*' at either the beginning or end of the word (or both) - * @param arrayref $result Set to word => array("length*id" ...), use this to merge the - * index locations with the appropriate query term. - * @return array Set to length => array(id ...) - * - * @author Tom N Harris <tnharris@whoopdedo.org> - */ -function idx_getIndexWordsSorted($words,&$result){ - // parse and sort tokens - $tokens = array(); - $tokenlength = array(); - $tokenwild = array(); - foreach($words as $word){ - $result[$word] = array(); - $wild = 0; - $xword = $word; - $wlen = wordlen($word); - - // check for wildcards - if(substr($xword,0,1) == '*'){ - $xword = substr($xword,1); - $wild |= 1; - $wlen -= 1; - } - if(substr($xword,-1,1) == '*'){ - $xword = substr($xword,0,-1); - $wild |= 2; - $wlen -= 1; - } - if ($wlen < IDX_MINWORDLENGTH && $wild == 0 && !is_numeric($xword)) continue; - if(!isset($tokens[$xword])){ - $tokenlength[$wlen][] = $xword; - } - if($wild){ - $ptn = preg_quote($xword,'/'); - if(($wild&1) == 0) $ptn = '^'.$ptn; - if(($wild&2) == 0) $ptn = $ptn.'$'; - $tokens[$xword][] = array($word, '/'.$ptn.'/'); - if(!isset($tokenwild[$xword])) $tokenwild[$xword] = $wlen; - }else - $tokens[$xword][] = array($word, null); - } - asort($tokenwild); - // $tokens = array( base word => array( [ query word , grep pattern ] ... ) ... ) - // $tokenlength = array( base word length => base word ... ) - // $tokenwild = array( base word => base word length ... ) - - $length_filter = empty($tokenwild) ? $tokenlength : min(array_keys($tokenlength)); - $indexes_known = idx_indexLengths($length_filter); - if(!empty($tokenwild)) sort($indexes_known); - // get word IDs - $wids = array(); - foreach($indexes_known as $ixlen){ - $word_idx = idx_getIndex('w',$ixlen); - // handle exact search - if(isset($tokenlength[$ixlen])){ - foreach($tokenlength[$ixlen] as $xword){ - $wid = array_search("$xword\n",$word_idx); - if(is_int($wid)){ - $wids[$ixlen][] = $wid; - foreach($tokens[$xword] as $w) - $result[$w[0]][] = "$ixlen*$wid"; - } - } - } - // handle wildcard search - foreach($tokenwild as $xword => $wlen){ - if($wlen >= $ixlen) break; - foreach($tokens[$xword] as $w){ - if(is_null($w[1])) continue; - foreach(array_keys(preg_grep($w[1],$word_idx)) as $wid){ - $wids[$ixlen][] = $wid; - $result[$w[0]][] = "$ixlen*$wid"; - } - } - } - } - return $wids; -} - -/** - * Lookup words in index - * - * Takes an array of word and will return a list of matching - * documents for each one. - * - * Important: No ACL checking is done here! All results are - * returned, regardless of permissions - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function idx_lookup($words){ - global $conf; - - $result = array(); - - $wids = idx_getIndexWordsSorted($words, $result); - if(empty($wids)) return array(); - - // load known words and documents - $page_idx = idx_getIndex('page',''); - - $docs = array(); // hold docs found - foreach(array_keys($wids) as $wlen){ - $wids[$wlen] = array_unique($wids[$wlen]); - $index = idx_getIndex('i',$wlen); - foreach($wids[$wlen] as $ixid){ - if($ixid < count($index)) - $docs["$wlen*$ixid"] = idx_parseIndexLine($page_idx,$index[$ixid]); - } - } - - // merge found pages into final result array - $final = array(); - foreach($result as $word => $res){ - $final[$word] = array(); - foreach($res as $wid){ - $hits = &$docs[$wid]; - foreach ($hits as $hitkey => $hitcnt) { - if (!isset($final[$word][$hitkey])) { - $final[$word][$hitkey] = $hitcnt; - } else { - $final[$word][$hitkey] += $hitcnt; - } - } - } - } - return $final; -} - -/** - * Returns a list of documents and counts from a index line + * Clean a name of a key for use as a file name. * - * It omits docs with a count of 0 and pages that no longer - * exist. - * - * @param array $page_idx The list of known pages - * @param string $line A line from the main index - * @author Andreas Gohr <andi@splitbrain.org> - */ -function idx_parseIndexLine(&$page_idx,$line){ - $result = array(); - - $line = trim($line); - if($line == '') return $result; - - $parts = explode(':',$line); - foreach($parts as $part){ - if($part == '') continue; - list($doc,$cnt) = explode('*',$part); - if(!$cnt) continue; - $doc = trim($page_idx[$doc]); - if(!$doc) continue; - // make sure the document still exists - if(!page_exists($doc,'',false)) continue; - - $result[$doc] = $cnt; - } - return $result; -} - -/** - * Tokenizes a string into an array of search words - * - * Uses the same algorithm as idx_getPageWords() - * - * @param string $string the query as given by the user - * @param arrayref $stopwords array of stopwords - * @param boolean $wc are wildcards allowed? - */ -function idx_tokenizer($string,&$stopwords,$wc=false){ - $words = array(); - $wc = ($wc) ? '' : $wc = '\*'; - - if(preg_match('/[^0-9A-Za-z]/u', $string)){ - // handle asian chars as single words (may fail on older PHP version) - $asia = @preg_replace('/('.IDX_ASIAN.')/u',' \1 ',$string); - if(!is_null($asia)) $string = $asia; //recover from regexp failure - - $arr = explode(' ', utf8_stripspecials($string,' ','\._\-:'.$wc)); - foreach ($arr as $w) { - if (!is_numeric($w) && strlen($w) < IDX_MINWORDLENGTH) continue; - $w = utf8_strtolower($w); - if($stopwords && is_int(array_search("$w\n",$stopwords))) continue; - $words[] = $w; - } - }else{ - $w = $string; - if (!is_numeric($w) && strlen($w) < IDX_MINWORDLENGTH) return $words; - $w = strtolower($w); - if(is_int(array_search("$w\n",$stopwords))) return $words; - $words[] = $w; - } - - return $words; -} - -/** - * Create a pagewords index from the existing index. + * Romanizes non-latin characters, then strips away anything that's + * not a letter, number, or underscore. * * @author Tom N Harris <tnharris@whoopdedo.org> */ -function idx_upgradePageWords(){ - global $conf; - $page_idx = idx_getIndex('page',''); - if (empty($page_idx)) return; - $pagewords = array(); - $len = count($page_idx); - for ($n=0;$n<$len;$n++){ - $pagewords[] = array(); - } - unset($page_idx); - - $n=0; - foreach (idx_indexLengths($n) as $wlen) { - $lines = idx_getIndex('i',$wlen); - $len = count($lines); - for ($wid=0;$wid<$len;$wid++) { - $wkey = "$wlen*$wid"; - foreach (explode(':',trim($lines[$wid])) as $part) { - if($part == '') continue; - list($doc,$cnt) = explode('*',$part); - $pagewords[(int)$doc][] = $wkey; - } - } - } - - $fn = $conf['indexdir'].'/pageword'; - $fh = @fopen($fn.'.tmp','w'); - if (!$fh){ - trigger_error("Failed to write word index", E_USER_ERROR); - return false; - } - foreach ($pagewords as $line){ - fwrite($fh, join(':',$line)."\n"); - } - fclose($fh); - if($conf['fperm']) chmod($fn.'.tmp', $conf['fperm']); - io_rename($fn.'.tmp', $fn.'.idx'); - return true; +function idx_cleanName($name) { + $name = utf8_romanize(trim((string)$name)); + $name = preg_replace('#[ \./\\:-]+#', '_', $name); + $name = preg_replace('/[^A-Za-z0-9_]/', '', $name); + return strtolower($name); } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/infoutils.php b/inc/infoutils.php index d3c6f2918..5f406aa3e 100644 --- a/inc/infoutils.php +++ b/inc/infoutils.php @@ -258,7 +258,7 @@ function check(){ * @see html_msgarea */ function msg($message,$lvl=0,$line='',$file=''){ - global $MSG; + global $MSG, $MSG_shown; $errors[-1] = 'error'; $errors[0] = 'info'; $errors[1] = 'success'; @@ -268,7 +268,7 @@ function msg($message,$lvl=0,$line='',$file=''){ if(!isset($MSG)) $MSG = array(); $MSG[]=array('lvl' => $errors[$lvl], 'msg' => $message); - if(headers_sent()){ + if(isset($MSG_shown) || headers_sent()){ if(function_exists('html_msgarea')){ html_msgarea(); }else{ diff --git a/inc/init.php b/inc/init.php index b53167e3c..819d92bdc 100644 --- a/inc/init.php +++ b/inc/init.php @@ -5,13 +5,12 @@ // start timing Dokuwiki execution function delta_time($start=0) { - list($usec, $sec) = explode(" ", microtime()); - return ((float)$usec+(float)$sec)-((float)$start); + return microtime(true)-((float)$start); } define('DOKU_START_TIME', delta_time()); global $config_cascade; -$config_cascade = ''; +$config_cascade = array(); // if available load a preload config file $preload = fullpath(dirname(__FILE__)).'/preload.php'; @@ -52,10 +51,9 @@ global $cache_authname; global $cache_metadata; $cache_metadata = array(); -//set the configuration cascade - but only if its not already been set in preload.php -if (empty($config_cascade)) { - include(DOKU_INC.'inc/config_cascade.php'); -} +// always include 'inc/config_cascade.php' +// previously in preload.php set fields of $config_cascade will be merged with the defaults +include(DOKU_INC.'inc/config_cascade.php'); //prepare config array() global $conf; @@ -200,10 +198,6 @@ init_creationmodes(); init_paths(); init_files(); -// automatic upgrade to script versions of certain files -scriptify(DOKU_CONF.'users.auth'); -scriptify(DOKU_CONF.'acl.auth'); - // setup plugin controller class (can be overwritten in preload.php) $plugin_types = array('admin','syntax','action','renderer', 'helper'); global $plugin_controller_class, $plugin_controller; @@ -224,6 +218,9 @@ if (!defined('NOSESSION')) { auth_setup(); } +// setup mail system +mail_setup(); + /** * Checks paths from config file */ @@ -277,6 +274,7 @@ function init_files(){ } # create title index (needs to have same length as page.idx) + /* $file = $conf['indexdir'].'/title.idx'; if(!@file_exists($file)){ $pages = file($conf['indexdir'].'/page.idx'); @@ -291,6 +289,7 @@ function init_files(){ nice_die("$file is not writable. Check your permissions settings!"); } } + */ } /** @@ -420,14 +419,27 @@ function getBaseURL($abs=null){ if($conf['baseurl']) return rtrim($conf['baseurl'],'/').$dir; //split hostheader into host and port - $addr = explode(':',$_SERVER['HTTP_HOST']); - $host = $addr[0]; - $port = ''; - if (isset($addr[1])) { - $port = $addr[1]; - } elseif (isset($_SERVER['SERVER_PORT'])) { + if(isset($_SERVER['HTTP_HOST'])){ + $parsed_host = parse_url('http://'.$_SERVER['HTTP_HOST']); + $host = $parsed_host['host']; + $port = $parsed_host['port']; + }elseif(isset($_SERVER['SERVER_NAME'])){ + $parsed_host = parse_url('http://'.$_SERVER['SERVER_NAME']); + $host = $parsed_host['host']; + $port = $parsed_host['port']; + }else{ + $host = php_uname('n'); + $port = ''; + } + + if(!$port && isset($_SERVER['SERVER_PORT'])) { $port = $_SERVER['SERVER_PORT']; } + + if(is_null($port)){ + $port = ''; + } + if(!is_ssl()){ $proto = 'http://'; if ($port == '80') { @@ -463,43 +475,6 @@ function is_ssl(){ } /** - * Append a PHP extension to a given file and adds an exit call - * - * This is used to migrate some old configfiles. An added PHP extension - * ensures the contents are not shown to webusers even if .htaccess files - * do not work - * - * @author Jan Decaluwe <jan@jandecaluwe.com> - */ -function scriptify($file) { - // checks - if (!is_readable($file)) { - return; - } - $fn = $file.'.php'; - if (@file_exists($fn)) { - return; - } - $fh = fopen($fn, 'w'); - if (!$fh) { - nice_die($fn.' is not writable. Check your permission settings!'); - } - // write php exit hack first - fwrite($fh, "# $fn\n"); - fwrite($fh, '# <?php exit()?>'."\n"); - fwrite($fh, "# Don't modify the lines above\n"); - fwrite($fh, "#\n"); - // copy existing lines - $lines = file($file); - foreach ($lines as $line){ - fwrite($fh, $line); - } - fclose($fh); - //try to rename the old file - io_rename($file,"$file.old"); -} - -/** * print a nice message even if no styles are loaded yet. */ function nice_die($msg){ diff --git a/inc/io.php b/inc/io.php index 1d69dabc9..034ac650e 100644 --- a/inc/io.php +++ b/inc/io.php @@ -486,7 +486,7 @@ function io_download($url,$file,$useAttachment=false,$defaultName='',$maxSize=20 preg_match('/attachment;\s*filename\s*=\s*"([^"]*)"/i', $content_disposition, $match)) { $name = basename($match[1]); - } + } } @@ -529,7 +529,7 @@ function io_rename($from,$to){ /** - * Runs an external command and returns it's output as string + * Runs an external command and returns its output as string * * @author Harry Brueckner <harry_b@eml.cc> * @author Andreas Gohr <andi@splitbrain.org> @@ -547,6 +547,27 @@ function io_runcmd($cmd){ } /** + * Runs an external command with input and output pipes. + * Returns the exit code from the process. + * + * @author Tom N Harris <tnharris@whoopdedo.org> + */ +function io_exec($cmd, $input, &$output){ + $descspec = array( + 0=>array("pipe","r"), + 1=>array("pipe","w"), + 2=>array("pipe","w")); + $ph = proc_open($cmd, $descspec, $pipes); + if(!$ph) return -1; + fclose($pipes[2]); // ignore stderr + fwrite($pipes[0], $input); + fclose($pipes[0]); + $output = stream_get_contents($pipes[1]); + fclose($pipes[1]); + return proc_close($ph); +} + +/** * Search a file for matching lines * * This is probably not faster than file()+preg_grep() but less diff --git a/inc/lang/af/lang.php b/inc/lang/af/lang.php index fce59d13e..6665196f4 100644 --- a/inc/lang/af/lang.php +++ b/inc/lang/af/lang.php @@ -26,6 +26,7 @@ $lang['btn_backlink'] = 'Wat skakel hierheen'; $lang['btn_subscribe'] = 'Hou bladsy dop'; $lang['btn_unsubscribe'] = 'Verwyder van bladsy dophoulys'; $lang['btn_resendpwd'] = 'E-pos nuwe wagwoord'; +$lang['btn_register'] = 'Skep gerus \'n rekening'; $lang['loggedinas'] = 'Ingeteken as'; $lang['user'] = 'Gebruikernaam'; $lang['pass'] = 'Wagwoord'; @@ -35,7 +36,6 @@ $lang['passchk'] = 'Herhaal wagwoord'; $lang['remember'] = 'Onthou my wagwoord oor sessies'; $lang['fullname'] = 'Regte naam'; $lang['email'] = 'E-pos'; -$lang['register'] = 'Skep gerus \'n rekening'; $lang['badlogin'] = 'Intekenfout'; $lang['minoredit'] = 'Klein wysiging'; $lang['reguexists'] = 'Die gebruikersnaam wat jy gebruik het, is alreeds gebruik. Kies asseblief \'n ander gebruikersnaam.'; diff --git a/inc/lang/ar/lang.php b/inc/lang/ar/lang.php index 30095347e..cc2de9e8b 100644 --- a/inc/lang/ar/lang.php +++ b/inc/lang/ar/lang.php @@ -28,7 +28,7 @@ $lang['btn_revs'] = 'نسخ قديمة'; $lang['btn_recent'] = 'أحدث التغييرات'; $lang['btn_upload'] = 'ارفع'; $lang['btn_cancel'] = 'ألغ'; -$lang['btn_index'] = 'فهرس'; +$lang['btn_index'] = 'خريطة موقع'; $lang['btn_secedit'] = 'حرر'; $lang['btn_login'] = 'لج'; $lang['btn_logout'] = 'اخرج'; @@ -45,8 +45,8 @@ $lang['btn_resendpwd'] = 'ارسل كلمة سر جديدة'; $lang['btn_draft'] = 'حرر المسودة'; $lang['btn_recover'] = 'استرجع المسودة'; $lang['btn_draftdel'] = 'احذف المسوّدة'; -$lang['btn_revert'] = 'استعد -'; +$lang['btn_revert'] = 'استعد'; +$lang['btn_register'] = 'سجّل'; $lang['loggedinas'] = 'داخل باسم'; $lang['user'] = 'اسم المستخدم'; $lang['pass'] = 'كلمة السر'; @@ -54,21 +54,20 @@ $lang['newpass'] = 'كلمة سر جديدة'; $lang['oldpass'] = 'أكد كلمة السر الحالية'; $lang['passchk'] = 'مرة أخرى'; $lang['remember'] = 'تذكرني'; -$lang['fullname'] = 'الاسم الكامل'; +$lang['fullname'] = 'الاسم الحقيقي'; $lang['email'] = 'البريد الإلكتروني'; -$lang['register'] = 'سجّل'; $lang['profile'] = 'الملف الشخصي'; $lang['badlogin'] = 'عذرا، اسم المشترك أو كلمة السر غير صحيحة'; $lang['minoredit'] = 'تعديلات طفيفة'; -$lang['draftdate'] = 'حفظ المسودات تلقائيا مشغل'; -$lang['nosecedit'] = 'غُيرت الصفحة في هذه الأثناء، معلومات الفقرة اصبحت قديمة. حُمُلت كل الصفحة بدلا.'; -$lang['regmissing'] = 'عذرا، يجب ملء جميع الحقول'; +$lang['draftdate'] = 'حفظ المسودات آليا مفعّل'; +$lang['nosecedit'] = 'غُيرت الصفحة في هذه الأثناء، معلومات الجزء اصبحت قديمة. حُمُلت كل الصفحة بدلا.'; +$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'] = 'هذه الويكي لا تدعم تعديل الملف الشخصي'; @@ -81,35 +80,35 @@ $lang['resendpwd'] = 'إرسال كلمة مرور'; $lang['resendpwdmissing'] = 'عذراّ، يجب أن تملأ كل الحقول.'; $lang['resendpwdnouser'] = 'عذراً، لم نجد المستخدم هذا في قاعدة بياناتنا.'; $lang['resendpwdbadauth'] = 'عذراً، رمز التفعيل هذا غير صحيح. نأكد من استخدامك كامل وصلة التأكيد.'; -$lang['resendpwdconfirm'] = 'أرسل رابط التأكيد بواسطة البريد.'; -$lang['resendpwdsuccess'] = 'كلمة السرالجديدة إرسلت عبر البريد.'; -$lang['license'] = 'مالم يشر لخلاف ذلك، فإن المحتوى على هذه الويكي مرخص وفق الرخصة التالية:'; +$lang['resendpwdconfirm'] = 'اُرسل رابط التأكيد بواسطة البريد.'; +$lang['resendpwdsuccess'] = 'كلمة السرالجديدة اُرسلت عبر البريد.'; +$lang['license'] = 'مالم يشر لخلاف ذلك، فإن المحتوى في هذه الويكي مرخص وفق الرخصة التالية:'; $lang['licenseok'] = 'لاحظ: بتحرير هذه الصفحة أنت توافق على ترخيص محتواها تحت الرخصة التالية:'; -$lang['searchmedia'] = 'ابحث في اسماء الملفات:'; +$lang['searchmedia'] = 'ابحث في أسماء الملفات:'; $lang['searchmedia_in'] = 'ابحث في %s'; $lang['txt_upload'] = 'اختر ملفاً للرفع'; $lang['txt_filename'] = 'رفع كـ (اختياري)'; $lang['txt_overwrt'] = 'اكتب على ملف موجود'; -$lang['lockedby'] = 'حالياً مقفل بواسطة'; +$lang['lockedby'] = 'مقفلة حاليا لـ'; $lang['lockexpire'] = 'ينتهي القفل في'; $lang['willexpire'] = 'سينتهي قفل تحرير هذه الصفحه خلال دقيقة.\nلتجنب التعارض استخدم زر المعاينة لتصفير مؤقت القفل.'; -$lang['js']['notsavedyet'] = 'التعديلات غير المحفوظة ستفقد. اكمل فعلا؟'; +$lang['js']['notsavedyet'] = 'التعديلات غير المحفوظة ستفقد.'; $lang['js']['searchmedia'] = 'ابحث عن ملفات'; $lang['js']['keepopen'] = 'أبقي النافذة مفتوحة أثناء الاختيار'; $lang['js']['hidedetails'] = 'أخف التفاصيل'; -$lang['js']['mediatitle'] = 'اعدادات الرابط'; +$lang['js']['mediatitle'] = 'إعدادات الرابط'; $lang['js']['mediadisplay'] = 'نوع الرابط'; $lang['js']['mediaalign'] = 'المحاذاة'; $lang['js']['mediasize'] = 'حجم الصورة'; $lang['js']['mediatarget'] = 'هدف الرابط'; -$lang['js']['mediaclose'] = 'اغلق'; +$lang['js']['mediaclose'] = 'أغلق'; $lang['js']['mediainsert'] = 'أدرج'; -$lang['js']['mediadisplayimg'] = 'اظهر الصورة.'; +$lang['js']['mediadisplayimg'] = 'أظهر الصورة.'; $lang['js']['mediadisplaylnk'] = 'اظهر الرابط فقط.'; $lang['js']['mediasmall'] = 'نسخة مصغرة'; $lang['js']['mediamedium'] = 'نسخة متوسطة'; $lang['js']['medialarge'] = 'نسخة كبيرة'; -$lang['js']['mediaoriginal'] = 'نسخة أصلية'; +$lang['js']['mediaoriginal'] = 'النسخة الأصلية'; $lang['js']['medialnk'] = 'الرابط لصفحة التفاصيل'; $lang['js']['mediadirect'] = 'رابط مباشر للأصل'; $lang['js']['medianolnk'] = 'لا رابط'; @@ -118,70 +117,73 @@ $lang['js']['medialeft'] = 'حاذي الصورة إلى اليسار.'; $lang['js']['mediaright'] = 'حاذي الصورة إلى اليمين.'; $lang['js']['mediacenter'] = 'حاذي الصورة إلى الوسط.'; $lang['js']['medianoalign'] = 'لا تستعمل المحاذاة.'; -$lang['js']['nosmblinks'] = 'الروابط لمجلدات ويندوز المشاركة تعمل فقط مع متصفح مايكروسفت Internet Explorer. ما زال بإمكانك قص و لصق الرابط.'; +$lang['js']['nosmblinks'] = 'الروابط لمجلدات مشاركة وندز تعمل فقط مع متصفح مايكروسفت Internet Explorer. +ما زال بإمكانك قص و لصق الرابط.'; $lang['js']['linkwiz'] = 'مرشد الروابط'; $lang['js']['linkto'] = 'الرابط إلى :'; $lang['js']['del_confirm'] = 'هل حقاً تريد حذف البنود المختارة؟'; $lang['js']['mu_btn'] = 'رفع عدة ملفات في وقت واحد'; $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['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['mediaview'] = 'اعرض الملف الأصلي'; $lang['mediaroot'] = 'الجذر'; -$lang['mediaupload'] = 'تحميل ملف إلى فضاء التسمية هنا. لإنشاء فضاءات تسمية فرعية، أضفها إلى بداية خانة تحميل باسم وافصل بينها باستخدام الفواصل'; -$lang['mediaextchange'] = 'تم تغيير نوع الملف من .%s إلى .%s!'; +$lang['mediaupload'] = 'تحميل ملف إلى فضاء التسمية هنا. لإنشاء فضاءات تسمية فرعية، أضفها إلى بداية خانة تحميل باسم وافصل بينها باستخدام الفاصلتان الرأسيتان.'; +$lang['mediaextchange'] = 'غُيرت لاحقة الملف من .%s إلى .%s!'; $lang['reference'] = 'مراجع لـ'; $lang['ref_inuse'] = 'لا يمكن حذف الملف، لأنه مستخدم من قبل الصفحات التالية:'; -$lang['ref_hidden'] = 'بعض المراجع لصفاحات لا تملك ترخيص برؤيتها'; -$lang['hits'] = 'زوار'; -$lang['quickhits'] = 'صفحات بهذا الاسم'; +$lang['ref_hidden'] = 'بعض المراجع على صفحات لا تملك صلاحيات قراءتها'; +$lang['hits'] = 'مرة'; +$lang['quickhits'] = 'صفحات مطابقة'; $lang['toc'] = 'جدول المحتويات'; $lang['current'] = 'حالي'; $lang['yours'] = 'نسختك'; -$lang['diff'] = 'مقارنة بالنسخة الحالية'; -$lang['diff2'] = 'مقارنة بين النسخ المختارة'; +$lang['diff'] = 'أظهر الاختلافات مع النسخة الحالية'; +$lang['diff2'] = 'أظهر الاختلافات بين النسخ المحددة'; +$lang['difflink'] = 'رابط إلى هذه المقارنة'; $lang['line'] = 'سطر'; $lang['breadcrumb'] = 'أثر'; $lang['youarehere'] = 'أنت هنا'; $lang['lastmod'] = 'آخر تعديل'; $lang['by'] = 'بواسطة'; -$lang['deleted'] = 'تم حذف'; -$lang['created'] = 'تم إنشاء'; -$lang['restored'] = 'عودة لنسخة قديمة'; +$lang['deleted'] = 'حذفت'; +$lang['created'] = 'اُنشئت'; +$lang['restored'] = 'استعيدت نسخة قديمة'; $lang['external_edit'] = 'تحرير خارجي'; $lang['summary'] = 'ملخص التحرير'; $lang['noflash'] = 'تحتاج إلى<a href="http://www.adobe.com/products/flashplayer/">ملحق فلاش أدوبي</a> لعرض هذا المحتوى.'; $lang['download'] = 'نزل Snippet'; $lang['mail_newpage'] = 'إضافة صفحة:'; $lang['mail_changed'] = 'تعديل صفحة:'; -$lang['mail_subscribe_list'] = 'صفحات غيرت في النظاق:'; -$lang['mail_new_user'] = 'مشترك جديد'; -$lang['mail_upload'] = 'تحميل ملف:'; +$lang['mail_subscribe_list'] = 'صفحات غيرت في النطاق:'; +$lang['mail_new_user'] = 'مشترك جديد:'; +$lang['mail_upload'] = 'رفع ملف:'; $lang['qb_bold'] = 'نص عريض'; $lang['qb_italic'] = 'نص مائل'; $lang['qb_underl'] = 'نص مسطر'; $lang['qb_code'] = 'نص برمجي'; $lang['qb_strike'] = 'نص مشطوب'; -$lang['qb_h1'] = 'عنوان مستوى أول'; -$lang['qb_h2'] = 'عنوان مستوى ثاني'; -$lang['qb_h3'] = 'عنوان مستوى ثالث'; -$lang['qb_h4'] = 'عنوان مستوى رابع'; -$lang['qb_h5'] = 'عنوان مستوى خامس'; +$lang['qb_h1'] = 'عنوان مستوى ١'; +$lang['qb_h2'] = 'عنوان مستوى ٢'; +$lang['qb_h3'] = 'عنوان مستوى ٣'; +$lang['qb_h4'] = 'عنوان مستوى ٤'; +$lang['qb_h5'] = 'عنوان مستوى ٥'; $lang['qb_h'] = 'الترويسة'; $lang['qb_hs'] = 'حدد الترويسة'; $lang['qb_hplus'] = 'ترويسة أعلى'; @@ -192,29 +194,29 @@ $lang['qb_extlink'] = 'رابط خارجي'; $lang['qb_hr'] = 'سطر أفقي'; $lang['qb_ol'] = 'بند فى قائمة مرتبة'; $lang['qb_ul'] = 'بند فى قائمة غير مرتبة'; -$lang['qb_media'] = 'إضافة صور و ملفات أخرى'; -$lang['qb_sig'] = 'أضف توقيعك'; -$lang['qb_smileys'] = 'الابتسامات'; +$lang['qb_media'] = 'أضف صورا و ملفات أخرى'; +$lang['qb_sig'] = 'أدرج التوقيع'; +$lang['qb_smileys'] = 'الإبتسامات'; $lang['qb_chars'] = 'محارف خاصة'; $lang['upperns'] = 'انتقل للنطاق الأب'; -$lang['admin_register'] = 'إضافة مشترك جديد'; +$lang['admin_register'] = 'أضف مستخدما جديدا'; $lang['metaedit'] = 'تحرير البيانات الشمولية '; -$lang['metasaveerr'] = 'فشلت عملية كتابة البيانات الشمولية'; -$lang['metasaveok'] = 'تم حفظ البيانت الشمولية'; -$lang['img_backto'] = 'العودة إلى'; +$lang['metasaveerr'] = 'فشلت كتابة البيانات الشمولية'; +$lang['metasaveok'] = 'حُفظت البيانات الشمولية'; +$lang['img_backto'] = 'عودة إلى'; $lang['img_title'] = 'العنوان'; -$lang['img_caption'] = 'تنويه الصورة'; +$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_format'] = 'الهيئة'; +$lang['img_camera'] = 'الكمرا'; $lang['img_keywords'] = 'كلمات مفتاحية'; $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'; @@ -224,7 +226,7 @@ $lang['subscr_m_new_header'] = 'أضف اشتراكا'; $lang['subscr_m_current_header'] = 'الاشتراكات الحالية'; $lang['subscr_m_unsubscribe'] = 'ألغ الاشتراك'; $lang['subscr_m_subscribe'] = 'اشترك'; -$lang['subscr_m_receive'] = 'استقبل'; +$lang['subscr_m_receive'] = 'استقبال'; $lang['subscr_style_every'] = 'بريدا على كل تغيير'; $lang['subscr_style_digest'] = 'بريد ملخص عن تغييرات كل صفحة'; $lang['subscr_style_list'] = 'قائمة بالصفحات المتغيرة منذ آخر بريد'; diff --git a/inc/lang/ar/subscribermail.txt b/inc/lang/ar/subscribermail.txt deleted file mode 100644 index c9894570e..000000000 --- a/inc/lang/ar/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -أهلاً! - -الصفحة @PAGE@ فى @TITLE@ ويكي تم تعديلها. -ها هى التعديلات: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -لإلغاء إشتراكك فى تلك الصفحة أدخل على الويكي على العنوان -@DOKUWIKIURL@ ثم أذهب الى -@NEWPAGE@ -و أختار 'إلغاء أشتراكك'. - --- -تم ارسال هذه الرسالة من دوكيويكي -@DOKUWIKIURL@ diff --git a/inc/lang/az/lang.php b/inc/lang/az/lang.php index 8d96f08cc..35b18d3a7 100644 --- a/inc/lang/az/lang.php +++ b/inc/lang/az/lang.php @@ -5,7 +5,7 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Pasha L. Topchiyev <pasha@itopchiyev.com> */ -$lang['encoding'] = ' utf-8'; +$lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; $lang['doublequoteopening'] = '«'; $lang['doublequoteclosing'] = '»'; @@ -47,6 +47,7 @@ $lang['btn_draft'] = 'Qaralamada düzəliş etmək'; $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['user'] = 'istifadəci adı'; $lang['pass'] = 'Şifrə'; @@ -56,7 +57,6 @@ $lang['passchk'] = 'təkrarlayın'; $lang['remember'] = 'Məni yadda saxla'; $lang['fullname'] = 'Tam ad'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Qeydiyyatdan keç'; $lang['profile'] = 'İstifadəçi profili'; $lang['badlogin'] = 'Təssüf ki istifadəçi adı və ya şifrə səhvdir.'; $lang['minoredit'] = 'Az dəyişiklər'; diff --git a/inc/lang/az/subscribermail.txt b/inc/lang/az/subscribermail.txt deleted file mode 100755 index a18525da6..000000000 --- a/inc/lang/az/subscribermail.txt +++ /dev/null @@ -1,19 +0,0 @@ -Salam! - -@TITLE@ adı wiki-də @PAGE@ adlı səhifə dəyişdirilmişdi. -Dəyişiklər aşağıda göstərilib: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Bu səhifənin dəyişiklərindən imtina etmək üçün, -@DOKUWIKIURL@ adresində yerləşən wiki-yə daxil -olun, @NEWPAGE@ səhifəsinə keçin -və 'Abunəlikdən çıx' düyməsini sıxın. - - --- -Bu məktub DokuWiki tərəfindən yaradıldı. -DokuWiki aşağıdakı adresdə yerləşir: -@DOKUWIKIURL@ diff --git a/inc/lang/bg/admin.txt b/inc/lang/bg/admin.txt index 8d16f68aa..d3c14a0da 100644 --- a/inc/lang/bg/admin.txt +++ b/inc/lang/bg/admin.txt @@ -1,3 +1,3 @@ -====== Администрация ====== +====== Администриране ====== -Долу може да намерите списък с администраторски задачи в DokuWiki.
\ No newline at end of file +Отдолу ще намерите списъка с администраторските задачи в DokuWiki.
\ No newline at end of file diff --git a/inc/lang/bg/adminplugins.txt b/inc/lang/bg/adminplugins.txt index 2b0268ed4..df24b0538 100644 --- a/inc/lang/bg/adminplugins.txt +++ b/inc/lang/bg/adminplugins.txt @@ -1 +1 @@ -===== Допълнителни Plugins =====
\ No newline at end of file +===== Допълнителни приставки =====
\ No newline at end of file diff --git a/inc/lang/bg/backlinks.txt b/inc/lang/bg/backlinks.txt index 28801a8ee..dd633d94d 100644 --- a/inc/lang/bg/backlinks.txt +++ b/inc/lang/bg/backlinks.txt @@ -1,3 +1,3 @@ -====== Задни връзки ====== +====== Обратни препратки ====== -Това е списък на страници, които изглежда препращат обратно към текущата страница. +Това е списък на страниците, които препращат обратно към текущата страница. diff --git a/inc/lang/bg/conflict.txt b/inc/lang/bg/conflict.txt index 51ec4b706..8c62a3787 100644 --- a/inc/lang/bg/conflict.txt +++ b/inc/lang/bg/conflict.txt @@ -1,6 +1,6 @@ -====== По-нова версия съшествува ====== +====== Съществува по-нова версия ====== -По-нова версия на документа който сте редактирали съществува. Това се случва когато друг потребител е променил документа докато сте го редактирали. +Съществува по-нова версия на документа, който сте редактирали. Това се случва когато друг потребител е променил документа докато сте го редактирали. -Разгледайте внимателно разгледайте разликите показани долу, след това решете коя версия да запазите. Ако изберете ''Запис'', версия Ви ще бъде запазена. Изберете ''Отказ'', за да запазите текущата версия. +Разгледайте внимателно разликите, след това решете коя версия да бъде запазена. Ако натиснете ''Запис'', ще бъде запазена вашата версия. Натиснете ли ''Отказ'', ще бъде запазена текущата версия. diff --git a/inc/lang/bg/denied.txt b/inc/lang/bg/denied.txt index 7b1d5788e..45ce63769 100644 --- a/inc/lang/bg/denied.txt +++ b/inc/lang/bg/denied.txt @@ -1,4 +1,4 @@ ====== Отказан достъп ====== -Нямате достатъчно права да продължите. Може би сте забравили да влезете? +Нямате достатъчно права, за да продължите. Може би сте забравили да се впишете? diff --git a/inc/lang/bg/diff.txt b/inc/lang/bg/diff.txt index 2bd8262c6..b1d49de92 100644 --- a/inc/lang/bg/diff.txt +++ b/inc/lang/bg/diff.txt @@ -1,4 +1,4 @@ ====== Разлики ====== -Тук са показани разликите между избраната версия на страницата и текущата. +Тук са показани разликите между избраната и текущата версия на страницата. diff --git a/inc/lang/bg/draft.txt b/inc/lang/bg/draft.txt index 1938e7d9c..a59201130 100644 --- a/inc/lang/bg/draft.txt +++ b/inc/lang/bg/draft.txt @@ -1,6 +1,6 @@ ====== Намерена чернова ====== -Последната редакционна сесия на тази страница не е завършена правилно. Dokuwiki автоматично запазва чернова по време на работа, която може сега да използвате, за да продължите редактирането си. Долу може да видите данните, които бяха запазени от последната сесия. +Последната редакционна сесия на страницата не е завършена правилно. Dokuwiki автоматично запазва чернова по време на редактирането, която можете да ползвате сега, за да продължите работата си. Отдолу може да видите данните, които бяха запазени от последната сесия. -Моля решете, дали искате да //recover// последната си редакционна сесия, да //delete// автоматично запазената чернова или да //cancel// редакцията. +Моля решете, дали искате да //възстановите// последната си редакционна сесия, //изтриете// автоматично запазената чернова или //откажете// редакцията. diff --git a/inc/lang/bg/edit.txt b/inc/lang/bg/edit.txt index 90d376dbc..086d9978e 100644 --- a/inc/lang/bg/edit.txt +++ b/inc/lang/bg/edit.txt @@ -1,2 +1,2 @@ -Редактирайте страницата и натиснете ''Запис''. Погледнете [[wiki:syntax]] за Wiki синтаксис. Моля редактирайте страницата, само ако може да я **подобрите**. Ако искате да пробвате разни неща, научете се да правите първите си стъпки в [[playground:playground|пясъчника]]. +Редактирайте и натиснете ''Запис''. За информация относно ползвания синтаксис прочетете [[wiki:syntax]]. Моля, редактирайте само когато може да **подобрите** съдържанието. Ако ще пробвате разни неща, може да експериментирате в [[playground:playground|пясъчника]]. diff --git a/inc/lang/bg/editrev.txt b/inc/lang/bg/editrev.txt index 87e7b26a8..ba97f253a 100644 --- a/inc/lang/bg/editrev.txt +++ b/inc/lang/bg/editrev.txt @@ -1,2 +1,2 @@ -**Заредили сте стара версия на документа!** Ако я запазите, ще създадете нова редакция с текущите данни. +**Заредена е стара версия на документа!** Ако я запазите, ще създадете нова версия с текущите данни. ---- diff --git a/inc/lang/bg/index.txt b/inc/lang/bg/index.txt index 2ebf5128a..7dabac6af 100644 --- a/inc/lang/bg/index.txt +++ b/inc/lang/bg/index.txt @@ -1,4 +1,4 @@ ====== Индекс ====== -Това е списък на всички достъпни страници подредени по [[doku>namespaces|именни пространства]]. +Това е списък на всички налични страници подредени по [[doku>namespaces|именни пространства]]. diff --git a/inc/lang/bg/install.html b/inc/lang/bg/install.html index 0d7fd5232..6dde7e4ce 100644 --- a/inc/lang/bg/install.html +++ b/inc/lang/bg/install.html @@ -1,25 +1,18 @@ -<p>Тази страница помага при първоначална инсталация и настройка на +<p>Страницата помага при първа инсталация и настройване на <a href="http://dokuwiki.org">Dokuwiki</a>. Повече информация -за този инсталатор е достъпна в неговата собствена -<a href="http://dokuwiki.org/installer">документация</a>.</p> +за инсталатора ще намерите в <a href="http://dokuwiki.org/installer">документацията му</a>.</p> -<p>Dokuwiki използва обикновени файлове за хранилище на уики страниците и друга -информация свързана с тези страници(примерно картинки, търсене, стари версии, т.н.). -За да използвате успешно DokuWiki -<strong>трябва</strong> да имате достъп за писане в директориите които съдържат тези -файлове. Този инсталатор няма възможности да настройва правата на директориите. -Това обикновено трябва да бъде направено директно от командният ред или ако -използвате хостинг - през FTP или контрол панела на хоста(примерно cPanel).</p> +<p>Dokuwiki ползва обикновени файлове за хранилище на страниците и друга +информация свързана с тях (примерно картинки, търсене, стари версии, и др.). +За да функционира нормално DokuWiki +<strong>трябва</strong> да има право за писане в директориите, които съдържат тези +файлове. Инсталаторът не може да настройва правата на директориите. +Обикновено трябва да направите това директно от командният ред или ако +ползвате хостинг - през FTP или контролния панела на хоста (примерно cPanel).</p> -<p>Този инсталатор ще настрои вашата DokuWiki конфигурация за -<acronym title="access control list">ACL</acronym>, което на -свой ред ще позволи на администратора да влезе и да има достъп -до администраторското меню в DokuWiki за инсталиране на плъгини, контрол -на потребители, управление да достъп до уики страници и промяна на настройките -Това не е необходимо на DokuWiki да работи, но ще направи DokuWiki по-лесно за -администриране.</p> +<p>Инсталаторът ще настрои вашата DokuWiki конфигурация на +<acronym title="списъка за достъп">ACL</acronym>, което ще позволи на администратора да се впише и ползва администраторското меню в DokuWiki за инсталиране на приставки, контрол +на потребители, управление на достъпа до страниците и промяна на останалите настройки. Това не е необходимо за функционирането на DokuWiki, но направи администрирането на DokuWiki по-лесно.</p> -<p>Опитните потребители или потребителите със специални изисквания -към настройките може да използват тези връзки за детайли свързани с -<a href="http://dokuwiki.org/install">инструкции за инсталация</a> -и <a href="http://dokuwiki.org/config">настройка</a>.</p> +<p>Опитните потребители или потребителите със специални изисквания към настройките имат на разположение информация относно <a href="http://dokuwiki.org/install"> инсталацията</a> +и <a href="http://dokuwiki.org/config">настройките</a>.</p> diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php index 053a7f1ba..c7c52b70f 100644 --- a/inc/lang/bg/lang.php +++ b/inc/lang/bg/lang.php @@ -5,6 +5,7 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Nikolay Vladimirov <nikolay@vladimiroff.com> * @author Viktor Usunov <usun0v@mail.bg> + * @author Kiril <neohidra@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -14,8 +15,8 @@ $lang['singlequoteopening'] = '‘'; $lang['singlequoteclosing'] = '’'; $lang['apostrophe'] = '’'; $lang['btn_edit'] = 'Редактиране'; -$lang['btn_source'] = 'Показване на кода на страницата'; -$lang['btn_show'] = 'Показване на страница'; +$lang['btn_source'] = 'Преглед на кода'; +$lang['btn_show'] = 'Преглед на страницата'; $lang['btn_create'] = 'Създаване на страница'; $lang['btn_search'] = 'Търсене'; $lang['btn_save'] = 'Запис'; @@ -24,224 +25,260 @@ $lang['btn_top'] = 'Към началото'; $lang['btn_newer'] = '<< по-нови'; $lang['btn_older'] = 'по-стари >>'; $lang['btn_revs'] = 'История'; -$lang['btn_recent'] = 'Последни промени'; +$lang['btn_recent'] = 'Скорошни промени'; $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_update'] = 'Актуализиране'; $lang['btn_delete'] = 'Изтриване'; $lang['btn_back'] = 'Назад'; -$lang['btn_backlink'] = 'Обратни връзки'; -$lang['btn_backtomedia'] = 'Назад към избор на медиен файл'; -$lang['btn_subscribe'] = 'Абониране за Промени'; -$lang['btn_unsubscribe'] = 'Отписване от Промени'; -$lang['btn_subscribens'] = 'Абониране за Промени на именно пространство'; -$lang['btn_unsubscribens'] = 'Отписване от Промени на именно пространство'; -$lang['btn_profile'] = 'Актуализирай Профила'; +$lang['btn_backlink'] = 'Обратни препратки'; +$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['loggedinas'] = 'Влезли сте като'; +$lang['btn_register'] = 'Регистриране'; +$lang['loggedinas'] = 'Вписани сте като'; $lang['user'] = 'Потребител'; $lang['pass'] = 'Парола'; $lang['newpass'] = 'Нова парола'; $lang['oldpass'] = 'Потвърждение на текуща парола'; -$lang['passchk'] = 'oтново'; +$lang['passchk'] = 'още веднъж'; $lang['remember'] = 'Запомни ме'; -$lang['fullname'] = 'Пълно име'; +$lang['fullname'] = 'Истинско име'; $lang['email'] = 'Електронна поща'; -$lang['register'] = 'Регистрация'; $lang['profile'] = 'Потребителски профил'; -$lang['badlogin'] = 'Потребителското име или паролата са грешни'; +$lang['badlogin'] = 'Грешно потребителско име или парола.'; $lang['minoredit'] = 'Незначителни промени'; -$lang['draftdate'] = 'Черновата бе автоматично записана на'; +$lang['draftdate'] = 'Черновата е автоматично записана на'; $lang['nosecedit'] = 'Страницата бе междувременно променена, презареждане на страницата поради неактуална информация.'; $lang['regmissing'] = 'Моля, попълнете всички полета.'; -$lang['reguexists'] = 'Потребител с такова име вече съществува.'; -$lang['regsuccess'] = 'Потребителят бе създаден и паролата бе пратена на електронната поща.'; -$lang['regsuccess2'] = 'Потребителят бе създаден.'; -$lang['regmailfail'] = 'Изглежда, че има проблем с пращането на писмото с паролата. Моля, свържете се с администратора.'; +$lang['reguexists'] = 'Вече съществува потребител с избраното име.'; +$lang['regsuccess'] = 'Потребителят е създаден, а паролата е пратена по електронната поща.'; +$lang['regsuccess2'] = 'Потребителят е създаден.'; +$lang['regmailfail'] = 'Изглежда, че има проблем с пращането на писмото с паролата. Моля, свържете се с администратора!'; $lang['regbadmail'] = 'Въведеният адрес изглежда невалиден - ако мислите, че това е грешка, свържете се с администратора.'; -$lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново'; -$lang['regpwmail'] = 'Парола за DokuWiki'; -$lang['reghere'] = 'Нямате профил все още? Направете си!'; -$lang['profna'] = 'Това Wiki не поддържа промяна на профила'; +$lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново.'; +$lang['regpwmail'] = 'Паролата ви за DokuWiki'; +$lang['reghere'] = 'Все още нямате профил? Направете си'; +$lang['profna'] = 'Wiki-то не поддържа промяна на профила'; $lang['profnochange'] = 'Няма промени.'; -$lang['profnoempty'] = 'Невъведено име или електронна поща не са позволени.'; -$lang['profchanged'] = 'Потребителският профил бе успешно обновен.'; -$lang['pwdforget'] = 'Забравили сте си паролата? Въведете нова.'; -$lang['resendna'] = 'Това Wiki не поддържа повторно пращане на парола'; +$lang['profnoempty'] = 'Въвеждането на име и ел. поща е задължително'; +$lang['profchanged'] = 'Потребителският профил е обновен успешно.'; +$lang['pwdforget'] = 'Забравили сте паролата си? Получете нова'; +$lang['resendna'] = 'Wiki-то не поддържа повторно пращане на паролата.'; $lang['resendpwd'] = 'Изпращане на нова парола за'; $lang['resendpwdmissing'] = 'Моля, попълнете всички полета.'; -$lang['resendpwdnouser'] = 'Потребителят не бе намерен в базата данни.'; -$lang['resendpwdbadauth'] = 'Този код за потвърждение е невалиден. Проверете дали сте използвали целият линк за потвърждение.'; -$lang['resendpwdconfirm'] = 'Адресът за потвърждение бе пратен по електронната поща.'; -$lang['resendpwdsuccess'] = 'Паролата ви бе изпратена на електронната поща.'; -$lang['license'] = 'Освен ако не е посочено друго, съдържанието на това Wiki е лицензирано под следния лиценз:'; -$lang['licenseok'] = 'Имайте предвид, че чрез редактирането на тази страница, Вие се съгласявате съдържанието й да бъде лицензирано под следния лиценз:'; +$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_overwrt'] = 'Запис върху съществуващ файл'; -$lang['lockedby'] = 'В момента е заключено от'; -$lang['lockexpire'] = 'Затварянето изтича в'; -$lang['willexpire'] = 'Затварянето на страницата за редактиране изтича след минута.\nЗа да избегнете противоречия, използвайте бутона, за да рестартирате броячът за затваряне.'; -$lang['js']['notsavedyet'] = "Незапазените промени ще бъдат загубени.\nИскате ли да продължите?"; -$lang['rssfailed'] = 'Възникна грешка при вземането на този feed: '; -$lang['nothingfound'] = 'Нищо не бе намерено.'; +$lang['txt_upload'] = 'Изберете файл за качване'; +$lang['txt_filename'] = 'Качи като (незадължително)'; +$lang['txt_overwrt'] = 'Презапиши съществуващите файлове'; +$lang['lockedby'] = 'В момента е заключена от'; +$lang['lockexpire'] = 'Ще бъде отключена на'; +$lang['willexpire'] = 'Страницата ще бъде отключена за редактиране след минута.\nЗа предотвратяване на конфликти, ползвайте бутона "Преглед", за рестартиране на брояча за заключване.'; +$lang['js']['notsavedyet'] = 'Незаписаните промени ще бъдат загубени. Желаете ли да продължите?'; +$lang['js']['searchmedia'] = 'Търсене на файлове'; +$lang['js']['keepopen'] = 'Без затваряне на прозореца след избор'; +$lang['js']['hidedetails'] = 'Без подробности'; +$lang['js']['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'] = 'Връзките към Windows shares работят само под Internet Explorer. +Можете да копирате и поставите връзката.'; +$lang['js']['linkwiz'] = 'Помощник за препратки'; +$lang['js']['linkto'] = 'Препратка към: '; +$lang['js']['del_confirm'] = 'Да бъдат ли изтрити избраните елементи?'; +$lang['js']['mu_btn'] = 'Качване на няколко файла наведнъж'; +$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['uploadsucc'] = 'Качването е успешно'; +$lang['uploadfail'] = 'Качването се провали. Може би поради грешни права?'; +$lang['uploadwrong'] = 'Качването е отказано. Файлово разширение е забранено!'; +$lang['uploadexist'] = 'Файлът вече съществува. Нищо не е направено.'; +$lang['uploadbadcontent'] = 'Каченото съдържание не съответства на файлово разширение %s .'; +$lang['uploadspam'] = 'Качването е блокирано от SPAM списъка.'; +$lang['uploadxss'] = 'Качването е блокирано, поради възможно зловредно съдържание.'; +$lang['uploadsize'] = 'Файльт за качване е прекалено голям. (макс. %s)'; $lang['deletesucc'] = 'Файлът "%s" бе изтрит.'; -$lang['deletefail'] = '"%s" не бе изтрит, проверете правата'; +$lang['deletefail'] = '"%s" не може да бъде изтрит - проверете правата.'; $lang['mediainuse'] = 'Файлът "%s" не бе изтрит - все още се ползва.'; $lang['namespaces'] = 'Именни пространства'; -$lang['mediafiles'] = 'Достъпни файлове в'; -$lang['js']['searchmedia'] = 'Търси файлове'; -$lang['js']['keepopen'] = 'Задържане на прозореца отворен при избор'; -$lang['js']['hidedetails'] = 'Скрий детайлите'; -$lang['js']['nosmblinks'] = 'Връзките към Windows shares работят само под Internet Explorer. -Можете да копирате и поставите връзката.'; -$lang['js']['linkwiz'] = 'Линк съветник'; -$lang['js']['linkto'] = 'Линк към: '; -$lang['js']['del_confirm'] = 'Да бъдат ли изтрити избраните елементи?'; -$lang['js']['mu_btn'] = 'Качване на няколко файла наведнъж'; -$lang['mediausage'] = 'Използвайте следният синтакс, за да упоменете файла:'; +$lang['mediafiles'] = 'Налични файлове в'; +$lang['accessdenied'] = 'Нямате разрешение да преглеждате страницата.'; +$lang['mediausage'] = 'Ползвайте следния синтаксис, за да упоменете файла:'; $lang['mediaview'] = 'Преглед на оригиналния файл'; $lang['mediaroot'] = 'root'; -$lang['mediaupload'] = 'Качете файл в текущото именнопространство тук. За да създадете подименни пространства, добавете ги в началото на "Качи като" име на файл, разделени с двоеточие.'; -$lang['mediaextchange'] = 'Разширението на файла бе сменено от .%s на .%s!'; -$lang['reference'] = 'Референции за'; +$lang['mediaupload'] = 'Качете файл в текущото именно пространство. За създаване на подимено пространство, добавете име преди това на файла като ги разделите с двоеточие в полето "Качи като"'; +$lang['mediaextchange'] = 'Разширението на файла е сменено от .%s на .%s!'; +$lang['reference'] = 'Връзки за'; $lang['ref_inuse'] = 'Файлът не може да бъде изтрит, защото все още се ползва от следните страници:'; -$lang['ref_hidden'] = 'Някои препратки са към страници, които нямате права да четете'; +$lang['ref_hidden'] = 'Някои връзки са към страници, които нямате права да четете'; $lang['hits'] = 'Съвпадения'; $lang['quickhits'] = 'Съвпадащи имена на страници'; $lang['toc'] = 'Съдържание'; -$lang['current'] = 'текущо'; +$lang['current'] = 'текуща'; $lang['yours'] = 'Вашата версия'; $lang['diff'] = 'Преглед на разликите с текущата версия'; -$lang['diff2'] = 'Показване на разликите между избрани преработки'; +$lang['diff2'] = 'Показване на разликите между избрани версии'; +$lang['difflink'] = 'Препратка към сравнението на версиите'; +$lang['diff_type'] = 'Преглед на разликите:'; +$lang['diff_inline'] = 'Вграден'; +$lang['diff_side'] = 'Един до друг'; $lang['line'] = 'Ред'; $lang['breadcrumb'] = 'Следа'; $lang['youarehere'] = 'Намирате се в'; $lang['lastmod'] = 'Последна промяна'; $lang['by'] = 'от'; -$lang['deleted'] = 'изтриване'; -$lang['created'] = 'създаване'; +$lang['deleted'] = 'изтрита'; +$lang['created'] = 'създадена'; $lang['restored'] = 'възстановена предишна версия'; $lang['external_edit'] = 'външна редакция'; $lang['summary'] = 'Обобщение'; -$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> е необходим за показване на съдържанието.'; +$lang['noflash'] = 'Необходим е <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> за изобразяване на съдържанието.'; $lang['download'] = 'Изтегляне на фрагмент'; -$lang['mail_newpage'] = 'добавена страница:'; -$lang['mail_changed'] = 'променена страница:'; -$lang['mail_new_user'] = 'нов потребител:'; +$lang['mail_newpage'] = 'добавена страница: '; +$lang['mail_changed'] = 'променена страница: '; +$lang['mail_subscribe_list'] = 'променени страници в именно пространство: '; +$lang['mail_new_user'] = 'нов потребител: '; $lang['mail_upload'] = 'качен файл: '; $lang['qb_bold'] = 'Удебелен текст'; $lang['qb_italic'] = 'Курсив текст'; $lang['qb_underl'] = 'Подчертан текст'; $lang['qb_code'] = 'Код'; $lang['qb_strike'] = 'Зачеркнат текст'; -$lang['qb_h1'] = 'Заглавие ниво 1'; -$lang['qb_h2'] = 'Заглавие ниво 2'; -$lang['qb_h3'] = 'Заглавие ниво 3'; -$lang['qb_h4'] = 'Заглавие ниво 4'; -$lang['qb_h5'] = 'Заглавие ниво 5'; +$lang['qb_h1'] = 'Заглавие от 1 ниво'; +$lang['qb_h2'] = 'Заглавие от 2 ниво'; +$lang['qb_h3'] = 'Заглавие от 3 ниво'; +$lang['qb_h4'] = 'Заглавие от 4 ниво'; +$lang['qb_h5'] = 'Заглавие от 5 ниво'; $lang['qb_h'] = 'Заглавие'; -$lang['qb_hs'] = 'Избери заглавие'; -$lang['qb_hplus'] = 'Основно заглавие'; +$lang['qb_hs'] = 'Изберете заглавие'; +$lang['qb_hplus'] = 'Надзаглавие'; $lang['qb_hminus'] = 'Подзаглавие'; -$lang['qb_hequal'] = 'Заглавие на същото ниво'; +$lang['qb_hequal'] = 'Заглавие от същото ниво'; $lang['qb_link'] = 'Вътрешна препратка'; $lang['qb_extlink'] = 'Външна препратка'; $lang['qb_hr'] = 'Хоризонтална линия'; -$lang['qb_ol'] = 'Подреден списък'; -$lang['qb_ul'] = 'Неподреден списък'; +$lang['qb_ol'] = 'Номериран списък'; +$lang['qb_ul'] = 'Неномериран списък'; $lang['qb_media'] = 'Добавяне на изображения и други файлове'; $lang['qb_sig'] = 'Вмъкване на подпис'; $lang['qb_smileys'] = 'Усмивчици'; $lang['qb_chars'] = 'Специални знаци'; -$lang['upperns'] = 'Към свьрзано именно пространство'; -$lang['admin_register'] = 'Добабяне на нов потребител'; +$lang['upperns'] = 'към майчиното именно пространство'; +$lang['admin_register'] = 'Добавяне на нов потребител'; $lang['metaedit'] = 'Редактиране на метаданни'; -$lang['metasaveerr'] = 'Запазването на метаданните бе неуспешно'; -$lang['metasaveok'] = 'Метаданните бяха запазени'; +$lang['metasaveerr'] = 'Записването на метаданните се провали'; +$lang['metasaveok'] = 'Метаданните са запазени успешно'; $lang['img_backto'] = 'Назад към'; $lang['img_title'] = 'Заглавие'; $lang['img_caption'] = 'Надпис'; $lang['img_date'] = 'Дата'; -$lang['img_fname'] = 'Име на файл'; +$lang['img_fname'] = 'Име на файла'; $lang['img_fsize'] = 'Размер'; -$lang['img_artist'] = 'Заснет от'; +$lang['img_artist'] = 'Фотограф'; $lang['img_copyr'] = 'Авторско право'; $lang['img_format'] = 'Формат'; $lang['img_camera'] = 'Фотоапарат'; $lang['img_keywords'] = 'Ключови думи'; -$lang['subscribe_success'] = '%s бе добавен към абонамента за %s'; -$lang['subscribe_error'] = 'Имаше грешка при добавянето на абонамента на %s за %s'; -$lang['subscribe_noaddress'] = 'Няма адрес свързан с потребителя, не може да се абонирате'; -$lang['unsubscribe_success'] = 'Абонаментът %s бе премахнат от списъка за %s'; -$lang['unsubscribe_error'] = 'Имаше грешка при премахването на абонамента на %s от списъка %s'; -$lang['authmodfailed'] = 'Лоша настройка за удостоверяване на потребителя. Моля, уведомете администратора.'; -$lang['authtempfail'] = 'Удостоверяването на потребителите е временно недостъпно. Ако това продължи дълго, моля уведомете администратора.'; -$lang['i_chooselang'] = 'Избор на език'; +$lang['subscr_subscribe_success'] = '%s е добавен към списъка с абониралите се за %s'; +$lang['subscr_subscribe_error'] = 'Грешка при добавянето на %s към списъка с абониралите се за %s'; +$lang['subscr_subscribe_noaddress'] = 'Добавянето ви към списъка с абонати не е възможно поради липсата на свързан адрес (на ел. поща) с профила ви.'; +$lang['subscr_unsubscribe_success'] = '%s е премахнат от списъка с абониралите се за %s'; +$lang['subscr_unsubscribe_error'] = 'Грешка при премахването на %s от списъка с абониралите се за %s'; +$lang['subscr_already_subscribed'] = '%s е вече абониран за %s'; +$lang['subscr_not_subscribed'] = '%s не е абониран за %s'; +$lang['subscr_m_not_subscribed'] = 'Не сте абониран за текущата страницата или именно пространство.'; +$lang['subscr_m_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 дни)'; +$lang['authmodfailed'] = 'Лоша настройки за удостоверяване. Моля, уведомете администратора на Wiki страницата.'; +$lang['authtempfail'] = 'Удостоверяването на потребители не е възможно за момента. Ако продължи дълго, моля уведомете администратора на Wiki страницата.'; +$lang['i_chooselang'] = 'Изберете вашия изик'; $lang['i_installer'] = 'Инсталатор на DokuWiki'; -$lang['i_wikiname'] = 'Име на Wiki'; -$lang['i_enableacl'] = 'Включване на списъци за достъп ACL (препоръчително)'; +$lang['i_wikiname'] = 'Име на Wiki-то'; +$lang['i_enableacl'] = 'Ползване на списък за достъп (ACL) [препоръчително]'; $lang['i_superuser'] = 'Супер потребител'; -$lang['i_problems'] = 'Инсталатора намери проблеми указани по-долу. Не може да продължите, докато не ги отстраните.'; -$lang['i_modified'] = 'Поради мерки за сигурност този скрипт ще работи само с нова и непроменена Dokuwiki инсталация. Трябва да разархивирате отново файловете от дръпнатия пакет или да се посъветвате с пълните <a href="http://dokuwiki.org/install">Инструкции за инсталация на Dokuwiki</a>.'; +$lang['i_problems'] = 'Открити са проблеми, които възпрепятстват инсталирането. Ще можете да продължите след като отстраните долуизброените проблеми.'; +$lang['i_modified'] = 'Поради мерки за сигурност скрипта ще работи само с нова и непроменена инсталация на Dokuwiki. Трябва да разархивирате отново файловете от сваления архив или да се посъветвате с <a href="http://dokuwiki.org/install">Инструкциите за инсталация на Dokuwiki</a>.'; $lang['i_funcna'] = 'PHP функцията <code>%s</code> не е достъпна. Може би е забранена от доставчика на хостинг.'; -$lang['i_phpver'] = 'Вашата PHP версия <code>%s</code> е по-стара от необходимата <code>%s</code>. Обновете PHP инсталацията си.'; -$lang['i_permfail'] = '<code>%s</code> не е достъпна за писане от DokuWiki. Трябва да промените настройките за достъп до директорията!'; +$lang['i_phpver'] = 'Инсталираната версия <code>%s</code> на PHP е по-стара от необходимата <code>%s</code>. Актуализирайте PHP инсталацията.'; +$lang['i_permfail'] = '<code>%s</code> не е достъпна за писане от DokuWiki. Трябва да промените правата за достъп до директорията!'; $lang['i_confexists'] = '<code>%s</code> вече съществува'; -$lang['i_writeerr'] = '<code>%s</code> не можа да бъде създаден. Трябва да проверите правата на директорията/файла за достъп и да създадете файл ръчно.'; -$lang['i_badhash'] = 'неразпознат или променен dokuwiki.php (hash=<code>%s</code>)'; +$lang['i_writeerr'] = '<code>%s</code> не можа да бъде създаден. Трябва да проверите правата за достъп до директорията/файла и да създадете файла ръчно.'; +$lang['i_badhash'] = 'Файлът dokuwiki.php не може да бъде разпознат или е променен (hash=<code>%s</code>)'; $lang['i_badval'] = '<code>%s</code> - непозволена или празна стойност'; -$lang['i_success'] = 'Настройката приключи успешно. Може да създадете файлът install.php сега. Продължете към - <a href="doku.php">Ново Ви DokuWiki</a>.'; -$lang['i_failure'] = 'Имаше грешки при записа на файловете с настройки. Може да трябва да ги редактирате ръчно. Ползвайте <a href="doku.php">Ново Ви DokuWiki</a>.'; -$lang['i_policy'] = 'Първоначална политика за достъп ACL'; -$lang['i_pol0'] = 'Отворено Wiki (четене, писане, качване от всички)'; -$lang['i_pol1'] = 'Публично Wiki (четене от всички, писане и качване от регистрирани потребители)'; -$lang['i_pol2'] = 'Затворено Wiki (четене, писане, качване само от регистрирани потребители)'; +$lang['i_success'] = 'Настройването приключи успешно. Вече можете да изтриете файла install.php. Продължете към <a href="doku.php">Вашето ново DokuWiki</a>.'; +$lang['i_failure'] = 'Възникнаха грешки при записването на файловете с настройки. Вероятно ще се наложи да ги поправите ръчно, за да можете да ползвате <a href="doku.php">Вашето ново DokuWiki</a>.'; +$lang['i_policy'] = 'Първоначална политика за достъп'; +$lang['i_pol0'] = 'Отворено Wiki (всеки може да чете, пише и качва)'; +$lang['i_pol1'] = 'Публично Wiki (всеки може да чете, само регистрирани пишат и качват)'; +$lang['i_pol2'] = 'Затворено Wiki (само регистрирани четат, пишат и качват)'; $lang['i_retry'] = 'Повторен опит'; -$lang['mu_intro'] = 'Тук можете да качите няколко файла наведнъж. Добавете ги към съответните полета и натиснете бутона за качване. +$lang['i_license'] = 'Моля, изберете лиценз под който желаете да публикувате съдържанието:'; +$lang['mu_intro'] = 'От тук можете да качите няколко файла наведнъж. Натиснете бутона "Избиране", изберете файлове и натиснете "Качване". '; -$lang['mu_gridname'] = 'Име на файл'; +$lang['mu_gridname'] = 'Име на файла'; $lang['mu_gridsize'] = 'Големина'; $lang['mu_gridstat'] = 'Състояние'; $lang['mu_namespace'] = 'Именно пространство'; -$lang['mu_browse'] = 'Избери'; +$lang['mu_browse'] = 'Избиране'; $lang['mu_toobig'] = 'прекалено голям'; $lang['mu_ready'] = 'готов за качване'; -$lang['mu_done'] = 'приключен'; -$lang['mu_fail'] = 'неуспешен'; -$lang['mu_authfail'] = 'сесията изтече'; +$lang['mu_done'] = 'качен'; +$lang['mu_fail'] = 'неуспешно качване'; +$lang['mu_authfail'] = 'приключила сесия'; $lang['mu_progress'] = '@PCT@% качен'; $lang['mu_filetypes'] = 'Позволени файлови разширения'; -$lang['mu_info'] = 'качени файлове'; +$lang['mu_info'] = 'качени файла.'; $lang['mu_lasterr'] = 'Последна грешка:'; -$lang['recent_global'] = 'В момента преглеждате промените в <b>%s</b> именно пространство. Може да прегледате и <a href="%s">промените на цялото Wiki</a>.'; +$lang['recent_global'] = 'В момента преглеждате промените в именно пространство <b>%s</b>. Може да прегледате и <a href="%s">промените в цялото Wiki</a>.'; $lang['years'] = 'преди %d години'; -$lang['months'] = 'преди %d месеци'; +$lang['months'] = 'преди %d месеца'; $lang['weeks'] = 'преди %d седмици'; $lang['days'] = 'преди %d дни'; $lang['hours'] = 'преди %d часа'; $lang['minutes'] = 'преди %d минути'; $lang['seconds'] = 'преди %d секунди'; +$lang['wordblock'] = 'Направените от вас промени не са съхранени, защото съдържат забранен текст (SPAM).'; diff --git a/inc/lang/bg/locked.txt b/inc/lang/bg/locked.txt index 0eecc6729..7cdfba786 100644 --- a/inc/lang/bg/locked.txt +++ b/inc/lang/bg/locked.txt @@ -1,3 +1,3 @@ -====== Страницата е затворена ====== +====== Страницата е заключена ====== -В момента страницата е затворена за редакция от друг потребител. Трябва да изчаката докато този потребител приключи или затварянето изтече. +В момента страницата е заключена за редактиране от друг потребител. Трябва да изчакате потребителя да приключи с редактирането на страницата или автоматичното отключване на страницата. diff --git a/inc/lang/bg/login.txt b/inc/lang/bg/login.txt index b525f08cf..a6f53e95d 100644 --- a/inc/lang/bg/login.txt +++ b/inc/lang/bg/login.txt @@ -1,3 +1,3 @@ -====== Вход ====== +====== Вписване ====== -В момента не сте влезли! Въведете данните си долу, за да го направите. Бисквитките (cookies) трябва да са включени. +Не сте се вписали! Въведете данните си удостоверяване отдолу, за да го направите. Бисквитките (cookies) трябва да са включени. diff --git a/inc/lang/bg/mailtext.txt b/inc/lang/bg/mailtext.txt index 8c18767e5..ad0024a8d 100644 --- a/inc/lang/bg/mailtext.txt +++ b/inc/lang/bg/mailtext.txt @@ -1,16 +1,16 @@ -Страница във DokuWiki бе добавена или променена. Ето детайлите: +Страница във DokuWiki е добавена или променена. Ето детайлите: -Дата : @DATE@ -Браузър : @BROWSER@ -IP-адрес : @IPADDRESS@ -Име на хост : @HOSTNAME@ +Дата : @DATE@ +Браузър : @BROWSER@ +IP адрес : @IPADDRESS@ +Име на хоста : @HOSTNAME@ Стара версия: @OLDPAGE@ -Нова версия : @NEWPAGE@ -Обобщение : @SUMMARY@ -Потребител : @USER@ +Нова версия: @NEWPAGE@ +Обобщение: @SUMMARY@ +Потребител : @USER@ @DIFF@ -- -Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@ +Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@ diff --git a/inc/lang/bg/newpage.txt b/inc/lang/bg/newpage.txt index fcc1c6257..22d3bb6d1 100644 --- a/inc/lang/bg/newpage.txt +++ b/inc/lang/bg/newpage.txt @@ -1,4 +1,4 @@ ====== Несъществуваща тема ====== -Последвали сте връзка към тема, която все още не съществува. Ако правата Ви позволяват, може да я създадете като използвате бутона ''Създаване на страницата'' +Последвали сте препратка към тема, която не съществува. Ако правата ви позволяват, може да я създадете чрез бутона ''Създаване на страница''. diff --git a/inc/lang/bg/norev.txt b/inc/lang/bg/norev.txt index 0262aef60..fb7aeef89 100644 --- a/inc/lang/bg/norev.txt +++ b/inc/lang/bg/norev.txt @@ -1,4 +1,4 @@ ====== Няма такава версия ====== -Избраната версия не съществува. Използвайте бутона ''Редакции'' за списък на стари версии на документа. +Избраната версия не съществува. Натиснете бутона ''История'' за отваряне на списъка със стари версии на документа. diff --git a/inc/lang/bg/password.txt b/inc/lang/bg/password.txt index be2f10c61..7a70ef1d8 100644 --- a/inc/lang/bg/password.txt +++ b/inc/lang/bg/password.txt @@ -1,9 +1,9 @@ Здравейте @FULLNAME@! -Ето Вашите потребителски данни за @TITLE@ на @DOKUWIKIURL@ +Вашите потребителски данни за @TITLE@ на @DOKUWIKIURL@ -Потребител: @LOGIN@ -Парола : @PASSWORD@ +Потребител : @LOGIN@ +Парола : @PASSWORD@ -- -Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file +Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/bg/preview.txt b/inc/lang/bg/preview.txt index 442f16de2..41fde7380 100644 --- a/inc/lang/bg/preview.txt +++ b/inc/lang/bg/preview.txt @@ -1,3 +1,3 @@ ====== Преглед ====== -Ето как ще изглежда текста. Той обаче все още **не е запазен** ! +Ето как ще изглежда страницата. Текста все още **не е запазен**!
\ No newline at end of file diff --git a/inc/lang/bg/pwconfirm.txt b/inc/lang/bg/pwconfirm.txt index 1cd64b151..2c4252e15 100644 --- a/inc/lang/bg/pwconfirm.txt +++ b/inc/lang/bg/pwconfirm.txt @@ -1,14 +1,13 @@ Здравейте @FULLNAME@! -Някой е поискал нова парола за потребителя @TITLE@ +Някой е поискал нова парола за потребител @TITLE@ на @DOKUWIKIURL@ Ако не сте поискали нова парола, товава просто игнорирайте това писмо. -За да потвърдите, че искането е наистина пратено от вас, моля използвайте -следния адрес. +За да потвърдите, че искането е наистина от вас, моля ползвайте следния линк: @CONFIRM@ -- -Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@ +Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@ diff --git a/inc/lang/bg/read.txt b/inc/lang/bg/read.txt index 89e9a9d70..861d47fc5 100644 --- a/inc/lang/bg/read.txt +++ b/inc/lang/bg/read.txt @@ -1,2 +1,2 @@ -Тази страница е позволена само за четене. Може да разгледате кода, но не и да го променята. Обърнете се съм администратора си, ако мислите, че това е грешно. +Страницата е само за четене. Може да разглеждате кода, но не и да го променяте. Обърнете се съм администратора, ако смятате, че това не е редно. diff --git a/inc/lang/bg/recent.txt b/inc/lang/bg/recent.txt index 262979e34..c92029054 100644 --- a/inc/lang/bg/recent.txt +++ b/inc/lang/bg/recent.txt @@ -1,4 +1,4 @@ -====== Последни промени ====== +====== Скорошни промени ====== Следните страници са били променени наскоро. diff --git a/inc/lang/bg/register.txt b/inc/lang/bg/register.txt index 74a07cd90..51fbb83fe 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/registermail.txt b/inc/lang/bg/registermail.txt index 7839b0910..4b0828c7b 100644 --- a/inc/lang/bg/registermail.txt +++ b/inc/lang/bg/registermail.txt @@ -1,13 +1,13 @@ -Нов потребител беше регистриран. Ето детайлите: +Регистриран е нов потребител. Ето детайлите: Потребител : @NEWUSER@ -Пълно име : @NEWNAME@ -E-поща : @NEWEMAIL@ +Пълно име : @NEWNAME@ +E. поща : @NEWEMAIL@ -Дата : @DATE@ -Браузър : @BROWSER@ -IP-адрес : @IPADDRESS@ -Име на хоста: @HOSTNAME@ +Дата : @DATE@ +Браузър : @BROWSER@ +IP адрес : @IPADDRESS@ +Име на хоста : @HOSTNAME@ -- -Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file +Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/bg/resendpwd.txt b/inc/lang/bg/resendpwd.txt index 7b9b9a027..38e2d1fe4 100644 --- a/inc/lang/bg/resendpwd.txt +++ b/inc/lang/bg/resendpwd.txt @@ -1,3 +1,3 @@ ====== Пращане на нова парола ====== -Моля, въведете потребителското си име във формуляра долу, за да поискате нова парола за вашият профил в това Wiki. Връзка за потвърждение ще ви бъде пратена на регистрираният в това Wiki адрес на електронна поща. +Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. По ел. поща ще получите линк, с който да потвърдите. diff --git a/inc/lang/bg/revisions.txt b/inc/lang/bg/revisions.txt index 295f5f6cc..0e14662b7 100644 --- a/inc/lang/bg/revisions.txt +++ b/inc/lang/bg/revisions.txt @@ -1,4 +1,4 @@ -====== Стари редакции ====== +====== Стари версии====== -Това са стари редакции на този документ. За да възстановите стара версия, изберете я долу, натиснете ''Редактиране'' и я запазете. +Това са старите версии на документа. За да възстановите стара версия, изберете я долу, натиснете ''Редактиране'' и я запазете. diff --git a/inc/lang/bg/searchpage.txt b/inc/lang/bg/searchpage.txt index 03e019985..48d47515a 100644 --- a/inc/lang/bg/searchpage.txt +++ b/inc/lang/bg/searchpage.txt @@ -1,5 +1,5 @@ ====== Търсене ====== -Може да намерите резултатите на търсенето долу. Ако не сте намерили каквото сте търсили, може да създадете или редактирате страница кръстена по вашета заявка за търсене със съответният бутон +Резултата от търсенето ще намерите по-долу. Ако не намирате каквото сте търсили, може да създадете или редактирате страница, кръстена на вашата заявка, чрез съответния бутон. ===== Резултати ===== diff --git a/inc/lang/bg/showrev.txt b/inc/lang/bg/showrev.txt index c0b1709fe..a3848f8bb 100644 --- a/inc/lang/bg/showrev.txt +++ b/inc/lang/bg/showrev.txt @@ -1,2 +1,2 @@ -**Това е стара редакция на документа** +**Това е стара версия на документа!** ---- diff --git a/inc/lang/bg/stopwords.txt b/inc/lang/bg/stopwords.txt index 369f4d789..03fd13758 100644 --- a/inc/lang/bg/stopwords.txt +++ b/inc/lang/bg/stopwords.txt @@ -1,7 +1,7 @@ -# Това е списък на думи за игнориране, с една дума на ред +# Това е списък с думи за игнориране при индексиране, с една дума на ред # Когато редактирате този файл, не забравяйте да използвате UNIX символ за нов ред -# Не е нужно да включвате думи по-кратки от 3 символа - те са игнорирани така или иначе -# Този списък се основава на думи намерени на http://www.ranks.nl/stopwords/ +# Не е нужно да включвате думи по-кратки от 3 символа - те биват игнорирани така или иначе +# Списъкът се основава на думи от http://www.ranks.nl/stopwords/ about are and diff --git a/inc/lang/bg/subscr_digest.txt b/inc/lang/bg/subscr_digest.txt new file mode 100644 index 000000000..f0533daf4 --- /dev/null +++ b/inc/lang/bg/subscr_digest.txt @@ -0,0 +1,18 @@ +Здравейте! + +Страницата @PAGE@ в @TITLE@ wiki е променена. +Промените са по-долу: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Стара версия: @OLDPAGE@ +Нова версия: @NEWPAGE@ + +Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите +@SUBSCRIBE@ +и да прекратите абонамента за промени по страницата или именното пространство. + +-- +Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/bg/subscr_form.txt b/inc/lang/bg/subscr_form.txt new file mode 100644 index 000000000..e32a5ec26 --- /dev/null +++ b/inc/lang/bg/subscr_form.txt @@ -0,0 +1,3 @@ +====== Диспечер на абонаменти ====== + +Страницата ви позволява да управлявате текущите си абонаменти за страници и именни пространства.
\ No newline at end of file diff --git a/inc/lang/bg/subscr_list.txt b/inc/lang/bg/subscr_list.txt new file mode 100644 index 000000000..e9e65bc39 --- /dev/null +++ b/inc/lang/bg/subscr_list.txt @@ -0,0 +1,15 @@ +Здравейте! + +Променени са страници от именното пространство @PAGE@ от @TITLE@ wiki. +Ето променените страници: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите +@SUBSCRIBE@ +и да прекратите абонамента за промени по страницата или именното пространство. + +-- +Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/bg/subscr_single.txt b/inc/lang/bg/subscr_single.txt new file mode 100644 index 000000000..7b26f8e96 --- /dev/null +++ b/inc/lang/bg/subscr_single.txt @@ -0,0 +1,22 @@ +Здравейте! + +Страницата @PAGE@ в @TITLE@ wiki е променена. +Промените са по-долу: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Дата : @DATE@ +Потребител : @USER@ +Обобщение: @SUMMARY@ +Стара версия: @OLDPAGE@ +Нова версия: @NEWPAGE@ + +Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите +@NEWPAGE@ +и да прекратите абонамента за промени по страницата или именното пространство. + +-- +Писмото е генерирано от DokuWiki на адрес +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/bg/subscribermail.txt b/inc/lang/bg/subscribermail.txt deleted file mode 100644 index 51d4f005a..000000000 --- a/inc/lang/bg/subscribermail.txt +++ /dev/null @@ -1,16 +0,0 @@ -Привет! - -Страницата @PAGE@ в @TITLE@ уиките бе променена. -Ето промените: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -За да се отпишете от тази страница, влезте в уикито на -@DOKUWIKIURL@ тогава отидете на -@NEWPAGE@ -и изберете 'Отписване от промените'. - --- -Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/bg/updateprofile.txt b/inc/lang/bg/updateprofile.txt index 0a6f15297..6113f0d07 100644 --- a/inc/lang/bg/updateprofile.txt +++ b/inc/lang/bg/updateprofile.txt @@ -1,3 +1,3 @@ ====== Обновете профила си ====== -Трябва само да допълните полетата, които искате да промените. Не може да сменяте потребителското си име. +Трябва само да допълните полетата, които искате да промените. Потребителското не може да бъде променяно. diff --git a/inc/lang/bg/uploadmail.txt b/inc/lang/bg/uploadmail.txt index 74f0cdc3e..ebd8d9112 100644 --- a/inc/lang/bg/uploadmail.txt +++ b/inc/lang/bg/uploadmail.txt @@ -1,13 +1,13 @@ -Бе качен файл на вашето DokuWiki. Ето детайлите +Качен е файл на вашето DokuWiki. Ето детайлите -Файл : @MEDIA@ -Дата : @DATE@ -Браузeр : @BROWSER@ -IP-Адрес : @IPADDRESS@ -Име на хост : @HOSTNAME@ -Размер : @SIZE@ -MIME Тип : @MIME@ -Потребител : @USER@ +Файл : @MEDIA@ +Дата : @DATE@ +Браузър : @BROWSER@ +IP адрес : @IPADDRESS@ +Име на хоста : @HOSTNAME@ +Размер : @SIZE@ +MIME тип : @MIME@ +Потребител : @USER@ -- -Tова писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file +Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/ca-valencia/lang.php b/inc/lang/ca-valencia/lang.php index d49c900fa..c6a7dc27e 100644 --- a/inc/lang/ca-valencia/lang.php +++ b/inc/lang/ca-valencia/lang.php @@ -4,7 +4,6 @@ * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Bernat Arlandis i Mañó <berarma@ya.com> - * @author Bernat Arlandis <berarma@ya.com> * @author Bernat Arlandis <berarma@llenguaitecnologia.com> */ $lang['encoding'] = 'utf-8'; @@ -49,6 +48,7 @@ $lang['btn_draft'] = 'Editar borrador'; $lang['btn_recover'] = 'Recuperar borrador'; $lang['btn_draftdel'] = 'Borrar borrador'; $lang['btn_revert'] = 'Recuperar'; +$lang['btn_register'] = 'Registrar-se'; $lang['loggedinas'] = 'Sessió de'; $lang['user'] = 'Nom d\'usuari'; $lang['pass'] = 'Contrasenya'; @@ -58,7 +58,6 @@ $lang['passchk'] = 'una atra volta'; $lang['remember'] = 'Recorda\'m'; $lang['fullname'] = 'Nom complet'; $lang['email'] = 'Correu electrònic'; -$lang['register'] = 'Registrar-se'; $lang['profile'] = 'Perfil d\'usuari'; $lang['badlogin'] = 'Disculpe, pero el nom d\'usuari o la contrasenya són incorrectes.'; $lang['minoredit'] = 'Canvis menors'; diff --git a/inc/lang/ca-valencia/subscribermail.txt b/inc/lang/ca-valencia/subscribermail.txt deleted file mode 100644 index 43299b598..000000000 --- a/inc/lang/ca-valencia/subscribermail.txt +++ /dev/null @@ -1,23 +0,0 @@ -¡Hola! - -La pàgina @PAGE@ del wiki @TITLE@ ha canviat. -Estos són els canvis: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Data: @DATE@ -Usuari: @USER@ -Resum: @SUMMARY@ -Revisió anterior: @OLDPAGE@ -Nova revisió: @NEWPAGE@ - -Per a cancelar les notificacions de pàgina, inicie sessió en el wiki en -@DOKUWIKIURL@, visite -@NEWPAGE@ -i desubscriga's dels canvis de la pàgina o de l'espai de noms. - --- -Este correu l'ha generat DokuWiki en -@DOKUWIKIURL@ diff --git a/inc/lang/ca/lang.php b/inc/lang/ca/lang.php index 19fb7c556..342257d11 100644 --- a/inc/lang/ca/lang.php +++ b/inc/lang/ca/lang.php @@ -5,8 +5,6 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Carles Bellver <carles.bellver@cent.uji.es> * @author Carles Bellver <carles.bellver@gmail.com> - * @author carles.bellver@gmail.com - * @author carles.bellver@cent.uji.es */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -50,6 +48,7 @@ $lang['btn_draft'] = 'Edita esborrany'; $lang['btn_recover'] = 'Recupera esborrany'; $lang['btn_draftdel'] = 'Suprimeix esborrany'; $lang['btn_revert'] = 'Restaura'; +$lang['btn_register'] = 'Registra\'m'; $lang['loggedinas'] = 'Heu entrat com'; $lang['user'] = 'Nom d\'usuari'; $lang['pass'] = 'Contrasenya'; @@ -59,7 +58,6 @@ $lang['passchk'] = 'una altra vegada'; $lang['remember'] = 'Recorda\'m'; $lang['fullname'] = 'Nom complet'; $lang['email'] = 'Correu electrònic'; -$lang['register'] = 'Registra\'m'; $lang['profile'] = 'Perfil d\'usuari'; $lang['badlogin'] = 'Nom d\'usuari o contrasenya incorrectes.'; $lang['minoredit'] = 'Canvis menors'; diff --git a/inc/lang/ca/subscribermail.txt b/inc/lang/ca/subscribermail.txt deleted file mode 100644 index 5558d2ff5..000000000 --- a/inc/lang/ca/subscribermail.txt +++ /dev/null @@ -1,15 +0,0 @@ -La pàgina @PAGE@ del wiki @TITLE@ ha estat modificada. -Heus ací els canvis: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Per cancel·lar la subscripció a aquesta pàgina, entre al wiki en -@DOKUWIKIURL@, aneu a -@NEWPAGE@ -i trieu 'Cancel·la subscripció'. - --- -Missatge generat per DokuWiki en -@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/cs/lang.php b/inc/lang/cs/lang.php index 33c6db01a..22aa00d7d 100644 --- a/inc/lang/cs/lang.php +++ b/inc/lang/cs/lang.php @@ -5,8 +5,8 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Bohumir Zamecnik <bohumir@zamecnik.org> * @author Tomas Valenta <t.valenta@sh.cvut.cz> + * @author Tomas Valenta <tomas@valenta.cz> * @author Zbynek Krivka <zbynek.krivka@seznam.cz> - * @author tomas@valenta.cz * @author Marek Sacha <sachamar@fel.cvut.cz> * @author Lefty <lefty@multihost.cz> */ @@ -49,6 +49,7 @@ $lang['btn_draft'] = 'Upravit koncept'; $lang['btn_recover'] = 'Obnovit koncept'; $lang['btn_draftdel'] = 'Vymazat koncept'; $lang['btn_revert'] = 'Vrátit zpět'; +$lang['btn_register'] = 'Registrovat'; $lang['loggedinas'] = 'Přihlášen(a) jako'; $lang['user'] = 'Uživatelské jméno'; $lang['pass'] = 'Heslo'; @@ -58,7 +59,6 @@ $lang['passchk'] = 'ještě jednou'; $lang['remember'] = 'Přihlásit se nastálo'; $lang['fullname'] = 'Celé jméno'; $lang['email'] = 'E-mail'; -$lang['register'] = 'Registrovat'; $lang['profile'] = 'Uživatelský profil'; $lang['badlogin'] = 'Zadané uživatelské jméno a heslo není správně.'; $lang['minoredit'] = 'Drobné změny'; @@ -242,7 +242,7 @@ $lang['i_wikiname'] = 'Název wiki'; $lang['i_enableacl'] = 'Zapnout ACL (doporučeno)'; $lang['i_superuser'] = 'Správce'; $lang['i_problems'] = 'Instalátor narazil na níže popsané problémy. Nelze pokračovat v instalaci, dokud je neopravíte.'; -$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 souboru z instalačního balíčku nebo se zkuste poradit s <a href="http://dokuwiki.org/install">instrukcemi pro instalci DokuWiki</a>.'; +$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 souboru z instalačního balíčku nebo se zkuste poradit s <a href="http://dokuwiki.org/install">instrukcemi 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_permfail'] = 'DokuWiki nemůže zapisovat do <code>%s</code>. Budete muset opravit práva k tomuto adresáři.'; @@ -268,7 +268,7 @@ $lang['mu_toobig'] = 'příliš velké'; $lang['mu_ready'] = 'připraveno k načtení'; $lang['mu_done'] = 'hotovo'; $lang['mu_fail'] = 'selhalo'; -$lang['mu_authfail'] = 'vypršla session'; +$lang['mu_authfail'] = 'vypršela session'; $lang['mu_progress'] = '@PCT@% načten'; $lang['mu_filetypes'] = 'Povolené typy souborů'; $lang['mu_info'] = 'soubory načteny.'; diff --git a/inc/lang/cs/subscr_form.txt b/inc/lang/cs/subscr_form.txt index b786ac137..d051b646f 100644 --- a/inc/lang/cs/subscr_form.txt +++ b/inc/lang/cs/subscr_form.txt @@ -1,3 +1,3 @@ ====== Správa odběratelů změn ====== -Tato stránka Vám umožnuje spravovat uživatele přihlášené k odběru změn aktuální stránky nebo jmenného prostoru.
\ No newline at end of file +Tato stránka Vám umožňuje spravovat uživatele přihlášené k odběru změn aktuální stránky nebo jmenného prostoru.
\ No newline at end of file diff --git a/inc/lang/cs/subscribermail.txt b/inc/lang/cs/subscribermail.txt deleted file mode 100644 index 6ef6411d0..000000000 --- a/inc/lang/cs/subscribermail.txt +++ /dev/null @@ -1,23 +0,0 @@ -Dobrý den, - -Stránka @PAGE@ ve wiki @TITLE@ se změnila. -Tady jsou detaily: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Datum: @DATE@ -Uživatel: @USER@ -Souhrn úpravy: @SUMMARY@ -Původní revize: @OLDPAGE@ -Nová revize: @NEWPAGE@ - - -Pro odhlášení z odběru změn pro tuto stránku se přihlašte do wiki -@DOKUWIKIURL@ a vstupte na stránku -@NEWPAGE@, kde stisknete tlačítko "Neodebírat změny mailem". - --- -Tato zpráva byla vygenerována systémem DokuWiki -@DOKUWIKIURL@ diff --git a/inc/lang/da/lang.php b/inc/lang/da/lang.php index 574917082..80d55d6f5 100644 --- a/inc/lang/da/lang.php +++ b/inc/lang/da/lang.php @@ -14,7 +14,7 @@ * @author rasmus@kinnerup.com * @author Michael Pedersen subben@gmail.com */ -$lang['encoding'] = 'ISO 8859-1 '; +$lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; $lang['doublequoteopening'] = '„'; $lang['doublequoteclosing'] = '“'; @@ -53,6 +53,7 @@ $lang['btn_draft'] = 'Redigér kladde'; $lang['btn_recover'] = 'Gendan kladde'; $lang['btn_draftdel'] = 'Slet kladde'; $lang['btn_revert'] = 'Reetablér'; +$lang['btn_register'] = 'Registrér'; $lang['loggedinas'] = 'Logget ind som'; $lang['user'] = 'Brugernavn'; $lang['pass'] = 'Adgangskode'; @@ -62,7 +63,6 @@ $lang['passchk'] = 'Gentag ny adgangskode'; $lang['remember'] = 'Automatisk log ind'; $lang['fullname'] = 'Fulde navn'; $lang['email'] = 'E-mail'; -$lang['register'] = 'Registrér'; $lang['profile'] = 'Brugerprofil'; $lang['badlogin'] = 'Brugernavn eller adgangskode var forkert.'; $lang['minoredit'] = 'Mindre ændringer'; @@ -108,6 +108,7 @@ $lang['js']['mediatitle'] = 'Link indstillinger'; $lang['js']['mediadisplay'] = 'Link type'; $lang['js']['mediaalign'] = 'Juster'; $lang['js']['mediasize'] = 'Billede størrelse'; +$lang['js']['mediatarget'] = 'Link mål'; $lang['js']['mediaclose'] = 'Luk'; $lang['js']['mediainsert'] = 'Indsæt'; $lang['js']['mediadisplayimg'] = 'Vis billedet'; @@ -116,6 +117,7 @@ $lang['js']['mediasmall'] = 'Lille version'; $lang['js']['mediamedium'] = 'Medium version'; $lang['js']['medialarge'] = 'Stor version'; $lang['js']['mediaoriginal'] = 'Original version'; +$lang['js']['medialnk'] = 'Link til detajle side'; $lang['js']['mediadirect'] = 'Direkte link til originalen'; $lang['js']['medianolnk'] = 'Intet link'; $lang['js']['medianolink'] = 'Link ikke billedet'; @@ -146,6 +148,7 @@ $lang['deletefail'] = '"%s" kunne ikke slettes - check rettighederne. $lang['mediainuse'] = 'Filen "%s" er ikke slettet - den er stadig i brug.'; $lang['namespaces'] = 'Navnerum'; $lang['mediafiles'] = 'Tilgængelige filer i'; +$lang['accessdenied'] = 'Du har ikke tilladelse til at se denne side'; $lang['mediausage'] = 'Brug den følgende syntaks til at henvise til denne fil:'; $lang['mediaview'] = 'Vis oprindelig fil'; $lang['mediaroot'] = 'rod'; @@ -161,6 +164,7 @@ $lang['current'] = 'nuværende'; $lang['yours'] = 'Din version'; $lang['diff'] = 'Vis forskelle i forhold til den nuværende udgave'; $lang['diff2'] = 'Vis forskelle i forhold til de valgte revisioner'; +$lang['difflink'] = 'Link til denne sammenlinings vising'; $lang['line'] = 'Linje'; $lang['breadcrumb'] = 'Sti'; $lang['youarehere'] = 'Du er her'; @@ -220,8 +224,16 @@ $lang['img_camera'] = 'Kamera'; $lang['img_keywords'] = 'Emneord'; $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'; $lang['subscr_unsubscribe_success'] = 'Fjernede %s fra abonnement listen for %s'; $lang['subscr_unsubscribe_error'] = 'Fejl ved fjernelse af %s fra abonnement listen for %s'; +$lang['subscr_already_subscribed'] = '%s har allerede et abonnement for listen %s'; +$lang['subscr_not_subscribed'] = '%s har ikke et abonnement for listen %s'; +$lang['subscr_m_not_subscribed'] = 'Du har ikke et abonnement til denne side eller navnerum'; +$lang['subscr_m_new_header'] = 'Tilføj abonnement'; +$lang['subscr_m_current_header'] = 'Nuværende abonnementer'; +$lang['subscr_m_unsubscribe'] = 'Fjern abonnement'; +$lang['subscr_m_subscribe'] = 'Abonér'; $lang['subscr_m_receive'] = 'Modtag'; $lang['subscr_style_every'] = 'email på hver ændring'; $lang['subscr_style_list'] = 'list af ændrede sider siden sidste email (hver %.2f dage)'; diff --git a/inc/lang/da/subscr_single.txt b/inc/lang/da/subscr_single.txt new file mode 100644 index 000000000..64b14588c --- /dev/null +++ b/inc/lang/da/subscr_single.txt @@ -0,0 +1,23 @@ +Hej! + +Siden @PAGE@ i wikien @TITLE@ er blevet ændret. +Her er ændringerne: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Dato : @DATE@ +Bruger : @USER@ +Summering: @SUMMARY@ +Gammel Revision: @OLDPAGE@ +Ny Revision: @NEWPAGE@ + +For at slå side notifikationer fra, skal du logge ind på +@DOKUWIKIURL@ og besøge +@NEWPAGE@ +og slå abonnoment for side / navnerum ændringer fra. + +-- +Denne email blev generet af DokuWiki på +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/da/subscribermail.txt b/inc/lang/da/subscribermail.txt deleted file mode 100644 index e89dd3c46..000000000 --- a/inc/lang/da/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Hej! - -Siden @PAGE@ i @TITLE@ wikien er blevet ændret. -Her er detaljerne: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -For at afmelde abonnement på denne side log ind på wikien på -@DOKUWIKIURL@ , besøg -@NEWPAGE@ -og vælg 'Fjern abonnement på ændringer'. - --- -Denne e-mail blev genereret af DokuWiki på -@DOKUWIKIURL@ diff --git a/inc/lang/de-informal/denied.txt b/inc/lang/de-informal/denied.txt index 6d76891b1..0bc0e59a8 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 erforderlichen Rechte, um diese Aktion durchzuführen. Eventuell bist du nicht am Wiki angemeldet? +Du hast nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. Eventuell bist du nicht am Wiki angemeldet? diff --git a/inc/lang/de-informal/draft.txt b/inc/lang/de-informal/draft.txt index 704c6d1da..e56dbe083 100644 --- a/inc/lang/de-informal/draft.txt +++ b/inc/lang/de-informal/draft.txt @@ -2,5 +2,5 @@ Deine letzte Bearbeitungssitzung wurde nicht ordnungsgemäß abgeschlossen. DokuWiki hat während deiner Arbeit automatisch einen Zwischenentwurf gespeichert, den du jetzt nutzen kannst, um deine Arbeit fortzusetzen. Unten siehst du die Daten, die bei deiner letzten Sitzung gespeichert wurden. -Bitte entscheide dich, ob du den Entwurf //wieder herstellen// oder //löschen// willst oder ob du die Bearbeitung abbrechen möchtest. +Bitte entscheide dich, ob du den Entwurf //wiederherstellen// oder //löschen// willst oder ob du die Bearbeitung abbrechen möchtest. diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php index 948a1ee51..d39bf8152 100644 --- a/inc/lang/de-informal/lang.php +++ b/inc/lang/de-informal/lang.php @@ -17,6 +17,7 @@ * @author Juergen Schwarzer <jschwarzer@freenet.de> * @author Marcel Metz <marcel_metz@gmx.de> * @author Matthias Schulte <post@lupo49.de> + * @author Christian Wichmann <nospam@zone0.de> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -49,7 +50,7 @@ $lang['btn_delete'] = 'Löschen'; $lang['btn_back'] = 'Zurück'; $lang['btn_backlink'] = 'Links hierher'; $lang['btn_backtomedia'] = 'Zurück zur Dateiauswahl'; -$lang['btn_subscribe'] = 'Änderungen abonnieren'; +$lang['btn_subscribe'] = 'Aboverwaltung'; $lang['btn_profile'] = 'Benutzerprofil'; $lang['btn_reset'] = 'Zurücksetzen'; $lang['btn_resendpwd'] = 'Sende neues Passwort'; @@ -57,6 +58,7 @@ $lang['btn_draft'] = 'Entwurf bearbeiten'; $lang['btn_recover'] = 'Entwurf wiederherstellen'; $lang['btn_draftdel'] = 'Entwurf löschen'; $lang['btn_revert'] = 'Wiederherstellen'; +$lang['btn_register'] = 'Registrieren'; $lang['loggedinas'] = 'Angemeldet als'; $lang['user'] = 'Benutzername'; $lang['pass'] = 'Passwort'; @@ -66,7 +68,6 @@ $lang['passchk'] = 'und nochmal'; $lang['remember'] = 'Angemeldet bleiben'; $lang['fullname'] = 'Voller Name'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Registrieren'; $lang['profile'] = 'Benutzerprofil'; $lang['badlogin'] = 'Nutzername oder Passwort sind falsch.'; $lang['minoredit'] = 'kleine Änderung'; @@ -87,7 +88,7 @@ $lang['profnoempty'] = 'Es muss ein Name oder eine E-Mail Adresse ange $lang['profchanged'] = 'Benutzerprofil erfolgreich geändert.'; $lang['pwdforget'] = 'Passwort vergessen? Fordere ein neues an'; $lang['resendna'] = 'Passwörter versenden ist in diesem Wiki nicht möglich.'; -$lang['resendpwd'] = 'Neues Passwort schicken für'; +$lang['resendpwd'] = 'Neues Passwort senden für'; $lang['resendpwdmissing'] = 'Es tut mir Leid, aber du musst alle Felder ausfüllen.'; $lang['resendpwdnouser'] = 'Es tut mir Leid, aber der Benutzer existiert nicht in unserer Datenbank.'; $lang['resendpwdbadauth'] = 'Es tut mir Leid, aber dieser Authentifizierungscode ist ungültig. Stelle sicher, dass du den kompletten Bestätigungslink verwendet haben.'; @@ -107,27 +108,27 @@ $lang['js']['notsavedyet'] = 'Nicht gespeicherte Änderungen gehen verloren! $lang['js']['searchmedia'] = 'Suche nach Dateien'; $lang['js']['keepopen'] = 'Fenster nach Auswahl nicht schließen'; $lang['js']['hidedetails'] = 'Details ausblenden'; -$lang['js']['mediatitle'] = 'Link-Eigenschaften'; -$lang['js']['mediadisplay'] = 'Linktyp'; -$lang['js']['mediaalign'] = 'Ausrichtung'; -$lang['js']['mediasize'] = 'Bildgröße'; -$lang['js']['mediatarget'] = 'Linkziel'; -$lang['js']['mediaclose'] = 'Schließen'; -$lang['js']['mediainsert'] = 'Einfügen'; -$lang['js']['mediadisplayimg'] = 'Bild anzeigen.'; -$lang['js']['mediadisplaylnk'] = 'Nur den Link anzeigen.'; -$lang['js']['mediasmall'] = 'Kleine Version'; -$lang['js']['mediamedium'] = 'Mittelgroße Version'; -$lang['js']['medialarge'] = 'Große Version'; -$lang['js']['mediaoriginal'] = 'Original Version'; -$lang['js']['medialnk'] = 'Link zu der Detailseite'; -$lang['js']['mediadirect'] = 'Direkter Link zum Original'; -$lang['js']['medianolnk'] = 'Kein link'; -$lang['js']['medianolink'] = 'Keine Verlinkung des Bildes'; -$lang['js']['medialeft'] = 'Bild nach links ausrichten.'; -$lang['js']['mediaright'] = 'Bild nach rechts ausrichten.'; -$lang['js']['mediacenter'] = 'Bild in der Mitte ausrichten'; -$lang['js']['medianoalign'] = 'Keine Ausrichtung des Bildes.'; +$lang['js']['mediatitle'] = 'Link-Eigenschaften'; +$lang['js']['mediadisplay'] = 'Linktyp'; +$lang['js']['mediaalign'] = 'Ausrichtung'; +$lang['js']['mediasize'] = 'Bildgröße'; +$lang['js']['mediatarget'] = 'Linkziel'; +$lang['js']['mediaclose'] = 'Schließen'; +$lang['js']['mediainsert'] = 'Einfügen'; +$lang['js']['mediadisplayimg'] = 'Bild anzeigen.'; +$lang['js']['mediadisplaylnk'] = 'Nur den Link anzeigen.'; +$lang['js']['mediasmall'] = 'Kleine Version'; +$lang['js']['mediamedium'] = 'Mittelgroße Version'; +$lang['js']['medialarge'] = 'Große Version'; +$lang['js']['mediaoriginal'] = 'Original Version'; +$lang['js']['medialnk'] = 'Link zu der Detailseite'; +$lang['js']['mediadirect'] = 'Direkter Link zum Original'; +$lang['js']['medianolnk'] = 'Kein link'; +$lang['js']['medianolink'] = 'Keine Verlinkung des Bildes'; +$lang['js']['medialeft'] = 'Bild nach links ausrichten.'; +$lang['js']['mediaright'] = 'Bild nach rechts ausrichten.'; +$lang['js']['mediacenter'] = 'Bild in der Mitte ausrichten'; +$lang['js']['medianoalign'] = 'Keine Ausrichtung des Bildes.'; $lang['js']['nosmblinks'] = 'Das Verlinken von Windows-Freigaben funktioniert nur im Microsoft Internet-Explorer.\nDer Link kann jedoch durch Kopieren und Einfügen verwendet werden.'; $lang['js']['linkwiz'] = 'Link-Assistent'; $lang['js']['linkto'] = 'Link zu:'; @@ -148,7 +149,6 @@ $lang['uploadsize'] = 'Die hochgeladene Datei war zu groß. (max. %s) $lang['deletesucc'] = 'Die Datei "%s" wurde gelöscht.'; $lang['deletefail'] = '"%s" konnte nicht gelöscht werden. Keine Berechtigung?.'; $lang['mediainuse'] = 'Die Datei "%s" wurde nicht gelöscht. Sie wird noch verwendet.'; -$lang['mediainuse'] = 'Die Datei "%s" wurde nicht gelöscht. Sie wird noch verwendet.'; $lang['namespaces'] = 'Namensräume'; $lang['mediafiles'] = 'Vorhandene Dateien in'; $lang['accessdenied'] = 'Du hast keinen Zugriff auf diese Seite'; @@ -168,6 +168,9 @@ $lang['yours'] = 'Deine Version'; $lang['diff'] = 'Zeige Unterschiede zu aktueller Version'; $lang['diff2'] = 'Zeige Unterschiede der ausgewählten Versionen'; $lang['difflink'] = 'Link zu der Versionshistorie'; +$lang['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'; @@ -225,22 +228,22 @@ $lang['img_copyr'] = 'Copyright'; $lang['img_format'] = 'Format'; $lang['img_camera'] = 'Kamera'; $lang['img_keywords'] = 'Schlagwörter'; -$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementenliste von %s hinzugefügt'; -$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementenliste von %s'; +$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementenliste von %s hinzugefügt'; +$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementenliste von %s'; $lang['subscr_subscribe_noaddress'] = 'In deinem Account ist keine E-Mail-Adresse hinterlegt. Dadurch kann die Seite nicht abonniert werden'; $lang['subscr_unsubscribe_success'] = 'Die Seite %s wurde von der Abonnementenliste von %s entfernt'; -$lang['subscr_unsubscribe_error'] = 'Fehler beim Entfernen von %s von der Abonnementenliste von %s'; -$lang['subscr_already_subscribed'] = '%s ist bereits auf der Abonnementenliste von %s'; -$lang['subscr_not_subscribed'] = '%s ist nicht auf der Abonnementenliste von %s'; -$lang['subscr_m_not_subscribed'] = 'Du hast kein Abonnement von dieser Seite oder dem Namensraum.'; -$lang['subscr_m_new_header'] = 'Abonnementen hinzufügen'; -$lang['subscr_m_current_header'] = 'Aktive Abonnements'; -$lang['subscr_m_unsubscribe'] = 'Abbestellen'; -$lang['subscr_m_subscribe'] = 'Abonnieren'; -$lang['subscr_m_receive'] = 'Erhalten'; -$lang['subscr_style_every'] = 'E-Mail bei jeder Änderung'; -$lang['subscr_style_digest'] = 'E-Mail mit zusammengefasster Übersicht der Seitenänderungen (alle %.2f Tage)'; -$lang['subscr_style_list'] = 'Auflistung aller geänderten Seiten seit der letzten E-Mail (alle %.2f Tage)'; +$lang['subscr_unsubscribe_error'] = 'Fehler beim Entfernen von %s von der Abonnementenliste von %s'; +$lang['subscr_already_subscribed'] = '%s ist bereits auf der Abonnementenliste von %s'; +$lang['subscr_not_subscribed'] = '%s ist nicht auf der Abonnementenliste von %s'; +$lang['subscr_m_not_subscribed'] = 'Du hast kein Abonnement von dieser Seite oder dem Namensraum.'; +$lang['subscr_m_new_header'] = 'Abonnementen hinzufügen'; +$lang['subscr_m_current_header'] = 'Aktive Abonnements'; +$lang['subscr_m_unsubscribe'] = 'Abbestellen'; +$lang['subscr_m_subscribe'] = 'Abonnieren'; +$lang['subscr_m_receive'] = 'Erhalten'; +$lang['subscr_style_every'] = 'E-Mail bei jeder Änderung'; +$lang['subscr_style_digest'] = 'E-Mail mit zusammengefasster Übersicht der Seitenänderungen (alle %.2f Tage)'; +$lang['subscr_style_list'] = 'Auflistung aller geänderten Seiten seit der letzten E-Mail (alle %.2f Tage)'; $lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wende dich an den Admin.'; $lang['authtempfail'] = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wende dich an den Admin.'; $lang['i_chooselang'] = 'Wähle deine Sprache'; @@ -288,4 +291,4 @@ $lang['days'] = 'vor %d Tagen'; $lang['hours'] = 'vor %d Stunden'; $lang['minutes'] = 'vor %d Minuten'; $lang['seconds'] = 'vor %d Sekunden'; -$lang['wordblock'] = 'Deine Änderungen konnten nicht gespeichert werden, da Teile des Texts blockierte Wörter (Spam) enthalten.'; +$lang['wordblock'] = 'Deine Bearbeitung wurde nicht gespeichert, da sie gesperrten Text enthielt (Spam).'; diff --git a/inc/lang/de-informal/resendpwd.txt b/inc/lang/de-informal/resendpwd.txt index 4dcd4bb4d..a0a714218 100644 --- a/inc/lang/de-informal/resendpwd.txt +++ b/inc/lang/de-informal/resendpwd.txt @@ -1,3 +1,3 @@ ====== Neues Passwort anfordern ====== -Fülle alle Felder unten aus, um ein neues Passwort für deinen Zugang zu erhalten. Das neue Passwort wird an deine gespeicherte E-Mail-Adresse geschickt. Der Benutzername sollte dein Wiki-Benutzername sein. +Fülle alle Felder unten aus, um ein neues Passwort für deinen Zugang zu erhalten. Das neue Passwort wird an deine gespeicherte E-Mail-Adresse geschickt. Der Benutzername muss deinem Wiki-Benutzernamen entsprechen. diff --git a/inc/lang/de-informal/revisions.txt b/inc/lang/de-informal/revisions.txt index e4a7be8f1..b69169a4e 100644 --- a/inc/lang/de-informal/revisions.txt +++ b/inc/lang/de-informal/revisions.txt @@ -1,4 +1,4 @@ ====== Ältere Versionen ====== -Dies sind ältere Versionen des gewählten Dokuments. Um zu einer älteren Version zurückzukehren, wähle die entsprechende Version aus, klicke auf **''[Diese Seite bearbeiten]''** und speichere sie erneut ab. +Dies sind ältere Versionen der gewählten Seite. Um zu einer älteren Version zurückzukehren, wähle die entsprechende Version aus, klicke auf **''[Diese Seite bearbeiten]''** und speichere sie erneut ab. diff --git a/inc/lang/de-informal/subscr_digest.txt b/inc/lang/de-informal/subscr_digest.txt index 9e943626c..f8cab210f 100644 --- a/inc/lang/de-informal/subscr_digest.txt +++ b/inc/lang/de-informal/subscr_digest.txt @@ -1,7 +1,7 @@ Hallo! Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet. -Das sind die nderungen: +Üersicht der Änderungen: -------------------------------------------------------- @DIFF@ @@ -10,10 +10,10 @@ Das sind die nderungen: Alte Revision: @OLDPAGE@ Neue Revision: @NEWPAGE@ -Um das Abonnement fr diese Seite aufzulsen, melde dich im Wiki an +Um das Abonnement für diese Seite aufzulösen, melde dich im Wiki an @DOKUWIKIURL@, besuchen dann @SUBSCRIBE@ -und klicke auf den Link 'nderungen abbestellen'. +und klicke auf den Link 'Aboverwaltung'. -- Diese Mail kommt vom DokuWiki auf diff --git a/inc/lang/de-informal/subscr_single.txt b/inc/lang/de-informal/subscr_single.txt index 3a295be76..3c557bc17 100644 --- a/inc/lang/de-informal/subscr_single.txt +++ b/inc/lang/de-informal/subscr_single.txt @@ -1,22 +1,22 @@ Hallo! Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet. -Das sind die Änderungen: +Übersicht der Änderungen: -------------------------------------------------------- @DIFF@ -------------------------------------------------------- -Datum : @DATE@ -Benutzer : @USER@ -Übersicht: @SUMMARY@ +Datum: @DATE@ +Benutzer: @USER@ +Zusammenfassung: @SUMMARY@ Alte Revision: @OLDPAGE@ Neue Revision: @NEWPAGE@ Um das Abonnement für diese Seite aufzulösen, melde dich im Wiki an -@DOKUWIKIURL@, besuchen dann +@DOKUWIKIURL@, besuche dann @NEWPAGE@ -und klicke auf den Link 'Änderungen abbestellen'. +und klicke auf den Link 'Aboverwaltung'. -- Diese Mail kommt vom DokuWiki auf diff --git a/inc/lang/de-informal/subscribermail.txt b/inc/lang/de-informal/subscribermail.txt deleted file mode 100644 index 952ac911e..000000000 --- a/inc/lang/de-informal/subscribermail.txt +++ /dev/null @@ -1,23 +0,0 @@ -Hallo! - -Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet. -Das sind die Änderungen: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Datum : @DATE@ -Benutzer : @USER@ -Übersicht: @SUMMARY@ -Alte Revision: @OLDPAGE@ -Neue Revision: @NEWPAGE@ - -Um das Abonnement für diese Seite aufzulösen, melde dich im Wiki an -@DOKUWIKIURL@, besuche dann -@NEWPAGE@ -und klicke auf die Taste 'Änderungen abbestellen'. - --- -Diese Mail kommt vom DokuWiki auf -@DOKUWIKIURL@ diff --git a/inc/lang/de/denied.txt b/inc/lang/de/denied.txt index b87965067..8efa81f1b 100644 --- a/inc/lang/de/denied.txt +++ b/inc/lang/de/denied.txt @@ -1,4 +1,4 @@ ====== Zugang verweigert ====== -Sie haben nicht die erforderlichen Rechte, um diese Aktion durchzuführen. Eventuell sind Sie nicht beim Wiki angemeldet? +Sie haben nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. Eventuell sind Sie nicht am Wiki angemeldet? diff --git a/inc/lang/de/draft.txt b/inc/lang/de/draft.txt index 14a5e8495..77a55b165 100644 --- a/inc/lang/de/draft.txt +++ b/inc/lang/de/draft.txt @@ -2,5 +2,5 @@ Ihre letzte Bearbeitungssitzung wurde nicht ordnungsgemäß abgeschlossen. DokuWiki hat während Ihrer Arbeit automatisch einen Zwischenentwurf gespeichert, den Sie jetzt nutzen können, um Ihre Arbeit fortzusetzen. Unten sehen Sie die Daten, die bei Ihrer letzten Sitzung gespeichert wurden. -Bitte entscheiden Sie, ob Sie den Entwurf //wieder herstellen// oder //löschen// wollen oder ob Sie die Bearbeitung abbrechen möchten. +Bitte entscheiden Sie, ob Sie den Entwurf //wiederherstellen// oder //löschen// wollen oder ob Sie die Bearbeitung abbrechen möchten. diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php index dfd9a8eab..f9f250994 100644 --- a/inc/lang/de/lang.php +++ b/inc/lang/de/lang.php @@ -15,8 +15,9 @@ * @author Arne Pelka <mail@arnepelka.de> * @author Dirk Einecke <dirk@dirkeinecke.de> * @author Blitzi94@gmx.de - * @author Robert Bogenschneider <robog@GMX.de> * @author Robert Bogenschneider <robog@gmx.de> + * @author Niels Lange <niels@boldencursief.nl> + * @author Christian Wichmann <nospam@zone0.de> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -49,14 +50,15 @@ $lang['btn_delete'] = 'Löschen'; $lang['btn_back'] = 'Zurück'; $lang['btn_backlink'] = 'Links hierher'; $lang['btn_backtomedia'] = 'Zurück zur Dateiauswahl'; -$lang['btn_subscribe'] = 'Änderungen abonnieren'; +$lang['btn_subscribe'] = 'Aboverwaltung'; $lang['btn_profile'] = 'Benutzerprofil'; $lang['btn_reset'] = 'Zurücksetzen'; $lang['btn_resendpwd'] = 'Sende neues Passwort'; $lang['btn_draft'] = 'Entwurf bearbeiten'; -$lang['btn_recover'] = 'Entwurf wieder herstellen'; +$lang['btn_recover'] = 'Entwurf wiederherstellen'; $lang['btn_draftdel'] = 'Entwurf löschen'; $lang['btn_revert'] = 'Wiederherstellen'; +$lang['btn_register'] = 'Registrieren'; $lang['loggedinas'] = 'Angemeldet als'; $lang['user'] = 'Benutzername'; $lang['pass'] = 'Passwort'; @@ -66,7 +68,6 @@ $lang['passchk'] = 'und nochmal'; $lang['remember'] = 'Angemeldet bleiben'; $lang['fullname'] = 'Voller Name'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Registrieren'; $lang['profile'] = 'Benutzerprofil'; $lang['badlogin'] = 'Nutzername oder Passwort sind falsch.'; $lang['minoredit'] = 'kleine Änderung'; @@ -80,14 +81,14 @@ $lang['regmailfail'] = 'Offenbar ist ein Fehler beim Versenden der Pas $lang['regbadmail'] = 'Die angegebene E-Mail-Adresse scheint ungültig zu sein. Falls dies ein Fehler ist, wenden Sie sich bitte an den Wiki-Admin.'; $lang['regbadpass'] = 'Die beiden eingegeben Passwörter stimmen nicht überein. Bitte versuchen Sie es noch einmal.'; $lang['regpwmail'] = 'Ihr DokuWiki Passwort'; -$lang['reghere'] = 'Sie haben noch keinen Zugang? Hier anmelden'; +$lang['reghere'] = 'Sie haben noch keinen Zugang? Hier registrieren'; $lang['profna'] = 'Änderung des Benutzerprofils in diesem Wiki nicht möglich.'; $lang['profnochange'] = 'Keine Änderungen, nichts zu tun.'; -$lang['profnoempty'] = 'Es muß ein Name und eine E-Mail-Adresse angegeben werden.'; +$lang['profnoempty'] = 'Es muss ein Name und eine E-Mail-Adresse angegeben werden.'; $lang['profchanged'] = 'Benutzerprofil erfolgreich geändert.'; $lang['pwdforget'] = 'Passwort vergessen? Fordere ein neues an'; $lang['resendna'] = 'Passwörter versenden ist in diesem Wiki nicht möglich.'; -$lang['resendpwd'] = 'Neues Passwort schicken für'; +$lang['resendpwd'] = 'Neues Passwort senden für'; $lang['resendpwdmissing'] = 'Es tut mir Leid, aber Sie müssen alle Felder ausfüllen.'; $lang['resendpwdnouser'] = 'Es tut mir Leid, aber der Benutzer existiert nicht in unserer Datenbank.'; $lang['resendpwdbadauth'] = 'Es tut mir Leid, aber dieser Authentifizierungscode ist ungültig. Stellen Sie sicher, dass Sie den kompletten Bestätigungslink verwendet haben.'; @@ -112,13 +113,13 @@ $lang['js']['mediadisplay'] = 'Linktyp'; $lang['js']['mediaalign'] = 'Anordnung'; $lang['js']['mediasize'] = 'Bildgröße'; $lang['js']['mediatarget'] = 'Linkziel'; -$lang['js']['mediaclose'] = 'Schliessen'; +$lang['js']['mediaclose'] = 'Schließen'; $lang['js']['mediainsert'] = 'Einfügen'; $lang['js']['mediadisplayimg'] = 'Bild anzeigen.'; $lang['js']['mediadisplaylnk'] = 'Nur den Link anzeigen.'; $lang['js']['mediasmall'] = 'Kleine Version'; $lang['js']['mediamedium'] = 'Mittlere Version'; -$lang['js']['medialarge'] = 'Grosse Version'; +$lang['js']['medialarge'] = 'Große Version'; $lang['js']['mediaoriginal'] = 'Originalversion'; $lang['js']['medialnk'] = 'Link zur Detailseite'; $lang['js']['mediadirect'] = 'Direktlink zum Original'; @@ -168,6 +169,9 @@ $lang['yours'] = 'Ihre Version'; $lang['diff'] = 'Zeige Unterschiede zu aktueller Version'; $lang['diff2'] = 'Zeige Unterschiede der ausgewählten Versionen'; $lang['difflink'] = 'Link zu dieser Vergleichsansicht'; +$lang['diff_type'] = 'Unterschiede anzeigen:'; +$lang['diff_inline'] = 'Inline'; +$lang['diff_side'] = 'Side by Side'; $lang['line'] = 'Zeile'; $lang['breadcrumb'] = 'Zuletzt angesehen'; $lang['youarehere'] = 'Sie befinden sich hier'; @@ -178,10 +182,10 @@ $lang['created'] = 'angelegt'; $lang['restored'] = 'alte Version wieder hergestellt'; $lang['external_edit'] = 'Externe Bearbeitung'; $lang['summary'] = 'Zusammenfassung'; -$lang['noflash'] = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Ihnalt anzuzeigen.'; +$lang['noflash'] = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Inhalt anzuzeigen.'; $lang['download'] = 'Schnipsel herunterladen'; $lang['mail_newpage'] = 'Neue Seite:'; -$lang['mail_changed'] = 'Seite geaendert:'; +$lang['mail_changed'] = 'Seite geändert:'; $lang['mail_subscribe_list'] = 'Geänderte Seiten im Namensraum:'; $lang['mail_new_user'] = 'Neuer Benutzer:'; $lang['mail_upload'] = 'Datei hochgeladen:'; @@ -238,7 +242,7 @@ $lang['subscr_m_current_header'] = 'Aktuelle Abonnements'; $lang['subscr_m_unsubscribe'] = 'Löschen'; $lang['subscr_m_subscribe'] = 'Abonnieren'; $lang['subscr_m_receive'] = 'Benachrichtigung'; -$lang['subscr_style_every'] = 'Email bei jeder Bearbeitung'; +$lang['subscr_style_every'] = 'E-Mail bei jeder Bearbeitung'; $lang['subscr_style_digest'] = 'Zusammenfassung der Änderungen für jede veränderte Seite (Alle %.2f Tage)'; $lang['subscr_style_list'] = 'Liste der geänderten Seiten (Alle %.2f Tage)'; $lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wenden Sie sich an den Systembetreuer.'; @@ -250,7 +254,7 @@ $lang['i_enableacl'] = 'Zugangskontrolle (ACL) aktivieren (empfohlen)' $lang['i_superuser'] = 'Administrator Benutzername'; $lang['i_problems'] = 'Das Installationsprogramm hat unten aufgeführte Probleme festgestellt, die zunächst behoben werden müssen bevor Sie mit der Installation fortfahren können.'; $lang['i_modified'] = 'Aus Sicherheitsgründen arbeitet dieses Script nur mit einer neuen, unmodifizierten DokuWiki Installation. Sie sollten entweder alle Dateien noch einmal frisch installieren oder die <a href="http://dokuwiki.org/install">Dokuwiki-Installationsanleitung</a> konsultieren.'; -$lang['i_funcna'] = 'Die PHP Funktion <code>%s</code> ist nicht verfügbar. Unter Umständen wurde sie von Ihrem Hoster deaktiviert?'; +$lang['i_funcna'] = 'Die PHP-Funktion <code>%s</code> ist nicht verfügbar. Unter Umständen wurde sie von Ihrem Hoster deaktiviert?'; $lang['i_phpver'] = 'Ihre PHP-Version <code>%s</code> ist niedriger als die benötigte Version <code>%s</code>. Bitte aktualisieren Sie Ihre PHP-Installation.'; $lang['i_permfail'] = '<code>%s</code> ist nicht durch DokuWiki beschreibbar. Sie müssen die Berechtigungen dieses Ordners ändern!'; $lang['i_confexists'] = '<code>%s</code> existiert bereits'; @@ -272,7 +276,7 @@ $lang['mu_gridstat'] = 'Status'; $lang['mu_namespace'] = 'Namensraum'; $lang['mu_browse'] = 'Durchsuchen'; $lang['mu_toobig'] = 'zu groß'; -$lang['mu_ready'] = 'bereit zum hochladen'; +$lang['mu_ready'] = 'bereit zum Hochladen'; $lang['mu_done'] = 'fertig'; $lang['mu_fail'] = 'gescheitert'; $lang['mu_authfail'] = 'Sitzung abgelaufen'; @@ -288,4 +292,4 @@ $lang['days'] = 'vor %d Tagen'; $lang['hours'] = 'vor %d Stunden'; $lang['minutes'] = 'vor %d Minuten'; $lang['seconds'] = 'vor %d Sekunden'; -$lang['wordblock'] = 'Deine Bearbeitung wurde nicht gespeichert, da sie gesperrten Text enthielt (Spam).'; +$lang['wordblock'] = 'Ihre Bearbeitung wurde nicht gespeichert, da sie gesperrten Text enthielt (Spam).'; diff --git a/inc/lang/de/resendpwd.txt b/inc/lang/de/resendpwd.txt index 2ff639369..a63fd5d55 100644 --- a/inc/lang/de/resendpwd.txt +++ b/inc/lang/de/resendpwd.txt @@ -1,3 +1,3 @@ ====== Neues Passwort anfordern ====== -Füllen Sie alle Felder unten aus, um ein neues Passwort für Ihren Zugang zu erhalten. Das neue Passwort wird an Ihre gespeicherte E-Mail-Adresse geschickt. Der Benutzername sollte Ihr Wiki-Benutzername sein. +Füllen Sie alle Felder unten aus, um ein neues Passwort für Ihren Zugang zu erhalten. Das neue Passwort wird an Ihre gespeicherte E-Mail-Adresse geschickt. Der Benutzername muss Ihrem Wiki-Benutzernamen entsprechen. diff --git a/inc/lang/de/revisions.txt b/inc/lang/de/revisions.txt index e1bafdd2d..843c3f9f4 100644 --- a/inc/lang/de/revisions.txt +++ b/inc/lang/de/revisions.txt @@ -1,4 +1,4 @@ ====== Ältere Versionen ====== -Dies sind ältere Versionen des gewählten Dokuments. Um zu einer älteren Version zurückzukehren, wählen Sie die entsprechende Version aus, klicken auf **''[Diese Seite bearbeiten]''** und speichern Sie sie erneut ab. +Dies sind ältere Versionen der gewählten Seite. Um zu einer älteren Version zurückzukehren, wählen Sie die entsprechende Version aus, klicken auf **''[Diese Seite bearbeiten]''** und speichern Sie diese erneut ab. diff --git a/inc/lang/de/subscr_digest.txt b/inc/lang/de/subscr_digest.txt index c8bf770ee..7cc79bba2 100644 --- a/inc/lang/de/subscr_digest.txt +++ b/inc/lang/de/subscr_digest.txt @@ -1,7 +1,7 @@ Hallo! Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet. -Das sind die Änderungen: +Übersicht der Änderungen: -------------------------------------------------------- @DIFF@ @@ -13,7 +13,7 @@ Neue Revision: @NEWPAGE@ Um das Abonnement für diese Seite aufzulösen, melden Sie sich im Wiki an @DOKUWIKIURL@, besuchen dann @SUBSCRIBE@ -und klicken auf den Link 'Änderungen abbestellen'. +und klicken auf den Link 'Aboverwaltung'. -- Diese Mail kommt vom DokuWiki auf diff --git a/inc/lang/de/subscr_single.txt b/inc/lang/de/subscr_single.txt index fb149e927..f3e1cd393 100644 --- a/inc/lang/de/subscr_single.txt +++ b/inc/lang/de/subscr_single.txt @@ -1,22 +1,22 @@ Hallo! Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet. -Das sind die Änderungen: +Übersicht der Änderungen: -------------------------------------------------------- @DIFF@ -------------------------------------------------------- -Datum : @DATE@ -Benutzer : @USER@ -Übersicht: @SUMMARY@ +Datum: @DATE@ +Benutzer: @USER@ +Zusammenfassung: @SUMMARY@ Alte Revision: @OLDPAGE@ Neue Revision: @NEWPAGE@ -Um das Abonnement für diese Seite aufzulösen, melde Sie sich im Wiki an +Um das Abonnement für diese Seite aufzulösen, melden Sie sich im Wiki an @DOKUWIKIURL@, besuchen dann @NEWPAGE@ -und klicken auf die Taste 'Änderungen abbestellen'. +und klicken auf die Taste 'Aboverwaltung'. -- Diese Mail kommt vom DokuWiki auf diff --git a/inc/lang/el/admin.txt b/inc/lang/el/admin.txt index 49e6c657b..729004b05 100644 --- a/inc/lang/el/admin.txt +++ b/inc/lang/el/admin.txt @@ -1,3 +1,3 @@ ====== Διαχείριση ====== -Παρακάτω μπορείτε να βρείτε μια λίστα με τις δυνατότητες διαχείρισης στο DokuWiki +Παρακάτω μπορείτε να βρείτε μια λίστα με τις λειτουργίες διαχείρισης στο DokuWiki diff --git a/inc/lang/el/adminplugins.txt b/inc/lang/el/adminplugins.txt index ea00b959e..ef1a2853b 100644 --- a/inc/lang/el/adminplugins.txt +++ b/inc/lang/el/adminplugins.txt @@ -1 +1 @@ -===== Πρόσθετες συνδεόμενες υπομονάδες =====
\ No newline at end of file +===== Πρόσθετα =====
\ No newline at end of file diff --git a/inc/lang/el/conflict.txt b/inc/lang/el/conflict.txt index 27b80b397..a2065c0f3 100644 --- a/inc/lang/el/conflict.txt +++ b/inc/lang/el/conflict.txt @@ -1,5 +1,8 @@ ====== Υπάρχει μία νεώτερη έκδοση αυτής της σελίδας ====== -Υπάρχει μία νεώτερη έκδοση της σελίδας που τρoποποιήσατε. Αυτό συμβαίνει εάν κάποιος άλλος χρήστης τροποποίησε την ίδια σελίδα ενώ την τροποποιούσατε και εσείς. +Υπάρχει μία νεώτερη έκδοση της σελίδας που τρoποποιήσατε. +Αυτό συμβαίνει εάν κάποιος άλλος χρήστης τροποποίησε την ίδια σελίδα ενώ την επεξεργαζόσασταν και εσείς. -Ελέγξτε προσεκτικά τις διαφορές που παρουσιάζονται παρακάτω και έπειτα αποφασίστε ποια έκδοση θα κρατήσετε. Εάν επιλέξετε ''Αποθήκευση'', η δική σας έκδοση θα αποθηκευτεί. Εάν επιλέξετε ''Ακύρωση'', η νεώτερη έκδοση θα διατηρηθεί ως τρέχουσα. +Ελέγξτε προσεκτικά τις διαφορές που παρουσιάζονται παρακάτω και έπειτα αποφασίστε ποια έκδοση θα κρατήσετε. +Εάν επιλέξετε ''Αποθήκευση'', η δική σας έκδοση θα αποθηκευτεί. +Εάν επιλέξετε ''Ακύρωση'', η νεώτερη έκδοση θα διατηρηθεί ως τρέχουσα. diff --git a/inc/lang/el/denied.txt b/inc/lang/el/denied.txt index 71e9a04b8..36d7ae103 100644 --- a/inc/lang/el/denied.txt +++ b/inc/lang/el/denied.txt @@ -2,4 +2,4 @@ Συγγνώμη, αλλά δεν έχετε επαρκή δικαιώματα για την συγκεκριμένη ενέργεια. -Μήπως παραλείψατε να συνδεθείτε? +Μήπως παραλείψατε να συνδεθείτε; diff --git a/inc/lang/el/draft.txt b/inc/lang/el/draft.txt index 3bb15037f..5ca7b8dfa 100644 --- a/inc/lang/el/draft.txt +++ b/inc/lang/el/draft.txt @@ -1,6 +1,8 @@ ====== Βρέθηκε μία αυτόματα αποθηκευμένη σελίδα ====== -Η τελευταία τροποποίηση αυτής της σελίδας δεν ολοκληρώθηκε επιτυχώς. Η εφαρμογή αποθήκευσε αυτόματα μία εκδοχή της σελίδας την ώρα που την τροποποιούσατε και μπορείτε να την χρησιμοποιήσετε για να συνεχίσετε την εργασία σας. Παρακάτω φαίνεται αυτή η πιο πρόσφατη αυτόματα αποθηκευμένη σελίδα. +Η τελευταία τροποποίηση αυτής της σελίδας δεν ολοκληρώθηκε επιτυχώς. +Η εφαρμογή αποθήκευσε αυτόματα μία εκδοχή της σελίδας την ώρα που την επεξεργαζόσασταν και μπορείτε να την χρησιμοποιήσετε για να συνεχίσετε την εργασία σας. +Παρακάτω φαίνεται αυτή η πιο πρόσφατη αυτόματα αποθηκευμένη σελίδα. Μπορείτε να //επαναφέρετε// αυτή την αυτόματα αποθηκευμένη σελίδα ως τρέχουσα, να την //διαγράψετε// ή να //ακυρώσετε// τη διαδικασία τροποποίησης της τρέχουσας σελίδας. diff --git a/inc/lang/el/edit.txt b/inc/lang/el/edit.txt index 26b52f97a..8d9559fcc 100644 --- a/inc/lang/el/edit.txt +++ b/inc/lang/el/edit.txt @@ -1 +1,3 @@ -Τροποποιήστε την σελίδα **μόνο** εάν μπορείτε να την **βελτιώσετε**. Για να κάνετε δοκιμές με ασφάλεια ή να εξοικειωθείτε με το περιβάλλον χρησιμοποιήστε το [[:playground:playground|playground]]. Αφού τροποποιήστε την σελίδα επιλέξτε ''Αποθήκευση''. Δείτε τις [[:wiki:syntax|οδηγίες]] για την σωστή σύνταξη. +Τροποποιήστε την σελίδα **μόνο** εάν μπορείτε να την **βελτιώσετε**. +Για να κάνετε δοκιμές με ασφάλεια ή να εξοικειωθείτε με το περιβάλλον χρησιμοποιήστε το [[:playground:playground|playground]]. +Αφού τροποποιήστε την σελίδα επιλέξτε ''Αποθήκευση''. Δείτε τις [[:wiki:syntax|οδηγίες]] για την σωστή σύνταξη. diff --git a/inc/lang/el/index.txt b/inc/lang/el/index.txt index 51f1fc600..e2da3a85e 100644 --- a/inc/lang/el/index.txt +++ b/inc/lang/el/index.txt @@ -1,3 +1,3 @@ ====== Κατάλογος ====== -Αυτός είναι ένας κατάλογος όλων των διαθέσιμων σελίδων ταξινομημένων κατά [[doku>namespaces|φακέλους]]. +Εδώ βλέπετε τον κατάλογο όλων των διαθέσιμων σελίδων, ταξινομημένες κατά [[doku>namespaces|φακέλους]]. diff --git a/inc/lang/el/install.html b/inc/lang/el/install.html index 89429d55b..9487de7c7 100644 --- a/inc/lang/el/install.html +++ b/inc/lang/el/install.html @@ -1,25 +1,26 @@ <p>Αυτή η σελίδα περιέχει πληροφορίες που βοηθούν στην αρχική εγκατάσταση και -ρύθμιση της εφαρμογής <a href="http://dokuwiki.org">Dokuwiki</a>. Περισσότερες -πληροφορίες υπάρχουν στη <a href="http://dokuwiki.org/installer">σελίδα τεκμηρίωσης</a> -του οδηγού εγκατάστασης.</p> +ρύθμιση της εφαρμογής <a href="http://www.dokuwiki.org/el:dokuwiki">Dokuwiki</a>. +Περισσότερες πληροφορίες υπάρχουν στη <a href="http://www.dokuwiki.org/el:installer"> +σελίδα τεκμηρίωσης</a> του οδηγού εγκατάστασης.</p> -<p>Η εφαρμογή DokuWiki χρησιμοποιεί απλά αρχεία για να αποθηκεύει τις σελίδες wiki -καθώς και πληροφορίες που σχετίζονται με αυτές (π.χ. εικόνες, καταλόγους αναζήτησης, -παλαιότερες εκδόσεις σελίδων, κλπ). Για να λειτουργεί σωστά η εφαρμογή DokuWiki -<strong>πρέπει</strong> να έχει δικαιώματα εγγραφής στους φακέλους που φιλοξενούν -αυτά τα αρχεία. Ο οδηγός εγκατάστασης δεν έχει την δυνατότητα να παραχωρήσει αυτά τα -δικαιώματα εγγραφής στους σχετικούς φακέλους. Ο κανονικός τρόπος για να γίνει αυτό είναι -είτε απευθείας σε περιβάλλον γραμμής εντολών ή, εάν δεν έχετε τέτοια πρόσβαση, μέσω FTP ή -του πίνακα ελέγχου του περιβάλλοντος φιλοξενίας (π.χ. cPanel).</p> +<p>Η εφαρμογή DokuWiki χρησιμοποιεί απλά αρχεία για να αποθηκεύει τις σελίδες +wiki καθώς και πληροφορίες που σχετίζονται με αυτές (π.χ. εικόνες, καταλόγους +αναζήτησης, παλαιότερες εκδόσεις σελίδων, κλπ). Για να λειτουργεί σωστά η εφαρμογή +DokuWiki <strong>πρέπει</strong> να έχει δικαιώματα εγγραφής στους φακέλους που +φιλοξενούν αυτά τα αρχεία. Ο οδηγός εγκατάστασης δεν έχει την δυνατότητα να +παραχωρήσει αυτά τα δικαιώματα εγγραφής στους σχετικούς φακέλους. Ο κανονικός +τρόπος για να γίνει αυτό είναι είτε απευθείας σε περιβάλλον γραμμής εντολών ή, +εάν δεν έχετε τέτοια πρόσβαση, μέσω FTP ή του πίνακα ελέγχου του περιβάλλοντος +φιλοξενίας (π.χ. cPanel).</p> <p>Ο οδηγός εγκατάστασης θα ρυθμίσει την εφαρμογή DokuWiki ώστε να χρησιμοποιεί -<acronym title="access control list">ACL</acronym>, με τρόπο ώστε ο διαχειριστής να -έχει δυνατότητα εισόδου και πρόσβαση στο μενού διαχείρισης της εφαρμογής για εγκατάσταση -επεκτάσεων, διαχείριση χρηστών, διαχείριση δικαιωμάτων πρόσβασης στις διάφορες σελίδες και -αλλαγή των ρυθμίσεων. Αυτό δεν είναι απαραίτητο για να λειτουργήσει η εφαρμογή, αλλά -κάνει την διαχείρισή της ευκολότερη.</p> +<acronym title="access control list">ACL</acronym>, με τρόπο ώστε ο διαχειριστής +να έχει δυνατότητα εισόδου και πρόσβαση στο μενού διαχείρισης της εφαρμογής για +εγκατάσταση επεκτάσεων, διαχείριση χρηστών, διαχείριση δικαιωμάτων πρόσβασης στις +διάφορες σελίδες και αλλαγή των ρυθμίσεων. Αυτό δεν είναι απαραίτητο για να +λειτουργήσει η εφαρμογή, αλλά κάνει την διαχείρισή της ευκολότερη.</p> <p>Οι έμπειροι χρήστες και οι χρήστες με ειδικές απαιτήσεις μπορούν να επισκεφθούν -τις σελίδες που περιέχουν λεπτομερείς -<a href="http://dokuwiki.org/install">οδηγίες εγκατάστασης</a> -και <a href="http://dokuwiki.org/config">πληροφορίες για τις ρυθμίσεις</a>.</p> +τις σελίδες που περιέχουν λεπτομερείς <a href="http://dokuwiki.org/install"> +οδηγίες εγκατάστασης</a> και <a href="http://dokuwiki.org/config">πληροφορίες +για τις ρυθμίσεις</a>.</p>
\ No newline at end of file diff --git a/inc/lang/el/lang.php b/inc/lang/el/lang.php index 83a869df0..11c64285e 100644 --- a/inc/lang/el/lang.php +++ b/inc/lang/el/lang.php @@ -15,7 +15,7 @@ $lang['doublequoteclosing'] = '”'; $lang['singlequoteopening'] = '‘'; $lang['singlequoteclosing'] = '’'; $lang['apostrophe'] = '’'; -$lang['btn_edit'] = 'Τροποποίηση σελίδας'; +$lang['btn_edit'] = 'Επεξεργασία σελίδας'; $lang['btn_source'] = 'Προβολή κώδικα σελίδας'; $lang['btn_show'] = 'Προβολή σελίδας'; $lang['btn_create'] = 'Δημιουργία σελίδας'; @@ -23,30 +23,31 @@ $lang['btn_search'] = 'Αναζήτηση'; $lang['btn_save'] = 'Αποθήκευση'; $lang['btn_preview'] = 'Προεπισκόπηση'; $lang['btn_top'] = 'Επιστροφή στην κορυφή της σελίδας'; -$lang['btn_newer'] = '<< πλέον πρόσφατες'; -$lang['btn_older'] = 'λιγότερο πρόσφατες >>'; +$lang['btn_newer'] = '<< πρόσφατες'; +$lang['btn_older'] = 'παλαιότερες >>'; $lang['btn_revs'] = 'Παλαιότερες εκδόσεις σελίδας'; -$lang['btn_recent'] = 'Πρόσφατες αλλαγές σελίδων'; +$lang['btn_recent'] = 'Πρόσφατες αλλαγές'; $lang['btn_upload'] = 'Φόρτωση'; $lang['btn_cancel'] = 'Ακύρωση'; $lang['btn_index'] = 'Κατάλογος'; -$lang['btn_secedit'] = 'Τροποποίηση'; -$lang['btn_login'] = 'Είσοδος χρήστη'; -$lang['btn_logout'] = 'Έξοδος χρήστη'; +$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_backlink'] = 'Σύνδεσμοι προς αυτή τη σελίδα'; $lang['btn_backtomedia'] = 'Επιστροφή στην επιλογή αρχείων'; $lang['btn_subscribe'] = 'Εγγραφή σε λήψη ενημερώσεων σελίδας'; -$lang['btn_profile'] = 'Τροποποίηση προφίλ'; +$lang['btn_profile'] = 'Επεξεργασία προφίλ'; $lang['btn_reset'] = 'Ακύρωση'; $lang['btn_resendpwd'] = 'Αποστολή νέου κωδικού'; -$lang['btn_draft'] = 'Τροποποίηση αυτόματα αποθηκευμένης σελίδας'; +$lang['btn_draft'] = 'Επεξεργασία αυτόματα αποθηκευμένης σελίδας'; $lang['btn_recover'] = 'Επαναφορά αυτόματα αποθηκευμένης σελίδας'; $lang['btn_draftdel'] = 'Διαγραφή αυτόματα αποθηκευμένης σελίδας'; $lang['btn_revert'] = 'Αποκατάσταση'; +$lang['btn_register'] = 'Εγγραφή'; $lang['loggedinas'] = 'Συνδεδεμένος ως'; $lang['user'] = 'Όνομα χρήστη'; $lang['pass'] = 'Κωδικός'; @@ -55,8 +56,7 @@ $lang['oldpass'] = 'Επιβεβαίωση τρέχοντος κω $lang['passchk'] = 'ακόμη μια φορά'; $lang['remember'] = 'Απομνημόνευση στοιχείων λογαριασμού'; $lang['fullname'] = 'Ονοματεπώνυμο'; -$lang['email'] = 'E-Mail'; -$lang['register'] = 'Εγγραφή'; +$lang['email'] = 'e-mail'; $lang['profile'] = 'Προφίλ χρήστη'; $lang['badlogin'] = 'Συγνώμη, το όνομα χρήστη ή ο κωδικός ήταν λανθασμένο.'; $lang['minoredit'] = 'Ασήμαντες αλλαγές'; @@ -67,15 +67,15 @@ $lang['reguexists'] = 'Αυτός ο λογαριασμός υπάρ $lang['regsuccess'] = 'Ο λογαριασμός δημιουργήθηκε και ο κωδικός εστάλει με e-mail.'; $lang['regsuccess2'] = 'Ο λογαριασμός δημιουργήθηκε.'; $lang['regmailfail'] = 'Φαίνεται να υπάρχει πρόβλημα με την αποστολή του κωδικού μέσω e-mail. Παρακαλούμε επικοινωνήστε μαζί μας!'; -$lang['regbadmail'] = 'Η διεύθυνση e-mail δεν δείχνει έγκυρη - εάν πιστεύετε ότι αυτό είναι λάθος, επικοινωνήστε μαζί μας'; +$lang['regbadmail'] = 'Η διεύθυνση e-mail δεν είναι έγκυρη - εάν πιστεύετε ότι αυτό είναι λάθος, επικοινωνήστε μαζί μας'; $lang['regbadpass'] = 'Οι δύο κωδικοί δεν είναι ίδιοι, προσπαθήστε ξανά.'; $lang['regpwmail'] = 'Ο κωδικός σας'; $lang['reghere'] = 'Δεν έχετε λογαριασμό ακόμη? Δημιουργήστε έναν'; -$lang['profna'] = 'Αυτό το wiki δεν υποστηρίζει την τροποποίηση προφίλ.'; +$lang['profna'] = 'Αυτό το wiki δεν υποστηρίζει την επεξεργασία προφίλ.'; $lang['profnochange'] = 'Καμία αλλαγή.'; $lang['profnoempty'] = 'Δεν επιτρέπεται κενό όνομα χρήστη η κενή διεύθυνση email.'; $lang['profchanged'] = 'Το προφίλ χρήστη τροποποιήθηκε επιτυχώς.'; -$lang['pwdforget'] = 'Ξεχάσατε το κωδικό σας? Αποκτήστε νέο.'; +$lang['pwdforget'] = 'Ξεχάσατε το κωδικό σας; Αποκτήστε νέο.'; $lang['resendna'] = 'Αυτό το wiki δεν υποστηρίζει την εκ\' νέου αποστολή κωδικών.'; $lang['resendpwd'] = 'Αποστολή νέων κωδικών για τον χρήστη'; $lang['resendpwdmissing'] = 'Πρέπει να συμπληρώσετε όλα τα πεδία.'; @@ -83,7 +83,7 @@ $lang['resendpwdnouser'] = 'Αυτός ο χρήστης δεν υπάρχ $lang['resendpwdbadauth'] = 'Αυτός ο κωδικός ενεργοποίησης δεν είναι έγκυρος.'; $lang['resendpwdconfirm'] = 'Ο σύνδεσμος προς την σελίδα ενεργοποίησης εστάλει με e-mail.'; $lang['resendpwdsuccess'] = 'Ο νέος σας κωδικός εστάλη με e-mail.'; -$lang['license'] = 'Εκτός εάν αναφέρεται διαφορετικά, το υλικό αυτού του wiki διατίθεται κάτω από την ακόλουθη άδεια:'; +$lang['license'] = 'Εκτός εάν αναφέρεται διαφορετικά, το περιεχόμενο σε αυτο το wiki διέπεται από την ακόλουθη άδεια:'; $lang['licenseok'] = 'Σημείωση: Τροποποιώντας αυτή την σελίδα αποδέχεστε την διάθεση του υλικού σας σύμφωνα με την ακόλουθη άδεια:'; $lang['searchmedia'] = 'Αναζήτηση αρχείου:'; $lang['searchmedia_in'] = 'Αναζήτηση σε %s'; @@ -92,9 +92,9 @@ $lang['txt_filename'] = 'Επιλέξτε νέο όνομα αρχεί $lang['txt_overwrt'] = 'Αντικατάσταση υπάρχοντος αρχείου'; $lang['lockedby'] = 'Προσωρινά κλειδωμένο από'; $lang['lockexpire'] = 'Το κλείδωμα λήγει στις'; -$lang['willexpire'] = 'Το κλείδωμά σας για την επεξεργασία αυτής της σελίδας θα λήξει σε ένα λεπτό.\n Για να το ανανεώσετε χρησιμοποιήστε την επιλογή Προεπισκόπηση.'; +$lang['willexpire'] = 'Το κλείδωμά σας για την επεξεργασία αυτής της σελίδας θα λήξει σε ένα λεπτό.\n Για να το ανανεώσετε χρησιμοποιήστε την Προεπισκόπηση.'; $lang['js']['notsavedyet'] = 'Οι μη αποθηκευμένες αλλαγές θα χαθούν. -Θέλετε να συνεχίσετε?'; +Θέλετε να συνεχίσετε;'; $lang['js']['searchmedia'] = 'Αναζήτηση για αρχεία'; $lang['js']['keepopen'] = 'Το παράθυρο να μην κλείνει'; $lang['js']['hidedetails'] = 'Απόκρυψη λεπτομερειών'; @@ -107,25 +107,25 @@ $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']['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']['medialeft'] = 'Αριστερή στοίχιση εικόνας.'; +$lang['js']['mediaright'] = 'Δεξιά στοίχιση εικόνας.'; +$lang['js']['mediacenter'] = 'Κέντρική στοίχιση εικόνας.'; +$lang['js']['medianoalign'] = 'Χωρίς στοίχηση.'; $lang['js']['nosmblinks'] = 'Οι σύνδεσμοι προς Windows shares δουλεύουν μόνο στον Microsoft Internet Explorer. Μπορείτε πάντα να κάνετε αντιγραφή και επικόλληση του συνδέσμου.'; $lang['js']['linkwiz'] = 'Αυτόματος Οδηγός Συνδέσμων'; $lang['js']['linkto'] = 'Σύνδεση σε:'; -$lang['js']['del_confirm'] = 'Να διαγραφεί?'; +$lang['js']['del_confirm'] = 'Να διαγραφεί;'; $lang['js']['mu_btn'] = 'Ταυτόχρονη φόρτωση πολλαπλών φακέλων'; -$lang['rssfailed'] = 'Εμφανίστηκε κάποιο σφάλμα κατά την ανάγνωση αυτού του feed: '; +$lang['rssfailed'] = 'Παρουσιάστηκε κάποιο σφάλμα κατά την ανάγνωση αυτού του feed: '; $lang['nothingfound'] = 'Δεν βρέθηκαν σχετικά αποτελέσματα.'; $lang['mediaselect'] = 'Επιλογή Αρχείων'; $lang['fileupload'] = 'Φόρτωση αρχείου'; @@ -156,9 +156,12 @@ $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['line'] = 'Γραμμή'; $lang['breadcrumb'] = 'Ιστορικό'; $lang['youarehere'] = 'Είστε εδώ'; @@ -218,12 +221,12 @@ $lang['img_camera'] = 'Camera'; $lang['img_keywords'] = 'Λέξεις-κλειδιά'; $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'; -$lang['subscr_m_not_subscribed'] = 'Αυτήν την στιγμή, δεν είσαστε γραμμένος/η στην λίστα ειδοποίησης της τρέχουσας σελίδας ή φακέλου.'; +$lang['subscr_m_not_subscribed'] = 'Αυτήν την στιγμή, δεν είσαστε εγεγγραμμένος/η στην λίστα ειδοποίησης της τρέχουσας σελίδας ή φακέλου.'; $lang['subscr_m_new_header'] = 'Προσθήκη στην λίστα ειδοποίησης'; $lang['subscr_m_current_header'] = 'Τρέχουσες εγγραφές ειδοποιήσεων'; $lang['subscr_m_unsubscribe'] = 'Διαγραφή'; @@ -231,17 +234,17 @@ $lang['subscr_m_subscribe'] = 'Εγγραφή'; $lang['subscr_m_receive'] = 'Λήψη'; $lang['subscr_style_every'] = 'email σε κάθε αλλαγή'; $lang['subscr_style_digest'] = 'συνοπτικό email αλλαγών της σελίδας (κάθε %.2f μέρες)'; -$lang['subscr_style_list'] = 'λίστα αλλαγμένων σελίδων μετά από το τελευταίο email (κάθε %.2f μέρες)'; +$lang['subscr_style_list'] = 'λίστα σελίδων με αλλαγές μετά από το τελευταίο email (κάθε %.2f μέρες)'; $lang['authmodfailed'] = 'Κακή ρύθμιση λίστας χρηστών. Παρακαλούμε ενημερώστε τον διαχειριστή του wiki.'; -$lang['authtempfail'] = 'Η είσοδος χρηστών δεν λειτουργεί αυτή την στιγμή. Εάν αυτό διαρκεί για πολύ χρόνο, παρακαλούμε ενημερώστε τον διαχειριστή του wiki.'; +$lang['authtempfail'] = 'Η συνδεση χρηστών είναι απενεργοποιημένη αυτή την στιγμή. Αν αυτό διαρκέσει για πολύ, παρακαλούμε ενημερώστε τον διαχειριστή του wiki.'; $lang['i_chooselang'] = 'Επιλογή γλώσσας'; $lang['i_installer'] = 'Οδηγός εγκατάστασης DokuWiki'; $lang['i_wikiname'] = 'Ονομασία wiki'; -$lang['i_enableacl'] = 'Ενεργοποίηση Λίστας Δικαιωμάτων Πρόσβασης - ACL (συνιστάται)'; +$lang['i_enableacl'] = 'Ενεργοποίηση Λίστας Δικαιωμάτων Πρόσβασης - ACL (συνίσταται)'; $lang['i_superuser'] = 'Διαχειριστής'; $lang['i_problems'] = 'Ο οδηγός εγκατάστασης συνάντησε τα προβλήματα που αναφέρονται παρακάτω. Η εγκατάσταση δεν θα ολοκληρωθεί επιτυχώς μέχρι να επιλυθούν αυτά τα προβλήματα.'; $lang['i_modified'] = 'Για λόγους ασφαλείας, ο οδηγός εγκατάστασης λειτουργεί μόνο με νέες και μη τροποποιημένες εγκαταστάσεις Dokuwiki. -Πρέπει είτε να κάνετε νέα εγκατάσταση, χρησιμοποιώντας το αρχικό πακέτο εγκατάστασης, ή να συμβουλευτείτε τις <a href="http://dokuwiki.org/install">οδηγίες εγκατάστασης της εφαρμογής</a>.'; +Πρέπει είτε να κάνετε νέα εγκατάσταση, χρησιμοποιώντας το αρχικό πακέτο εγκατάστασης, ή να συμβουλευτείτε τις <a href="http://dokuwiki.org/el:install">οδηγίες εγκατάστασης της εφαρμογής</a>.'; $lang['i_funcna'] = 'Η λειτουργία <code>%s</code> της PHP δεν είναι διαθέσιμη. Πιθανόν να είναι απενεργοποιημένη στις ρυθμίσεις έναρξης της PHP'; $lang['i_phpver'] = 'Η έκδοση <code>%s</code> της PHP που έχετε είναι παλαιότερη της απαιτούμενης <code>%s</code>. Πρέπει να αναβαθμίσετε την PHP.'; $lang['i_permfail'] = 'Ο φάκελος <code>%s</code> δεν είναι εγγράψιμος από την εφαρμογή DokuWiki. Πρέπει να διορθώσετε τα δικαιώματα πρόσβασης αυτού του φακέλου!'; @@ -268,16 +271,16 @@ $lang['mu_ready'] = 'έτοιμο για φόρτωση'; $lang['mu_done'] = 'ολοκληρώθηκε'; $lang['mu_fail'] = 'απέτυχε'; $lang['mu_authfail'] = 'η συνεδρία έληξε'; -$lang['mu_progress'] = '@PCT@% φορτώθηκε'; +$lang['mu_progress'] = 'φορτώθηκε @PCT@%'; $lang['mu_filetypes'] = 'Επιτρεπτοί τύποι αρχείων'; $lang['mu_info'] = 'τα αρχεία ανέβηκαν.'; $lang['mu_lasterr'] = 'Τελευταίο σφάλμα:'; $lang['recent_global'] = 'Βλέπετε τις αλλαγές εντός του φακέλου <b>%s</b>. Μπορείτε επίσης να <a href="%s">δείτε τις πρόσφατες αλλαγές σε όλο το 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'] = 'Η αλλαγή σας δεν αποθηκεύτηκε γιατί περιείχε μπλοκαρισμένο κείμενο (spam).'; +$lang['years'] = 'πριν %d χρόνια'; +$lang['months'] = 'πριν %d μήνες'; +$lang['weeks'] = 'πριν %d εβδομάδες'; +$lang['days'] = 'πριν %d ημέρες'; +$lang['hours'] = 'πριν %d ώρες'; +$lang['minutes'] = 'πριν %d λεπτά'; +$lang['seconds'] = 'πριν %d δευτερόλεπτα'; +$lang['wordblock'] = 'Η αλλαγή σας δεν αποθηκεύτηκε γιατί περιείχε spam.';
\ No newline at end of file diff --git a/inc/lang/el/locked.txt b/inc/lang/el/locked.txt index d2f542c19..425c334f1 100644 --- a/inc/lang/el/locked.txt +++ b/inc/lang/el/locked.txt @@ -1,4 +1,5 @@ ====== Κλειδωμένη σελίδα ====== -Αυτή η σελίδα είναι προς το παρόν δεσμευμένη για τροποποίηση από άλλον χρήστη. Θα πρέπει να περιμένετε μέχρι ο συγκεκριμένος χρήστης να τελειώσει την τροποποίηση ή να εκπνεύσει το χρονικό όριο για το σχετικό κλείδωμα. +Αυτή η σελίδα είναι προς το παρόν δεσμευμένη για τροποποίηση από άλλον χρήστη. +Θα πρέπει να περιμένετε μέχρι ο συγκεκριμένος χρήστης να σταματήσει να την επεξεργάζεται ή να εκπνεύσει το χρονικό όριο για το σχετικό κλείδωμα. diff --git a/inc/lang/el/login.txt b/inc/lang/el/login.txt index 3839b7279..3021a19ea 100644 --- a/inc/lang/el/login.txt +++ b/inc/lang/el/login.txt @@ -1,3 +1,5 @@ -====== Είσοδος χρήστη ====== +====== Σύνδεση χρήστη ====== -Αυτή την στιγμή δεν έχετε συνδεθεί ως χρήστης! Για να συνδεθείτε, εισάγετε τα στοιχεία σας στην παρακάτω φόρμα. Πρέπει να έχετε ενεργοποιήσει τα cookies στον φυλλομετρητή σας. +Αυτή την στιγμή δεν έχετε συνδεθεί ως χρήστης! +Για να συνδεθείτε, εισάγετε τα στοιχεία σας στην παρακάτω φόρμα. +Πρέπει να έχετε ενεργοποιήσει τα cookies στο πρόγραμμα περιήγηση σας. diff --git a/inc/lang/el/newpage.txt b/inc/lang/el/newpage.txt index e8d65d6e5..3349ad90e 100644 --- a/inc/lang/el/newpage.txt +++ b/inc/lang/el/newpage.txt @@ -1,3 +1,4 @@ ====== Αυτή η σελίδα δεν υπάρχει ακόμη ====== -Η σελίδα που ζητάτε δεν υπάρχει ακόμη. Εάν όμως έχετε επαρκή δικαιώματα, μπορείτε να την δημιουργήσετε επιλέγοντας ''Δημιουργία σελίδας''. +Η σελίδα που ζητάτε δεν υπάρχει ακόμη. +Aν όμως έχετε επαρκή δικαιώματα, μπορείτε να την δημιουργήσετε επιλέγοντας ''Δημιουργία σελίδας''. diff --git a/inc/lang/el/norev.txt b/inc/lang/el/norev.txt index 9ce347948..2b13290ff 100644 --- a/inc/lang/el/norev.txt +++ b/inc/lang/el/norev.txt @@ -1,4 +1,5 @@ -====== Δεν υπάρχει τέτοια έκδοση ====== +====== Αυτή η έκδοση δεν υπάρχει ====== -Η έκδοση που αναζητήσατε δεν υπάρχει. Επιλέξτε ''Παλαιότερες εκδόσεις σελίδας'' για να δείτε την λίστα με τις παλαιότερες εκδόσεις της τρέχουσας σελίδας. +Η έκδοση που αναζητήσατε δεν υπάρχει. +Μπορείτε να δείτε λίστα με τις παλαιότερες εκδόσεις της τρέχουσας σελίδας πατώντας ''Παλαιότερες εκδόσεις σελίδας''. diff --git a/inc/lang/el/password.txt b/inc/lang/el/password.txt index 621a215f0..d27fbb3c3 100644 --- a/inc/lang/el/password.txt +++ b/inc/lang/el/password.txt @@ -2,8 +2,8 @@ Αυτά είναι τα στοιχεία εισόδου για το @TITLE@ στο @DOKUWIKIURL@ -Όνομα : @LOGIN@ -Κωδικός : @PASSWORD@ +Όνομα : @LOGIN@ +Συνθηματικό : @PASSWORD@ -- Αυτό το e-mail δημιουργήθηκε αυτόματα από την εφαρμογή DokuWiki στην διεύθυνση diff --git a/inc/lang/el/preview.txt b/inc/lang/el/preview.txt index f6709a441..aef65c974 100644 --- a/inc/lang/el/preview.txt +++ b/inc/lang/el/preview.txt @@ -1,4 +1,5 @@ ====== Προεπισκόπηση ====== -Αυτή είναι μια προεπισκόπηση του πως θα δείχνει η σελίδα. Θυμηθείτε: Οι αλλαγές σας **δεν έχουν αποθηκευθεί** ακόμη! +Αυτή είναι μια προεπισκόπηση του πως θα δείχνει η σελίδα. +Υπενθύμιση: Οι αλλαγές σας **δεν έχουν αποθηκευθεί** ακόμη! diff --git a/inc/lang/el/pwconfirm.txt b/inc/lang/el/pwconfirm.txt index 03f408819..a9e58be7d 100644 --- a/inc/lang/el/pwconfirm.txt +++ b/inc/lang/el/pwconfirm.txt @@ -1,11 +1,11 @@ Γεια σας @FULLNAME@! -Κάποιος ζήτησε τη δημιουργία νέου κωδικού για τον λογαριασμό @TITLE@ +Κάποιος ζήτησε τη δημιουργία νέου συνθηματικού για τον λογαριασμό @TITLE@ που διατηρείτε στο @DOKUWIKIURL@ -Εάν δεν ζητήσατε εσείς την δημιουργία νέου κωδικού απλά αγνοήστε αυτό το e-mail. +Αν δεν ζητήσατε εσείς την δημιουργία νέου συνθηματικού απλά αγνοήστε αυτό το e-mail. -Εάν όντως εσείς ζητήσατε την δημιουργία νέου κωδικού, ακολουθήστε τον παρακάτω σύνδεσμο για να το επιβεβαιώσετε. +Αν όντως εσείς ζητήσατε την δημιουργία νέου συνθηματικού, ακολουθήστε τον παρακάτω σύνδεσμο για να το επιβεβαιώσετε. @CONFIRM@ diff --git a/inc/lang/el/read.txt b/inc/lang/el/read.txt index 2d43c28fc..a620ab559 100644 --- a/inc/lang/el/read.txt +++ b/inc/lang/el/read.txt @@ -1 +1,2 @@ -Μπορείτε μόνο να διαβάσετε αυτή την σελίδα και όχι να την τροποποιήσετε. Εάν πιστεύετε ότι αυτό δεν είναι σωστό, απευθυνθείτε στον διαχειριστή της εφαρμογής. +Μπορείτε να διαβάσετε αυτή την σελίδα αλλά δεν μπορείτε να την τροποποιήσετε. +Αν πιστεύετε ότι αυτό δεν είναι σωστό, απευθυνθείτε στον διαχειριστή της εφαρμογής. diff --git a/inc/lang/el/recent.txt b/inc/lang/el/recent.txt index cc8051581..78c74a655 100644 --- a/inc/lang/el/recent.txt +++ b/inc/lang/el/recent.txt @@ -1,3 +1,3 @@ -====== Πρόσφατες αλλαγές σελίδων ====== +====== Πρόσφατες αλλαγές ====== Οι παρακάτω σελίδες τροποποιήθηκαν πρόσφατα: diff --git a/inc/lang/el/register.txt b/inc/lang/el/register.txt index 15d64cba3..6a4e963e4 100644 --- a/inc/lang/el/register.txt +++ b/inc/lang/el/register.txt @@ -1,3 +1,5 @@ ====== Εγγραφή νέου χρήστη ====== -Συμπληρώστε όλα τα παρακάτω πεδία για να δημιουργήσετε ένα νέο λογαριασμό σε αυτό το wiki. Πρέπει να δώσετε μια **υπαρκτή e-mail διεύθυνση** - ο κωδικός σας θα σας αποσταλεί σε αυτήν. Το όνομα χρήστη θα πρέπει να πληρεί τις ίδιες απαιτήσεις ονόματος που ισχύουν και για τους [[doku>pagename|φακέλους]]. +Συμπληρώστε όλα τα παρακάτω πεδία για να δημιουργήσετε ένα νέο λογαριασμό σε αυτό το wiki. +Πρέπει να δώσετε μια **υπαρκτή e-mail διεύθυνση** - ο κωδικός σας θα σας αποσταλεί σε αυτήν. +Το όνομα χρήστη θα πρέπει να πληρεί τις ίδιες απαιτήσεις ονόματος που ισχύουν και για τους [[doku>el:pagename|φακέλους]]. diff --git a/inc/lang/el/registermail.txt b/inc/lang/el/registermail.txt index 5d516ee31..0b3e0b78b 100644 --- a/inc/lang/el/registermail.txt +++ b/inc/lang/el/registermail.txt @@ -1,4 +1,4 @@ -Ένας νέος χρήστης εγγράφηκε. Αυτές είναι οι λεπτομέρειες: +Ένας νέος χρήστης εγγράφηκε. Ορίστε οι λεπτομέρειες: Χρήστης : @NEWUSER@ Όνομα : @NEWNAME@ diff --git a/inc/lang/el/resendpwd.txt b/inc/lang/el/resendpwd.txt index 2b91ed017..6b4f3bbca 100644 --- a/inc/lang/el/resendpwd.txt +++ b/inc/lang/el/resendpwd.txt @@ -1,4 +1,6 @@ ====== Αποστολή νέου κωδικού ====== -Συμπληρώστε όλα τα παρακάτω πεδία για να λάβετε ένα νέο κωδικό για τον λογαριασμό σας σε αυτό το wiki. Ο νέος κωδικός σας θα σταλεί στην e-mail διεύθυνση που έχετε ήδη δηλώσει. Το όνομα πρέπει να είναι αυτό που ισχύει για τον λογαριασμό σας σε αυτό το wiki. +Συμπληρώστε όλα τα παρακάτω πεδία για να λάβετε ένα νέο κωδικό για τον λογαριασμό σας σε αυτό το wiki. +Ο νέος κωδικός σας θα σταλεί στην e-mail διεύθυνση που έχετε ήδη δηλώσει. +Το όνομα πρέπει να είναι αυτό που ισχύει για τον λογαριασμό σας σε αυτό το wiki. diff --git a/inc/lang/el/revisions.txt b/inc/lang/el/revisions.txt index 7689c3b2b..955fa1703 100644 --- a/inc/lang/el/revisions.txt +++ b/inc/lang/el/revisions.txt @@ -1,3 +1,8 @@ ====== Παλαιότερες εκδόσεις σελίδας ====== -Οι παρακάτω είναι παλαιότερες εκδόσεις της τρέχουσας σελίδας. Εάν θέλετε να αντικαταστήσετε την τρέχουσα σελίδα με κάποια από τις παλαιότερες εκδόσεις της, επιλέξτε την σχετική έκδοση, επιλέξτε ''Τροποποίηση σελίδας'', κάνετε τυχόν αλλαγές και αποθηκεύστε την. +Οι παρακάτω είναι παλαιότερες εκδόσεις της τρέχουσας σελίδας. +Εάν θέλετε να αντικαταστήσετε την τρέχουσα σελίδα με κάποια από τις παλαιότερες εκδόσεις της κάντε τα παρακάτω: + * επιλέξτε την σχετική έκδοση + * επιλέξτε ''Τροποποίηση σελίδας'' + * κάνετε τυχόν αλλαγές + * αποθηκεύστε την diff --git a/inc/lang/el/searchpage.txt b/inc/lang/el/searchpage.txt index 87f396292..b52162b60 100644 --- a/inc/lang/el/searchpage.txt +++ b/inc/lang/el/searchpage.txt @@ -1,5 +1,4 @@ ====== Αναζήτηση ====== -Τα αποτελέσματα της αναζήτησής σας ακολουθούν. +Τα αποτελέσματα της αναζήτησής σας: -===== Αποτελέσματα =====
\ No newline at end of file diff --git a/inc/lang/el/showrev.txt b/inc/lang/el/showrev.txt index 212245420..a6ba3f99e 100644 --- a/inc/lang/el/showrev.txt +++ b/inc/lang/el/showrev.txt @@ -1,2 +1,2 @@ -**Αυτή είναι μια παλαιότερη έκδοση της σελίδας!** +**Βλέπετε μια παλαιότερη έκδοση της σελίδας!** ---- diff --git a/inc/lang/el/stopwords.txt b/inc/lang/el/stopwords.txt index bc6eb48ae..01d5103b3 100644 --- a/inc/lang/el/stopwords.txt +++ b/inc/lang/el/stopwords.txt @@ -1,29 +1,103 @@ # This is a list of words the indexer ignores, one word per line # When you edit this file be sure to use UNIX line endings (single newline) # No need to include words shorter than 3 chars - these are ignored anyway -# This list is based upon the ones found at http://www.ranks.nl/stopwords/ -about -are -and -you -your -them -their -com -for -from -into -how -that -the -this -was -what -when -where -who -will -with -und -the -www +# This list is provided by Fotis Lazarinis based on his research found at: http://lazarinf.teimes.gr/papers/J8.pdf +και +ήταν +το +ενός +να +πολύ +του +όμως +η +κατά +της +αυτή +με +όταν +που +μέσα +την +οποίο +από +πως +για +έτσι +τα +στους +είναι +μέσω +των +όλα +σε +καθώς +ο +αυτά +οι +προς +στο +ένας +θα +πριν +τη +μου +στην +όχι +τον +χωρίς +τους +επίσης +δεν +μεταξύ +τις +μέχρι +ένα +έναν +μια +μιας +ότι +αφού +ή +ακόμα +στη +όπου +στα +είχε +μας +δηλαδή +αλλά +τρόπος +στον +όσο +στις +ακόμη +αυτό +τόσο +όπως +έχουμε +αν +ώστε +μπορεί +αυτές +μετά +γιατί +σας +πάνω +δύο +τότε +τι +τώρα +ως +κάτι +κάθε +άλλο +πρέπει +μην +πιο +εδώ +οποία +είτε +μόνο +μη +ενώ
\ No newline at end of file diff --git a/inc/lang/el/subscr_digest.txt b/inc/lang/el/subscr_digest.txt index 1a0f44d14..7dd0345d7 100644 --- a/inc/lang/el/subscr_digest.txt +++ b/inc/lang/el/subscr_digest.txt @@ -11,10 +11,9 @@ Νέα έκδοση: @NEWPAGE@ Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε -στο wiki στην διεύθυνση @DOKUWIKIURL@ και στην -συνέχεια επισκεφθείτε το @SUBSCRIBE@ και -διαγραφείτε από τις ειδοποιήσεις της σελίδας ή -φακέλου. +στο wiki στην διεύθυνση @DOKUWIKIURL@ +και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@ +και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου. -- Αυτό το μήνυμα παράχθηκε απο το DokuWiki στην diff --git a/inc/lang/el/subscr_list.txt b/inc/lang/el/subscr_list.txt index f5cb8023d..97b8dc47d 100644 --- a/inc/lang/el/subscr_list.txt +++ b/inc/lang/el/subscr_list.txt @@ -10,11 +10,10 @@ @DIFF@ -------------------------------------------------------- -Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε -στο wiki στην διεύθυνση @DOKUWIKIURL@ και στην -συνέχεια επισκεφθείτε το @SUBSCRIBE@ και -διαγραφείτε από τις ειδοποιήσεις της σελίδας ή -φακέλου. +Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε στο wiki +στην διεύθυνση @DOKUWIKIURL@ +και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@ +και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου. -- Αυτό το μήνυμα παράχθηκε απο το DokuWiki στην diff --git a/inc/lang/el/subscr_single.txt b/inc/lang/el/subscr_single.txt index 9815cc0bb..610af49a2 100644 --- a/inc/lang/el/subscr_single.txt +++ b/inc/lang/el/subscr_single.txt @@ -12,11 +12,10 @@ Παλιά έκδοση: @OLDPAGE@ Νέα έκδοση: @NEWPAGE@ -Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε -στο wiki στην διεύθυνση @DOKUWIKIURL@ και στην -συνέχεια επισκεφθείτε το @SUBSCRIBE@ και -διαγραφείτε από τις ειδοποιήσεις της σελίδας ή -φακέλου. +Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε στο wiki +στην διεύθυνση @DOKUWIKIURL@ +και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@ +και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου. -- Αυτό το μήνυμα παράχθηκε απο το DokuWiki στην diff --git a/inc/lang/el/subscribermail.txt b/inc/lang/el/subscribermail.txt deleted file mode 100644 index 2963ef348..000000000 --- a/inc/lang/el/subscribermail.txt +++ /dev/null @@ -1,24 +0,0 @@ -Γειa σας! - -Η σελίδα @PAGE@ στο wiki @TITLE@ τροποποιήθηκε. -Αυτές είναι οι διαφορές σε σχέση με την προηγούμενη έκδοση: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Ημερομηνία: @DATE@ -Χρήστης: @USER@ -Περίληψη τροποποίησης: @SUMMARY@ -Παλιά έκδοση: @OLDPAGE@ -Νέα έκδοση: @NEWPAGE@ - -Για να πάψετε να λαμβάνετε τέτοια ενημερωτικά e-mails, -επισκεφτείτε το wiki στο -@DOKUWIKIURL@ δείτε την σελίδα -@NEWPAGE@ -και επιλέξτε 'Διαγραφή από λήψη ενημερώσεων'. - --- -Αυτό το e-mail δημιουργήθηκε αυτόματα από την εφαρμογή DokuWiki στην διεύθυνση -@DOKUWIKIURL@ diff --git a/inc/lang/el/updateprofile.txt b/inc/lang/el/updateprofile.txt index ccb9596b6..56f176d37 100644 --- a/inc/lang/el/updateprofile.txt +++ b/inc/lang/el/updateprofile.txt @@ -1,3 +1,4 @@ ====== Τροποποίηση προφίλ ====== -Τροποποιήστε **μόνο** τα πεδία που θέλετε να αλλάξετε. Δεν μπορείτε να αλλάξετε το πεδίο ''Όνομα''. +Τροποποιήστε **μόνο** τα πεδία που θέλετε να αλλάξετε. +Δεν μπορείτε να αλλάξετε το πεδίο ''Όνομα''. diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php index 5c890246c..51fd8f645 100644 --- a/inc/lang/en/lang.php +++ b/inc/lang/en/lang.php @@ -46,7 +46,8 @@ $lang['btn_resendpwd'] = 'Send new password'; $lang['btn_draft'] = 'Edit draft'; $lang['btn_recover'] = 'Recover draft'; $lang['btn_draftdel'] = 'Delete draft'; -$lang['btn_revert'] = 'Restore'; +$lang['btn_revert'] = 'Restore'; +$lang['btn_register'] = 'Register'; $lang['loggedinas'] = 'Logged in as'; $lang['user'] = 'Username'; @@ -57,7 +58,6 @@ $lang['passchk'] = 'once again'; $lang['remember'] = 'Remember me'; $lang['fullname'] = 'Real name'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Register'; $lang['profile'] = 'User Profile'; $lang['badlogin'] = 'Sorry, username or password was wrong.'; $lang['minoredit'] = 'Minor Changes'; @@ -164,6 +164,9 @@ $lang['yours'] = 'Your Version'; $lang['diff'] = 'Show differences to current revisions'; $lang['diff2'] = 'Show differences between selected revisions'; $lang['difflink'] = 'Link to this comparison view'; +$lang['diff_type'] = 'View differences:'; +$lang['diff_inline']= 'Inline'; +$lang['diff_side'] = 'Side by Side'; $lang['line'] = 'Line'; $lang['breadcrumb'] = 'Trace'; $lang['youarehere'] = 'You are here'; @@ -316,4 +319,4 @@ $lang['seconds'] = '%d seconds ago'; $lang['wordblock'] = 'Your change was not saved because it contains blocked text (spam).'; -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/lang/eo/lang.php b/inc/lang/eo/lang.php index a2457474b..305c080f1 100644 --- a/inc/lang/eo/lang.php +++ b/inc/lang/eo/lang.php @@ -4,16 +4,11 @@ * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Antono Vasiljev <esperanto.minsk ĈE tut.by> - * @author Felipe Castro <fefcas CXE yahoo.com.br> + * @author Felipe Castro <fefcas@yahoo.com.br> * @author Felipe Castro <fefcas@uol.com.br> * @author Felipe Castro <fefcas@gmail.com> - * @author Felipe Castro <fefcas (cxe) gmail (punkto) com> - * @author Felipo Kastro <fefcas@gmail.com> * @author Robert Bogenschneider <robog@gmx.de> - * @author Erik Pedersen <erik pedersen@shaw.ca> * @author Erik Pedersen <erik.pedersen@shaw.ca> - * @author Robert Bogenschneider <robog@GMX.de> - * @author Robert BOGENSCHNEIDER <robog@gmx.de> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -54,6 +49,7 @@ $lang['btn_draft'] = 'Redakti skizon'; $lang['btn_recover'] = 'Restarigi skizon'; $lang['btn_draftdel'] = 'Forigi skizon'; $lang['btn_revert'] = 'Restarigi'; +$lang['btn_register'] = 'Registriĝi'; $lang['loggedinas'] = 'Ensalutita kiel'; $lang['user'] = 'Uzant-nomo'; $lang['pass'] = 'Pasvorto'; @@ -63,7 +59,6 @@ $lang['passchk'] = 'plian fojon'; $lang['remember'] = 'Rememoru min'; $lang['fullname'] = 'Kompleta nomo'; $lang['email'] = 'Retpoŝto'; -$lang['register'] = 'Registriĝi'; $lang['profile'] = 'Uzanto-profilo'; $lang['badlogin'] = 'Pardonu, uzant-nomo aŭ pasvorto estis erara.'; $lang['minoredit'] = 'Etaj modifoj'; diff --git a/inc/lang/eo/subscribermail.txt b/inc/lang/eo/subscribermail.txt deleted file mode 100644 index 074a99351..000000000 --- a/inc/lang/eo/subscribermail.txt +++ /dev/null @@ -1,23 +0,0 @@ -Saluton! - -La retpaĝo @PAGE@ en la vikio @TITLE@ ŝanĝiĝis. -Jen la ŝanĝoj: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Dato : @DATE@ -Uzanto : @USER@ -Modifa rezumo: @SUMMARY@ -Malnova revizio: @OLDPAGE@ -Nova revizio: @NEWPAGE@ - -Por nuligi la avizojn pri paĝoŝanĝoj, ensalutu en la vikio ĉe -@DOKUWIKIURL@ kaj aliru -@NEWPAGE@ -kaj malaliĝu al avizoj pri paĝaj kaj/aŭ nomspacaj ŝanĝoj. - --- -Tiu ĉi mesaĝo estis kreita de DokuWiki ĉe -@DOKUWIKIURL@ diff --git a/inc/lang/es/lang.php b/inc/lang/es/lang.php index 04403c821..427f7e0a2 100644 --- a/inc/lang/es/lang.php +++ b/inc/lang/es/lang.php @@ -14,8 +14,7 @@ * @author oliver@samera.com.py * @author Enrico Nicoletto <liverig@gmail.com> * @author Manuel Meco <manuel.meco@gmail.com> - * @author VictorCastelan <victorcastelan@gmail.com> - * @author Jordan Mero hack.jord@gmail.com + * @author Jordan Mero <hack.jord@gmail.com> * @author Felipe Martinez <metalmartinez@gmail.com> * @author Javier Aranda <internet@javierav.com> * @author Zerial <fernando@zerial.org> @@ -64,6 +63,7 @@ $lang['btn_draft'] = 'Editar borrador'; $lang['btn_recover'] = 'Recuperar borrador'; $lang['btn_draftdel'] = 'Eliminar borrador'; $lang['btn_revert'] = 'Restaurar'; +$lang['btn_register'] = 'Registrarse'; $lang['loggedinas'] = 'Conectado como '; $lang['user'] = 'Usuario'; $lang['pass'] = 'Contraseña'; @@ -73,7 +73,6 @@ $lang['passchk'] = 'otra vez'; $lang['remember'] = 'Recordarme'; $lang['fullname'] = 'Nombre real'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Registrarse'; $lang['profile'] = 'Perfil del usuario'; $lang['badlogin'] = 'Lo siento, el usuario o la contraseña es incorrecto.'; $lang['minoredit'] = 'Cambios menores'; diff --git a/inc/lang/es/subscribermail.txt b/inc/lang/es/subscribermail.txt deleted file mode 100644 index 05be8557a..000000000 --- a/inc/lang/es/subscribermail.txt +++ /dev/null @@ -1,23 +0,0 @@ -¡Hola! - -La página @PAGE@ en el wiki @TITLE@ ha cambiado. -Los cambios son los siguientes: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Fecha : @DATE@ -Usuario : @USER@ -Resumen de la edición: @SUMMARY@ -Revisión vieja: @OLDPAGE@ -Revisión nueva: @NEWPAGE@ - -Para cacelar las notificaciones, ingresa al wiki -en @DOKUWIKIURL@ y luego visita la página -@NEWPAGE@ -y elige 'Cancelar suscripción'. - --- -Este mail fue generado por DokuWiki en -@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/et/lang.php b/inc/lang/et/lang.php index ef540bb3d..c7060ebca 100644 --- a/inc/lang/et/lang.php +++ b/inc/lang/et/lang.php @@ -3,212 +3,217 @@ * 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 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 */ -$lang['encoding'] = 'utf-8'; -$lang['direction'] = 'ltr'; -$lang['doublequoteopening'] = '„';//„ -$lang['doublequoteclosing'] = '“';//“ -$lang['singlequoteopening'] = '‚';//‚ -$lang['singlequoteclosing'] = '‘';//‘ - -$lang['btn_edit'] = 'Toimeta seda lehte'; -$lang['btn_source'] = 'Näita lehepõhja'; -$lang['btn_show'] = 'Näita lehte'; -$lang['btn_create'] = 'Tekita selle lingi alla leht'; -$lang['btn_search'] = 'Otsi'; -$lang['btn_save'] = 'Salvesta'; -$lang['btn_preview']= 'Eelvaade'; -$lang['btn_top'] = 'Tagasi lehe algusesse'; -$lang['btn_revs'] = 'Eelmised versioonid'; -$lang['btn_recent'] = 'Viimased muudatused'; -$lang['btn_upload'] = 'Lae üles'; -$lang['btn_cancel'] = 'Katkesta'; -$lang['btn_index'] = 'Sisukord'; -$lang['btn_secedit']= 'Toimeta'; -$lang['btn_login'] = 'Logi sisse'; -$lang['btn_logout'] = 'Logi välja'; -$lang['btn_admin'] = 'Administreeri'; -$lang['btn_update'] = 'Uuenda'; -$lang['btn_delete'] = 'Kustuta'; -$lang['btn_newer'] = '<< varajasemad'; -$lang['btn_older'] = '>> hilisemad'; -$lang['btn_back'] = 'Tagasi'; -$lang['btn_backtomedia'] = 'Tagasi faili valikusse'; -$lang['btn_profile'] = 'Minu info'; -$lang['btn_reset'] = 'Taasta'; -$lang['btn_resendpwd'] = 'Saada uus parool'; -$lang['btn_draft'] = 'Toimeta mustandit'; -$lang['btn_recover'] = 'Taata mustand'; -$lang['btn_draftdel'] = 'Kustuta mustand'; -$lang['newpass'] = 'Uus parool'; -$lang['oldpass'] = 'Vana parool'; -$lang['passchk'] = 'Korda uut parooli'; -$lang['profile'] = 'Kasutaja info'; -$lang['minoredit'] = 'Ebaolulised muudatused'; -$lang['draftdate'] = 'Mustand automaatselt salvestatud'; -$lang['regsuccess2'] = 'Kasutaja sai tehtud.'; -$lang['regbadpass'] = 'Uus parool on kirjutatud erinevalt. Proovi uuesti.'; -$lang['uploadexist'] = 'Fail on juba olemas. Midagi ei muudetud.'; -$lang['deletesucc'] = 'Fail nimega "%s" sai kustutatud.'; -$lang['deletefail'] = 'Faili nimega "%s" ei kustutatud (kontrolli õigusi).'; -$lang['mediainuse'] = 'Faili nimega "%s" ei kustutatud, sest see on kasutuses.'; -$lang['js']['keepopen'] = 'Jäta aken peale valiku sooritamist avatuks'; -$lang['js']['hidedetails'] = 'Peida detailid'; -$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['mediaextchange'] = 'Faili laiend .%s-st %s-ks!'; -$lang['ref_inuse'] = 'Seda faili ei saa kustutada, sest teda kasutavad järgmised lehed:'; -$lang['ref_hidden'] = 'Mõned viidad failile on lehtedel, millele sul ei ole ligipääsu'; -$lang['youarehere'] = 'Sa oled siin'; -$lang['mail_new_user'] = 'Uus kasutaja:'; -$lang['qb_strike'] = 'Läbijoonitud tekst'; -$lang['qb_smileys'] = 'Emotikonid'; -$lang['qb_chars'] = 'Erisümbolid'; -$lang['admin_register'] = 'Lisa kasutaja'; - - -#$lang['reference'] = ''; -#$lang['btn_backlink'] = ''; -#$lang['profna'] = ''; -$lang['btn_subscribe'] = 'Jälgi seda lehte (teated meilile)'; -$lang['btn_unsubscribe'] = 'Lõpeta lehe jälgimine'; -$lang['profnochange'] = 'Muutused puuduvad.'; -$lang['profnoempty'] = 'Tühi nimi ega meiliaadress pole lubatud.'; -$lang['profchanged'] = 'Kasutaja info edukalt muudetud'; -$lang['pwdforget'] = 'Unustasid parooli? Tee uus'; -$lang['resendna'] = 'See wiki ei toeta parooli taassaatmist.'; -$lang['resendpwd'] = 'Saada uus parool'; -$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['txt_overwrt'] = 'Kirjutan olemasoleva faili üle'; -$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'] = ''; -$lang['img_format'] = 'Formaat'; -$lang['img_camera'] = 'Kaamera'; -$lang['img_keywords'] = 'Võtmesõnad'; - -$lang['i_chooselang'] = 'Vali keel'; -$lang['i_installer'] = 'DokuWiki paigaldaja'; -$lang['i_wikiname'] = 'Wiki nimi'; -$lang['i_enableacl'] = 'Kas lubada kasutajate haldus (soovitatav)'; -$lang['i_superuser'] = 'Superkasutaja'; -$lang['i_problems'] = 'Paigaldaja leidis mõned vead, mis on allpool välja toodud. Enne vigade eemaldamist ei saa jätkata.'; -$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_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'] = ''; -$lang['i_badval'] = '<code>%s</code> - lubamatu või tühi väärtus'; -$lang['i_success'] = 'Seadistamine on õnnelikult lõpule viidud. Sa võid nüüd kustutada faili install.php. Alusta oma <a href="doku.php">uue DokuWiki</a> täitmist.'; -$lang['i_failure'] = 'Konfiguratsiooni faili kirjutamisel esines vigu. Võimalik, et pead need käsitsi parandama enne <a href="doku.php">uue DokuWiki</a> täitma asumist.'; -$lang['i_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['loggedinas'] = 'Logis sisse kui'; -$lang['user'] = 'Kasutaja'; -$lang['pass'] = 'Parool'; -$lang['remember'] = 'Pea mind meeles'; -$lang['fullname'] = 'Täielik nimi'; -$lang['email'] = 'E-post'; -$lang['register'] = 'Registreeri uus kasutaja'; -$lang['badlogin'] = 'Oops, Sinu kasutajanimi või parool oli vale.'; - -$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.'; -$lang['regmailfail']= 'Ilmselt tekkis e-posti teel parooli saatmisel mingi tõrge. Palun suhtle sel teemal +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '„'; +$lang['doublequoteclosing'] = '“'; +$lang['singlequoteopening'] = '‚'; +$lang['singlequoteclosing'] = '‘'; +$lang['btn_edit'] = 'Toimeta seda lehte'; +$lang['btn_source'] = 'Näita lehepõhja'; +$lang['btn_show'] = 'Näita lehte'; +$lang['btn_create'] = 'Tekita selle lingi alla leht'; +$lang['btn_search'] = 'Otsi'; +$lang['btn_save'] = 'Salvesta'; +$lang['btn_preview'] = 'Eelvaade'; +$lang['btn_top'] = 'Tagasi lehe algusesse'; +$lang['btn_newer'] = '<< varajasemad'; +$lang['btn_older'] = '>> hilisemad'; +$lang['btn_revs'] = 'Eelmised versioonid'; +$lang['btn_recent'] = 'Viimased muudatused'; +$lang['btn_upload'] = 'Lae üles'; +$lang['btn_cancel'] = 'Katkesta'; +$lang['btn_index'] = 'Sisukord'; +$lang['btn_secedit'] = 'Toimeta'; +$lang['btn_login'] = 'Logi sisse'; +$lang['btn_logout'] = 'Logi välja'; +$lang['btn_admin'] = 'Administreeri'; +$lang['btn_update'] = 'Uuenda'; +$lang['btn_delete'] = 'Kustuta'; +$lang['btn_back'] = 'Tagasi'; +$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'] = 'Saada uus parool'; +$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['user'] = 'Kasutaja'; +$lang['pass'] = 'Parool'; +$lang['newpass'] = 'Uus parool'; +$lang['oldpass'] = 'Vana parool'; +$lang['passchk'] = 'Korda uut parooli'; +$lang['remember'] = 'Pea mind meeles'; +$lang['fullname'] = 'Täielik nimi'; +$lang['email'] = 'E-post'; +$lang['profile'] = 'Kasutaja info'; +$lang['badlogin'] = 'Oops, Sinu kasutajanimi või parool oli vale.'; +$lang['minoredit'] = 'Ebaolulised muudatused'; +$lang['draftdate'] = 'Mustand automaatselt salvestatud'; +$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.'; +$lang['regsuccess2'] = 'Kasutaja sai tehtud.'; +$lang['regmailfail'] = 'Ilmselt tekkis e-posti teel parooli saatmisel mingi tõrge. Palun suhtle sel teemal oma serveri administraatoriga!'; -$lang['regbadmail'] = 'Tundub, et Sinu antud e-posti aadress ei toimi - kui Sa arvad, et tegemist on +$lang['regbadmail'] = 'Tundub, et Sinu antud e-posti aadress ei toimi - kui Sa arvad, et tegemist on ekstitusega, suhtle oma serveri administraatoriga'; -$lang['regpwmail'] = 'Sinu DokuWiki parool'; -$lang['reghere'] = 'Sul ei olegi veel kasutajakontot? No aga tekita see siis endale!'; - -$lang['txt_upload'] = 'Vali fail, mida üles laadida'; -$lang['txt_filename'] = 'Siseta oma Wikinimi (soovituslik)'; -$lang['lockedby'] = 'Praegu on selle lukustanud'; -$lang['lockexpire'] = 'Lukustus aegub'; -$lang['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.\nKas Sa ikka tahad edasi liikuda?"; -$lang['rssfailed'] = 'Sinu soovitud info ammutamisel tekkis viga: '; -$lang['nothingfound']= 'Oops, aga mitte muhvigi ei leitud.'; - -$lang['mediaselect'] = 'Hunnik faile'; -$lang['fileupload'] = 'Faili üleslaadimine'; -$lang['uploadsucc'] = 'Üleslaadimine läks ootuspäraselt hästi'; -$lang['uploadfail'] = 'Üleslaadimine läks nässu. Äkki pole Sa selleks lihtsalt piisavalt võimukas tegija?'; -$lang['uploadwrong'] = 'Ei saa Sa midagi üles laadida. Oops, aga seda tüüpi faili sul lihtsalt ei lubata üles laadida'; -$lang['namespaces'] = 'Alajaotus'; -$lang['mediafiles'] = 'Failid on Sulle kättesaadavad'; - -$lang['hits'] = 'Päringu tabamused'; -$lang['quickhits'] = 'Päringule vastavad lehed'; -$lang['toc'] = 'Sisujuht'; -$lang['current'] = 'Hetkel kehtiv'; -$lang['yours'] = 'Sinu versioon'; -$lang['diff'] = 'Näita erinevusi hetkel kehtiva versiooniga'; -$lang['line'] = 'Rida'; -$lang['breadcrumb'] = 'Käidud rada'; -$lang['lastmod'] = 'Viimati muutnud'; -$lang['by'] = 'persoon'; -$lang['deleted'] = 'eemaldatud'; -$lang['created'] = 'tekitatud'; -$lang['restored'] = 'vana versioon taastatud'; -$lang['summary'] = 'kokkuvõte muudatustest'; - -$lang['mail_newpage'] = 'leht lisatud:'; -$lang['mail_changed'] = 'leht muudetud'; - -$lang['nosmblinks'] = 'Windowsis võrguarvutiga ühendamine toimib ainult Internet Exploreris ja -sisevõrgus.\nAga Sa saad õnneks omale lingi kopeerida ja hiljem kuhugi kleepida.'; - -$lang['qb_bold'] = 'Rasvane kiri'; -$lang['qb_italic'] = 'Kaldkiri'; -$lang['qb_underl'] = 'Alajoonega kiri'; -$lang['qb_code'] = 'Koodi tekst'; -$lang['qb_h1'] = '1. astme pealkiri'; -$lang['qb_h2'] = '2. astme pealkiri'; -$lang['qb_h3'] = '3. astme pealkiri'; -$lang['qb_h4'] = '4. astme pealkiri'; -$lang['qb_h5'] = '5. astme pealkiri'; -$lang['qb_link'] = 'Siselink'; -$lang['qb_extlink'] = 'Välislink'; -$lang['qb_hr'] = 'Horisontaalne vahejoon'; -$lang['qb_ol'] = 'Nummerdatud nimikiri'; -$lang['qb_ul'] = 'Mummuga nimekiri'; -$lang['qb_media'] = 'Lisa pilte ja muid faile'; -$lang['qb_sig'] = 'Lisa allkiri!'; - -$lang['authmodfailed'] = 'Vigane kasutajate autentimise konfiguratsioon. Palun teavita sellest serveri haldajat.'; -$lang['authtempfail'] = 'Kasutajate autentimine on ajutiselt rivist väljas. Kui see olukord mõne aja jooksul ei parane, siis teavita sellest serveri haldajat.'; - -$lang['js']['del_confirm']= 'Kas kustutame selle kirje?'; - -#$lang['subscribe_success'] = ''; -#$lang['subscribe_error'] = ''; -#$lang['subscribe_noaddress'] = ''; -#$lang['unsubscribe_success'] = ''; -#$lang['unsubscribe_error'] = ''; - -//Setup VIM: ex: et ts=2 enc=utf-8 : +$lang['regbadpass'] = 'Uus parool on kirjutatud erinevalt. Proovi uuesti.'; +$lang['regpwmail'] = 'Sinu DokuWiki parool'; +$lang['reghere'] = 'Sul ei olegi veel kasutajakontot? No aga tekita see siis endale!'; +$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['pwdforget'] = 'Unustasid parooli? Tee uus'; +$lang['resendna'] = 'See wiki ei toeta parooli taassaatmist.'; +$lang['resendpwd'] = 'Saada uus parool'; +$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['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_overwrt'] = 'Kirjutan olemasoleva faili üle'; +$lang['lockedby'] = 'Praegu on selle lukustanud'; +$lang['lockexpire'] = 'Lukustus aegub'; +$lang['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'; +$lang['js']['keepopen'] = 'Jäta aken peale valiku sooritamist avatuks'; +$lang['js']['hidedetails'] = 'Peida detailid'; +$lang['js']['mediatitle'] = 'Lingi sätted'; +$lang['js']['mediadisplay'] = 'Lingi liik'; +$lang['js']['mediaalign'] = 'Joondus'; +$lang['js']['mediasize'] = 'Pildi mõõtmed'; +$lang['js']['mediatarget'] = 'Lingi siht'; +$lang['js']['mediaclose'] = 'Sulge'; +$lang['js']['mediainsert'] = 'Sisesta'; +$lang['js']['mediadisplayimg'] = 'Näita pilti.'; +$lang['js']['mediadisplaylnk'] = 'Näita ainult linki.'; +$lang['js']['mediasmall'] = 'Väiksem suurus'; +$lang['js']['mediamedium'] = 'Keskmine suurus'; +$lang['js']['medialarge'] = 'Suurem suurus'; +$lang['js']['mediaoriginal'] = 'Originaali suurus'; +$lang['js']['medialnk'] = 'Link üksikasjadele'; +$lang['js']['mediadirect'] = 'Otselink originaalile'; +$lang['js']['medianolnk'] = 'Ilma lingita'; +$lang['js']['medianolink'] = 'Ära lingi pilti'; +$lang['js']['medialeft'] = 'Joonda pilt vasakule.'; +$lang['js']['mediaright'] = 'Joonda pilt paremale.'; +$lang['js']['mediacenter'] = 'Joonda pilt keskele.'; +$lang['js']['medianoalign'] = 'Ära joonda.'; +$lang['js']['nosmblinks'] = 'Lingid \'Windows shares\'ile töötab ainult Microsoft Internet Exploreriga. +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']['mu_btn'] = 'Laadi üles mittu faili'; +$lang['rssfailed'] = 'Sinu soovitud info ammutamisel tekkis viga: '; +$lang['nothingfound'] = 'Oops, aga mitte muhvigi ei leitud.'; +$lang['mediaselect'] = 'Hunnik faile'; +$lang['fileupload'] = 'Faili üleslaadimine'; +$lang['uploadsucc'] = 'Üleslaadimine läks ootuspäraselt hästi'; +$lang['uploadfail'] = 'Üleslaadimine läks nässu. Äkki pole Sa selleks lihtsalt piisavalt võimukas tegija?'; +$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['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).'; +$lang['mediainuse'] = 'Faili nimega "%s" ei kustutatud, sest see on kasutuses.'; +$lang['namespaces'] = 'Alajaotus'; +$lang['mediafiles'] = 'Failid on Sulle kättesaadavad'; +$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['mediaextchange'] = 'Faili laiend .%s-st %s-ks!'; +$lang['ref_inuse'] = 'Seda faili ei saa kustutada, sest teda kasutavad järgmised lehed:'; +$lang['ref_hidden'] = 'Mõned viidad failile on lehtedel, millele sul ei ole ligipääsu'; +$lang['hits'] = 'Päringu tabamused'; +$lang['quickhits'] = 'Päringule vastavad lehed'; +$lang['toc'] = 'Sisujuht'; +$lang['current'] = 'Hetkel kehtiv'; +$lang['yours'] = 'Sinu versioon'; +$lang['diff'] = 'Näita erinevusi hetkel kehtiva versiooniga'; +$lang['line'] = 'Rida'; +$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'; +$lang['summary'] = 'kokkuvõte muudatustest'; +$lang['mail_newpage'] = 'leht lisatud:'; +$lang['mail_changed'] = 'leht muudetud'; +$lang['mail_new_user'] = 'Uus kasutaja:'; +$lang['qb_bold'] = 'Rasvane kiri'; +$lang['qb_italic'] = 'Kaldkiri'; +$lang['qb_underl'] = 'Alajoonega kiri'; +$lang['qb_code'] = 'Koodi tekst'; +$lang['qb_strike'] = 'Läbijoonitud tekst'; +$lang['qb_h1'] = '1. astme pealkiri'; +$lang['qb_h2'] = '2. astme pealkiri'; +$lang['qb_h3'] = '3. astme pealkiri'; +$lang['qb_h4'] = '4. astme pealkiri'; +$lang['qb_h5'] = '5. astme pealkiri'; +$lang['qb_link'] = 'Siselink'; +$lang['qb_extlink'] = 'Välislink'; +$lang['qb_hr'] = 'Horisontaalne vahejoon'; +$lang['qb_ol'] = 'Nummerdatud nimikiri'; +$lang['qb_ul'] = 'Mummuga nimekiri'; +$lang['qb_media'] = 'Lisa pilte ja muid faile'; +$lang['qb_sig'] = 'Lisa allkiri!'; +$lang['qb_smileys'] = 'Emotikonid'; +$lang['qb_chars'] = 'Erisümbolid'; +$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_format'] = 'Formaat'; +$lang['img_camera'] = 'Kaamera'; +$lang['img_keywords'] = 'Võtmesõnad'; +$lang['authmodfailed'] = 'Vigane kasutajate autentimise konfiguratsioon. Palun teavita sellest serveri haldajat.'; +$lang['authtempfail'] = 'Kasutajate autentimine on ajutiselt rivist väljas. Kui see olukord mõne aja jooksul ei parane, siis teavita sellest serveri haldajat.'; +$lang['i_chooselang'] = 'Vali keel'; +$lang['i_installer'] = 'DokuWiki paigaldaja'; +$lang['i_wikiname'] = 'Wiki nimi'; +$lang['i_enableacl'] = 'Kas lubada kasutajate haldus (soovitatav)'; +$lang['i_superuser'] = 'Superkasutaja'; +$lang['i_problems'] = 'Paigaldaja leidis mõned vead, mis on allpool välja toodud. Enne vigade eemaldamist ei saa jätkata.'; +$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_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_badval'] = '<code>%s</code> - lubamatu või tühi väärtus'; +$lang['i_success'] = 'Seadistamine on õnnelikult lõpule viidud. Sa võid nüüd kustutada faili install.php. Alusta oma <a href="doku.php">uue DokuWiki</a> täitmist.'; +$lang['i_failure'] = 'Konfiguratsiooni faili kirjutamisel esines vigu. Võimalik, et pead need käsitsi parandama enne <a href="doku.php">uue DokuWiki</a> täitma asumist.'; +$lang['i_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)'; diff --git a/inc/lang/et/subscribermail.txt b/inc/lang/et/subscribermail.txt deleted file mode 100644 index 76ce2845f..000000000 --- a/inc/lang/et/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Tere! - -Lehekülg @PAGE@ on muutunud (@TITLE@). -Siin on muudatused: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Selle lehe jälgimisest loobumiseks logi wikisse sisse -@DOKUWIKIURL@ ja siis külasta -@NEWPAGE@ -ning vali sealt 'Lõpeta jälgimine'. - --- -See meil on saadetud DokuWiki poolt -@DOKUWIKIURL@ diff --git a/inc/lang/eu/adminplugins.txt b/inc/lang/eu/adminplugins.txt new file mode 100644 index 000000000..20709bfd6 --- /dev/null +++ b/inc/lang/eu/adminplugins.txt @@ -0,0 +1 @@ +===== Plugin Gehigarriak =====
\ No newline at end of file diff --git a/inc/lang/eu/lang.php b/inc/lang/eu/lang.php index a5f786654..503b20b30 100644 --- a/inc/lang/eu/lang.php +++ b/inc/lang/eu/lang.php @@ -38,15 +38,14 @@ $lang['btn_back'] = 'Atzera'; $lang['btn_backlink'] = 'Itzulera estekak'; $lang['btn_backtomedia'] = 'Atzera Multimedia Fitxategiaren Aukeraketara'; $lang['btn_subscribe'] = 'Harpidetu Orri Aldaketetara'; -$lang['btn_unsubscribe'] = 'Utzi Harpidetza Orri Aldaketetara'; -$lang['btn_subscribens'] = 'Harpidetu Izen-espazio Aldaketetara'; -$lang['btn_unsubscribens'] = 'Utzi Harpidetza Izen-espazio Aldaketetara'; $lang['btn_profile'] = 'Eguneratu Profila '; $lang['btn_reset'] = 'Aldaketak Desegin'; $lang['btn_resendpwd'] = 'Pasahitz berria bidali'; $lang['btn_draft'] = 'Editatu zirriborroa'; $lang['btn_recover'] = 'Berreskuratu zirriborroa'; $lang['btn_draftdel'] = 'Ezabatu zirriborroa'; +$lang['btn_revert'] = 'Berrezarri'; +$lang['btn_register'] = 'Erregistratu'; $lang['loggedinas'] = 'Erabiltzailea'; $lang['user'] = 'Erabiltzailea'; $lang['pass'] = 'Pasahitza'; @@ -56,7 +55,6 @@ $lang['passchk'] = 'berriz'; $lang['remember'] = 'Gogoratu'; $lang['fullname'] = 'Izen Deiturak'; $lang['email'] = 'E-Maila'; -$lang['register'] = 'Erregistratu'; $lang['profile'] = 'Erabiltzaile Profila'; $lang['badlogin'] = 'Barkatu, prozesuak huts egin du; saiatu berriz'; $lang['minoredit'] = 'Aldaketa Txikiak'; @@ -85,13 +83,46 @@ $lang['resendpwdconfirm'] = 'Baieztapen esteka bat e-postaz bidali da.'; $lang['resendpwdsuccess'] = 'Zure pasahitz berria e-postaz bidali da.'; $lang['license'] = 'Besterik esan ezean, wiki hontako edukia ondorengo lizentziapean argitaratzen da:'; $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_overwrt'] = 'Oraingo fitxategiaren gainean idatzi'; $lang['lockedby'] = 'Momentu honetan blokeatzen:'; $lang['lockexpire'] = 'Blokeaketa iraungitzen da:'; $lang['willexpire'] = 'Zure blokeaketa orri hau aldatzeko minutu batean iraungitzen da.\nGatazkak saihesteko, aurreikusi botoia erabili blokeaketa denboragailua berrabiarazteko.'; -$lang['js']['notsavedyet'] = "Gorde gabeko aldaketak galdu egingo dira.\nBenetan jarraitu nahi duzu?"; +$lang['js']['notsavedyet'] = 'Gorde gabeko aldaketak galdu egingo dira. +Benetan jarraitu nahi duzu?'; +$lang['js']['searchmedia'] = 'Bilatu fitxategiak'; +$lang['js']['keepopen'] = 'Mantendu leihoa irekita aukeraketan'; +$lang['js']['hidedetails'] = 'Xehetasunak Ezkutatu'; +$lang['js']['mediatitle'] = 'Esteken ezarpenak'; +$lang['js']['mediadisplay'] = 'Esteka mota'; +$lang['js']['mediaalign'] = 'Lerrokatzea'; +$lang['js']['mediasize'] = 'Irudi tamaina'; +$lang['js']['mediatarget'] = 'Estekaren helburua'; +$lang['js']['mediaclose'] = 'Itxi'; +$lang['js']['mediainsert'] = 'Txertatu'; +$lang['js']['mediadisplayimg'] = 'Irudia erakutsi'; +$lang['js']['mediadisplaylnk'] = 'Esteka bakarrik erakutsi'; +$lang['js']['mediasmall'] = 'Bertsio txikia'; +$lang['js']['mediamedium'] = 'Bertsio ertaina'; +$lang['js']['medialarge'] = 'Bertsio handia'; +$lang['js']['mediaoriginal'] = 'Jatorrizko bertsioa'; +$lang['js']['medialnk'] = 'Esteka xehetasunen orrira'; +$lang['js']['mediadirect'] = 'Jatorrizkora esteka zuzena'; +$lang['js']['medianolnk'] = 'Estekarik ez'; +$lang['js']['medianolink'] = 'Ez estekatu irudia'; +$lang['js']['medialeft'] = 'Irudia ezkerrean lerrokatu'; +$lang['js']['mediaright'] = 'Irudia eskuinean lerrokatu'; +$lang['js']['mediacenter'] = 'Irudia erdian lerrokatu'; +$lang['js']['medianoalign'] = 'Ez erabili lerrokatzerik'; +$lang['js']['nosmblinks'] = 'Window baliabide konpartituetara estekek Microsoft Internet Explorer-en bakarrik balio dute. +Esteka kopiatu eta itsatsi dezakezu dena den.'; +$lang['js']['linkwiz'] = 'Estekatze Laguntzailea'; +$lang['js']['linkto'] = 'Estekatu hona:'; +$lang['js']['del_confirm'] = 'Benetan ezabatu aukeratutako fitxategia(k)?'; +$lang['js']['mu_btn'] = 'Igo hainbat fitxategi aldi berean'; $lang['rssfailed'] = 'Errorea gertatu da feed hau irakurtzean:'; $lang['nothingfound'] = 'Ez da ezer aurkitu.'; $lang['mediaselect'] = 'Aukeratu Multimedia fitxategia'; @@ -109,11 +140,7 @@ $lang['deletefail'] = 'Ezin izan da "%s" ezabatu - egiaztatu baimenak $lang['mediainuse'] = 'Ez da "%s" fitxategia ezabatu - oraindik erabilia izaten ari da.'; $lang['namespaces'] = 'Izen-espazioak'; $lang['mediafiles'] = 'Fitxategiak eskuragarri hemen:'; -$lang['js']['keepopen'] = 'Mantendu leihoa irekita aukeraketan'; -$lang['js']['hidedetails'] = 'Xehetasunak Ezkutatu'; -$lang['js']['nosmblinks'] = 'Window baliabide konpartituetara estekek Microsoft Internet Explorer-en bakarrik balio dute. -Esteka kopiatu eta itsatsi dezakezu dena den.'; -$lang['js']['mu_btn'] = 'Igo hainbat fitxategi aldi berean'; +$lang['accessdenied'] = 'Ez zaude orri hau ikusteko baimendua'; $lang['mediausage'] = 'Erabili ondoko sintaxia fitxategi honi erreferentzia egiteko:'; $lang['mediaview'] = 'Ikusi jatorrizko fitxategia'; $lang['mediaroot'] = 'root'; @@ -129,6 +156,7 @@ $lang['current'] = 'egungoa'; $lang['yours'] = 'Zure Bertsioa'; $lang['diff'] = 'egungo bertsioarekin dituen aldaketak aurkezten ditu'; $lang['diff2'] = 'Erakutsi desberdintasunak aukeratutako bertsioen artean'; +$lang['difflink'] = 'Estekatu konparaketa bista honetara'; $lang['line'] = 'Marra'; $lang['breadcrumb'] = 'Traza'; $lang['youarehere'] = 'Hemen zaude'; @@ -140,8 +168,10 @@ $lang['restored'] = 'bertsio zaharra berrezarria'; $lang['external_edit'] = 'kanpoko aldaketa'; $lang['summary'] = 'Aldatu laburpena'; $lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> beharrezkoa da eduki hau bistaratzeko.'; +$lang['download'] = 'Deskarga Snippet-a'; $lang['mail_newpage'] = '[DokuWiki] gehitutako orria:'; $lang['mail_changed'] = '[DokuWiki] aldatutako orria:'; +$lang['mail_subscribe_list'] = 'izen-espazioan aldatutako orriak:'; $lang['mail_new_user'] = 'erabiltzaile berria:'; $lang['mail_upload'] = 'fitxategia igota:'; $lang['qb_bold'] = 'Letra beltzez'; @@ -154,6 +184,11 @@ $lang['qb_h2'] = 'Izenburua 2'; $lang['qb_h3'] = 'Izenburua 3'; $lang['qb_h4'] = 'Izenburua 4'; $lang['qb_h5'] = 'Izenburua 5'; +$lang['qb_h'] = 'Izenburua'; +$lang['qb_hs'] = 'Izenburua Aukeratu'; +$lang['qb_hplus'] = 'Izenburu Handiagoa'; +$lang['qb_hminus'] = 'Izenburu Txikiagoa'; +$lang['qb_hequal'] = 'Maila Berdineko Izenburua'; $lang['qb_link'] = 'Barruko Lotura'; $lang['qb_extlink'] = 'Kanpoko Lotura'; $lang['qb_hr'] = 'Horizontal Marra'; @@ -163,7 +198,7 @@ $lang['qb_media'] = 'Irudiak eta beste fitxategiak gehitu'; $lang['qb_sig'] = 'Gehitu sinadura'; $lang['qb_smileys'] = 'Irrifartxoak'; $lang['qb_chars'] = 'Karaktere Bereziak'; -$lang['js']['del_confirm'] = 'Benetan ezabatu aukeratutako fitxategia(k)?'; +$lang['upperns'] = 'Jauzi izen-espazio gurasora'; $lang['admin_register'] = 'Erabiltzaile berria gehitu'; $lang['metaedit'] = 'Metadatua Aldatu'; $lang['metasaveerr'] = 'Metadatuaren idazketak huts egin du'; @@ -179,11 +214,22 @@ $lang['img_copyr'] = 'Copyright'; $lang['img_format'] = 'Formatua'; $lang['img_camera'] = 'Kamera'; $lang['img_keywords'] = 'Hitz-gakoak'; -$lang['subscribe_success'] = 'Gehitua %s %s harpidetza zerrendara'; -$lang['subscribe_error'] = 'Errorea %s gehitzen %s harpidetza zerrendara'; -$lang['subscribe_noaddress'] = 'Ez dago posta elektroniko helbiderik zure erabiltzaile izenarekin erlazionatuta, ezin zara harpidetza zerrendara gehitua izan'; -$lang['unsubscribe_success'] = 'Ezabatua %s %s harpidetza zerrendatik'; -$lang['unsubscribe_error'] = 'Errorea %s ezabatzen %s harpidetza zerrendatik'; +$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.'; +$lang['subscr_unsubscribe_success'] = '%s ezabatua %s-ren harpidetza zerrendatik'; +$lang['subscr_unsubscribe_error'] = 'Errorea %s ezabatzen %s-ren harpidetza zerrendatik'; +$lang['subscr_already_subscribed'] = '%s lehendik harpidetua dago %s-n'; +$lang['subscr_not_subscribed'] = '%s ez dago %s-n harpidetua'; +$lang['subscr_m_not_subscribed'] = 'Momentu honetan ez zaude orri honetara edo izen-espazio honetara harpidetua.'; +$lang['subscr_m_new_header'] = 'Gehitu harpidetza'; +$lang['subscr_m_current_header'] = 'Uneko harpidetzak'; +$lang['subscr_m_unsubscribe'] = 'Kendu harpidetza'; +$lang['subscr_m_subscribe'] = 'Harpidetu'; +$lang['subscr_m_receive'] = 'Jaso'; +$lang['subscr_style_every'] = 'e-posta aldaketa bakoitzean'; +$lang['subscr_style_digest'] = 'e-posta laburbildua orri bakoitzeko aldaketentzat (%.2f egunero)'; +$lang['subscr_style_list'] = 'aldatutako orrien zerrenda azken e-postatik (%.2f egunero)'; $lang['authmodfailed'] = 'Erabiltzaile kautotzearen konfigurazioa okerra da. Mesedez, eman honen berri Wiki administratzaileari'; $lang['authtempfail'] = 'Erabiltzaile kautotzea denboraldi batez ez dago erabilgarri. Egoerak hala jarraitzen badu, mesedez, eman honen berri Wiki administratzaileari'; $lang['i_chooselang'] = 'Hautatu zure hizkuntza'; @@ -207,6 +253,7 @@ $lang['i_pol0'] = 'Wiki Irekia (irakurri, idatzi, fitxategiak igo $lang['i_pol1'] = 'Wiki Publikoa (irakurri edonorentzat, idatzi eta fitxategiak igo erregistratutako erabiltzaileentzat)'; $lang['i_pol2'] = 'Wiki Itxia (irakurri, idatzi, fitxategiak igo erregistratutako erabiltzaileentzat soilik)'; $lang['i_retry'] = 'Berriz saiatu'; +$lang['i_license'] = 'Mesedez, aukeratu zein lizentzipean ezarri nahi duzun zure edukia:'; $lang['mu_intro'] = 'Hemen hainbat fitxategi aldi berean igo ditzakezu. Egin klik nabigazio botoian hauek ilarara gehitzeko. Sakatu igo botoia prest egotean.'; $lang['mu_gridname'] = 'Fitxategi izena'; $lang['mu_gridsize'] = 'Tamaina'; @@ -220,4 +267,14 @@ $lang['mu_fail'] = 'hutsegitea'; $lang['mu_authfail'] = 'saioa iraungita'; $lang['mu_progress'] = '@PCT@% igota'; $lang['mu_filetypes'] = 'Onartutako Fitxategi Motak'; +$lang['mu_info'] = 'igotako fitxategiak.'; +$lang['mu_lasterr'] = 'Azken errorea;'; $lang['recent_global'] = 'Une honetan <b>%s</b> izen-espazioaren barneko aldaketak ikusten ari zara.<a href="%s"> Wiki osoaren azken aldaketak</a> ere ikusi ditzakezu.'; +$lang['years'] = 'duela %d urte'; +$lang['months'] = 'duela %d hilabete'; +$lang['weeks'] = 'duela %d aste'; +$lang['days'] = 'duela %d egun'; +$lang['hours'] = 'duela %d ordu'; +$lang['minutes'] = 'duela %d minutu'; +$lang['seconds'] = 'duela %d segundu'; +$lang['wordblock'] = 'Zure aldaketa ez da aldatua izan blokeatutako testua (spam) daukalako.'; diff --git a/inc/lang/eu/subscr_digest.txt b/inc/lang/eu/subscr_digest.txt new file mode 100644 index 000000000..e7962ca22 --- /dev/null +++ b/inc/lang/eu/subscr_digest.txt @@ -0,0 +1,20 @@ +Kaixo! + +@TITLE@ wikiko @PAGE@ orria aldatu egin da. +Hemen aldaketak: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Berrikuste zaharra: @OLDPAGE@ +Berrikuste berria: @NEWPAGE@ + +Orri jakinarazpenak ezeztatzeko, sartu wikian +@DOKUWIKIURL@ helbidean, bisitatu +@SUBSCRIBE@ +eta ezabatu orri eta/edo izen-espazio aldaketen harpidetza. + +-- +E-posta hau DokuWiki-k sortua izan da helbide honetan: +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/eu/subscr_form.txt b/inc/lang/eu/subscr_form.txt new file mode 100644 index 000000000..02a117898 --- /dev/null +++ b/inc/lang/eu/subscr_form.txt @@ -0,0 +1,3 @@ +====== Harpidetza Kudeaketa ====== + +Orri honek, oraingo orriko eta izen-espazioko harpidetzak kudeatzeko aukera ematen dizu.
\ No newline at end of file diff --git a/inc/lang/eu/subscr_list.txt b/inc/lang/eu/subscr_list.txt new file mode 100644 index 000000000..950cd352b --- /dev/null +++ b/inc/lang/eu/subscr_list.txt @@ -0,0 +1,17 @@ +Kaixo! + +@TITLE@ wikiko @PAGE@ izen-espazioko orri batzuk aldatu egin dira. +Hemen aldatutako orriak: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Orri jakinarazpenak ezeztatzeko, sartu wikian +@DOKUWIKIURL@ helbidean, bisitatu +@SUBSCRIBE@ +eta ezabatu orri eta/edo izen-espazio aldaketen harpidetza. + +-- +E-posta hau DokuWiki-k sortua izan da helbide honetan: +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/eu/subscr_single.txt b/inc/lang/eu/subscr_single.txt new file mode 100644 index 000000000..490211784 --- /dev/null +++ b/inc/lang/eu/subscr_single.txt @@ -0,0 +1,23 @@ +Kaixo! + +@TITLE@ wikiko @PAGE@ orria aldatu egin da. +Hemen aldaketak: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Data : @DATE@ +Erabiltzailea : @USER@ +Aldaketaren Laburpena: @SUMMARY@ +Berrikuste Zaharra: @OLDPAGE@ +Berrikuste Berria: @NEWPAGE@ + +Orri jakinarazpenak ezeztatzeko, sartu wikian +@DOKUWIKIURL@ helbidean, bisitatu +@SUBSCRIBE@ +eta ezabatu orri eta/edo izen-espazio aldaketen harpidetza. + +-- +E-posta hau DokuWiki-k sortua izan da helbide honetan: +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/eu/subscribermail.txt b/inc/lang/eu/subscribermail.txt deleted file mode 100644 index 9e5503a8b..000000000 --- a/inc/lang/eu/subscribermail.txt +++ /dev/null @@ -1,13 +0,0 @@ -Kaixo! - -@PAGE@ orria @TITLE@ wikian aldatua izan da. -Hona hemen aldaketak: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Orri jakinarazpenak ezeztatzeko, hasi saioa @DOKUWIKIURL@ wikian, bisitatu @NEWPAGE@ eta orriaren eta/edo izen-espazioaren harpidetza utzi. - --- -Posta hau @DOKUWIKIURL@ gunean DokuWikik sortua izan da.
\ No newline at end of file diff --git a/inc/lang/fa/lang.php b/inc/lang/fa/lang.php index c5be8e1c0..ceea28f8e 100644 --- a/inc/lang/fa/lang.php +++ b/inc/lang/fa/lang.php @@ -10,7 +10,6 @@ * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesFa.php?view=co * @author behrad eslamifar <behrad_es@yahoo.com) * @author Mohsen Firoozmandan <info@mambolearn.com> - * @author omidmr@gmail.com * @author Omid Mottaghi <omidmr@gmail.com> * @author Mohammad Reza Shoaei <shoaei@gmail.com> */ @@ -53,6 +52,7 @@ $lang['btn_draft'] = 'ویرایش پیشنویس'; $lang['btn_recover'] = 'بازیابی پیشنویس'; $lang['btn_draftdel'] = 'حذف پیشنویس'; $lang['btn_revert'] = 'بازیابی'; +$lang['btn_register'] = 'یک حساب جدید بسازید'; $lang['loggedinas'] = 'به عنوان کاربر روبرو وارد شدهاید:'; $lang['user'] = 'نام کاربری:'; $lang['pass'] = 'گذرواژهی شما'; @@ -62,7 +62,6 @@ $lang['passchk'] = 'گذرواژه را دوباره وارد کن $lang['remember'] = 'گذرواژه را به یاد بسپار.'; $lang['fullname'] = '*نام واقعی شما'; $lang['email'] = 'ایمیل شما*'; -$lang['register'] = 'یک حساب جدید بسازید'; $lang['profile'] = 'پروفایل کاربر'; $lang['badlogin'] = 'خطا در ورود به سیستم'; $lang['minoredit'] = 'این ویرایش خُرد است'; diff --git a/inc/lang/fa/subscribermail.txt b/inc/lang/fa/subscribermail.txt deleted file mode 100644 index 140f2e3e0..000000000 --- a/inc/lang/fa/subscribermail.txt +++ /dev/null @@ -1,21 +0,0 @@ -درود! - -صفحهی @PAGE@ با عنوان @TITLE@ تغییر کرد. -تغییرات عبارتند از: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -تاریخ: @DATE@ -کاربر: @USER@ -خلاصهی ویرایش: @SUMMARY@ -نگارش پیشین: @OLDPAGE@ -نگارش تازه: @NEWPAGE@ - -برای لغو دریافت پیامهای آگاهی دهنده، وارد ویکی به آدرس -@DOKUWIKIURL@ شده و سپس به صفحهی @NEWPAGE@ بروید -و از عضویت صفحه یا فضاینام خارج شوید. - --- -این ایمیل توسط DokuWiki به آدرس @DOKUWIKIURL@ ایجاد شده است.
\ No newline at end of file diff --git a/inc/lang/fi/lang.php b/inc/lang/fi/lang.php index e91a1d497..bc52625e0 100644 --- a/inc/lang/fi/lang.php +++ b/inc/lang/fi/lang.php @@ -5,7 +5,6 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Petteri <petteri@gmail.com> * @author Matti Pöllä <mpo@iki.fi> - * @author otto@valjakko.net * @author Otto Vainio <otto@valjakko.net> * @author Teemu Mattila <ghcsystems@gmail.com> */ @@ -48,6 +47,7 @@ $lang['btn_draft'] = 'Muokkaa luonnosta'; $lang['btn_recover'] = 'Palauta luonnos'; $lang['btn_draftdel'] = 'Poista luonnos'; $lang['btn_revert'] = 'palauta'; +$lang['btn_register'] = 'Rekisteröidy'; $lang['loggedinas'] = 'Kirjautunut nimellä'; $lang['user'] = 'Käyttäjänimi'; $lang['pass'] = 'Salasana'; @@ -57,7 +57,6 @@ $lang['passchk'] = 'uudelleen'; $lang['remember'] = 'Muista minut'; $lang['fullname'] = 'Koko nimi'; $lang['email'] = 'Sähköposti'; -$lang['register'] = 'Rekisteröidy'; $lang['profile'] = 'Käyttäjän profiili'; $lang['badlogin'] = 'Käyttäjänimi tai salasana oli väärä.'; $lang['minoredit'] = 'Pieni muutos'; @@ -270,7 +269,7 @@ $lang['mu_fail'] = 'epäonnistui'; $lang['mu_authfail'] = 'istunto on vanhentunut'; $lang['mu_progress'] = '@PCT@% lähetetty'; $lang['mu_filetypes'] = 'Sallitut tyypit'; -$lang['mu_info'] = 'tiedstoa ladattu.'; +$lang['mu_info'] = 'tiedostoa ladattu.'; $lang['mu_lasterr'] = 'Edellinen virhe:'; $lang['recent_global'] = 'Seuraat tällä hetkellä muutoksia nimiavaruuden <b>%s</b> sisällä. Voit myös <a href="%s">katsoa muutoksia koko wikissä</a>'; $lang['years'] = '%d vuotta sitten'; diff --git a/inc/lang/fi/stopwords.txt b/inc/lang/fi/stopwords.txt index f92fe70cc..82d3daa44 100644 --- a/inc/lang/fi/stopwords.txt +++ b/inc/lang/fi/stopwords.txt @@ -1,7 +1,7 @@ # Tämä on lista sanoista, jotka indeksoija ohittaa. Yksi sana riviä kohti # Kun muokkaat sivua, varmista että käytät UNIX rivinvaihtoa (yksi newline) # Ei tarvitse lisätä alle kolmen merkin sanoja. NE ohitetaan automaattisesti. -# Jos wikissäsin muita kieliä, lisää sanoja listaan esim sivulta http://www.ranks.nl/stopwords/ +# Jos wikissäsin muita kieliä, lisää sanoja listaan esimerkiksi sivulta http://www.ranks.nl/stopwords/ www eli tai diff --git a/inc/lang/fi/subscr_list.txt b/inc/lang/fi/subscr_list.txt index 47ee1b155..cd39014e8 100644 --- a/inc/lang/fi/subscr_list.txt +++ b/inc/lang/fi/subscr_list.txt @@ -7,7 +7,7 @@ Tässä ovat muuttuneet sivut: @DIFF@ -------------------------------------------------------- -Peruttaaksesi sivuilmoitukset kirjaudu wikiin osoitteessa +Peruuttaaksesi sivuilmoitukset kirjaudu wikiin osoitteessa @DOKUWIKIURL@ , jonka jälkeen katso @SUBSCRIBE@ ja peruuta tilauksesi sivun ja/tai nimiavaruuden muutoksista. diff --git a/inc/lang/fi/subscribermail.txt b/inc/lang/fi/subscribermail.txt deleted file mode 100644 index d1c5d9138..000000000 --- a/inc/lang/fi/subscribermail.txt +++ /dev/null @@ -1,23 +0,0 @@ -Hei! - -Sivua @PAGE@ wiki-sivustolla @TITLE@ on muokattu. -Tässä muutokset: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Päivä : @DATE@ -Käyttäjä : @USER@ -Yhteenveto: @SUMMARY@ -Vanha revisio: @OLDPAGE@ -Uusi revisio: @NEWPAGE@ - -Poistaaksesi sivun seurannan, kirjaudu wikiin osoitteessa -@DOKUWIKIURL@ ja siirry sivulle -@NEWPAGE@ -ja valitse 'Lopeta sivun ja/tai nimiavaruuden tarkkailu'. - --- -Tämän viestin generoi DokuWiki osoitteessa -@DOKUWIKIURL@ diff --git a/inc/lang/fo/lang.php b/inc/lang/fo/lang.php index 2bc5c3d53..3d4d0455b 100644 --- a/inc/lang/fo/lang.php +++ b/inc/lang/fo/lang.php @@ -4,7 +4,7 @@ * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Poul J. Clementsen <poul@diku.dk> - * @author Einar Petersen einar.petersen@gmail.com + * @author Einar Petersen <einar.petersen@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -45,6 +45,7 @@ $lang['btn_draft'] = 'Broyt kladdu'; $lang['btn_recover'] = 'Endurbygg kladdu'; $lang['btn_draftdel'] = 'Sletta'; $lang['btn_revert'] = 'Endurbygg'; +$lang['btn_register'] = 'Melda til'; $lang['loggedinas'] = 'Ritavur inn sum'; $lang['user'] = 'Brúkaranavn'; $lang['pass'] = 'Loyniorð'; @@ -54,7 +55,6 @@ $lang['passchk'] = 'Endurtak nýtt loyniorð'; $lang['remember'] = 'Minst til loyniorðið hjá mær'; $lang['fullname'] = 'Navn'; $lang['email'] = 'T-postur'; -$lang['register'] = 'Melda til'; $lang['profile'] = 'Brúkara vangamynd'; $lang['badlogin'] = 'Skeivt brúkaranavn ella loyniorð.'; $lang['minoredit'] = 'Smærri broytingar'; diff --git a/inc/lang/fo/subscribermail.txt b/inc/lang/fo/subscribermail.txt deleted file mode 100644 index 4dca0cda5..000000000 --- a/inc/lang/fo/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Hey! - -Síðan @PAGE@ á @TITLE@ wikiuni er blivin broytt. -Her eru ein lýsing: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Fyri at avmelda broytinga upplýsingar fyri hesa síðu rita inn á wikiuna á -@DOKUWIKIURL@ , vitja -@NEWPAGE@ -og vel 'Strika til melda broytingar'. - --- -Hesin t-postur var skaptur av DokuWiki á: -@DOKUWIKIURL@ diff --git a/inc/lang/fr/lang.php b/inc/lang/fr/lang.php index 76e1271bd..40384fecb 100644 --- a/inc/lang/fr/lang.php +++ b/inc/lang/fr/lang.php @@ -12,7 +12,6 @@ * @author Stéphane Chamberland <stephane.chamberland@ec.gc.ca> * @author Delassaux Julien <julien@delassaux.fr> * @author Maurice A. LeBlanc <leblancma@cooptel.qc.ca> - * @author gb@isis.u-strasbg.fr * @author stephane.gully@gmail.com * @author Guillaume Turri <guillaume.turri@gmail.com> * @author Erik Pedersen <erik.pedersen@shaw.ca> @@ -20,7 +19,8 @@ * @author Vincent Feltz <psycho@feltzv.fr> * @author Philippe Bajoit <philippe.bajoit@gmail.com> * @author Florian Gaub <floriang@floriang.net> - * @author Samuel Dorsaz samuel.dorsaz@novelion.net + * @author Samuel Dorsaz <samuel.dorsaz@novelion.net> + * @author Johan Guilbaud <guilbaud.johan@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -61,6 +61,7 @@ $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['loggedinas'] = 'Connecté en tant que '; $lang['user'] = 'Utilisateur'; $lang['pass'] = 'Mot de passe'; @@ -70,7 +71,6 @@ $lang['passchk'] = 'Répéter nouveau mot de passe'; $lang['remember'] = 'Mémoriser'; $lang['fullname'] = 'Nom'; $lang['email'] = 'Adresse de courriel'; -$lang['register'] = 'S\'enregistrer'; $lang['profile'] = 'Profil utilisateur'; $lang['badlogin'] = 'L\'utilisateur ou le mot de passe est incorrect.'; $lang['minoredit'] = 'Modification mineure'; @@ -173,6 +173,9 @@ $lang['yours'] = 'Votre version'; $lang['diff'] = 'Différences avec la version actuelle'; $lang['diff2'] = 'Différences entre les versions sélectionnées'; $lang['difflink'] = 'Lien vers cette vue'; +$lang['diff_type'] = 'Voir les différences :'; +$lang['diff_inline'] = 'Sur une seule ligne'; +$lang['diff_side'] = 'Côte à côte'; $lang['line'] = 'Ligne'; $lang['breadcrumb'] = 'Piste'; $lang['youarehere'] = 'Vous êtes ici'; diff --git a/inc/lang/fr/subscribermail.txt b/inc/lang/fr/subscribermail.txt deleted file mode 100644 index 514f9cf5d..000000000 --- a/inc/lang/fr/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Bonjour ! - -La page @PAGE@ dans le wiki @TITLE@ a changé. -Voici les modifications : - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Pour vous désabonner de cette page, connectez vous via -@DOKUWIKIURL@ et visualisez la page -@NEWPAGE@ -puis choisissez 'Ne pas notifier les modifications'. - --- -Ce message a été généré par Dokuwiki -@DOKUWIKIURL@ diff --git a/inc/lang/gl/lang.php b/inc/lang/gl/lang.php index 9f1b48173..37cf55d22 100644 --- a/inc/lang/gl/lang.php +++ b/inc/lang/gl/lang.php @@ -44,6 +44,7 @@ $lang['btn_draft'] = 'Editar borrador'; $lang['btn_recover'] = 'Recuperar borrador'; $lang['btn_draftdel'] = 'Eliminar borrador'; $lang['btn_revert'] = 'Restaurar'; +$lang['btn_register'] = 'Rexístrate'; $lang['loggedinas'] = 'Iniciaches sesión como'; $lang['user'] = 'Nome de Usuario'; $lang['pass'] = 'Contrasinal'; @@ -53,7 +54,6 @@ $lang['passchk'] = 'de novo'; $lang['remember'] = 'Lémbrame'; $lang['fullname'] = 'Nome Completo'; $lang['email'] = 'Correo-e'; -$lang['register'] = 'Rexístrate'; $lang['profile'] = 'Perfil de Usuario'; $lang['badlogin'] = 'Sentímolo, mais o nome de usuario ou o contrasinal non son correctos.'; $lang['minoredit'] = 'Trocos Menores'; diff --git a/inc/lang/gl/subscribermail.txt b/inc/lang/gl/subscribermail.txt deleted file mode 100644 index 0b1c3a662..000000000 --- a/inc/lang/gl/subscribermail.txt +++ /dev/null @@ -1,19 +0,0 @@ -Ola! - -A páxina @PAGE@ na wiki @TITLE@ foi mudada. -Aquí van as modificacións: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Para desubscribirte deste rexistro de cambios de páxina -na wiki en -@DOKUWIKIURL@ -fai unha visita a -@NEWPAGE@ -e selecciona 'Non avisar dos cambios'. - --- -Este correo foi xerado polo DokuWiki en -@DOKUWIKIURL@ diff --git a/inc/lang/he/conflict.txt b/inc/lang/he/conflict.txt index d27a78559..c1cccdfcf 100644 --- a/inc/lang/he/conflict.txt +++ b/inc/lang/he/conflict.txt @@ -1,6 +1,6 @@ -====== גירסה עדכנית יותר של הקובץ קיימת ====== +====== קיימת גרסה עדכנית יותר של הקובץ ====== -גירסה עדכנית יותר של המסמך קיימת. דבר זה קורה כאשר משתמש אחר שינה את המסמך בזמן שערכת אותו. +ישנה גרסה עדכנית יותר של המסמך. מצב כזה קורה כאשר משתמש אחר שינה את המסמך בזמן שערכת אותו. -מומלץ לעיין בהבדלים תחת הודעה ולאחר מכן להחליט איזו גירסה כדאי לשמור. לחיצה על הכפתור "שמור" תשמור את הגרסה שערכת. לחיצה על הכפתור "בטל" תשמור את הגרסה הקיימת. +מומלץ לעיין בהבדלים המופיעים להלן ולאחר מכן להחליט איזו גרסה כדאי לשמור. לחיצה על הכפתור "שמירה" תשמור את הגרסה שערכת. לחיצה על הכפתור "ביטול" תשמור את הגרסה הקיימת. diff --git a/inc/lang/he/denied.txt b/inc/lang/he/denied.txt index 34c8417b4..a366fc198 100644 --- a/inc/lang/he/denied.txt +++ b/inc/lang/he/denied.txt @@ -1,3 +1,3 @@ ====== הרשאה נדחתה ====== -אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך. אולי שכחת להכנס למערכת?
\ No newline at end of file +אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך. אולי שכחת להיכנס למערכת?
\ No newline at end of file diff --git a/inc/lang/he/draft.txt b/inc/lang/he/draft.txt index 22fc88d9f..b999cc187 100644 --- a/inc/lang/he/draft.txt +++ b/inc/lang/he/draft.txt @@ -1,5 +1,5 @@ -====== נמצא קובץ טיוטא ====== +====== נמצא קובץ טיוטה ====== -העריכה האחרונה שבוצעה לדף זה לא הסתימה כהלכה. DokuWiki שמר באופן אוטומטי טיוטה של העבודה ובאפשרותך להשתמש בה כדי להמשיך את העריכה. ניתן לראות מטה את המידע שנשמר מהפעם הקודמת. +העריכה האחרונה שבוצעה לדף זה לא הושלמה כראוי. DokuWiki שמר באופן אוטומטי טיוטה של העבודה ובאפשרותך להשתמש בה כדי להמשיך את העריכה. ניתן לראות להלן את הנתונים שנשמרו מהפעם הקודמת. באפשרותך לבחור ב//שחזור הטיוטה// של אותה עריכה //מחיקת הטיוטה// או //ביטול// העריכה כליל.
\ No newline at end of file diff --git a/inc/lang/he/edit.txt b/inc/lang/he/edit.txt index 4d8151e9d..74b3cefeb 100644 --- a/inc/lang/he/edit.txt +++ b/inc/lang/he/edit.txt @@ -1 +1 @@ -עריכת הדף ולחיצה על הכפתור "שמור" תעדכן את תוכנו. מומלץ לעיין בדף ה[[wiki:syntax|תחביר]] כדי להכיר את כללי תחביר הויקי. נא לערוך את הדף רק אם הדבר נעשה כדי **לשפר** אותו. אם העריכה היא לצורך התנסות מומלץ לבקר ב[[playground:playground|ארגז החול]]. +עריכת הדף ולחיצה על הלחצן "שמירה" תעדכן את תוכנו. מומלץ לעיין בדף ה[[wiki:syntax|תחביר]] כדי להכיר את כללי תחביר הוויקי. נא לערוך את הדף רק אם הדבר נעשה כדי **לשפר** אותו. אם העריכה היא לצורך התנסות מומלץ לבקר ב[[playground:playground|ארגז החול]]. diff --git a/inc/lang/he/editrev.txt b/inc/lang/he/editrev.txt index a6c755cba..e33001fa3 100644 --- a/inc/lang/he/editrev.txt +++ b/inc/lang/he/editrev.txt @@ -1,2 +1,2 @@ -**הדף שנפתח הוא גרסה ישנה של המסמך!** לחיצה על הכפתור "שמור" תשחזר את המסמך לגרסה המוצגת כעת. +**הדף שנפתח הוא גרסה ישנה של המסמך!** לחיצה על הלחצן "שמירה" תשחזר את המסמך לגרסה המוצגת כעת. ----
\ No newline at end of file diff --git a/inc/lang/he/index.txt b/inc/lang/he/index.txt index 12b7a960e..4b0623f84 100644 --- a/inc/lang/he/index.txt +++ b/inc/lang/he/index.txt @@ -1,4 +1,4 @@ -====== אינדקס ====== +====== מפת אתר ====== -זהו קובץ אינדקס הנמצא מעל לכל הדפים המאורגנים ב[[ויקי:דוקיוויקי]]. +זהו קובץ מפת אתר הנמצא מעל לכל הדפים המאורגנים ב[[ויקי:דוקיוויקי]]. diff --git a/inc/lang/he/install.html b/inc/lang/he/install.html index 7831623c9..3832fb5fb 100644 --- a/inc/lang/he/install.html +++ b/inc/lang/he/install.html @@ -1,13 +1,13 @@ -<p>דף זה מסייע להתקנה וההגדרה הראשוניות של -<a href="http://dokuwiki.org">Dokuwiki</a>. מידע נוסף על מתקין זה זמין בדף +<p>דף זה מסייע בהליכי ההתקנה וההגדרה הראשוניים של +<a href="http://dokuwiki.org">Dokuwiki</a>. מידע נוסף על תכנית התקנה זו זמין בדף <a href="http://dokuwiki.org/installer">התיעוד שלו</a>.</p> -<p>DokuWiki עושה שימוש בקבצים רגילים לשמירת דפי ויקי ומידע נוסף הקשור לדפים אלו (לדוגמה תמונות, רשימות חיפוש, גרסאות קודמות וכו'). -לתפקוד תקין DokuWiki <strong>חייב</strong> גישה לכתיבה לתיקיות המכילות קבצים אלו. מתקין זה אינו יכול לקבוע הרשאות לתיקיות. -פעולה זו צריכה בד"כ להתבצע ישירות משורת הפקודה או במקרה שנעשה שימוש בשרת מארח דרך FTP או מנשק הניהול של המארח (cPanell לדוגמה).</p> +<p>DokuWiki עושה שימוש בקבצים רגילים לשמירת דפי ויקי ומידע נוסף הקשור לדפים אלו (לדוגמה: תמונות, רשימות חיפוש, גרסאות קודמות וכו׳). +לצורך תפקוד תקין DokuWiki <strong>חייב</strong> גישה לכתיבה לתיקיות המכילות קבצים אלו. תכנית התקנה זו אינה יכולה להגדיר הרשאות לתיקיות. +פעולה זו צריכה בד״כ להתבצע ישירות משורת הפקודה או במקרה שנעשה שימוש בשרת מארח דרך FTP או מנשק הניהול של המארח (cPanell לדוגמה).</p> -<p>מתקין זה יגדיר את תצורת ה-<acronym title="access control list">ACL</acronym> ב-DokuWiki שלך +<p>מתקין זה יגדיר את תצורת ה־<acronym title="access control list">ACL</acronym> ב-DokuWiki שלך , זה בתורו מאפשר גישת מנהל לתפריט הניהול של DokuWiki כדי להתקין הרחבות, לנהל משתמשים, לנהל גישות לדפי ויקי ושינויים בהגדרות התצורה. -אין הוא הכרחי לתפקוד DokuWiki אך הוא יהפוך את Dokuwiki קל יותר לניהול.</p> +אין הוא הכרחי לתפקוד DokuWiki אך הוא יהפוך את Dokuwiki לפשוט יותר לניהול.</p> -<p>על משתמשים מנוסים או כאלו עם דרישות מיוחדות להתקנה להשתמש בקישורים אלו לפרטים בנוגע ל<a href="http://dokuwiki.org/install">הוראות התקנה</a> ו<a href="http://dokuwiki.org/config">הגדרות תצורה</a>.</p> +<p>על משתמשים מנוסים או כאלו עם דרישות מיוחדות להתקנה להשתמש בקישורים אלו לפרטים בנוגע ל<a href="http://dokuwiki.org/install">הוראות התקנה</a> ול<a href="http://dokuwiki.org/config">הגדרות תצורה</a>.</p> diff --git a/inc/lang/he/lang.php b/inc/lang/he/lang.php index a411764d2..1a47ebcb8 100644 --- a/inc/lang/he/lang.php +++ b/inc/lang/he/lang.php @@ -6,10 +6,10 @@ * @link http://sourceforge.net/projects/hebdokuwiki/ * @author גיא שפר <guysoft@ort.org.il> * @author Denis Simakov <akinoame1@gmail.com> - * @author DoK <kamberd@yahoo.com> * @author Dotan Kamber <kamberd@yahoo.com> * @author Moshe Kaplan <mokplan@gmail.com> * @author Yaron Yogev <yaronyogev@gmail.com> + * @author Yaron Shahrabani <sh.yaron@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'rtl'; @@ -18,132 +18,153 @@ $lang['doublequoteclosing'] = '”'; $lang['singlequoteopening'] = '‘'; $lang['singlequoteclosing'] = '’'; $lang['apostrophe'] = '\''; -$lang['btn_edit'] = 'עריכה'; -$lang['btn_source'] = 'הצג את מקור הדף'; -$lang['btn_show'] = 'הצג דף'; +$lang['btn_edit'] = 'עריכת דף זה'; +$lang['btn_source'] = 'הצגת מקור הדף'; +$lang['btn_show'] = 'הצגת דף'; $lang['btn_create'] = 'יצירת דף'; -$lang['btn_search'] = 'חפש'; -$lang['btn_save'] = 'שמור'; +$lang['btn_search'] = 'חיפוש'; +$lang['btn_save'] = 'שמירה'; $lang['btn_preview'] = 'תצוגה מקדימה'; -$lang['btn_top'] = 'חזור למעלה'; -$lang['btn_newer'] = '<< יותר חדש'; -$lang['btn_older'] = 'פחות חדש >>'; +$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_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_admin'] = 'ניהול'; +$lang['btn_update'] = 'עדכון'; +$lang['btn_delete'] = 'מחיקה'; +$lang['btn_back'] = 'חזרה'; $lang['btn_backlink'] = 'קישורים לכאן'; -$lang['btn_backtomedia'] = 'לחזור לבחירת קובץ מדיה'; -$lang['btn_subscribe'] = 'עקוב אחרי שינוים'; -$lang['btn_unsubscribe'] = 'הפסק לעקוב'; -$lang['btn_subscribens'] = 'הרשמה לשינויים במרחב השם'; -$lang['btn_unsubscribens'] = 'הסרת הרשמה לשינויים במחב השם'; -$lang['btn_profile'] = 'עדכן פרופיל'; +$lang['btn_backtomedia'] = 'חזרה לבחירת קובץ מדיה'; +$lang['btn_subscribe'] = 'מעקב אחרי שינוים'; +$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['loggedinas'] = 'רשום כ-'; +$lang['btn_revert'] = 'שחזור'; +$lang['btn_register'] = 'הרשמה'; +$lang['loggedinas'] = 'נכנסת בשם'; $lang['user'] = 'שם משתמש'; -$lang['pass'] = 'סיסמה'; -$lang['newpass'] = 'סיסמה חדשה'; -$lang['oldpass'] = 'אשר את הסיסמה הנוכחית'; -$lang['passchk'] = 'שוב'; -$lang['remember'] = 'זכור אותי'; +$lang['pass'] = 'ססמה'; +$lang['newpass'] = 'ססמה חדשה'; +$lang['oldpass'] = 'אישור הססמה הנוכחית'; +$lang['passchk'] = 'פעם נוספת'; +$lang['remember'] = 'שמירת הפרטים שלי'; $lang['fullname'] = 'שם מלא'; -$lang['email'] = 'דוא"ל'; -$lang['register'] = 'הרשמה'; -$lang['profile'] = 'פרופיל'; -$lang['badlogin'] = 'סליחה, שם המשתמש או הסיסמה שגויים'; -$lang['minoredit'] = 'שינוים מינוריים'; -$lang['draftdate'] = 'טיוטה נשמרה ב-'; +$lang['email'] = 'דוא״ל'; +$lang['profile'] = 'פרופיל המשתמש'; +$lang['badlogin'] = 'שם המשתמש או הססמה שגויים, עמך הסליחה'; +$lang['minoredit'] = 'שינוים מזעריים'; +$lang['draftdate'] = 'הטיוטה נשמרה אוטומטית ב־'; $lang['nosecedit'] = 'הדף השתנה בינתיים, הקטע שערכת אינו מעודכן - העמוד כולו נטען במקום זאת.'; -$lang['regmissing'] = 'סליחה, עליך למלא את כל השדות'; -$lang['reguexists'] = 'סליחה, משתמש בשם זה כבר נרשם'; -$lang['regsuccess'] = 'הרשמה הצליחה, המשתמש נרשם והודעה נשלחה בדואר'; -$lang['regsuccess2'] = 'הרשמה הצליחה, המשתמש נרשם.'; -$lang['regmailfail'] = 'שליחת הודעת הדואר כשלה, נא ליצור קשר עם מנהל האתר'; -$lang['regbadmail'] = 'כתובת דואר כנראה לא תקפה, אם לא כך היא יש ליצור קשר עם מנהל האתר'; -$lang['regbadpass'] = 'שתי הסיסמות הן לא זהות, נא לנסות שוב'; -$lang['regpwmail'] = 'סיסמת הדוקוויקי שלך'; -$lang['reghere'] = 'עדיין ללא שם-משתמש? ההרשמה כאן'; +$lang['regmissing'] = 'עליך למלא את כל השדות, עמך הסליחה.'; +$lang['reguexists'] = 'משתמש בשם זה כבר נרשם, עמך הסליחה.'; +$lang['regsuccess'] = 'ההרשמה הצליחה, המשתמש נרשם והודעה נשלחה בדוא״ל.'; +$lang['regsuccess2'] = 'ההרשמה הצליחה, המשתמש נוצר.'; +$lang['regmailfail'] = 'שליחת הודעת הדוא״ל כשלה, נא ליצור קשר עם מנהל האתר!'; +$lang['regbadmail'] = 'יתכן כי כתובת הדוא״ל אינה תקפה, אם לא כך הדבר ליצור קשר עם מנהל האתר'; +$lang['regbadpass'] = 'שתי הססמאות אינן זהות זו לזו, נא לנסות שוב.'; +$lang['regpwmail'] = 'ססמת הדוקוויקי שלך'; +$lang['reghere'] = 'עדיין אין לך חשבון? ההרשמה כאן'; $lang['profna'] = 'בוויקי הזה לא ניתן לשנות פרופיל'; -$lang['profnochange'] = 'אין שינוים, פרופיל לא עודכן'; -$lang['profnoempty'] = 'שם וכתובת דוא"ל לא יכולים להיות ריקים'; -$lang['profchanged'] = 'פרופיל עודכן בהצלחה'; -$lang['pwdforget'] = 'שכחת סיסמה? קבל חדשה'; -$lang['resendna'] = 'הוויקי הזה לא תומך בחידוש סיסמה'; -$lang['resendpwd'] = 'שלח סיסמה חדשה עבור'; -$lang['resendpwdmissing'] = 'סליחה, עליך למלא את כל השדות'; -$lang['resendpwdnouser'] = 'סליחה, משתמש בשם זה לא נמצא'; -$lang['resendpwdbadauth'] = 'סליחה, קוד אימות זה אינו תקף. יש לודא כי נעשה שימוש במלוא קישור האימות.'; -$lang['resendpwdconfirm'] = 'קישור אימות נשלח בדוא"ל.'; -$lang['resendpwdsuccess'] = 'סיסמה חדשה נשלחה בדואר'; -$lang['license'] = 'למעט מקרים בהם צוין אחרת, התוכן בוויקי זה זמין לפי הרשיון הבא:'; -$lang['licenseok'] = 'שים לב: עריכת דף זה מהווה הסכמה מצידך להצגת התוכן שהוספת לפי הרשיון הבא:'; -$lang['searchmedia'] = 'חפש שם קובץ:'; -$lang['txt_upload'] = 'בחר קובץ להעלות'; -$lang['txt_filename'] = 'הכנס שם לוויקי (בחירה)'; -$lang['txt_overwrt'] = 'לכתוב במקום קובץ קיים'; +$lang['profnochange'] = 'אין שינויים, הפרופיל לא עודכן'; +$lang['profnoempty'] = 'השם וכתובת הדוא״ל לא יכולים להיות ריקים'; +$lang['profchanged'] = 'הפרופיל עודכן בהצלחה'; +$lang['pwdforget'] = 'שכחת את הססמה שלך? ניתן לקבל חדשה'; +$lang['resendna'] = 'הוויקי הזה אינו תומך בחידוש ססמה'; +$lang['resendpwd'] = 'שליחת ססמה חדשה עבור'; +$lang['resendpwdmissing'] = 'עליך למלא את כל השדות, עמך הסליחה.'; +$lang['resendpwdnouser'] = 'משתמש בשם זה לא נמצא במסד הנתונים, עמך הסליחה.'; +$lang['resendpwdbadauth'] = 'קוד אימות זה אינו תקף. יש לוודא כי נעשה שימוש בקישור האימות המלא, עמך הסליחה.'; +$lang['resendpwdconfirm'] = 'נשלח קישור לאימות נשלח בדוא״ל.'; +$lang['resendpwdsuccess'] = 'נשלחה ססמה חדשה בדוא״ל'; +$lang['license'] = 'למעט מקרים בהם צוין אחרת, התוכן בוויקי זה זמין לפי הרישיון הבא:'; +$lang['licenseok'] = 'נא לשים לב: עריכת דף זה מהווה הסכמה מצדך להצגת התוכן שהוספת בהתאם הרישיון הבא:'; +$lang['searchmedia'] = 'חיפוש שם קובץ:'; +$lang['searchmedia_in'] = 'חיפוש תחת %s'; +$lang['txt_upload'] = 'בחירת קובץ להעלות'; +$lang['txt_filename'] = 'העלאה בשם (נתון לבחירה)'; +$lang['txt_overwrt'] = 'שכתוב על קובץ קיים'; $lang['lockedby'] = 'נעול על ידי'; -$lang['lockexpire'] = 'נעילה פגה'; -$lang['willexpire'] = 'נעילה תחלוף עוד זמן קצר. \nלמניעת התנגשויות יש להשתמש בכפתור הרענון מטה כדי לאתחל את הנעילה שנית'; -$lang['js']['notsavedyet'] = "קיימים שינויים שטרם נשמרו ואשר יאבדו \n האם להמשיך?"; -$lang['rssfailed'] = 'כשל ב-RSS'; -$lang['nothingfound'] = 'לא נמצאו תוצאות'; -$lang['mediaselect'] = 'בחירת קובץ מדיה'; -$lang['fileupload'] = 'העלאת קובץ מדיה'; -$lang['uploadsucc'] = 'העלאת הקובץ בוצעה בהצלחה'; -$lang['uploadfail'] = 'קרתה שגיאה בעת העלאת הקובץ. תיתכן ובעייה זו נוצרה עקב הרשאות שגיות.'; -$lang['uploadwrong'] = 'העלאה לא אושרה. קבצים בסיומת זו אסורים'; -$lang['uploadexist'] = 'הקובץ כבר קיים. פעולה בוטלה'; +$lang['lockexpire'] = 'הנעילה פגה'; +$lang['willexpire'] = 'הנעילה תחלוף עוד זמן קצר. \nלמניעת התנגשויות יש להשתמש בכפתור הרענון מטה כדי לאפס את מד משך הנעילה.'; +$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'] = 'קישור לכונני שיתוף של Windows עובד רק באמצעות Microsoft Internet Explorer. +עדיין ניתן להעתיק ולהדביק את הקישור.'; +$lang['js']['linkwiz'] = 'אשף הקישורים'; +$lang['js']['linkto'] = 'קישור אל:'; +$lang['js']['del_confirm'] = 'באמת למחוק?'; +$lang['js']['mu_btn'] = 'העלאת מספר קבצים יחד'; +$lang['rssfailed'] = 'אירע כשל בעת קבלת הזנה זו:'; +$lang['nothingfound'] = 'לא נמצאו תוצאות.'; +$lang['mediaselect'] = 'קובצי מדיה'; +$lang['fileupload'] = 'העלאת קובצי מדיה'; +$lang['uploadsucc'] = 'ההעלאה הושלמה בהצלחה'; +$lang['uploadfail'] = 'אירעה שגיאה בעת העלאת הקובץ. היתכן שתקלה זו נוצרה עקב הרשאות שגיות?'; +$lang['uploadwrong'] = 'ההעלאה לא אושרה. קבצים בסיומת זו אסורים!'; +$lang['uploadexist'] = 'הקובץ כבר קיים. הפעולה בוטלה.'; $lang['uploadbadcontent'] = 'התוכן שהועלה לא תאם את הסיומת %s של הקובץ.'; -$lang['uploadspam'] = 'ההעלאה נחסמה על ידי הרשימה השחורה של הספאם.'; +$lang['uploadspam'] = 'ההעלאה נחסמה על ידי רשימת חסימת הספאם.'; $lang['uploadxss'] = 'ההעלאה נחסמה בשל חשד לתוכן זדוני.'; -$lang['uploadsize'] = 'הקובץ שהועלה היה גדול מדי. (מקסימום %s)'; -$lang['deletesucc'] = 'קובץ %s נמחק'; -$lang['deletefail'] = 'לא יכולתי למחוק "%s" -- בדקו הרשאות'; -$lang['mediainuse'] = 'קובץ "%s" לא נמחק - הוא עדיין בשימוש'; +$lang['uploadsize'] = 'הקובץ שהועלה היה גדול מדי. (%s לכל היותר)'; +$lang['deletesucc'] = 'הקובץ %s נמחק.'; +$lang['deletefail'] = 'לא ניתן למחוק את "%s" -- נא לבדוק את ההרשאות.'; +$lang['mediainuse'] = 'הקובץ "%s" לא נמחק - הוא עדיין בשימוש.'; $lang['namespaces'] = 'שמות מתחם'; -$lang['mediafiles'] = 'קבצים זמינים ב-'; -$lang['js']['searchmedia'] = 'חיפוש קבצים'; -$lang['js']['keepopen'] = 'השאר חלון פתוח בבחירה'; -$lang['js']['hidedetails'] = 'הסתר פרטים'; -$lang['js']['nosmblinks'] = ':( קישור למערכת קבצים של חלונות פועל רק בדפדפן אינטרנט אקספלורר. - זה בסדר, אין צורך לעבור. אפשר להעתיק ולהדביק את הקישור'; -$lang['js']['linkwiz'] = 'אשף הקישורים'; -$lang['js']['linkto'] = 'קשר אל:'; -$lang['js']['del_confirm'] = 'באמת למחוק?'; -$lang['js']['mu_btn'] = 'העלאת קבצים מרובים'; -$lang['mediausage'] = 'השתמש בתחביר הבא להתיחסות אל קובץ זה:'; -$lang['mediaview'] = 'הצג את הקובץ המקורי'; +$lang['mediafiles'] = 'קבצים זמינים תחת'; +$lang['accessdenied'] = 'אין לך הרשאה לצפות בדף זה.'; +$lang['mediausage'] = 'יש להשתמש בתחביר הבא כדי להפנות לקובץ זה:'; +$lang['mediaview'] = 'הצגת הקובץ המקורי'; $lang['mediaroot'] = 'root'; -$lang['mediaupload'] = 'כאן ניתן להעלות קובץ למרחב השמות הנוכחי. ליצירת תתי-מרחבי שמות צרפם ב-"העלה" לתחילת שם הקובץ מופרדים בפסיקים'; -$lang['mediaextchange'] = 'סיומת הקובץ השתנתה מ-.%s ל-.%s!'; -$lang['reference'] = 'קישורים ל'; +$lang['mediaupload'] = 'כאן ניתן להעלות קובץ למרחב השם הנוכחי. ליצירת תת־מרחבי שם יש לצרף אותם לתחילת שם הקובץ, מופרדים בפסיקים, בשם הקובץ תחת "העלאה בתור".'; +$lang['mediaextchange'] = 'סיומת הקובץ השתנתה מ־.%s ל־.%s!'; +$lang['reference'] = 'הפניות אל'; $lang['ref_inuse'] = 'לא ניתן למחוק קובץ זה, כיוון שהדפים הבאים עדיין משתמשים בו:'; -$lang['ref_hidden'] = 'יש קישורים לדפים ללא הרשאת קריאה'; -$lang['hits'] = 'פגיעות'; -$lang['quickhits'] = 'דפים שנמצאו'; +$lang['ref_hidden'] = 'חלק מההפניות נמצאות בדפים שאין לך הרשאות לקרוא אותם'; +$lang['hits'] = 'ביקורים'; +$lang['quickhits'] = 'שמות דפים שנמצאו'; $lang['toc'] = 'תוכן עניינים'; -$lang['current'] = 'גירסה נוכחית'; +$lang['current'] = 'הגרסה הנוכחית'; $lang['yours'] = 'הגרסה שלך'; -$lang['diff'] = 'הצג שינוים מגרסה זו ועד הנוכחית'; +$lang['diff'] = 'הצגת שינוים מגרסה זו ועד הנוכחית'; $lang['diff2'] = 'הצגת הבדלים בין הגרסאות שנבחרו'; +$lang['difflink'] = 'קישור לתצוגה השוואה זו'; $lang['line'] = 'שורה'; $lang['breadcrumb'] = 'ביקורים אחרונים'; -$lang['youarehere'] = 'אתה נמצא כאן'; -$lang['lastmod'] = 'שונה לאחרונה ב'; +$lang['youarehere'] = 'זהו מיקומך'; +$lang['lastmod'] = 'מועד השינוי האחרון'; $lang['by'] = 'על ידי'; $lang['deleted'] = 'נמחק'; $lang['created'] = 'נוצר'; @@ -151,9 +172,10 @@ $lang['restored'] = 'שוחזר'; $lang['external_edit'] = 'עריכה חיצונית'; $lang['summary'] = 'תקציר העריכה'; $lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">תוסף פלאש לדפדפן</a> נדרש כדי להציג תוכן זה.'; -$lang['download'] = 'הורד מקטע'; +$lang['download'] = 'הורדת מקטע'; $lang['mail_newpage'] = 'דף נוסף:'; $lang['mail_changed'] = 'דף שונה:'; +$lang['mail_subscribe_list'] = 'דפים שהשתנו במרחב השם:'; $lang['mail_new_user'] = 'משתמש חדש:'; $lang['mail_upload'] = 'קובץ הועלה:'; $lang['qb_bold'] = 'טקסט מודגש'; @@ -167,7 +189,7 @@ $lang['qb_h3'] = 'כותרת רמה 3'; $lang['qb_h4'] = 'כותרת רמה 4'; $lang['qb_h5'] = 'כותרת רמה 5'; $lang['qb_h'] = 'כותרת'; -$lang['qb_hs'] = 'בחירת כותרת'; +$lang['qb_hs'] = 'כותרת נבחרת'; $lang['qb_hplus'] = 'כותרת ברמה גבוהה יותר'; $lang['qb_hminus'] = 'כותרת ברמה נמוכה יותר'; $lang['qb_hequal'] = 'כותרת באותה רמה'; @@ -175,73 +197,85 @@ $lang['qb_link'] = 'קישור פנימי'; $lang['qb_extlink'] = 'קישור חיצוני'; $lang['qb_hr'] = 'קו אופקי'; $lang['qb_ol'] = 'איבר ברשימה ממוספרת'; -$lang['qb_ul'] = 'אבר ברשימה לא ממוספרת'; -$lang['qb_media'] = 'תמונות או קובץ אחר'; -$lang['qb_sig'] = 'הזנת חתימה'; -$lang['qb_smileys'] = 'פרצופונים'; -$lang['qb_chars'] = 'סימנים מיוחדים'; -$lang['upperns'] = 'עבור למרחב השם שברמה שמעל הנוכחית'; -$lang['admin_register'] = 'להוסיף משתמש חדש'; -$lang['metaedit'] = 'ערוך נתונים'; -$lang['metasaveerr'] = 'כשל בשמירת נתונים'; -$lang['metasaveok'] = 'נתונים נשמרו'; -$lang['img_backto'] = 'הזור ל'; -$lang['img_title'] = 'כותרת'; -$lang['img_caption'] = 'תיאור'; +$lang['qb_ul'] = 'איבר ברשימה לא ממוספרת'; +$lang['qb_media'] = 'תמונות וקבצים אחרים'; +$lang['qb_sig'] = 'הוספת חתימה'; +$lang['qb_smileys'] = 'חייכנים'; +$lang['qb_chars'] = 'תווים מיוחדים'; +$lang['upperns'] = 'מעבר למרחב השם שברמה שמעל הנוכחית'; +$lang['admin_register'] = 'הוספת משתמש חדש'; +$lang['metaedit'] = 'עריכת נתוני העל'; +$lang['metasaveerr'] = 'אירע כשל בשמירת נתוני העל'; +$lang['metasaveok'] = 'נתוני העל נשמרו'; +$lang['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_copyr'] = 'זכויות יוצרים'; +$lang['img_format'] = 'מבנה'; $lang['img_camera'] = 'מצלמה'; $lang['img_keywords'] = 'מילות מפתח'; -$lang['subscribe_success'] = '%s נוסף לרשימת המכותבים עבור %s'; -$lang['subscribe_error'] = 'שגיאה בהוספת %s לרשימת המכותבים עבור %s'; -$lang['subscribe_noaddress'] = 'אין כתובת המשויכת לרישום שלך ולכן אין באפשרותך להצטרף לרשימת המכותבים'; -$lang['unsubscribe_success'] = '%s הוסר מרשימת המכותבים עבור %s'; -$lang['unsubscribe_error'] = 'שגיאה בהסרת %s מרשימת המכותבים עבור %s'; -$lang['authmodfailed'] = 'תצורת אימות משתמשים גרועה. נא לדווח למנהל הויקי.'; -$lang['authtempfail'] = 'אימות משתמשים אינו זמין כרגע. אם מצב זה נמשך נא להודיע למנהל הויקי.'; +$lang['subscr_subscribe_success'] = '%s נוסף לרשימת המינויים לדף %s'; +$lang['subscr_subscribe_error'] = 'אירעה שגיאה בהוספת %s לרשימת המינויים לדף %s'; +$lang['subscr_subscribe_noaddress'] = 'אין כתובת המשויכת עם הכניסה שלך, נא ניתן להוסיף אותך לרשימת המינויים'; +$lang['subscr_unsubscribe_success'] = 'המשתמש %s הוסר מרשימת המינויים לדף %s'; +$lang['subscr_unsubscribe_error'] = 'אירעה שגיאה בהסרת %s מרשימת המינויים לדף %s'; +$lang['subscr_already_subscribed'] = 'המשתמש %s כבר מנוי לדף %s'; +$lang['subscr_not_subscribed'] = 'המשתמש %s איננו רשום לדף %s'; +$lang['subscr_m_not_subscribed'] = 'המשתמש שלך אינו רשום, נכון לעכשיו, לדף הנוכחי או למרחב השם.'; +$lang['subscr_m_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 ימים)'; +$lang['authmodfailed'] = 'תצורת אימות המשתמשים אינה תקינה. נא ליידע את מנהל הוויקי.'; +$lang['authtempfail'] = 'אימות משתמשים אינו זמין כרגע. אם מצב זה נמשך נא ליידע את מנהל הוויקי.'; $lang['i_chooselang'] = 'נא לבחור שפה'; -$lang['i_installer'] = 'DokuWiki Installer'; -$lang['i_wikiname'] = 'שם הויקי'; -$lang['i_enableacl'] = 'אפשר ACL (מומלץ)'; -$lang['i_superuser'] = 'משתמש-על'; -$lang['i_problems'] = 'המתקין זיהה מספר בעיות המצוינות מטה. אין באפשרותך להמשיך לפני תיקונן.'; -$lang['i_modified'] = 'משיקולי אבטחה תסריט זה יעבוד אך ורק עם התקנת DokuWiki חדשה שלא עברה כל שינוי. - עליך לחלץ שנית את הקבצים מהחבילה שהורדה או להעזר בדף +$lang['i_installer'] = 'תכנית ההתקנה של DokuWiki'; +$lang['i_wikiname'] = 'שם הוויקי'; +$lang['i_enableacl'] = 'הפעלת ACL (מומלץ)'; +$lang['i_superuser'] = 'משתמש־על'; +$lang['i_problems'] = 'תכנית ההתקנה זיהתה מספר בעיות המפורטות להלן. אין באפשרותך להמשיך לפני תיקונן.'; +$lang['i_modified'] = 'משיקולי אבטחה סקריפט זה יעבוד אך ורק עם התקנת DokuWiki חדשה שלא עברה כל שינוי. + עליך לחלץ שנית את הקבצים מהחבילה שהורדה או להיעזר בדף <a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>'; -$lang['i_funcna'] = 'פונקצית ה-PHP <code>%s</code> אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?'; -$lang['i_phpver'] = 'גרסת ה-PHP שלך <code>%s</code> נמוכה מהדרוש. עליך לשדרג את התקנת ה-PHP'; -$lang['i_permfail'] = '<code>%s</code> אינה ברת כתיבה על ידי DokuWiki. עליך לשנות הרשאות ספריה זו!'; +$lang['i_funcna'] = 'פונקציית ה-PHP‏ <code>%s</code> אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?'; +$lang['i_phpver'] = 'גרסת ה־PHP שלך <code>%s</code> נמוכה מהדרוש. עליך לשדרג את התקנת ה־PHP שלך.'; +$lang['i_permfail'] = '<code>%s</code> אינה ניתנת לכתיבה על ידי DokuWiki. עליך לשנות הרשאות תיקייה זו!'; $lang['i_confexists'] = '<code>%s</code> כבר קיים'; -$lang['i_writeerr'] = 'אין אפשרות ליצור את <code>%s</code>. נא לבדוק את הרשאות הקובץ/ספריה וליצור את הקובץ ידנית.'; -$lang['i_badhash'] = 'קובץ Dokuwiki.php לא מזוהה או שעבר שינויים (hash=<code>%s</code>)'; -$lang['i_badval'] = '<code>%s</code> - ערך לא חוקי או ריק'; -$lang['i_success'] = 'ההגדרה הסתימה בהצלחה. באפשרותך למחוק עתה את הקובץ install.php ולהמשיך אל <a href="doku.php">DokuWiki החדש שלך</a>.'; -$lang['i_failure'] = 'מספר שגיאות ארעו בעת כתיבת קבצי התצורה. ייתכן כי יהיה צורך לתקנם ידנית לפני שניתן יהיה להשתמש ב<a href="doku.php">DokuWiki החדש שלך</a>.'; -$lang['i_policy'] = 'מדיניות ACL תחילית'; +$lang['i_writeerr'] = 'אין אפשרות ליצור את <code>%s</code>. נא לבדוק את הרשאות הקובץ/תיקייה וליצור את הקובץ ידנית.'; +$lang['i_badhash'] = 'הקובץ Dokuwiki.php אינו מזוהה או שעבר שינויים (hash=<code>%s</code>)'; +$lang['i_badval'] = '<code>%s</code> - הערך אינו חוקי או ריק'; +$lang['i_success'] = 'תהליך ההגדרה הסתיים בהצלחה. כעת ניתן למחוק את הקובץ install.php ולהמשיך אל ה־<a href="doku.php">DokuWiki החדש שלך</a>.'; +$lang['i_failure'] = 'מספר שגיאות אירעו בעת כתיבת קובצי התצורה. יתכן כי יהיה צורך לתקנם ידנית לפני שניתן יהיה להשתמש ב־<a href="doku.php">DokuWiki החדש שלך</a>.'; +$lang['i_policy'] = 'מדיניות ACL התחלתית'; $lang['i_pol0'] = 'ויקי פתוח (קריאה, כתיבה והעלאה לכולם)'; $lang['i_pol1'] = ' ויקי ציבורי (קריאה לכולם, כתיבה והעלאה למשתמשים רשומים)'; $lang['i_pol2'] = 'ויקי סגור (קריאה, כתיבה והעלאה למשתמשים רשומים בלבד)'; -$lang['i_retry'] = 'נסיון נוסף'; -$lang['mu_intro'] = 'כאן תוכל להעלות קבצים מרובים. לחץ על כפתור החיפוש להוסיף אותם למחסנית. לחץ על העלאה לסיום.'; -$lang['mu_gridname'] = 'שם קובץ'; +$lang['i_retry'] = 'ניסיון נוסף'; +$lang['i_license'] = 'נא לבחור את הרישיון שיחול על התוכן שבוויקי שלך:'; +$lang['mu_intro'] = 'דרך כאן ניתן להעלות מספר קבצים בבת אחת. יש ללחוץ על לחצן החיפוש להוסיף אותם למחסנית. ניתן ללחוץ על העלאה לסיום.'; +$lang['mu_gridname'] = 'שם הקובץ'; $lang['mu_gridsize'] = 'גודל'; -$lang['mu_gridstat'] = 'סטאטןס'; +$lang['mu_gridstat'] = 'מצב'; $lang['mu_namespace'] = 'מרחב שם'; $lang['mu_browse'] = 'חיפוש'; $lang['mu_toobig'] = 'גדול מדי'; -$lang['mu_ready'] = 'מוכן להעלאה'; -$lang['mu_done'] = 'סיים'; +$lang['mu_ready'] = 'בהמתנה להעלאה'; +$lang['mu_done'] = 'הסתיים'; $lang['mu_fail'] = 'נכשל'; -$lang['mu_authfail'] = 'תקוף נעילת עריכה פג'; +$lang['mu_authfail'] = 'תוקף ההפעלה פג'; $lang['mu_progress'] = '@PCT@% הועלה'; $lang['mu_filetypes'] = 'סוגי קבצים מורשים'; $lang['mu_info'] = 'הקבצים הועלו'; $lang['mu_lasterr'] = 'שגיאה אחרונה:'; -$lang['recent_global'] = 'אתה צופה כעת בשינויים בתוך מרחב השם <b>%s</b>. אתה יכול גם <a href="%s">לצפות בשינויים האחרונים של כל הוויקי </a>.'; +$lang['recent_global'] = 'נכון לעכשיו מתנהל על ידיך מעקב אחר מרחב השם <b>%s</b>. כמו כן, באפשרותך <a href="%s">לצפות בשינויים האחרונים בוויקי כולו</a>.'; $lang['years'] = 'לפני %d שנים'; $lang['months'] = 'לפני %d חודשים'; $lang['weeks'] = 'לפני %d שבועות'; @@ -249,3 +283,4 @@ $lang['days'] = 'לפני %d ימים'; $lang['hours'] = 'לפני %d שעות'; $lang['minutes'] = 'לפני %d דקות'; $lang['seconds'] = 'לפני %d שניות'; +$lang['wordblock'] = 'השינויים שלך לא נשמרו כיוון שהם מכילים טקסט חסום (ספאם).'; diff --git a/inc/lang/he/mailtext.txt b/inc/lang/he/mailtext.txt index d7990b2b3..222ee1b6d 100644 --- a/inc/lang/he/mailtext.txt +++ b/inc/lang/he/mailtext.txt @@ -1,17 +1,17 @@ -דף בDokuWiki נוסף או שונה. הנה הפרטים: +דף בDokuWiki נוסף או שונה. להלן הפרטים: -Date : @DATE@ -Browser : @BROWSER@ -IP-Address : @IPADDRESS@ -Hostname : @HOSTNAME@ -Old Revision: @OLDPAGE@ -New Revision: @NEWPAGE@ -Edit Summary: @SUMMARY@ -User : @USER@ +תאריך : @DATE@ +דפדפן : @BROWSER@ +כתובת ה־IP‏ : @IPADDRESS@ +שם המארח : @HOSTNAME@ +המהדורה הישנה: @OLDPAGE@ +המהדורה החדשה: @NEWPAGE@ +תקציר העריכה: @SUMMARY@ +משתמש : @USER@ @DIFF@ -- -דף זה נוצר ע"י DokuWiki ב- +דף זה נוצר ע״י ה־DokuWiki הזמין בכתובת @DOKUWIKIURL@ diff --git a/inc/lang/he/password.txt b/inc/lang/he/password.txt index 29742ebda..745c5cb5c 100644 --- a/inc/lang/he/password.txt +++ b/inc/lang/he/password.txt @@ -1,10 +1,10 @@ שלום @FULLNAME@! -הנה נתוני המשתמש שלך עבור @TITLE@ ב- @DOKUWIKIURL@ +הנה נתוני המשתמש שלך עבור @TITLE@ ב־@DOKUWIKIURL@ -כניסה : @LOGIN@ -סיסמה : @PASSWORD@ +שם כניסה : @LOGIN@ +ססמה : @PASSWORD@ -- -מכתב זה נוצר על ידי דוקוויקי ב- +מכתב זה נוצר על ידי ה־DokuWiki הזמין בכתובת @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/he/pwconfirm.txt b/inc/lang/he/pwconfirm.txt index 255195c7f..7dc46c340 100644 --- a/inc/lang/he/pwconfirm.txt +++ b/inc/lang/he/pwconfirm.txt @@ -1,13 +1,13 @@ שלום @FULLNAME@! -מישהו ביקש סיסמה חדשה עבור הכניסה שלך ל-@TITLE@ ב-@DOKUWIKIURL@ +מישהו ביקש ססמה חדשה עבור שם הכניסה שלך לוויקי @TITLE@ בכתובת @DOKUWIKIURL@ -אם לא ביקשת סיסמה חדשה פשוט התעלם מדוא"ל זה. +אם לא ביקשת ססמה חדשה באפשרותך פשוט להתעלם מהודעת דוא״ל זו. -כדי לאשר שהבקשה באמת נשלחה על ידך נא השתמש בקישור הבא. +כדי לאשר שהבקשה באמת נשלחה על ידך עליך השתמש בקישור הבא. @CONFIRM@ -- -דואר זה נוצר על ידי DokuWiki ב- +הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki הזמין בכתובת @DOKUWIKIURL@ diff --git a/inc/lang/he/read.txt b/inc/lang/he/read.txt index 8e4c177ee..18efc5e03 100644 --- a/inc/lang/he/read.txt +++ b/inc/lang/he/read.txt @@ -1,2 +1,2 @@ -דף זה הוא דף לקריאה בלבד. ניתן לצפות בקוד המקור שלו, אבל לא ניתן לערוך אותו. ניתן לפנות אל מנהל הויקי אם לדעתך נפלה טעות. +דף זה הוא דף לקריאה בלבד. ניתן לצפות בקוד המקור שלו, אך לא ניתן לערוך אותו. ניתן לפנות למנהל הוויקי אם לדעתך נפלה טעות. diff --git a/inc/lang/he/register.txt b/inc/lang/he/register.txt index 7225b02fd..c4dfad752 100644 --- a/inc/lang/he/register.txt +++ b/inc/lang/he/register.txt @@ -1,3 +1,3 @@ ====== הרשמה כמשתמש חדש ====== -יש למלא את כל המידע מטה כדי ליצור חשבון חדש בויקי זה. יש לודא כי מוזנת **כתובת דוא"ל תקפה**- סיסמתך החדשה תשלח לכתובת זו\\ על שם המשתמש להיות [[hdoku>ויקי:שם דף|שם דף]] תקף. +יש למלא את כל המידע להלן כדי ליצור חשבון חדש בוויקי זה. עליך לוודא כי הזנת **כתובת דוא״ל תקפה**- ססמתך החדשה תשלח לכתובת זו. על שם המשתמש להיות [[hdoku>ויקי:שם דף|שם דף]] תקף. diff --git a/inc/lang/he/registermail.txt b/inc/lang/he/registermail.txt index bb64a8158..3edca3fa0 100644 --- a/inc/lang/he/registermail.txt +++ b/inc/lang/he/registermail.txt @@ -1,14 +1,14 @@ -משתמש חדש נרשם. הנה הפרטים: +משתמש חדש נרשם. להלן הפרטים: שם משתמש : @NEWUSER@ שם מלא : @NEWNAME@ -דוא"ל : @NEWEMAIL@ +דוא״ל : @NEWEMAIL@ תאריך : @DATE@ דפדפן : @BROWSER@ -כתובת רשת : @IPADDRESS@ -שם המחשב : @HOSTNAME@ +כתובת IP‏ : @IPADDRESS@ +שם המארח : @HOSTNAME@ -- -דוא"ל זה נוצר על ידי DokuWiki ב- +הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki הזמין בכתובת @DOKUWIKIURL@ diff --git a/inc/lang/he/resendpwd.txt b/inc/lang/he/resendpwd.txt index 47e7749c2..8ca27207b 100644 --- a/inc/lang/he/resendpwd.txt +++ b/inc/lang/he/resendpwd.txt @@ -1,4 +1,4 @@ -====== שליחת סיסמה חדשה ====== +====== שליחת ססמה חדשה ====== -יש להזין את שם המשתמש בטופס מטה ולבקש סיסמה חדשה לחשבון שלך בויקי זה. קישור לאימות ישלח לכתובת הדו"ל איתה נרשמת. +יש להזין את שם המשתמש בטופס מטה ולבקש ססמה חדשה לחשבון שלך בוויקי זה. הקישור לאימות יישלח לכתובת הדוא״ל באמצעותה נרשמת. diff --git a/inc/lang/he/subscr_digest.txt b/inc/lang/he/subscr_digest.txt new file mode 100644 index 000000000..af5220229 --- /dev/null +++ b/inc/lang/he/subscr_digest.txt @@ -0,0 +1,20 @@ +שלום! + +הדף @PAGE@ שבאתר הוויקי @TITLE@ השתנה. +להלן השינויים: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +המהדורה הישנה: @OLDPAGE@ +המהדורה החדשה: @NEWPAGE@ + +כדי לבטל את ההתרעות לשינויי העמוד, יש להיכנס לאתר הוויקי בכתובת +@DOKUWIKIURL@ ואז לבקר באגף +@SUBSCRIBE@ +ולבטל את המינוי לשינויים בדף ו/או במרחב השם. + +-- +הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki שבכתובת +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/he/subscr_single.txt b/inc/lang/he/subscr_single.txt new file mode 100644 index 000000000..123b186c8 --- /dev/null +++ b/inc/lang/he/subscr_single.txt @@ -0,0 +1,22 @@ +שלום! + +הדף @PAGE@ באתר הוויקי @TITLE@ השתנה. + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +תאריך : @DATE@ +משתמש : @USER@ +תקציר העריכה: @SUMMARY@ +המהדורה הישנה: @OLDPAGE@ +המהדורה החדשה: @NEWPAGE@ + +לביטול התרעות בנוגע לעמוד, יש להיכנס לאתר הוויקי בכתובת +@DOKUWIKIURL@ ואז לבקר בדף +@NEWPAGE@ +ולבטל את המינוי לקבלת שינויים בדף ו/או במרחב השם. + +-- +הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki הזמין בכתובת +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/he/subscribermail.txt b/inc/lang/he/subscribermail.txt deleted file mode 100644 index 7b05c4f47..000000000 --- a/inc/lang/he/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -שלום! - -הדף @PAGE@ בויקי @TITLE@ השתנה. -הנה השינויים: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -כדי להפסיק את ההרשמה לדף זה יש להכנס לויקי ב- -@DOKUWIKIURL@ לבקר בדף -@NEWPAGE@ -ולבחור 'הפסק לעקוב'. - --- -דוא"ל זה נוצר על ידי DokuWiki ב- -@DOKUWIKIURL@ diff --git a/inc/lang/hi/lang.php b/inc/lang/hi/lang.php index 044d7d5a4..00e5589d8 100644 --- a/inc/lang/hi/lang.php +++ b/inc/lang/hi/lang.php @@ -9,6 +9,7 @@ * * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesHi.php?view=co * @author Abhinav Tyagi <abhinavtyagi11@gmail.com> + * @author yndesai@gmail.com */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -41,6 +42,8 @@ $lang['btn_delete'] = 'मिटाना'; $lang['btn_back'] = 'पीछे'; $lang['btn_backlink'] = 'पिछली कड़ियाँ'; $lang['btn_backtomedia'] = 'मीडिया फाइल चयन पर पीछे जायें'; +$lang['btn_subscribe'] = 'सदस्यता प्रबंधन'; +$lang['btn_profile'] = 'परिचय संपादित करें'; $lang['user'] = 'उपयोगकर्ता का नाम'; $lang['pass'] = 'गुप्त शब्द'; $lang['newpass'] = 'नव गुप्त शब्द'; @@ -64,10 +67,10 @@ $lang['txt_filename'] = 'के रूप में अपलोड क $lang['txt_overwrt'] = 'अधिलेखित उपस्थित फ़ाइल'; $lang['lockedby'] = 'इस समय तक बंद'; $lang['lockexpire'] = 'बंद समाप्त होगा'; +$lang['js']['hidedetails'] = 'विवरण छिपाएँ'; $lang['nothingfound'] = 'कुच्छ नहीं मिला |'; $lang['uploadexist'] = 'फ़ाइल पहले से उपस्थित है. कुछ भी नहीं किया |'; $lang['mediafiles'] = 'उपलब्ध फाइलों में'; -$lang['js']['hidedetails'] = 'विवरण छिपाएँ'; $lang['mediaview'] = 'मूल फ़ाइल देखें'; $lang['reference'] = 'संदर्भ के लिए'; $lang['ref_hidden'] = 'कुच्छ संदर्भ उन पन्नो पर हैं जिनको पड़ने की आपको अनुमति नहीं है|'; @@ -76,11 +79,8 @@ $lang['current'] = 'वर्तमान'; $lang['yours'] = 'आपका संस्करणः'; $lang['diff'] = 'वर्तमान संशोधन में मतभेद दिखाइये |'; $lang['diff2'] = 'चयनित संशोधन के बीच में मतभेद दिखाइये |'; -$lang['line'] = 'रेखा -'; -$lang['youarehere'] = 'आप यहाँ हैं | - -'; +$lang['line'] = 'रेखा'; +$lang['youarehere'] = 'आप यहाँ हैं |'; $lang['lastmod'] = 'अंतिम बार संशोधित'; $lang['by'] = 'के द्वारा'; $lang['deleted'] = 'हटाया'; @@ -118,8 +118,7 @@ $lang['i_superuser'] = 'महाउपयोगकर्ता'; $lang['i_retry'] = 'पुनःप्रयास'; $lang['mu_gridsize'] = 'आकार'; $lang['mu_gridstat'] = 'स्थिति'; -$lang['mu_browse'] = 'ब्राउज़ -'; +$lang['mu_browse'] = 'ब्राउज़'; $lang['mu_toobig'] = 'बहुत बड़ा'; $lang['mu_ready'] = 'अपलोड करने के लिए तैयार'; $lang['mu_done'] = 'पूर्ण'; diff --git a/inc/lang/hr/lang.php b/inc/lang/hr/lang.php index 545498dee..a42e8c96f 100644 --- a/inc/lang/hr/lang.php +++ b/inc/lang/hr/lang.php @@ -48,6 +48,7 @@ $lang['btn_resendpwd'] = 'Pošalji 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_register'] = 'Registracija'; $lang['loggedinas'] = 'Prijavljen kao'; $lang['user'] = 'Korisničko ime'; $lang['pass'] = 'Lozinka'; @@ -57,7 +58,6 @@ $lang['passchk'] = 'Ponoviti'; $lang['remember'] = 'Zapamti me'; $lang['fullname'] = 'Ime i prezime'; $lang['email'] = 'Email'; -$lang['register'] = 'Registracija'; $lang['profile'] = 'Korisnički profil'; $lang['badlogin'] = 'Ne ispravno korisničko ime ili lozinka.'; $lang['minoredit'] = 'Manje izmjene'; diff --git a/inc/lang/hr/subscribermail.txt b/inc/lang/hr/subscribermail.txt deleted file mode 100644 index c55b4a288..000000000 --- a/inc/lang/hr/subscribermail.txt +++ /dev/null @@ -1,16 +0,0 @@ -Pozdrav! - -Stranica @PAGE@ na @TITLE@ je promijenjena. -Slijede promjene: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Ukoliko se želite odjaviti s ove pretplate - prijavite se na: -@DOKUWIKIURL@ zatim odite na -@NEWPAGE@ -i odaberite 'Odjava'. - --- -@DOKUWIKIURL@ diff --git a/inc/lang/hu/lang.php b/inc/lang/hu/lang.php index b3cd87c29..fc21d1c8b 100644 --- a/inc/lang/hu/lang.php +++ b/inc/lang/hu/lang.php @@ -5,10 +5,8 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Ziegler Gábor <gziegler@freemail.hu> * @author Sandor TIHANYI <stihanyi+dw@gmail.com> - * @author Siaynoq Siaynoq <siaynoqmage@gmail.com> * @author Siaynoq Mage <siaynoqmage@gmail.com> * @author schilling.janos@gmail.com - * @author Szabó Dávid (szabo.david@gyumolcstarhely.hu) * @author Szabó Dávid <szabo.david@gyumolcstarhely.hu> */ $lang['encoding'] = 'utf-8'; @@ -50,6 +48,7 @@ $lang['btn_draft'] = 'Piszkozat szerkesztése'; $lang['btn_recover'] = 'Piszkozat folytatása'; $lang['btn_draftdel'] = 'Piszkozat törlése'; $lang['btn_revert'] = 'Helyreállítás'; +$lang['btn_register'] = 'Regisztráció'; $lang['loggedinas'] = 'Belépett felhasználó: '; $lang['user'] = 'Azonosító'; $lang['pass'] = 'Jelszó'; @@ -59,7 +58,6 @@ $lang['passchk'] = 'még egyszer'; $lang['remember'] = 'Emlékezz rám'; $lang['fullname'] = 'Teljes név'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Regisztráció'; $lang['profile'] = 'Személyes beállítások'; $lang['badlogin'] = 'Sajnáljuk, az azonosító, vagy a jelszó nem jó.'; $lang['minoredit'] = 'Apróbb változások'; diff --git a/inc/lang/hu/subscribermail.txt b/inc/lang/hu/subscribermail.txt deleted file mode 100644 index a5e8c96d1..000000000 --- a/inc/lang/hu/subscribermail.txt +++ /dev/null @@ -1,18 +0,0 @@ -Szia! - -A(z) @PAGE@ oldal a(z) @TITLE@ wikiben megváltozott. -Itt vannak a változások: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Ha le szeretnél iratkozni ennek az oldalnak a változás-követéséről, -lépj be a wikibe ezen a címen: -@DOKUWIKIURL@, majd keresd meg a(z) -@NEWPAGE@ oldalt -és válaszd a 'Oldalváltozások-hírlevél leiratkozás' gombot. - --- -Ezt a levelet a @DOKUWIKIURL@ címen lévő DokuWiki alkalmazás generálta. - diff --git a/inc/lang/ia/lang.php b/inc/lang/ia/lang.php index f68467543..bdfef88f4 100644 --- a/inc/lang/ia/lang.php +++ b/inc/lang/ia/lang.php @@ -50,6 +50,7 @@ $lang['btn_draft'] = 'Modificar version provisori'; $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['user'] = 'Nomine de usator'; $lang['pass'] = 'Contrasigno'; @@ -59,7 +60,6 @@ $lang['passchk'] = 'un altere vice'; $lang['remember'] = 'Memorar me'; $lang['fullname'] = 'Nomine real'; $lang['email'] = 'E-mail'; -$lang['register'] = 'Crear conto'; $lang['profile'] = 'Profilo de usator'; $lang['badlogin'] = 'Le nomine de usator o le contrasigno es incorrecte.'; $lang['minoredit'] = 'Modificationes minor'; diff --git a/inc/lang/id-ni/lang.php b/inc/lang/id-ni/lang.php index 4e26677e0..9c04f0259 100644 --- a/inc/lang/id-ni/lang.php +++ b/inc/lang/id-ni/lang.php @@ -41,6 +41,7 @@ $lang['btn_reset'] = 'Fawu\'a'; $lang['btn_resendpwd'] = 'Fa\'ohe\'ö kode sibohou'; $lang['btn_draft'] = 'Fawu\'a wanura'; $lang['btn_draftdel'] = 'Heta zura'; +$lang['btn_register'] = 'Fasura\'ö'; $lang['loggedinas'] = 'Möi bakha zotöi'; $lang['user'] = 'Töi'; $lang['pass'] = 'Kode'; @@ -50,7 +51,6 @@ $lang['passchk'] = 'Sura sakalitö'; $lang['remember'] = 'Töngöni ndra\'o'; $lang['fullname'] = 'Töi safönu'; $lang['email'] = 'Imele'; -$lang['register'] = 'Fasura\'ö'; $lang['profile'] = 'Töi pörofile'; $lang['badlogin'] = 'Bologö dödöu, fasala döi faoma kode.'; $lang['minoredit'] = 'Famawu\'a ma\'ifu'; diff --git a/inc/lang/id/lang.php b/inc/lang/id/lang.php index 3ea1b394a..c1480f518 100644 --- a/inc/lang/id/lang.php +++ b/inc/lang/id/lang.php @@ -45,6 +45,7 @@ $lang['btn_reset'] = 'Reset'; $lang['btn_resendpwd'] = 'Kirim password baru'; $lang['btn_draft'] = 'Edit draft'; $lang['btn_draftdel'] = 'Hapus draft'; +$lang['btn_register'] = 'Daftar'; $lang['loggedinas'] = 'Login sebagai '; $lang['user'] = 'Username'; $lang['pass'] = 'Password'; @@ -54,7 +55,6 @@ $lang['passchk'] = 'sekali lagi'; $lang['remember'] = 'Ingat saya'; $lang['fullname'] = 'Nama lengkap'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Daftar'; $lang['profile'] = 'Profil User'; $lang['badlogin'] = 'Maaf, username atau password salah.'; $lang['minoredit'] = 'Perubahan Minor'; diff --git a/inc/lang/id/subscribermail.txt b/inc/lang/id/subscribermail.txt deleted file mode 100644 index dc04df29a..000000000 --- a/inc/lang/id/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Halo Dunia! - -Halaman @PAGE@ di @TITLE@ wiki telah berubah. -Perubahannya adalah sebagai berikut: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Untuk unsubscribe dari halaman ini, silahkan login ke wiki di -@DOKUWIKIURL@ lalu buka -@NEWPAGE@ -dan pilih 'Unsubscribe Changes'. - --- -Email ini telah digenerate oleh DokuWiki -@DOKUWIKIURL@ diff --git a/inc/lang/is/lang.php b/inc/lang/is/lang.php index ba1ab2c04..7388e6908 100644 --- a/inc/lang/is/lang.php +++ b/inc/lang/is/lang.php @@ -54,6 +54,7 @@ $lang['btn_draft'] = 'Breyta uppkasti'; $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['user'] = 'Notendanafn'; $lang['pass'] = 'Aðgangsorð'; @@ -63,7 +64,6 @@ $lang['passchk'] = 'Aðgangsorð (aftur)'; $lang['remember'] = 'Muna.'; $lang['fullname'] = 'Fullt nafn þitt*'; $lang['email'] = 'Tölvupóstfangið þitt*'; -$lang['register'] = 'Skráning'; $lang['profile'] = 'Notendastillingar'; $lang['badlogin'] = 'Því miður, notandanafn eða aðgangsorð var rangur.'; $lang['minoredit'] = 'Minniháttar breyting'; diff --git a/inc/lang/is/subscribermail.txt b/inc/lang/is/subscribermail.txt deleted file mode 100644 index 57e5faf86..000000000 --- a/inc/lang/is/subscribermail.txt +++ /dev/null @@ -1,23 +0,0 @@ -Hæ - -@PAGE@ síðan í @TITLE@ hefur breyst. -Hér eru breytingarnar: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Dagsetning : @DATE@ -Notandi : @USER@ -Samantekt : @SUMMARY@ -Eldri útgáfa: @OLDPAGE@ -Ný útgáfa: @NEWPAGE@ - -Ef þú vilt ekki lengur fá tilkynningar um breytingar á síðum, skráðu þig þá inn á -@DOKUWIKIURL@, heimsóttu síðan -@NEWPAGE@ -og afskráðu þig af tilkynningum fyrir síður og/ eða rými fyrir heiti. - --- -Pósturinn var myndaður af DokuWiki að -@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/it/denied.txt b/inc/lang/it/denied.txt index c6ba610c4..d21956a5b 100644 --- a/inc/lang/it/denied.txt +++ b/inc/lang/it/denied.txt @@ -1,5 +1,5 @@ ====== Accesso negato ====== -Non hai i diritti per continuare. Hai forse dimenticato di effettuare l'accesso? +Non hai i diritti per continuare. Forse hai dimenticato di effettuare l'accesso? diff --git a/inc/lang/it/install.html b/inc/lang/it/install.html index 471734412..3454fbc3e 100644 --- a/inc/lang/it/install.html +++ b/inc/lang/it/install.html @@ -1,10 +1,10 @@ -<p>Questa pagina ti assisterà durante la prima installazione e configurazione di +<p>Questa pagina ti assisterà durante l'installazione e la prima configurazione di <a href="http://dokuwiki.org">Dokuwiki</a>. Ulteriori informazioni sulla procedura di installazione sono reperibili nella <a href="http://dokuwiki.org/installer">pagina di documentazione</a>.</p> -<p>DokuWiki utilizza normali file per la memorizzazione di pagine wiki ed altre -informazioni associate a tali pagine (es. immagini, indici per la ricerca, vecchie +<p>DokuWiki utilizza dei normali file per la memorizzazione delle pagine del wiki e +delle altre informazioni associate a tali pagine (es. immagini, indici per la ricerca, vecchie revisioni, ecc.). Per poter operare correttamente DokuWiki <strong>deve</strong> accedere in scrittura alle directory che contengono tali file. La procedura di installazione non è in grado di impostare i permessi sulle directory. Questo @@ -19,6 +19,6 @@ Non è necessario per il funzionamento di DokuWiki, ma renderà Dokuwiki più fa da amministrare.</p> <p>Gli utenti esperti o con particolari esigenze di installazione dovrebbero far riferimento ai -seguenti link per i dettagli riguardanti +seguenti link per dettagli sulle <a href="http://dokuwiki.org/install">istruzioni per l'installazione</a> -e i <a href="http://dokuwiki.org/config">parametri di configurazione</a>.</p> +e sui <a href="http://dokuwiki.org/config">parametri di configurazione</a>.</p> diff --git a/inc/lang/it/lang.php b/inc/lang/it/lang.php index 4bfafb060..682f5b8c2 100644 --- a/inc/lang/it/lang.php +++ b/inc/lang/it/lang.php @@ -4,16 +4,15 @@ * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Giorgio Vecchiocattivi <giorgio@vecchio.it> - * @author Roberto Bolli <http://www.rbnet.it/> + * @author Roberto Bolli [http://www.rbnet.it/] * @author Silvia Sargentoni <polinnia@tin.it> * @author Diego Pierotto <ita.translations@tiscali.it> - * @author Diego Pierotto ita.translations@tiscali.it - * @author ita.translations@tiscali.it * @author Lorenzo Breda <lbreda@gmail.com> * @author snarchio@alice.it * @author robocap <robocap1@gmail.com> * @author Matteo Carnevali <rekstorm@gmail.com> - * @author Osman Tekin osman.tekin93@hotmail.it + * @author Osman Tekin <osman.tekin93@hotmail.it> + * @author Jacopo Corbetta <jacopo.corbetta@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -44,7 +43,7 @@ $lang['btn_admin'] = 'Amministrazione'; $lang['btn_update'] = 'Aggiorna'; $lang['btn_delete'] = 'Elimina'; $lang['btn_back'] = 'Indietro'; -$lang['btn_backlink'] = 'Backlinks'; +$lang['btn_backlink'] = 'Puntano qui'; $lang['btn_backtomedia'] = 'Torna alla selezione file'; $lang['btn_subscribe'] = 'Sottoscrivi modifiche'; $lang['btn_profile'] = 'Aggiorna profilo'; @@ -54,30 +53,30 @@ $lang['btn_draft'] = 'Modifica bozza'; $lang['btn_recover'] = 'Ripristina bozza'; $lang['btn_draftdel'] = 'Elimina bozza'; $lang['btn_revert'] = 'Ripristina'; +$lang['btn_register'] = 'Registrazione'; $lang['loggedinas'] = 'Collegato come'; $lang['user'] = 'Nome utente'; $lang['pass'] = 'Password'; $lang['newpass'] = 'Nuova password'; $lang['oldpass'] = 'Conferma password attuale'; $lang['passchk'] = 'Ripeti password'; -$lang['remember'] = 'Ricorda automaticamente'; +$lang['remember'] = 'Memorizza nome utente e password'; $lang['fullname'] = 'Nome completo'; $lang['email'] = 'Email'; -$lang['register'] = 'Registrazione'; $lang['profile'] = 'Profilo utente'; $lang['badlogin'] = 'Il nome utente o la password non sono validi.'; $lang['minoredit'] = 'Modifiche minori'; $lang['draftdate'] = 'Bozza salvata in automatico il'; -$lang['nosecedit'] = 'La pagina nel frattempo è cambiata, la sezione info è scaduta, caricata invece la pagina intera.'; +$lang['nosecedit'] = 'La pagina è stata modificata nel frattempo; è impossibile modificare solo la sezione scelta, quindi è stata caricata la pagina intera.'; $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.'; $lang['regsuccess2'] = 'L\'utente è stato creato.'; -$lang['regmailfail'] = 'Sembra che ci sia stato un errore nell\'invio della email. Contatta il tuo amministratore!'; -$lang['regbadmail'] = 'L\'indirizzo email fornito sembra essere non valido - se pensi che ci sia un errore contatta il tuo amministratore'; +$lang['regmailfail'] = 'Sembra che ci sia stato un errore nell\'invio della email. Contatta l\'amministratore!'; +$lang['regbadmail'] = 'L\'indirizzo email fornito sembra essere non valido - se pensi che ci sia un errore contatta l\'amministratore'; $lang['regbadpass'] = 'Le due password inserite non coincidono, prova di nuovo.'; -$lang['regpwmail'] = 'La tua password DokuWiki'; -$lang['reghere'] = 'Non hai ancora un accesso? Registrati qui.'; +$lang['regpwmail'] = 'La tua password per DokuWiki'; +$lang['reghere'] = 'Non sei ancora registrato? Registrati qui.'; $lang['profna'] = 'Questo wiki non supporta modifiche al profilo'; $lang['profnochange'] = 'Nessuna modifica, niente da aggiornare.'; $lang['profnoempty'] = 'Nome o indirizzo email vuoti non sono consentiti.'; @@ -90,9 +89,9 @@ $lang['resendpwdnouser'] = 'Impossibile trovare questo utente nel database $lang['resendpwdbadauth'] = 'Spiacenti, questo codice di autorizzazione non è valido. Assicurati di aver usato il link completo di conferma.'; $lang['resendpwdconfirm'] = 'Un link di conferma è stato spedito via email.'; $lang['resendpwdsuccess'] = 'La nuova password è stata spedita via email.'; -$lang['license'] = 'Ad eccezione da dove è diversamente indicato, il contenuto di questo wiki è sotto la seguente licenza:'; +$lang['license'] = 'Ad eccezione da dove è diversamente indicato, il contenuto di questo wiki è soggetto alla seguente licenza:'; $lang['licenseok'] = 'Nota: modificando questa pagina accetti di rilasciare il contenuto sotto la seguente licenza:'; -$lang['searchmedia'] = 'Cerca nome file:'; +$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)'; @@ -126,7 +125,7 @@ $lang['js']['mediaright'] = 'Allinea l\'immagine a destra.'; $lang['js']['mediacenter'] = 'Allinea l\'immagine al centro.'; $lang['js']['medianoalign'] = 'Non allineare.'; $lang['js']['nosmblinks'] = 'I collegamenti con le risorse condivise di Windows funzionano solo con Microsoft Internet Explorer. -Puoi fare un copia/incolla di questo collegamento.'; +È comunque possibile copiare e incollare il collegamento.'; $lang['js']['linkwiz'] = 'Collegamento guidato'; $lang['js']['linkto'] = 'Collega a:'; $lang['js']['del_confirm'] = 'Eliminare veramente questa voce?'; @@ -136,12 +135,12 @@ $lang['nothingfound'] = 'Nessun risultato trovato.'; $lang['mediaselect'] = 'Selezione dei file'; $lang['fileupload'] = 'File caricato'; $lang['uploadsucc'] = 'Invio riuscito'; -$lang['uploadfail'] = 'Invio fallito. Contatta l\'amministratore.'; +$lang['uploadfail'] = 'Invio fallito. È possibile che si tratti di un problema di permessi.'; $lang['uploadwrong'] = 'Invio rifiutato. Questa estensione di file non è ammessa'; -$lang['uploadexist'] = 'Il file esiste già . Invio annullato.'; -$lang['uploadbadcontent'] = 'Il contenuto caricato non corrisponde all\'estensione del file %s.'; -$lang['uploadspam'] = 'Il caricamento è stato bloccato dalla lista nera di spam.'; -$lang['uploadxss'] = 'Il caricamento è stato bloccato perchè il contenuto potrebbe essere malizioso.'; +$lang['uploadexist'] = 'Il file esiste già. Invio annullato.'; +$lang['uploadbadcontent'] = 'Il tipo di contenuto caricato non corrisponde all\'estensione del file %s.'; +$lang['uploadspam'] = 'Il caricamento è stato bloccato come spam perché presente nella lista nera.'; +$lang['uploadxss'] = 'Il caricamento è stato bloccato perchè il contenuto potrebbe essere un virus o presentare problemi di sicurezza.'; $lang['uploadsize'] = 'Il file caricato è troppo grande. (massimo %s)'; $lang['deletesucc'] = 'Il file "%s" è stato eliminato.'; $lang['deletefail'] = '"%s" non può essere eliminato - verifica i permessi.'; @@ -164,7 +163,7 @@ $lang['current'] = 'versione attuale'; $lang['yours'] = 'la tua versione'; $lang['diff'] = 'differenze con la versione attuale'; $lang['diff2'] = 'differenze tra le versioni selezionate'; -$lang['difflink'] = 'Link all visualizzazione della comparazione'; +$lang['difflink'] = 'Link a questa pagina di confronto'; $lang['line'] = 'Linea'; $lang['breadcrumb'] = 'Traccia'; $lang['youarehere'] = 'Ti trovi qui'; @@ -175,7 +174,7 @@ $lang['created'] = 'creata'; $lang['restored'] = 'versione precedente ripristinata'; $lang['external_edit'] = 'modifica esterna'; $lang['summary'] = 'Oggetto della modifica'; -$lang['noflash'] = 'E\' necessario <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> per visualizzare questo contenuto.'; +$lang['noflash'] = 'E\' necessario <a href="http://www.adobe.com/products/flashplayer/">il plugin Adobe Flash</a> per visualizzare questo contenuto.'; $lang['download'] = 'Scarica lo "snippet"'; $lang['mail_newpage'] = 'pagina aggiunta:'; $lang['mail_changed'] = 'pagina modificata:'; @@ -222,11 +221,11 @@ $lang['img_copyr'] = 'Copyright'; $lang['img_format'] = 'Formato'; $lang['img_camera'] = 'Camera'; $lang['img_keywords'] = 'Parole chiave'; -$lang['subscr_subscribe_success'] = 'Aggiunto %s alla lista di sottoscrizione %s'; -$lang['subscr_subscribe_error'] = 'Impossibile aggiungere %s alla lista di sottoscrizione %s'; -$lang['subscr_subscribe_noaddress'] = 'Non esiste alcun indirizzo associato al tuo account, non puoi essere aggiunto alla lista di sottoscrizione'; -$lang['subscr_unsubscribe_success'] = 'Rimosso %s dalla lista di sottoscrizione %s'; -$lang['subscr_unsubscribe_error'] = 'Impossibile rimuovere %s dalla lista di sottoscrizione %s'; +$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'; +$lang['subscr_unsubscribe_success'] = 'Rimosso %s dalla lista di sottoscrizioni %s'; +$lang['subscr_unsubscribe_error'] = 'Impossibile rimuovere %s dalla lista di sottoscrizioni %s'; $lang['subscr_already_subscribed'] = '% è già iscritto a %s'; $lang['subscr_not_subscribed'] = '% non è iscritto a %s'; $lang['subscr_m_not_subscribed'] = 'Attualmente non sei iscritto alla pagina o categoria corrente'; @@ -238,34 +237,33 @@ $lang['subscr_m_receive'] = 'Ricevi'; $lang['subscr_style_every'] = 'email per ogni modifica'; $lang['subscr_style_digest'] = 'email riassuntiva delle modifiche di ogni pagina'; $lang['subscr_style_list'] = 'elenco delle pagine modificate dall\'ultima email'; -$lang['authmodfailed'] = 'La configurazione dell\'autenticazione non è corretta. Informa l\'amministratore di questo Wiki.'; -$lang['authtempfail'] = 'L\'autenticazione è temporaneamente non disponibile. Se questa situazione persiste, informa l\'amministratore di questo Wiki.'; +$lang['authmodfailed'] = 'La configurazione dell\'autenticazione non è corretta. Informa l\'amministratore di questo wiki.'; +$lang['authtempfail'] = 'L\'autenticazione è temporaneamente non disponibile. Se questa situazione persiste, informa l\'amministratore di questo wiki.'; $lang['i_chooselang'] = 'Scegli la lingua'; -$lang['i_installer'] = 'Installazione DokuWiki'; +$lang['i_installer'] = 'Installazione di DokuWiki'; $lang['i_wikiname'] = 'Nome Wiki'; $lang['i_enableacl'] = 'Abilita ACL (consigliato)'; $lang['i_superuser'] = 'Amministratore'; $lang['i_problems'] = 'Si sono verificati problemi durante l\'installazione, indicati di seguito. Non è possibile continuare finché non saranno risolti.'; $lang['i_modified'] = 'Per motivi di sicurezza questa procedura funziona solamente con un\'installazione Dokuwiki nuova e non modificata. -Dovresti ri-estrarre i file dal pacchetto scaricato oppure consultare tutte le +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_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/file e creare il file manualmente.'; +$lang['i_writeerr'] = 'Impossibile creare <code>%s</code>. E\' necessario verificare i permessi della directory o del file oppure creare il file manualmente.'; $lang['i_badhash'] = 'dokuwiki.php (hash=<code>%s</code>) non riconosciuto o modificato'; $lang['i_badval'] = '<code>%s</code> - valore vuoto o non valido'; -$lang['i_success'] = 'La configurazione è stata completata correttamente. Ora è possibile eliminare il file install.php. Continuare con -<a href="doku.php">il nuovo DokuWiki</a>.'; -$lang['i_failure'] = 'Si sono verificati errori durante la scrittura dei file di configurazione. Potrebbe essere necessario correggerli manualmente prima di poter utilizzare <a href="doku.php">il nuovo DokuWiki</a>.'; +$lang['i_success'] = 'La configurazione è stata completata correttamente. Ora è possibile eliminare il file install.php. Poi, visita <a href="doku.php">il tuo nuovo DokuWiki</a>.'; +$lang['i_failure'] = 'Si sono verificati errori durante la scrittura dei file di configurazione. Potrebbe essere necessario correggerli manualmente prima di poter utilizzare <a href="doku.php">il tuo nuovo DokuWiki</a>.'; $lang['i_policy'] = 'Regole di accesso iniziali'; $lang['i_pol0'] = 'Wiki Aperto (lettura, scrittura, caricamento file per tutti)'; $lang['i_pol1'] = 'Wiki Pubblico (lettura per tutti, scrittura e caricamento file per gli utenti registrati)'; $lang['i_pol2'] = 'Wiki Chiuso (lettura, scrittura, caricamento file solamente per gli utenti registrati)'; $lang['i_retry'] = 'Riprova'; -$lang['i_license'] = 'Perfavore scegli la licenza in cui vuoi inserire il tuo contenuto:'; -$lang['mu_intro'] = 'Qui si possono caricare più di un file alla volta. Cliccare su "Sfoglia..." per aggiungere i file in coda. Fai click su "Invia file" quando si è pronti.'; +$lang['i_license'] = 'Per favore scegli la licenza sotto cui vuoi rilasciare il contenuto:'; +$lang['mu_intro'] = 'Qui si possono caricare più di un file alla volta. Scegliere "Sfoglia..." per aggiungere file alla coda. Alla fine, fai click su "Invia file".'; $lang['mu_gridname'] = 'Nome file'; $lang['mu_gridsize'] = 'Dimensione'; $lang['mu_gridstat'] = 'Stato'; @@ -280,7 +278,7 @@ $lang['mu_progress'] = '@PCT@% caricato'; $lang['mu_filetypes'] = 'Tipi di file permessi'; $lang['mu_info'] = 'file caricati.'; $lang['mu_lasterr'] = 'Ultimo errore:'; -$lang['recent_global'] = 'Stai attualmente vedendo le modifiche dentro l\'area <b>%s</b>. Puoi anche <a href="%s">vedere le modifiche recenti dell\'intero wiki</a>.'; +$lang['recent_global'] = 'Stai attualmente vedendo le modifiche effettuate nell\'area <b>%s</b>. Puoi anche <a href="%s">vedere le modifiche recenti dell\'intero wiki</a>.'; $lang['years'] = '%d anni fa'; $lang['months'] = '%d mesi fa'; $lang['weeks'] = '%d settimane fa'; diff --git a/inc/lang/it/mailtext.txt b/inc/lang/it/mailtext.txt index a4506e951..3a326961e 100644 --- a/inc/lang/it/mailtext.txt +++ b/inc/lang/it/mailtext.txt @@ -1,16 +1,17 @@ Una pagina su DokuWiki è stata aggiunta o modificata. Questi sono i dettagli: -Data : @DATE@ -Browser : @BROWSER@ -Indirizzo IP : @IPADDRESS@ -Nome host : @HOSTNAME@ -Vecchia revisione : @OLDPAGE@ -Nuova revisione : @NEWPAGE@ +Data : @DATE@ +Browser : @BROWSER@ +Indirizzo IP : @IPADDRESS@ +Nome host : @HOSTNAME@ +Vecchia revisione : @OLDPAGE@ +Nuova revisione : @NEWPAGE@ Oggetto della modifica : @SUMMARY@ +Utente : @USER@ @DIFF@ -- -Questa email è stata generata dal DokuWiki di +Questa email è stata generata dal DokuWiki all'indirizzo @DOKUWIKIURL@ diff --git a/inc/lang/it/password.txt b/inc/lang/it/password.txt index d57c78913..670d5ae44 100644 --- a/inc/lang/it/password.txt +++ b/inc/lang/it/password.txt @@ -6,5 +6,5 @@ Nome utente : @LOGIN@ Password : @PASSWORD@ -- -Questa email è stata generata dal DokuWiki di +Questa email è stata generata dal DokuWiki all'indirizzo @DOKUWIKIURL@ diff --git a/inc/lang/it/pwconfirm.txt b/inc/lang/it/pwconfirm.txt index dfcd8a346..8a594ded8 100644 --- a/inc/lang/it/pwconfirm.txt +++ b/inc/lang/it/pwconfirm.txt @@ -11,5 +11,5 @@ seguente collegamento. @CONFIRM@ -- -Questa email è stata generata dal DokuWiki di +Questa email è stata generata dal DokuWiki all'indirizzo @DOKUWIKIURL@ diff --git a/inc/lang/it/register.txt b/inc/lang/it/register.txt index 74f57094d..5a336a971 100644 --- a/inc/lang/it/register.txt +++ b/inc/lang/it/register.txt @@ -1,4 +1,3 @@ ====== Registrazione nuovo utente ====== -Riempi tutte le informazioni seguenti per creare un nuovo account in questo wiki. Assicurati di inserire un **indirizzo email valido** - la tua nuova password ti sarà inviata con un messaggio di posta elettronica. L'account dovrebbe essere un [[doku>pagename|nome di pagina]] valido. - +Riempi tutte le informazioni seguenti per creare un nuovo account in questo wiki. Assicurati di inserire un **indirizzo email valido** - a meno che tu non l'abbia già inserita qui, la password ti sarà inviata con un messaggio di posta elettronica. Il nome utente deve soddisfare i criteri per i [[doku>pagename|nomi delle pagine]].
\ No newline at end of file diff --git a/inc/lang/it/registermail.txt b/inc/lang/it/registermail.txt index e8af0d323..30a6fed48 100644 --- a/inc/lang/it/registermail.txt +++ b/inc/lang/it/registermail.txt @@ -4,11 +4,11 @@ Nome utente : @NEWUSER@ Nome completo : @NEWNAME@ EMail : @NEWEMAIL@ -Data : @DATE@ -Browser : @BROWSER@ -Indirizzo IP : @IPADDRESS@ -Nome macchina : @HOSTNAME@ +Data : @DATE@ +Browser : @BROWSER@ +Indirizzo IP : @IPADDRESS@ +Nome host : @HOSTNAME@ -- -Questa email è stata generata dal DokuWiki di +Questa email è stata generata dal DokuWiki all'indirizzo @DOKUWIKIURL@ diff --git a/inc/lang/it/resendpwd.txt b/inc/lang/it/resendpwd.txt index fc3f09414..54604d7f3 100644 --- a/inc/lang/it/resendpwd.txt +++ b/inc/lang/it/resendpwd.txt @@ -1,3 +1,3 @@ ====== Invia nuova password ====== -Riempi tutte le informazioni seguenti per ottenere una nuova password per il tuo account su questo wiki. La nuova password sarà inviata al tuo indirizzo di posta elettronica registrato. Il nome utente deve essere il tuo nome utente di questo wiki. +Inserisci tutte le informazioni per ottenere una nuova password per il tuo account su questo wiki. La nuova password sarà inviata al tuo indirizzo di posta elettronica registrato. Il nome utente deve essere il tuo nome utente in questo wiki. diff --git a/inc/lang/it/subscr_digest.txt b/inc/lang/it/subscr_digest.txt index 8656f8536..a19128702 100644 --- a/inc/lang/it/subscr_digest.txt +++ b/inc/lang/it/subscr_digest.txt @@ -10,11 +10,11 @@ Queste sono le modifiche: Vecchia revisione: @OLDPAGE@ Nuova revisione: @NEWPAGE@ -Per annullare la pagina delle notifiche collegati al +Per non ricevere più queste notifiche collegati al wiki @DOKUWIKIURL@ e poi visita @SUBSCRIBE@ e rimuovi la sottoscrizione alle modifiche delle pagine e/o categorie. -- -Questa email è stata generata dal DokuWiki di +Questa email è stata generata dal DokuWiki all'indirizzo @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/it/subscr_list.txt b/inc/lang/it/subscr_list.txt index e42f7d1ad..8eb7acd3c 100644 --- a/inc/lang/it/subscr_list.txt +++ b/inc/lang/it/subscr_list.txt @@ -8,11 +8,11 @@ Queste sono le pagine modificate: @DIFF@ -------------------------------------------------------- -Per annullare la pagina delle notifiche collegati al +Per non ricevere più queste notifiche collegati al wiki @DOKUWIKIURL@ e poi visita @SUBSCRIBE@ e rimuovi la sottoscrizione alle modifiche delle pagine e/o categorie. -- -Questa email è stata generata dal DokuWiki di +Questa email è stata generata dal DokuWiki all'indirizzo @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/it/subscr_single.txt b/inc/lang/it/subscr_single.txt index 2c4d5cbb8..8cde8ea0f 100644 --- a/inc/lang/it/subscr_single.txt +++ b/inc/lang/it/subscr_single.txt @@ -13,11 +13,12 @@ Sommario modifica: @SUMMARY@ Vecchia revisione: @OLDPAGE@ Nuova revisione: @NEWPAGE@ -Per annullare la pagina delle notifiche collegati al -wiki @DOKUWIKIURL@ e poi visita @SUBSCRIBE@ -e rimuovi la sottoscrizione alle modifiche delle -pagine e/o categorie. +Per non ricevere più queste notifiche, collegati al +wiki all'indirizzo @DOKUWIKIURL@ e poi visita +@NEWPAGE@ +e rimuovi la sottoscrizione alle modifiche della +pagina o categoria. -- -Questa email è stata generata dal DokuWiki di +Questa email è stata generata dal DokuWiki all'indirizzo @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/it/subscribermail.txt b/inc/lang/it/subscribermail.txt deleted file mode 100644 index a211ef2e5..000000000 --- a/inc/lang/it/subscribermail.txt +++ /dev/null @@ -1,18 +0,0 @@ -Ciao! - -La pagina @PAGE@ di @TITLE@ wiki è stata aggiornata. -Qui sotto sono elencate le modifiche apportate: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Per cancellare la tua sottoscrizione alla lista di controllo -per questa pagina collegati al wiki -@DOKUWIKIURL@ poi spostati su -@NEWPAGE@ -e seleziona 'Cancella sottoscrizione'. - --- -Questa email è stata generata da DokuWiki su -@DOKUWIKIURL@ diff --git a/inc/lang/it/uploadmail.txt b/inc/lang/it/uploadmail.txt index d8d17a378..da3dacd36 100644 --- a/inc/lang/it/uploadmail.txt +++ b/inc/lang/it/uploadmail.txt @@ -10,5 +10,5 @@ Tipo MIME : @MIME@ Utente : @USER@ -- -Questa email è stata generata dal DokuWiki di +Questa email è stata generata dal DokuWiki all'indirizzo @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/ja/lang.php b/inc/lang/ja/lang.php index ad76e5bf0..d503bae31 100644 --- a/inc/lang/ja/lang.php +++ b/inc/lang/ja/lang.php @@ -40,9 +40,6 @@ $lang['btn_back'] = '戻る'; $lang['btn_backlink'] = 'バックリンク'; $lang['btn_backtomedia'] = 'メディアファイル選択に戻る'; $lang['btn_subscribe'] = '変更履歴配信の登録'; -$lang['btn_unsubscribe'] = '変更履歴配信の解除'; -$lang['btn_subscribens'] = '名前空間変更配信の登録'; -$lang['btn_unsubscribens'] = '名前空間変更配信の解除'; $lang['btn_profile'] = 'ユーザー情報の更新'; $lang['btn_reset'] = 'リセット'; $lang['btn_resendpwd'] = 'パスワード再発行'; @@ -50,6 +47,7 @@ $lang['btn_draft'] = 'ドラフトを編集'; $lang['btn_recover'] = 'ドラフトを復元'; $lang['btn_draftdel'] = 'ドラフトを削除'; $lang['btn_revert'] = '元に戻す'; +$lang['btn_register'] = 'ユーザー登録'; $lang['loggedinas'] = 'ようこそ'; $lang['user'] = 'ユーザー名'; $lang['pass'] = 'パスワード'; @@ -59,7 +57,6 @@ $lang['passchk'] = '確認'; $lang['remember'] = 'ユーザー名とパスワードを記憶する'; $lang['fullname'] = 'フルネーム'; $lang['email'] = 'メールアドレス'; -$lang['register'] = 'ユーザー登録'; $lang['profile'] = 'ユーザー情報'; $lang['badlogin'] = 'ユーザー名かパスワードが違います。'; $lang['minoredit'] = '小変更'; @@ -96,8 +93,38 @@ $lang['txt_overwrt'] = '既存のファイルを上書き'; $lang['lockedby'] = 'この文書は次のユーザによってロックされています'; $lang['lockexpire'] = 'ロック期限:'; $lang['willexpire'] = '編集中の文書はロック期限を過ぎようとしています。このままロックする場合は、一度文書の確認を行って期限をリセットしてください。'; -$lang['js']['notsavedyet'] = "変更は保存されません。このまま処理を続けてよろしいですか?"; -$lang['rssfailed'] = 'RSSの取り出しに失敗しました:'; +$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'] = 'ウィンドウズの共有フォルダへリンクは Microsoft Internet Explorer でのみ可能となります。 +当然、カットアンドペーストが使用できます。'; +$lang['js']['linkwiz'] = 'リンクウィザード'; +$lang['js']['linkto'] = 'リンク先:'; +$lang['js']['del_confirm'] = '選択した項目を本当に削除しますか?'; +$lang['js']['mu_btn'] = '複数のファイルを一度にアップロード'; +$lang['rssfailed'] = 'RSSの取得に失敗しました:'; $lang['nothingfound'] = '該当文書はありませんでした。'; $lang['mediaselect'] = 'メディアファイルを選択'; $lang['fileupload'] = 'メディアファイルをアップロード'; @@ -114,15 +141,7 @@ $lang['deletefail'] = 'ファイル "%s" が削除できません。 $lang['mediainuse'] = 'ファイル "%s" は使用中のため、削除されませんでした。'; $lang['namespaces'] = '名前空間'; $lang['mediafiles'] = '有効なファイル:'; -$lang['js']['searchmedia'] = 'ファイル検索'; -$lang['js']['keepopen'] = '選択中はウィンドウを閉じない'; -$lang['js']['hidedetails'] = '詳細を非表示'; -$lang['js']['nosmblinks'] = 'ウィンドウズの共有フォルダへリンクは Microsoft Internet Explorer でのみ可能となります。 -当然、カットアンドペーストが使用できます。'; -$lang['js']['linkwiz'] = 'リンクウィザード'; -$lang['js']['linkto'] = 'リンク先:'; -$lang['js']['del_confirm'] = '選択した項目を本当に削除しますか?'; -$lang['js']['mu_btn'] = '複数のファイルを一度にアップロード'; +$lang['accessdenied'] = 'このページを閲覧する権限がありません。'; $lang['mediausage'] = 'このファイルを使用するためには次の文法を使用する:'; $lang['mediaview'] = 'オリジナルファイルを閲覧'; $lang['mediaroot'] = 'ルート'; @@ -138,6 +157,7 @@ $lang['current'] = '現在'; $lang['yours'] = 'あなたのバージョン'; $lang['diff'] = '現在のリビジョンとの差分を表示'; $lang['diff2'] = '選択したリビジョン間の差分を表示'; +$lang['difflink'] = 'この比較画面にリンクする'; $lang['line'] = 'ライン'; $lang['breadcrumb'] = 'トレース'; $lang['youarehere'] = '現在位置'; @@ -152,6 +172,7 @@ $lang['noflash'] = 'この内容を表示するためには <a hre $lang['download'] = 'この部分をダウンロード'; $lang['mail_newpage'] = '文書の追加:'; $lang['mail_changed'] = '文書の変更:'; +$lang['mail_subscribe_list'] = '名前空間内でページが変更:'; $lang['mail_new_user'] = '新規ユーザー:'; $lang['mail_upload'] = 'ファイルのアップロード:'; $lang['qb_bold'] = '太字'; @@ -194,11 +215,22 @@ $lang['img_copyr'] = '著作権'; $lang['img_format'] = 'フォーマット'; $lang['img_camera'] = '使用カメラ'; $lang['img_keywords'] = 'キーワード'; -$lang['subscribe_success'] = '変更履歴配信の登録が完了しました。'; -$lang['subscribe_error'] = '変更履歴配信の登録に失敗しました。'; -$lang['subscribe_noaddress'] = 'ログインしていないため、変更履歴配信に登録することはできません。'; -$lang['unsubscribe_success'] = '変更履歴配信の解除が完了しました。'; -$lang['unsubscribe_error'] = '変更履歴配信の解除に失敗しました。'; +$lang['subscr_subscribe_success'] = '%sが%sの購読リストに登録されました。'; +$lang['subscr_subscribe_error'] = '%sを%sの購読リストへの追加に失敗しました。'; +$lang['subscr_subscribe_noaddress'] = 'あなたのログインに対応するアドレスがないため、購読リストへ追加することができません。'; +$lang['subscr_unsubscribe_success'] = '%sを%sの購読リストから削除しました。'; +$lang['subscr_unsubscribe_error'] = '%sを%sの購読リストからの削除に失敗しました。'; +$lang['subscr_already_subscribed'] = '%sは既に%sに登録されています。'; +$lang['subscr_not_subscribed'] = '%sは%sに登録されていません。'; +$lang['subscr_m_not_subscribed'] = '現在のページ、もしくは名前空間にあなたは登録されていません。'; +$lang['subscr_m_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 日毎)'; $lang['authmodfailed'] = 'ユーザー認証の設定が正しくありません。Wikiの管理者に連絡して下さい。'; $lang['authtempfail'] = 'ユーザー認証が一時的に使用できなくなっています。この状態が続いているようであれば、Wikiの管理者に連絡して下さい。'; $lang['i_chooselang'] = '使用言語を選択してください'; @@ -224,6 +256,7 @@ $lang['i_pol0'] = 'オープン Wiki(全ての人に、閲覧 $lang['i_pol1'] = 'パブリック Wiki(閲覧は全ての人が可能、書き込み・アップロードは登録ユーザーのみ)'; $lang['i_pol2'] = 'クローズド Wiki (登録ユーザーにのみ使用を許可)'; $lang['i_retry'] = '再試行'; +$lang['i_license'] = 'あなたが作成したコンテンツが属するライセンスを選択してください:'; $lang['mu_intro'] = '複数のファイルを一度にアップロードできます。ブラウズボタンをクリックしてファイルを追加してください。追加したら、アップロードボタンをクリックしてください。'; $lang['mu_gridname'] = 'ファイル名'; $lang['mu_gridsize'] = 'サイズ'; @@ -247,3 +280,4 @@ $lang['days'] = '%d日前'; $lang['hours'] = '%d時間前'; $lang['minutes'] = '%d分前'; $lang['seconds'] = '%d秒前'; +$lang['wordblock'] = 'スパムと認識されるテキストが含まれているため、変更は保存されませんでした。'; diff --git a/inc/lang/ja/subscr_digest.txt b/inc/lang/ja/subscr_digest.txt new file mode 100644 index 000000000..ff5fc8d47 --- /dev/null +++ b/inc/lang/ja/subscr_digest.txt @@ -0,0 +1,21 @@ +こんにちは。 + +@TITLE@ 内のページ @PAGE@ は変更されました。 +変更点は以下の通りです: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +古いリビジョン: @OLDPAGE@ +新しいリビジョン: @NEWPAGE@ + +この通知を解除するには次のウィキへログインし +@DOKUWIKIURL@ +その後、 +@SUBSCRIBE@ +ページと名前空間の変更に対する購読を解除してください。 + +-- +このメールは次の DokuWiki によって生成されました: +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/ja/subscr_form.txt b/inc/lang/ja/subscr_form.txt new file mode 100644 index 000000000..5767189fd --- /dev/null +++ b/inc/lang/ja/subscr_form.txt @@ -0,0 +1,3 @@ +====== 購読管理 ====== + +このページで、現在のページと名前空間に対する購読を管理することができます。
\ No newline at end of file diff --git a/inc/lang/ja/subscr_list.txt b/inc/lang/ja/subscr_list.txt new file mode 100644 index 000000000..0d225af58 --- /dev/null +++ b/inc/lang/ja/subscr_list.txt @@ -0,0 +1,19 @@ +こんにちは。 + +@TITLE@ の 名前空間 @PAGE@ にあるページが変更されました。 +変更点は以下の通りです: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + + +この通知を解除するには次のウィキへログインし +@DOKUWIKIURL@ +その後、 +@SUBSCRIBE@ +ページと名前空間の変更に対する購読を解除してください。 + +-- +このメールは次の DokuWiki によって生成されました: +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/ja/subscr_single.txt b/inc/lang/ja/subscr_single.txt new file mode 100644 index 000000000..b02352238 --- /dev/null +++ b/inc/lang/ja/subscr_single.txt @@ -0,0 +1,24 @@ +こんにちは。 + +@TITLE@ のウィキにあるページ @PAGE@ が変更されました。 +変更点は以下の通りです: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +日付 : @DATE@ +ユーザー : @USER@ +変更概要: @SUMMARY@ +古いリビジョン: @OLDPAGE@ +新しいリビジョン: @NEWPAGE@ + +この通知を解除するには次のウィキへログインし +@DOKUWIKIURL@ +その後、 +@SUBSCRIBE@ +ページと名前空間の変更に対する購読を解除してください。 + +-- +このメールは次の DokuWiki によって生成されました: +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/ja/subscribermail.txt b/inc/lang/ja/subscribermail.txt deleted file mode 100644 index d18ffe36d..000000000 --- a/inc/lang/ja/subscribermail.txt +++ /dev/null @@ -1,16 +0,0 @@ -こんにちは - -@TITLE@ 内のページ @PAGE@ は変更されました。 -変更内容は以下の通りです。 - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -ページ変更履歴配信サービスの解除は、 -@DOKUWIKIURL@ の @NEWPAGE@ -にある'変更履歴配信の解除'で行うことができます。 - --- -このメールは次のDokuWikiより自動的に送信されています。 -@DOKUWIKIURL@ diff --git a/inc/lang/km/lang.php b/inc/lang/km/lang.php index 19847674d..90cad3133 100644 --- a/inc/lang/km/lang.php +++ b/inc/lang/km/lang.php @@ -1,9 +1,6 @@ <?php /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) - * @author Andreas Gohr <andi@splitbrain.org> - * @author Anika Henke <henke@cosmocode.de> - * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> * @author Ratana Lim <aerorat@yahoo.com> */ $lang['encoding'] = 'utf-8'; @@ -46,6 +43,7 @@ $lang['btn_resendpwd'] = 'ផ្ញើពាក្សសម្ងាត់'; $lang['btn_draft'] = 'កែគំរោង'; $lang['btn_recover'] = 'ស្រោះគំរោងឡើង'; $lang['btn_draftdel'] = 'លុបគំរោង'; +$lang['btn_register'] = 'ចុះឈ្មោះ';//'Register'; $lang['loggedinas'] = 'អ្នកប្រើ'; $lang['user'] = 'នាមបម្រើ'; @@ -56,7 +54,6 @@ $lang['passchk'] = 'ម្ដងទាត'; $lang['remember'] = 'ចំណាំខ្ញុំ'; $lang['fullname'] = 'នាមត្រគោល'; $lang['email'] = 'អ៊ីមែល'; -$lang['register'] = 'ចុះឈ្មោះ';//'Register'; $lang['profile'] = 'ប្រវត្តិរូប';// 'User Profile'; $lang['badlogin'] = 'សុំអាទោស នាមបំរើ ឬ ពាក្សសម្ងាតមិនត្រវទេ។'; $lang['minoredit'] = 'កែបបណ្តិចបណ្តួច';// 'Minor Changes'; @@ -227,4 +224,4 @@ $lang['i_pol2'] = 'វីគីបិទជិត'; $lang['i_retry'] = 'ម្តងទៀត'; -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/lang/ko/adminplugins.txt b/inc/lang/ko/adminplugins.txt new file mode 100644 index 000000000..5312cf357 --- /dev/null +++ b/inc/lang/ko/adminplugins.txt @@ -0,0 +1 @@ +===== 부가적인 플러그인 =====
\ No newline at end of file diff --git a/inc/lang/ko/edit.txt b/inc/lang/ko/edit.txt index d73f935fe..9b59524f7 100644 --- a/inc/lang/ko/edit.txt +++ b/inc/lang/ko/edit.txt @@ -1,2 +1,2 @@ -페이지를 편집하고 **저장**을 누르십시오. 위키 구문은 [[wiki:syntax]] 혹은 [[syntax|(한글) 구문]]을 참고하십시오. 이 페이지를 **더 낫게 만들 자신이 있을** 때에만 편집하십시오. 실험을 하고 싶을 때에는, 먼저 [[playground:playground|연습장]] 에 가서 연습해 보십시오. +페이지를 편집하고 **저장**을 누르십시오. 위키 구문은 [[wiki:syntax]] 혹은 [[wiki:ko_syntax|(한글) 구문]]을 참고하십시오. 이 페이지를 **더 낫게 만들 자신이 있을** 때에만 편집하십시오. 실험을 하고 싶을 때에는, 먼저 [[playground:playground|연습장]] 에 가서 연습해 보십시오. diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php index 83014c151..0b45c6ce0 100644 --- a/inc/lang/ko/lang.php +++ b/inc/lang/ko/lang.php @@ -7,7 +7,7 @@ * @author jk Lee * @author dongnak@gmail.com * @author Song Younghwan <purluno@gmail.com> - * @author SONG Younghwan <purluno@gmail.com> + * @author Seung-Chul Yoo <dryoo@live.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -41,15 +41,14 @@ $lang['btn_back'] = '뒤로'; $lang['btn_backlink'] = '이전 링크'; $lang['btn_backtomedia'] = '미디어 파일 선택으로 돌아가기'; $lang['btn_subscribe'] = '구독 신청'; -$lang['btn_unsubscribe'] = '구독 신청 해지'; -$lang['btn_subscribens'] = '네임스페이스 구독 신청'; -$lang['btn_unsubscribens'] = '네임스페이스 구독 신청 해지'; $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['user'] = '사용자'; $lang['pass'] = '패스워드'; @@ -59,7 +58,6 @@ $lang['passchk'] = '패스워드 다시 확인'; $lang['remember'] = '기억하기'; $lang['fullname'] = '실제 이름'; $lang['email'] = '이메일'; -$lang['register'] = '등록'; $lang['profile'] = '개인 정보'; $lang['badlogin'] = '잘못된 사용자 이름이거나 패스워드입니다.'; $lang['minoredit'] = '일부 내용 변경'; @@ -88,13 +86,45 @@ $lang['resendpwdconfirm'] = '확인 링크를 이메일로 보냈습니다. $lang['resendpwdsuccess'] = '새로운 패스워드는 이메일로 보내드립니다.'; $lang['license'] = '이 위키의 내용은 다음의 라이센스에 따릅니다 :'; $lang['licenseok'] = '주의 : 이 페이지를 수정한다는 다음의 라이센스에 동의함을 의미합니다 :'; +$lang['searchmedia'] = '파일이름 찾기:'; +$lang['searchmedia_in'] = ' %에서 검색'; $lang['txt_upload'] = '업로드 파일을 선택합니다.'; $lang['txt_filename'] = '업로드 파일 이름을 입력합니다.(선택 사항)'; $lang['txt_overwrt'] = '새로운 파일로 이전 파일을 교체합니다.'; $lang['lockedby'] = '현재 잠금 사용자'; $lang['lockexpire'] = '잠금 해제 시간'; $lang['willexpire'] = '잠시 후 편집 잠금이 해제됩니다.\n편집 충돌을 피하려면 미리보기를 눌러 잠금 시간을 다시 설정하기 바랍니다.'; -$lang['js']['notsavedyet'] = "저장하지 않은 변경은 지워집니다.\n계속하시겠습니까?"; +$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']['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'] = '윈도우 공유 파일과의 연결은 MS 인터넷 익스플로러에서만 동작합니다. +그러나 링크를 복사하거나 붙여넣기를 할 수 있습니다.'; +$lang['js']['linkwiz'] = '링크 마법사'; +$lang['js']['linkto'] = '다음으로 연결:'; +$lang['js']['del_confirm'] = '정말로 선택된 항목(들)을 삭제하시겠습니까?'; +$lang['js']['mu_btn'] = '여러 파일들을 한번에 업로드합니다.'; $lang['rssfailed'] = 'feed 가져오기 실패: '; $lang['nothingfound'] = '아무 것도 없습니다.'; $lang['mediaselect'] = '미디어 파일 선택'; @@ -112,11 +142,7 @@ $lang['deletefail'] = '"%s" 파일을 삭제할 수 없습니다. - $lang['mediainuse'] = '"%s" 파일을 삭제할 수 없습니다. - 아직 사용 중입니다.'; $lang['namespaces'] = '네임스페이스'; $lang['mediafiles'] = '사용 가능한 파일 목록'; -$lang['js']['keepopen'] = '선택할 때 윈도우를 열어놓으시기 바랍니다.'; -$lang['js']['hidedetails'] = '자세한 정보 감추기'; -$lang['js']['nosmblinks'] = '윈도우 공유 파일과의 연결은 MS 인터넷 익스플로러에서만 동작합니다. -그러나 링크를 복사하거나 붙여넣기를 할 수 있습니다.'; -$lang['js']['mu_btn'] = '여러 파일들을 한번에 업로드합니다.'; +$lang['accessdenied'] = '이 페이지를 볼 권한이 없습니다.'; $lang['mediausage'] = '이 파일을 참조하려면 다음 문법을 사용하기 바랍니다:'; $lang['mediaview'] = '원본 파일 보기'; $lang['mediaroot'] = '루트(root)'; @@ -143,8 +169,10 @@ $lang['restored'] = '옛 버전 복구'; $lang['external_edit'] = '외부 편집기'; $lang['summary'] = '편집 요약'; $lang['noflash'] = '이 컨텐츠를 표시하기 위해서 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>이 필요합니다.'; +$lang['download'] = '조각 다운로드'; $lang['mail_newpage'] = '페이지 추가:'; $lang['mail_changed'] = '페이지 변경:'; +$lang['mail_subscribe_list'] = '네임스페이스에서 변경된 페이지:'; $lang['mail_new_user'] = '새로운 사용자:'; $lang['mail_upload'] = '파일 첨부:'; $lang['qb_bold'] = '굵은 글'; @@ -157,6 +185,11 @@ $lang['qb_h2'] = '2단계 헤드라인'; $lang['qb_h3'] = '3단계 헤드라인'; $lang['qb_h4'] = '4단계 헤드라인'; $lang['qb_h5'] = '5단계 헤드라인'; +$lang['qb_h'] = '표제'; +$lang['qb_hs'] = '표제 선택'; +$lang['qb_hplus'] = '상위 표제'; +$lang['qb_hminus'] = '하위 표제'; +$lang['qb_hequal'] = '동급 표제'; $lang['qb_link'] = '내부 링크'; $lang['qb_extlink'] = '외부 링크'; $lang['qb_hr'] = '수평선'; @@ -166,7 +199,7 @@ $lang['qb_media'] = '이미지와 기타 파일 추가'; $lang['qb_sig'] = '서명 추가'; $lang['qb_smileys'] = '이모티콘'; $lang['qb_chars'] = '특수문자'; -$lang['js']['del_confirm'] = '정말로 선택된 항목(들)을 삭제하시겠습니까?'; +$lang['upperns'] = '상위 네임스페이스로 이동'; $lang['admin_register'] = '새로운 사용자 추가'; $lang['metaedit'] = '메타 데이타를 편집합니다.'; $lang['metasaveerr'] = '메타 데이타 쓰기가 실패했습니다.'; @@ -182,11 +215,16 @@ $lang['img_copyr'] = '저작권'; $lang['img_format'] = '포맷'; $lang['img_camera'] = '카메라'; $lang['img_keywords'] = '키워드'; -$lang['subscribe_success'] = '%s를 추가했습니다. (%s의 구독 목록)'; -$lang['subscribe_error'] = '%s를 추가하는데 실패했습니다.(%s의 구독 목록)'; -$lang['subscribe_noaddress'] = '로그인 정보에 이메일 주소가 없습니다, 구독 목록에 추가할 수 없습니다.'; -$lang['unsubscribe_success'] = '%s를 제외시켰습니다. (%s의 구독 목록)'; -$lang['unsubscribe_error'] = '%s를 제외시키는데 실패했습니다.(%s의 구독 목록)'; +$lang['subscr_subscribe_noaddress'] = '등록된 주소가 없기 때문에 구독목록에 등록되지 않았습니다.'; +$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 일 마다)'; $lang['authmodfailed'] = '잘못된 사용자 인증 설정입니다. 관리자에게 문의하기 바랍니다.'; $lang['authtempfail'] = '사용자 인증이 일시적으로 불가능합니다. 만일 계속해서 문제가 발생하면 관리자에게 문의하기 바랍니다.'; $lang['i_chooselang'] = '사용하는 언어를 선택합니다.'; @@ -213,6 +251,7 @@ $lang['i_pol0'] = '개방형 위키 (누구나 읽기/쓰기/업 $lang['i_pol1'] = '공개형 위키 (누구나 읽을 수 있지만, 등록된 사용자만 쓰기/업로드가 가능합니다.)'; $lang['i_pol2'] = '폐쇄형 위키 (등록된 사용자만 읽기/쓰기/업로드가 가능합니다.)'; $lang['i_retry'] = '다시 시도'; +$lang['i_license'] = '내용의 배포를 위한 라이센스를 선택하세요.'; $lang['mu_intro'] = '여러 파일을 한번에 업로드할 수 있습니다. 파일 목록에 추가하려면 "찾기" 버튼을 클릭합니다. 파일 목록 추가 작업이 끝나면 "업로드" 버튼을 클릭하기 바랍니다. '; $lang['mu_gridname'] = '파일명'; $lang['mu_gridsize'] = '크기'; @@ -226,4 +265,14 @@ $lang['mu_fail'] = '업로드가 실패했습니다.'; $lang['mu_authfail'] = '세션 기간이 종료되었습니다.'; $lang['mu_progress'] = '@PCT@% 업로드되었습니다.'; $lang['mu_filetypes'] = '허용된 파일타입'; +$lang['mu_info'] = '업로드 되었습니다.'; +$lang['mu_lasterr'] = '마지막 에러:'; $lang['recent_global'] = '<b>%s</b> 네임스페이스를 구독중입니다. <a href="%s">전체위키 변경사항 </a>도 보실수 있습니다.'; +$lang['years'] = '%d 년 전'; +$lang['months'] = '%d 개월 전'; +$lang['weeks'] = '%d 주 전'; +$lang['days'] = '%d 일 전'; +$lang['hours'] = '%d 시간 전'; +$lang['minutes'] = '%d 분 전'; +$lang['seconds'] = '%d 초 전'; +$lang['wordblock'] = '스팸 문구를 포함하고 있어서 저장되지 않았습니다.'; diff --git a/inc/lang/ko/register.txt b/inc/lang/ko/register.txt index 999073a1d..24105efeb 100644 --- a/inc/lang/ko/register.txt +++ b/inc/lang/ko/register.txt @@ -1,4 +1,4 @@ ====== 새 사용자 등록 ====== -이 위키에 새 계정을 만들려면 아래의 모든 내용을 입력하십시오. **제대로 된 이메일 주소**를 사용하십시오. 그러나, 아래 내용을 입력했다고 해서 계정을 만들 수 있으리라고는 믿지 마십시오. 이곳은 내가 개인적으로 사용하는 곳이며, 계정을 만들어 주고 안주고는 내 마음입니다. 차라리, 내게 이메일을 보내서 신청하는 편이 더 나을 것입니다. 패스워드는 이 이메일로 보내집니다. 사용자명은 올바른 [[doku>pagename|pagename]] 이어야 합니다. +이 위키에 새 계정을 만들려면 아래의 모든 내용을 입력하세요. **제대로 된 이메일 주소**를 사용하세요. 암호를 입력하는 곳이 없다면 암호는 이 이메일로 보내집니다. 사용자명은 올바른 [[doku>pagename|pagename]] 이어야 합니다. diff --git a/inc/lang/ko/subscr_digest.txt b/inc/lang/ko/subscr_digest.txt new file mode 100644 index 000000000..2e9c87848 --- /dev/null +++ b/inc/lang/ko/subscr_digest.txt @@ -0,0 +1,18 @@ +안녕하세요! + +@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다. + +변경사항은 다음과 같습니다: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +옛날 것: @OLDPAGE@ +새 것: @NEWPAGE@ + +이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤 +@SUBSCRIBE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요. + +-- +@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
\ No newline at end of file diff --git a/inc/lang/ko/subscr_form.txt b/inc/lang/ko/subscr_form.txt new file mode 100644 index 000000000..31470f372 --- /dev/null +++ b/inc/lang/ko/subscr_form.txt @@ -0,0 +1,3 @@ +====== 구독 관리 ====== + +이 페이지는 현재의 페이지와 네임스페이스의 구독을 관리할 수있도록 해줍니다.
\ No newline at end of file diff --git a/inc/lang/ko/subscr_list.txt b/inc/lang/ko/subscr_list.txt new file mode 100644 index 000000000..2661a6a15 --- /dev/null +++ b/inc/lang/ko/subscr_list.txt @@ -0,0 +1,15 @@ +안녕하세요! + +@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다. + +변경사항은 다음과 같습니다: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤 +@SUBSCRIBE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요. + +-- +@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
\ No newline at end of file diff --git a/inc/lang/ko/subscr_single.txt b/inc/lang/ko/subscr_single.txt new file mode 100644 index 000000000..1aa4d7efa --- /dev/null +++ b/inc/lang/ko/subscr_single.txt @@ -0,0 +1,21 @@ +안녕하세요! + +@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다. + +변경사항은 다음과 같습니다: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +날짜 : @DATE@ +사용자 : @USER@ +편집 요약 : @SUMMARY@ +구 버전 : @OLDPAGE@ +새 버전 : @NEWPAGE@ + +이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤 t +@NEWPAGE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요. + +-- +@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
\ No newline at end of file diff --git a/inc/lang/ko/subscribermail.txt b/inc/lang/ko/subscribermail.txt deleted file mode 100644 index 9bd0d9011..000000000 --- a/inc/lang/ko/subscribermail.txt +++ /dev/null @@ -1,15 +0,0 @@ -안녕하세요! - -@TITLE@ 위키의 @PAGE@ 페이지가 변경됬습니다. - -변경 내용은 아래와 같습니다. --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -@DOKUWIKIURL@의 이 페이지 구독신청을 해지하려면 @NEWPAGE@를 방문하여 -'구독신청 해지'를 선택하세요. - --- - -@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. diff --git a/inc/lang/ku/lang.php b/inc/lang/ku/lang.php index cb8dd0865..9bed43cd1 100644 --- a/inc/lang/ku/lang.php +++ b/inc/lang/ku/lang.php @@ -34,6 +34,7 @@ $lang['btn_backlink'] = "Girêdanên paş"; $lang['btn_backtomedia'] = 'Back to Mediafile Selection'; $lang['btn_subscribe'] = 'Subscribe Changes'; $lang['btn_unsubscribe'] = 'Unsubscribe Changes'; +$lang['btn_register'] = 'Register'; $lang['loggedinas'] = 'Logged in as'; $lang['user'] = 'Username'; @@ -42,7 +43,6 @@ $lang['passchk'] = 'once again'; $lang['remember'] = 'Remember me'; $lang['fullname'] = 'Full name'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Register'; $lang['badlogin'] = 'Sorry, username or password was wrong.'; $lang['regmissing'] = 'Sorry, you must fill in all fields.'; @@ -160,4 +160,4 @@ $lang['subscribe_noaddress']= 'There is no address associated with your login, y $lang['unsubscribe_success']= 'Removed %s from subscription list for %s'; $lang['unsubscribe_error'] = 'Error removing %s from subscription list for %s'; -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/lang/ku/subscribermail.txt b/inc/lang/ku/subscribermail.txt deleted file mode 100644 index 0c8c2637f..000000000 --- a/inc/lang/ku/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Hello! - -The page @PAGE@ in the @TITLE@ wiki changed. -Here are the changes: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -To unsubscribe from this page log into the wiki at -@DOKUWIKIURL@ then visit -@NEWPAGE@ -and choose 'Unsubscribe Changes'. - --- -This mail was generated by DokuWiki at -@DOKUWIKIURL@ diff --git a/inc/lang/la/admin.txt b/inc/lang/la/admin.txt new file mode 100644 index 000000000..a8e380280 --- /dev/null +++ b/inc/lang/la/admin.txt @@ -0,0 +1,3 @@ +====== Administratio ====== + +In hac pagina administratio uicis est.
\ No newline at end of file diff --git a/inc/lang/la/adminplugins.txt b/inc/lang/la/adminplugins.txt new file mode 100644 index 000000000..9f2ec47aa --- /dev/null +++ b/inc/lang/la/adminplugins.txt @@ -0,0 +1 @@ +===== Addenda alia =====
\ No newline at end of file diff --git a/inc/lang/la/backlinks.txt b/inc/lang/la/backlinks.txt new file mode 100644 index 000000000..b3c0d131c --- /dev/null +++ b/inc/lang/la/backlinks.txt @@ -0,0 +1,3 @@ +====== Nexa ====== + +Index paginarum, quae ad hanc paginam connexae sunt. diff --git a/inc/lang/la/conflict.txt b/inc/lang/la/conflict.txt new file mode 100644 index 000000000..aebc38b25 --- /dev/null +++ b/inc/lang/la/conflict.txt @@ -0,0 +1,5 @@ +====== Recentior forma est ====== + +Recentior forma est: nam dum hanc paginam recensibas, aliquis paginam mutauit. + +Discrimina uides et formam seruandam eligis. Alia forma delebitur.
\ No newline at end of file diff --git a/inc/lang/la/denied.txt b/inc/lang/la/denied.txt new file mode 100644 index 000000000..fdb62f53e --- /dev/null +++ b/inc/lang/la/denied.txt @@ -0,0 +1,3 @@ +====== 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 diff --git a/inc/lang/la/diff.txt b/inc/lang/la/diff.txt new file mode 100644 index 000000000..ead382715 --- /dev/null +++ b/inc/lang/la/diff.txt @@ -0,0 +1,3 @@ +====== Discrimina ====== + +Discrimina inter duas paginas ostendere
\ No newline at end of file diff --git a/inc/lang/la/draft.txt b/inc/lang/la/draft.txt new file mode 100644 index 000000000..23bb20fe2 --- /dev/null +++ b/inc/lang/la/draft.txt @@ -0,0 +1,5 @@ +====== Propositum inuentum ====== + +Tua extrema recensio non perfecta est. Vicis propositum in itinere seruauit, sic his seruatis uteris. + +Statuas si //restituere// uis, //delere// seruata aut //delere// omnes.
\ No newline at end of file diff --git a/inc/lang/la/edit.txt b/inc/lang/la/edit.txt new file mode 100644 index 000000000..342b30726 --- /dev/null +++ b/inc/lang/la/edit.txt @@ -0,0 +1 @@ +Paginam recensere et "Serua" premere. Vide [[wiki:syntax]] ut uicis stilus uidere possis. Hanc paginam recenses, solum si hanc auges. Prima uestigia apud hunc nexum [[playground:playground|playground]] uidere possis.
\ No newline at end of file diff --git a/inc/lang/la/editrev.txt b/inc/lang/la/editrev.txt new file mode 100644 index 000000000..6a4d082cc --- /dev/null +++ b/inc/lang/la/editrev.txt @@ -0,0 +1,2 @@ +**Vetus forma a te restituta est** Si hanc formam seruabis, nouam creabis. +----
\ No newline at end of file diff --git a/inc/lang/la/index.txt b/inc/lang/la/index.txt new file mode 100644 index 000000000..cd65dbb59 --- /dev/null +++ b/inc/lang/la/index.txt @@ -0,0 +1,3 @@ +====== Forma Situs ====== + +Haec forma situs ordinata [[doku>namespaces|generatim]].
\ No newline at end of file diff --git a/inc/lang/la/install.html b/inc/lang/la/install.html new file mode 100644 index 000000000..c06f3ac2c --- /dev/null +++ b/inc/lang/la/install.html @@ -0,0 +1,8 @@ +<p>Haec pagina te adiuuat in <a href="http://dokuwiki.org">Dokuuiki</a> conformando. Maiores res in +<a href="http://dokuwiki.org/installer">hac pagina</a> sunt.</p> + +<p>DokuWiki documenta ut omnes paginas uicis et omnia (ut imagines, indices, ueteres formas) quae ad easdem pertinent colligat. Vt bene operet DokuWiki omnes facultates scrini habere <strong>debes</strong>. Hoc instrumentum facultates eligere non potest, his facultatibus locatori spati interretis quaeras uel FTP intrumento uel aliis rebus (ut cPanel) uteraris.</p> + +<p>Hoc intrumentum optiones primae DokuWiki <acronym title="index custodiae ,aditus">ICA</acronym>, quos rectori situs inire et indicem, ut addenda optiones uicis et alia administrare possit uidere licet. Hoc instrumentum non necessarium DokuWiki ut feliciter operet, sed melius administrare adiuuat.</p> + +<p>Periti uel qui certa quaesita habet paginas <a href="http://dokuwiki.org/install">rationis conformandum uicem</a> et <a href="http://dokuwiki.org/config">optionum conformationis</a> uidere possunt.</p>
\ No newline at end of file diff --git a/inc/lang/la/lang.php b/inc/lang/la/lang.php new file mode 100644 index 000000000..d10c094f8 --- /dev/null +++ b/inc/lang/la/lang.php @@ -0,0 +1,283 @@ +<?php +/** + * la 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/MessagesLa.php?view=co + * @author Massimiliano Vassalli <vassalli.max@gmail.com> + */ +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '"'; +$lang['doublequoteclosing'] = '"'; +$lang['singlequoteopening'] = '`'; +$lang['singlequoteclosing'] = '\''; +$lang['apostrophe'] = '´'; +$lang['btn_edit'] = 'Recensere hanc paginam'; +$lang['btn_source'] = 'Fontem uidere'; +$lang['btn_show'] = 'Ostendere paginam'; +$lang['btn_create'] = 'Creare paginam'; +$lang['btn_search'] = 'Quaerere'; +$lang['btn_save'] = 'Seruare'; +$lang['btn_preview'] = 'Praeuidere'; +$lang['btn_top'] = 'I ad summa'; +$lang['btn_newer'] = '<< recentiores'; +$lang['btn_older'] = 'minus recentiores >>'; +$lang['btn_revs'] = 'Veteres renouationes'; +$lang['btn_recent'] = 'Nuper mutata'; +$lang['btn_upload'] = 'Onerare'; +$lang['btn_cancel'] = 'Abrogare'; +$lang['btn_index'] = 'Index'; +$lang['btn_secedit'] = 'Recensere'; +$lang['btn_login'] = 'Conuentum aperire'; +$lang['btn_logout'] = 'Conuentum concludere'; +$lang['btn_admin'] = 'Rector'; +$lang['btn_update'] = 'Nouare'; +$lang['btn_delete'] = 'Delere'; +$lang['btn_back'] = 'Redire'; +$lang['btn_backlink'] = 'Nexus ad paginam'; +$lang['btn_backtomedia'] = 'Ad media redire'; +$lang['btn_subscribe'] = 'Custodire'; +$lang['btn_profile'] = 'Tabellam nouare'; +$lang['btn_reset'] = 'Abrogare'; +$lang['btn_resendpwd'] = 'Tesseram nouam cursu interretiali petere'; +$lang['btn_draft'] = 'Propositum recensere'; +$lang['btn_recover'] = 'Propositum reficere'; +$lang['btn_draftdel'] = 'Propositum delere'; +$lang['btn_revert'] = 'Reficere'; +$lang['btn_register'] = 'Te adscribere'; +$lang['loggedinas'] = 'Nomen sodalis:'; +$lang['user'] = 'Nomen sodalis:'; +$lang['pass'] = 'Tessera tua'; +$lang['newpass'] = 'Tessera noua'; +$lang['oldpass'] = 'Tessera uetus:'; +$lang['passchk'] = 'Tesseram tuam adfirmare'; +$lang['remember'] = 'Tesseram meam sodalitatis memento'; +$lang['fullname'] = 'Nomen tuom uerum:'; +$lang['email'] = 'Cursus interretialis:'; +$lang['profile'] = 'Tabella Sodalis'; +$lang['badlogin'] = 'Error in ineundo est, rectum nomen uel tessera cedo.'; +$lang['minoredit'] = 'Recensio minor'; +$lang['draftdate'] = 'Propositum seruatur die:'; +$lang['nosecedit'] = 'Pagina interea mutatur, pars rerum exiit, in loco eius tota pagina reclamata est.'; +$lang['regmissing'] = 'Omnes campi complendi sunt.'; +$lang['reguexists'] = 'Nomen Sodalis ab aliquo iam elegitur.'; +$lang['regsuccess'] = 'Adscriptio feliciter perficitur et tessera cursu interretiali mittitur'; +$lang['regsuccess2'] = 'Adscriptio perficitur'; +$lang['regmailfail'] = 'Error in litteras mittendo est. Rectorem conueni!'; +$lang['regbadmail'] = 'Cursus interretialis non legitimus: si errorem putes, Rectorem conueni.'; +$lang['regbadpass'] = 'Tesserae quas scripsisti inter se non congruont.'; +$lang['regpwmail'] = 'Tessera Dokuuicis tuam'; +$lang['reghere'] = 'Non iam adscriptus\a esne? Te adscribe'; +$lang['profna'] = 'Tabellam tuam mutare non potes.'; +$lang['profnochange'] = 'Si res non mutare uis, nihil agere'; +$lang['profnoempty'] = 'Omnes campi complendi sunt.'; +$lang['profchanged'] = 'Tabella Sodalis feliciter nouatur'; +$lang['pwdforget'] = 'Tesseram amisistine? Nouam petere'; +$lang['resendna'] = 'Tesseram non mutare potest.'; +$lang['resendpwd'] = 'Tesseram mitte'; +$lang['resendpwdmissing'] = 'Omnes campi complendi sunt.'; +$lang['resendpwdnouser'] = 'In tabellis Sodalium nomen non inuentum est.'; +$lang['resendpwdbadauth'] = 'Tesseram non legitima est.'; +$lang['resendpwdconfirm'] = 'Confirmatio cursu interretiali mittitur.'; +$lang['resendpwdsuccess'] = 'Tessera noua cursu interretiali mittitur.'; +$lang['license'] = 'Praeter ubi adnotatum, omnia scripta Corporis Gentis Latinae cum his facultatibus:'; +$lang['licenseok'] = 'Caue: si paginam recenseas, has facultates confirmas:'; +$lang['searchmedia'] = 'Quaere titulum:'; +$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['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'; +$lang['js']['keepopen'] = 'Fenestram apertam tene'; +$lang['js']['hidedetails'] = 'Singulas res abscondere'; +$lang['js']['mediatitle'] = 'Optiones nexorum'; +$lang['js']['mediadisplay'] = 'Genus nexi'; +$lang['js']['mediaalign'] = 'Collocatio'; +$lang['js']['mediasize'] = 'Amplitudo imaginis'; +$lang['js']['mediatarget'] = 'Cui nexum est'; +$lang['js']['mediaclose'] = 'Claudere'; +$lang['js']['mediainsert'] = 'Insere'; +$lang['js']['mediadisplayimg'] = 'Imaginem ostendere'; +$lang['js']['mediadisplaylnk'] = 'Solum nexum ostendere'; +$lang['js']['mediasmall'] = 'Forma minor'; +$lang['js']['mediamedium'] = 'Forma media'; +$lang['js']['medialarge'] = 'Forma maior'; +$lang['js']['mediaoriginal'] = 'Forma primigenia'; +$lang['js']['medialnk'] = 'Singulis rebus paginae nexum'; +$lang['js']['mediadirect'] = 'Primigeniae formae nexum'; +$lang['js']['medianolnk'] = 'Connectio deest'; +$lang['js']['medianolink'] = 'Imaginem non connectere'; +$lang['js']['medialeft'] = 'Imaginem ad sinistram collocare'; +$lang['js']['mediaright'] = 'Imaginem ad dextram collocare'; +$lang['js']['mediacenter'] = 'Imaginem in mediam collocare'; +$lang['js']['medianoalign'] = 'Collocationem remouere'; +$lang['js']['nosmblinks'] = 'Windows nexa solum cum Microsoft Internet Explorer ostendi possunt. +Adhuc transcribere nexum potes.'; +$lang['js']['linkwiz'] = 'Connectendi ductor'; +$lang['js']['linkto'] = 'Nexum ad:'; +$lang['js']['del_confirm'] = 'Delere electas res uin?'; +$lang['js']['mu_btn'] = 'Plura documenta uno tempore onerare'; +$lang['rssfailed'] = 'Error in restituendo '; +$lang['nothingfound'] = 'Nihil inuentum est.'; +$lang['mediaselect'] = 'Documenta uisiua:'; +$lang['fileupload'] = 'Documentum uisiuom onerare'; +$lang['uploadsucc'] = 'Oneratum perfectum'; +$lang['uploadfail'] = 'Error onerandi.'; +$lang['uploadwrong'] = 'Onerare non potest. Genus documenti non legitimum!'; +$lang['uploadexist'] = 'Documentum iam est.'; +$lang['uploadbadcontent'] = 'Documentum oneratum cum genere documenti non congruit.'; +$lang['uploadspam'] = 'Onerare non potest: nam in indice perscriptionis documentum est.'; +$lang['uploadxss'] = 'Onerare non potest: nam forsitan malum scriptum in documento est.'; +$lang['uploadsize'] = 'Documentum onerandum ponderosius est. (Maxime "%s")'; +$lang['deletesucc'] = 'Documentum "%s" deletum est.'; +$lang['deletefail'] = '"%s" non deletur: uide facultates.'; +$lang['mediainuse'] = 'documentum "%s" non deletur, nam aliquis hoc utitur.'; +$lang['namespaces'] = 'Genus'; +$lang['mediafiles'] = 'Documentum liberum in:'; +$lang['accessdenied'] = 'Non uidere documentum potes.'; +$lang['mediausage'] = 'Hac forma uteris ut documentum referas:'; +$lang['mediaview'] = 'Vide documentum primigenium'; +$lang['mediaroot'] = 'scrinium'; +$lang['mediaupload'] = 'Hic genus oneras. Si nouom genus creare uis, ante "Onerare ut" nomen documenti diuisum a duabus punctis ponas.'; +$lang['mediaextchange'] = 'Genus documenti mutatum a(b) ".%s" ad ".%s"!'; +$lang['reference'] = 'Referre:'; +$lang['ref_inuse'] = 'Documentum non deleri potest, nam in his paginis apertum est:'; +$lang['ref_hidden'] = 'Aliquae mentiones ad paginas, ad quas ire non potes, habent'; +$lang['hits'] = 'Ictus'; +$lang['quickhits'] = 'Spatium nominis conguens'; +$lang['toc'] = 'Index'; +$lang['current'] = 'nouos\a\um'; +$lang['yours'] = 'Tua forma'; +$lang['diff'] = 'Discrimina inter formas ostendere'; +$lang['diff2'] = 'Discrimina inter electas recensiones ostendere'; +$lang['difflink'] = 'Nexum ad comparandum'; +$lang['line'] = 'Linea'; +$lang['breadcrumb'] = 'Vestigium'; +$lang['youarehere'] = 'Hic es'; +$lang['lastmod'] = 'Extrema mutatio'; +$lang['by'] = 'a(b)'; +$lang['deleted'] = 'deletur'; +$lang['created'] = 'creatur'; +$lang['restored'] = 'Recensio uetus restituta'; +$lang['external_edit'] = 'Externe recensere'; +$lang['summary'] = 'Indicem recensere'; +$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> necessarium est.'; +$lang['download'] = 'Snippet capere'; +$lang['mail_newpage'] = 'Pagina addita:'; +$lang['mail_changed'] = 'Pagina mutata:'; +$lang['mail_subscribe_list'] = 'Paginae in genere mutatae:'; +$lang['mail_new_user'] = 'Nouos Sodalis:'; +$lang['mail_upload'] = 'Documentum oneratum:'; +$lang['qb_bold'] = 'Litterae pingues'; +$lang['qb_italic'] = 'Litterae italicae'; +$lang['qb_underl'] = 'Litterae sullineatae'; +$lang['qb_code'] = 'Codex scripti'; +$lang['qb_strike'] = 'Litterae illineatae'; +$lang['qb_h1'] = 'Caput I'; +$lang['qb_h2'] = 'Caput II'; +$lang['qb_h3'] = 'Caput III'; +$lang['qb_h4'] = 'Caput IV'; +$lang['qb_h5'] = 'Caput V'; +$lang['qb_h'] = 'Caput'; +$lang['qb_hs'] = 'Caput eligere'; +$lang['qb_hplus'] = 'Caput maius'; +$lang['qb_hminus'] = 'Caput minus'; +$lang['qb_hequal'] = 'Caput eiusdem gradus'; +$lang['qb_link'] = 'Nexus internus'; +$lang['qb_extlink'] = 'Nexus externus (memento praefigere http://)'; +$lang['qb_hr'] = 'Linea directa (noli saepe uti)'; +$lang['qb_ol'] = 'Index ordinatus rerum'; +$lang['qb_ul'] = 'Index non ordinatus rerum'; +$lang['qb_media'] = 'Imagines et documenta addere'; +$lang['qb_sig'] = 'Subscriptio tua cum indicatione temporis'; +$lang['qb_smileys'] = 'Pupuli'; +$lang['qb_chars'] = 'Signa singularia'; +$lang['upperns'] = 'I ad anterius genus'; +$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['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'; +$lang['subscr_unsubscribe_success'] = 'A subscriptione %s deletur quod %s'; +$lang['subscr_unsubscribe_error'] = 'Error delendi %s a subscriptione quod %s'; +$lang['subscr_already_subscribed'] = '%s iam subscriptus\a est in %s'; +$lang['subscr_not_subscribed'] = '%s non subscriptus\a est in %n'; +$lang['subscr_m_not_subscribed'] = 'Non hanc paginam uel genus subscribere potes.'; +$lang['subscr_m_new_header'] = 'Subscriptionem addere'; +$lang['subscr_m_current_header'] = 'haec subscriptio:'; +$lang['subscr_m_unsubscribe'] = 'Delere'; +$lang['subscr_m_subscribe'] = 'Subscribere'; +$lang['subscr_m_receive'] = 'Accipere'; +$lang['subscr_style_every'] = 'Cursus mutationibus omnibus'; +$lang['subscr_style_digest'] = 'Accipere litteras in mutando paginam (%.2f dies)'; +$lang['subscr_style_list'] = 'Index mutatarum paginarum ab extremis litteris (%.2f dies)'; +$lang['authmodfailed'] = 'Confirmatio infeliciter facta est. Rectorem conuenis.'; +$lang['authtempfail'] = 'Confirmare non potes. Rectorem conuenis.'; +$lang['i_chooselang'] = 'Linguam eligere'; +$lang['i_installer'] = 'Docuuicis creator'; +$lang['i_wikiname'] = 'Nomen Vicis'; +$lang['i_enableacl'] = 'ICA aptum facias (consulatum est)'; +$lang['i_superuser'] = 'Magister\stra'; +$lang['i_problems'] = 'Creator hos errores habes. Continuare potes postquam omnia soluentur.'; +$lang['i_modified'] = 'Hoc scriptum solum cum noua forma Dokuuicis est. Hoc rursum capere in pagina, in qua haec machina capta est, potes aut i ad <a href="http://dokuwiki.org/install">Dokuuicis installation instructions</a>'; +$lang['i_funcna'] = 'PHP functio <code>%s</code> inepta est.'; +$lang['i_phpver'] = 'Forma tua PHP <code>%s</code> minor quam illa necessaria <code>%s</code>.'; +$lang['i_permfail'] = '<code>%s</code> non a uice scribitur. Facultates inspicere.'; +$lang['i_confexists'] = '<code>%s</code> iam est.'; +$lang['i_writeerr'] = '<code>%s</code> non creari potest. Manu illum creas.'; +$lang['i_badhash'] = 'Ignotum uel mutatum dokuwiki.php (<code>%s</code>)'; +$lang['i_badval'] = '<code>%s</code> non legitimum uel uacuom'; +$lang['i_success'] = 'Administratio feliciter perficitur. Delere install.php documentum potes. I ad <a href="doku.php">hanc paginam</a> ut continues.'; +$lang['i_failure'] = 'Aliqui errores dum documenta administrantur sunt. Manu onerare omnes potes priusquam <a href="doku.php">tuo nouo uice</a> uteris.'; +$lang['i_policy'] = 'ICA ratio prima'; +$lang['i_pol0'] = 'Vicem aperire (omnes legere, scribere, onerare possunt)'; +$lang['i_pol1'] = 'Publicus uicis (omnes legere, Sodales scribere et onerare possunt)'; +$lang['i_pol2'] = 'Clausus uicis (Soli Sodales legere scribere et onerare poccunt)'; +$lang['i_retry'] = 'Rursum temptas'; +$lang['i_license'] = 'Elige facultatem sub qua tuus uicis est:'; +$lang['mu_intro'] = 'Plura documenta uno tempore onerare potes.'; +$lang['mu_gridname'] = 'Documenti nomen'; +$lang['mu_gridsize'] = 'Pondus'; +$lang['mu_gridstat'] = 'Status'; +$lang['mu_namespace'] = 'Genus'; +$lang['mu_browse'] = 'Euoluere'; +$lang['mu_toobig'] = 'Ponderosius'; +$lang['mu_ready'] = 'Aptus ad onerandum'; +$lang['mu_done'] = 'Perfectum'; +$lang['mu_fail'] = 'Error'; +$lang['mu_authfail'] = 'Sessio exit'; +$lang['mu_progress'] = '@PCT@% oneratum'; +$lang['mu_filetypes'] = 'Genera documenti apta facere'; +$lang['mu_info'] = 'Documenta onerare'; +$lang['mu_lasterr'] = 'Extremus error:'; +$lang['recent_global'] = 'Mutatione in hoc genere uides. Recentiores mutationes quoque uidere <a href="%s">potes</a>'; +$lang['years'] = 'ab annis %d'; +$lang['months'] = 'a mensibus %d'; +$lang['weeks'] = 'a septimanis %d'; +$lang['days'] = 'a diebus %d'; +$lang['hours'] = 'a horis %d'; +$lang['minutes'] = 'a minutis %d'; +$lang['seconds'] = 'a secundis %d'; +$lang['wordblock'] = 'Mutationes non seruantur, eo quod mala uerba contenit'; diff --git a/inc/lang/la/locked.txt b/inc/lang/la/locked.txt new file mode 100644 index 000000000..65446df30 --- /dev/null +++ b/inc/lang/la/locked.txt @@ -0,0 +1,3 @@ +====== Pagina inclusa ====== + +Haec pagina inclusa est: nullam mutationem facere potest.
\ No newline at end of file diff --git a/inc/lang/la/login.txt b/inc/lang/la/login.txt new file mode 100644 index 000000000..25d4cd170 --- /dev/null +++ b/inc/lang/la/login.txt @@ -0,0 +1,3 @@ +====== Aditus ====== + +Nomen Sodalis et tesseram scribere debes ut in conuentum inire uelis.
\ No newline at end of file diff --git a/inc/lang/la/mailtext.txt b/inc/lang/la/mailtext.txt new file mode 100644 index 000000000..2d2504c8c --- /dev/null +++ b/inc/lang/la/mailtext.txt @@ -0,0 +1,16 @@ +Pagina in uice addita uel mutata. Hae singulae res sunt: + +Dies : @DATE@ +IP-Numerus : @IPADDRESS@ +Hospes situs : @HOSTNAME@ +Vetus recensio: @OLDPAGE@ +Noua recensio: @NEWPAGE@ +Summa recensere: @SUMMARY@ +Sodalis : @USER@ + +@DIFF@ + + +-- +Hic cursus generatus a(b) +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/la/newpage.txt b/inc/lang/la/newpage.txt new file mode 100644 index 000000000..13cfff7d6 --- /dev/null +++ b/inc/lang/la/newpage.txt @@ -0,0 +1,3 @@ +====== Hoc argumentum deest ====== + +Nexum, quod pressisti, ad argumentum nullum fert. Si facultatem habes, creare nouam paginam potes.
\ No newline at end of file diff --git a/inc/lang/la/norev.txt b/inc/lang/la/norev.txt new file mode 100644 index 000000000..19b60fe15 --- /dev/null +++ b/inc/lang/la/norev.txt @@ -0,0 +1,3 @@ +====== Forma non reperta ====== + +Haec forma non reperta est. Aliam formam quaeris.
\ No newline at end of file diff --git a/inc/lang/la/password.txt b/inc/lang/la/password.txt new file mode 100644 index 000000000..f49f4b85d --- /dev/null +++ b/inc/lang/la/password.txt @@ -0,0 +1,10 @@ +Aue @FULLNAME@! + +Hae res @TITLE@, i ad paginam: @DOKUWIKIURL@ + +Sodalis nomen : @LOGIN@ +Tessera : @PASSWORD@ + +-- +Hic cursus generatus a(b) +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/la/preview.txt b/inc/lang/la/preview.txt new file mode 100644 index 000000000..7e5a1377e --- /dev/null +++ b/inc/lang/la/preview.txt @@ -0,0 +1,3 @@ +====== Praeuisio ====== + +In hac pagina scriptum praeuidere potes. Memento hunc non seruatum iam esse.
\ No newline at end of file diff --git a/inc/lang/la/pwconfirm.txt b/inc/lang/la/pwconfirm.txt new file mode 100644 index 000000000..32e351a9c --- /dev/null +++ b/inc/lang/la/pwconfirm.txt @@ -0,0 +1,14 @@ +Aue, @FULLNAME@! + +Aliquis tesseram nouam @TITLE@ +ut ineas in @DOKUWIKIURL@ + +Si nouam tesseram non petiuisti, hoc nuntium ignorat. + +Ut hoc nuntium petiuisti, premendo hunc nexum confirmas. + +@CONFIRM@ + +-- +Hic cursus generatus a +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/la/read.txt b/inc/lang/la/read.txt new file mode 100644 index 000000000..b1710f2e6 --- /dev/null +++ b/inc/lang/la/read.txt @@ -0,0 +1 @@ +Hanc paginam solum legere potes. Fontem uidere, sed non mutare potes.
\ No newline at end of file diff --git a/inc/lang/la/recent.txt b/inc/lang/la/recent.txt new file mode 100644 index 000000000..d8e721cbf --- /dev/null +++ b/inc/lang/la/recent.txt @@ -0,0 +1,3 @@ +====== Recentes Mutationes ====== + +Hae paginae mutatae sunt in recentibus temporibus
\ No newline at end of file diff --git a/inc/lang/la/register.txt b/inc/lang/la/register.txt new file mode 100644 index 000000000..71ca8dd0f --- /dev/null +++ b/inc/lang/la/register.txt @@ -0,0 +1,3 @@ +====== Nouom\am Sodalem Adscribere ====== + +Nomen Sodalis legitimus esse debes: [[doku>pagename|pagename]].
\ No newline at end of file diff --git a/inc/lang/la/registermail.txt b/inc/lang/la/registermail.txt new file mode 100644 index 000000000..73901950e --- /dev/null +++ b/inc/lang/la/registermail.txt @@ -0,0 +1,14 @@ +Nouos\a Sodalis est. Hae suae res: + +Sodalis nomen : @NEWUSER@ +Nomen uerum : @NEWNAME@ +Cursus interretialis : @NEWEMAIL@ + +Dies : @DATE@ +Machina interretis : @BROWSER@ +IP-numerus : @IPADDRESS@ +Hostname : @HOSTNAME@ + +-- +Hic cursus generatus a +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/la/resendpwd.txt b/inc/lang/la/resendpwd.txt new file mode 100644 index 000000000..5a4972fca --- /dev/null +++ b/inc/lang/la/resendpwd.txt @@ -0,0 +1,3 @@ +====== ouam Tesseram mittere ====== + +Inserere nomen Sodalis priusquam tesseram petere. Confirmatio mittibitur.
\ No newline at end of file diff --git a/inc/lang/la/revisions.txt b/inc/lang/la/revisions.txt new file mode 100644 index 000000000..38b9bae0e --- /dev/null +++ b/inc/lang/la/revisions.txt @@ -0,0 +1,3 @@ +====== Veteres recensiones ====== + +In hac pagina ueteres recensiones paginae sunt: ut unam ex his restituas, illam eligis et deinde "Recensere paginam" premis et serua.
\ No newline at end of file diff --git a/inc/lang/la/searchpage.txt b/inc/lang/la/searchpage.txt new file mode 100644 index 000000000..8e929110d --- /dev/null +++ b/inc/lang/la/searchpage.txt @@ -0,0 +1,5 @@ +====== Quaerere ====== + +Responsiones in hac pagina uidere potes. + +===== Responsiones =====
\ No newline at end of file diff --git a/inc/lang/la/showrev.txt b/inc/lang/la/showrev.txt new file mode 100644 index 000000000..b95e68265 --- /dev/null +++ b/inc/lang/la/showrev.txt @@ -0,0 +1,2 @@ +**Haec uetus forma documenti est!** +----
\ No newline at end of file diff --git a/inc/lang/la/stopwords.txt b/inc/lang/la/stopwords.txt new file mode 100644 index 000000000..f063ba775 --- /dev/null +++ b/inc/lang/la/stopwords.txt @@ -0,0 +1,37 @@ +apud +sunt +etsi +atque +et +tu +tuus +eius +eorum +infra +ad +in +inter +si +in +a +ab +de +ut +super +aut +uel +illud +illa +ille +ad +fuit +quid +quod +ubi +hoc +ex +e +cum +haec +hic +www
\ No newline at end of file diff --git a/inc/lang/la/subscr_digest.txt b/inc/lang/la/subscr_digest.txt new file mode 100644 index 000000000..629213359 --- /dev/null +++ b/inc/lang/la/subscr_digest.txt @@ -0,0 +1,20 @@ +Aue! + +Pagina @PAGE@ in @TITLE@ uici mutata. +Haec mutationes sunt: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Vetus recensio: @OLDPAGE@ +Noua recensio: @NEWPAGE@ + +Ut paginae adnotationes deleas, in uicem ineas in +@DOKUWIKIURL@, deinde uideas +@NEWPAGE@ +et paginarum generum optiones mutes. + +-- +Hic cursus a uicis generatus +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/la/subscr_form.txt b/inc/lang/la/subscr_form.txt new file mode 100644 index 000000000..23000b31e --- /dev/null +++ b/inc/lang/la/subscr_form.txt @@ -0,0 +1,3 @@ +====== Inscriptionis Administratio ====== + +In hac pagina inscriptiones huius paginae et generis sunt.
\ No newline at end of file diff --git a/inc/lang/la/subscr_list.txt b/inc/lang/la/subscr_list.txt new file mode 100644 index 000000000..e6ff8d89d --- /dev/null +++ b/inc/lang/la/subscr_list.txt @@ -0,0 +1,17 @@ +Aue! + +Paginae in spatio nominis @PAGE@ @TITLE@ uicis mutatae. +Hae mutationes sunt: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Ut adnotationes deleas, preme hic +@DOKUWIKIURL@ then visit +@SUBSCRIBE@ +et paginarum et\aut generum mutationes tollis. + +-- +Hic cursus generatus a(b) +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/la/subscr_single.txt b/inc/lang/la/subscr_single.txt new file mode 100644 index 000000000..7839791ea --- /dev/null +++ b/inc/lang/la/subscr_single.txt @@ -0,0 +1,23 @@ +Aue! + +Pagina "@PAGE@" in titulo "@TITlE@" mutata. +Hae mutationes sunt: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Dies : @DATE@ +Sodalis : @USER@ +Summa recensita: @SUMMARY@ +Vetus recensio: @OLDPAGE@ +Noua recensio: @NEWPAGE@ + +Ut paginae adnotationes deleas, in uicem ineas in +@DOKUWIKIURL@, deinde uideas +@NEWPAGE@ +et paginarum et\aut generum optiones mutasa. + +-- +Hic cursus a uicis generatus +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/la/updateprofile.txt b/inc/lang/la/updateprofile.txt new file mode 100644 index 000000000..565f81a3e --- /dev/null +++ b/inc/lang/la/updateprofile.txt @@ -0,0 +1,3 @@ +====== Nouare Sodalis tabellas ====== + +Solum in campis, quos mutare uis, scribis. Nomen Sodalis non mutare potes.
\ No newline at end of file diff --git a/inc/lang/la/uploadmail.txt b/inc/lang/la/uploadmail.txt new file mode 100644 index 000000000..044297973 --- /dev/null +++ b/inc/lang/la/uploadmail.txt @@ -0,0 +1,14 @@ +Documentum nouatum est. Hae mutatione sunt: + +Documentum : @MEDIA@ +Dies : @DATE@ +Machina interretis : @BROWSER@ +IP-Numerus : @IPADDRESS@ +Hospes situs : @HOSTNAME@ +Pondus : @SIZE@ +MIME Genus : @MIME@ +Sodalis : @USER@ + +-- +Hic cursu generatus a(b) +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/lb/lang.php b/inc/lang/lb/lang.php index 7152b65b1..09fc41f08 100644 --- a/inc/lang/lb/lang.php +++ b/inc/lang/lb/lang.php @@ -41,6 +41,7 @@ $lang['btn_resendpwd'] = 'Nei Passwuert schécken'; $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['user'] = 'Benotzernumm'; $lang['pass'] = 'Passwuert'; @@ -50,7 +51,6 @@ $lang['passchk'] = 'nach eng Kéier'; $lang['remember'] = 'Verhal mech'; $lang['fullname'] = 'Richtegen Numm'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Registréieren'; $lang['profile'] = 'Benotzerprofil'; $lang['badlogin'] = 'Entschëllegt, de Benotzernumm oder d\'Passwuert war falsch'; $lang['minoredit'] = 'Kleng Ännerungen'; diff --git a/inc/lang/lt/lang.php b/inc/lang/lt/lang.php index 639ad4749..6ae5f6c73 100644 --- a/inc/lang/lt/lang.php +++ b/inc/lang/lt/lang.php @@ -7,7 +7,6 @@ * @author Edmondas Girkantas <eg@zemaitija.net> * @author Arūnas Vaitekūnas <aras@fan.lt> * @author audrius.klevas@gmail.com - * @author Arunas Vaitekunas <aras@fan.lt> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -50,6 +49,7 @@ $lang['btn_resendpwd'] = 'Išsiųsti naują slaptažodį'; $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['user'] = 'Vartotojo vardas'; $lang['pass'] = 'Slaptažodis'; @@ -59,7 +59,6 @@ $lang['passchk'] = 'dar kartą'; $lang['remember'] = 'Prisiminti mane'; $lang['fullname'] = 'Visas vardas'; $lang['email'] = 'El. pašto adresas'; -$lang['register'] = 'Registruotis'; $lang['profile'] = 'Vartotojo profilis'; $lang['badlogin'] = 'Nurodėte blogą vartotojo vardą arba slaptažodį.'; $lang['minoredit'] = 'Nedidelis pataisymas'; diff --git a/inc/lang/lt/subscribermail.txt b/inc/lang/lt/subscribermail.txt deleted file mode 100644 index 8f101bcd7..000000000 --- a/inc/lang/lt/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Sveiki! - -Pranešame, kad Wiki tinklalapyje @TITLE@ pakeistas puslapis @PAGE@. -Štai pakeitimai: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Norėdami nutraukti šią prenumeratą, apsilankykite -@DOKUWIKIURL@, tada atverkite -@NEWPAGE@ -ir išsirinkite 'Atsisakyti keitimų prenumeratos'. - --- -Šis laiškas sugeneruotas DokuWiki (@DOKUWIKIURL@). - diff --git a/inc/lang/lv/lang.php b/inc/lang/lv/lang.php index 21c4606b3..73559c0f8 100644 --- a/inc/lang/lv/lang.php +++ b/inc/lang/lv/lang.php @@ -44,6 +44,7 @@ $lang['btn_draft'] = 'Labot melnrakstu'; $lang['btn_recover'] = 'Atjaunot melnrakstu'; $lang['btn_draftdel'] = 'Dzēst melnrakstu'; $lang['btn_revert'] = 'Atjaunot'; +$lang['btn_register'] = 'Reģistrēties'; $lang['loggedinas'] = 'Pieteicies kā'; $lang['user'] = 'Lietotājvārds'; $lang['pass'] = 'Parole'; @@ -53,7 +54,6 @@ $lang['passchk'] = 'vēlreiz'; $lang['remember'] = 'Atceries mani'; $lang['fullname'] = 'Pilns vārds'; $lang['email'] = 'E-pasts'; -$lang['register'] = 'Reģistrēties'; $lang['profile'] = 'Lietotāja vārds'; $lang['badlogin'] = 'Atvaino, lietotājvārds vai parole aplama.'; $lang['minoredit'] = 'Sīki labojumi'; diff --git a/inc/lang/lv/subscribermail.txt b/inc/lang/lv/subscribermail.txt deleted file mode 100644 index 1395009f0..000000000 --- a/inc/lang/lv/subscribermail.txt +++ /dev/null @@ -1,23 +0,0 @@ -Sveiki! - -@TITLE@ wiki ir mainījusies lapa @PAGE@ . - -Atšķirības ir: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Datums : @DATE@ -Lietotājs : @USER@ -Izmaiņu anotācija: @SUMMARY@ -Vecā versijan: @OLDPAGE@ -Jaunā versija: @NEWPAGE@ - -Lai atteiktos no šīm vēstulēm, ielogojies wiki sistēmā -@DOKUWIKIURL@, tad apmeklē @NEWPAGE@ -uz izvēlies 'Atteikties no izmaiņu paziņojumiem'. - --- -Vestuli izveidoja -@DOKUWIKIURL@ diff --git a/inc/lang/mg/lang.php b/inc/lang/mg/lang.php index 2ecbcdcff..8c95a9e02 100644 --- a/inc/lang/mg/lang.php +++ b/inc/lang/mg/lang.php @@ -28,6 +28,7 @@ $lang['btn_update'] = 'Update'; $lang['btn_delete'] = 'Fafao'; $lang['btn_back'] = 'Miverina'; $lang['btn_backtomedia'] = 'Fitsongana fichier Media'; +$lang['btn_register'] = 'Hisoratra'; $lang['loggedinas'] = 'Anaranao:'; $lang['user'] = 'Anarana'; @@ -36,7 +37,6 @@ $lang['passchk'] = 'Ataovy indray'; $lang['remember'] = 'Tsarovy'; $lang['fullname'] = 'Anarana feno'; $lang['email'] = 'Imailaka'; -$lang['register'] = 'Hisoratra'; $lang['badlogin'] = 'Miala tsiny fa misy diso ny anarana na ny alahidy.'; $lang['regmissing'] = 'Tsy maintsy fenoina ny saha rehetra.'; @@ -132,4 +132,4 @@ $lang['acl_perm8'] = 'Mandefa rakitra'; $lang['acl_perm16'] = 'Mamafa'; $lang['acl_new'] = 'Ampio andalana vaovao'; -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/lang/mk/lang.php b/inc/lang/mk/lang.php index ddd734e22..456a5a3d4 100644 --- a/inc/lang/mk/lang.php +++ b/inc/lang/mk/lang.php @@ -47,6 +47,7 @@ $lang['btn_draft'] = 'Уреди скица'; $lang['btn_recover'] = 'Поврати скица'; $lang['btn_draftdel'] = 'Избриши скица'; $lang['btn_revert'] = 'Обнови'; +$lang['btn_register'] = 'Регистрирај се'; $lang['loggedinas'] = 'Најавен/а како'; $lang['user'] = 'Корисничко име'; $lang['pass'] = 'Лозинка'; @@ -56,7 +57,6 @@ $lang['passchk'] = 'уште еднаш'; $lang['remember'] = 'Запомни ме'; $lang['fullname'] = 'Вистинско име'; $lang['email'] = 'Е-пошта'; -$lang['register'] = 'Регистрирај се'; $lang['profile'] = 'Кориснички профил'; $lang['badlogin'] = 'Жалам, корисничкото име или лозинката се погрешни.'; $lang['minoredit'] = 'Мали измени'; diff --git a/inc/lang/mr/lang.php b/inc/lang/mr/lang.php index 99561f064..d991d46cf 100644 --- a/inc/lang/mr/lang.php +++ b/inc/lang/mr/lang.php @@ -10,7 +10,6 @@ * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesMr.php?view=co * @author ghatothkach@hotmail.com * @author Padmanabh Kulkarni <kulkarnipadmanabh@gmail.com> - * @author Padmanabh Kulkarni<kulkarnipadmanabh@gmail.com> * @author shantanoo@gmail.com */ $lang['encoding'] = 'utf-8'; @@ -54,6 +53,7 @@ $lang['btn_resendpwd'] = 'कृपया परवलीचा नव $lang['btn_draft'] = 'प्रत संपादन'; $lang['btn_recover'] = 'प्रत परत मिळवा'; $lang['btn_draftdel'] = 'प्रत रद्द'; +$lang['btn_register'] = 'नोंदणी'; $lang['loggedinas'] = 'लॉगिन नाव'; $lang['user'] = 'वापरकर्ता'; $lang['pass'] = 'परवलीचा शब्द'; @@ -63,7 +63,6 @@ $lang['passchk'] = 'परत एकदा'; $lang['remember'] = 'लक्षात ठेवा'; $lang['fullname'] = 'पूर्ण नावं'; $lang['email'] = 'इमेल'; -$lang['register'] = 'नोंदणी'; $lang['profile'] = 'वापरकर्त्याची माहिती'; $lang['badlogin'] = 'माफ़ करा, वापरकर्ता नावात किंवा परवलीच्या शब्दात चूक झाली आहे.'; $lang['minoredit'] = 'छोटे बदल'; diff --git a/inc/lang/mr/subscribermail.txt b/inc/lang/mr/subscribermail.txt deleted file mode 100644 index 8cbb3164e..000000000 --- a/inc/lang/mr/subscribermail.txt +++ /dev/null @@ -1,21 +0,0 @@ -नमस्कार ! - -@TITLE@ विकी मधलं @PAGE@ हे पान बदललं आहे. -खाली त्यातील बदल दाखवले आहेत: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -दिनांक : @DATE@ -सदस्य : @USER@ -संपादन सारांश : @SUMMARY@ -जुनी आवृत्ती : @OLDPAGE@ -नवीन आवृत्ती : @NEWPAGE@ - -पानाच्या बदलाविषयिच्या सूचना तुम्हाला नको असतील तर -@DOKUWIKIURL@ या विकी वर लॉगिन करा आणि -@NEWPAGE@ पानावर जा व त्या पान/नेमस्पेस विषयीच्या सूचना बंद ( unsubscribe ) करा. - --- -हा ईमेल @DOKUWIKIURL@ येथील डॉक्युविकिद्वारा आपोआप तयार केला गेला आहे.
\ No newline at end of file diff --git a/inc/lang/ne/lang.php b/inc/lang/ne/lang.php index 6c00610ea..e5b30ceaf 100644 --- a/inc/lang/ne/lang.php +++ b/inc/lang/ne/lang.php @@ -3,8 +3,7 @@ * Nepali language file * * @author Saroj Kumar Dhakal <lotusnagarkot@gmail.com> - * @author SarojKumar Dhakal <lotusnagarkot@yahoo.com> - * @author Saroj Dhakal<lotusnagarkot@yahoo.com> + * @author Saroj Kumar Dhakal <lotusnagarkot@yahoo.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -47,6 +46,7 @@ $lang['btn_resendpwd'] = 'नयाँ प्रवेश शव्द( $lang['btn_draft'] = ' ड्राफ्ट सम्पादन गर्नुहोस् '; $lang['btn_recover'] = 'पहिलेको ड्राफ्ट हासिल गर्नुहोस '; $lang['btn_draftdel'] = ' ड्राफ्ट मेटाउनुहोस् '; +$lang['btn_register'] = 'दर्ता गर्नुहोस्'; $lang['loggedinas'] = 'प्रवेश गर्नुहोस् '; $lang['user'] = 'प्रयोगकर्ता '; $lang['pass'] = 'प्रवेशशव्द'; @@ -56,7 +56,6 @@ $lang['passchk'] = 'एकपटक पुन:'; $lang['remember'] = 'मलाई सम्झनु'; $lang['fullname'] = 'पूरा नाम'; $lang['email'] = 'इमेल'; -$lang['register'] = 'दर्ता गर्नुहोस्'; $lang['profile'] = 'प्रयोगकर्ताको प्रोफाइल'; $lang['badlogin'] = 'माफ गर्नुहोस् , प्रयोगकर्तानाम वा प्रवेशशव्द गलत भयो '; $lang['minoredit'] = 'सामान्य परिवर्तन'; diff --git a/inc/lang/ne/subscribermail.txt b/inc/lang/ne/subscribermail.txt deleted file mode 100644 index 413c79c67..000000000 --- a/inc/lang/ne/subscribermail.txt +++ /dev/null @@ -1,19 +0,0 @@ -नमस्कार ! -@TITLE@ शिर्षक रहेको यो पृष्ठ @PAGE@ परिवर्तन भएको छ । --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- -मिति : @DATE@ -प्रयोगकर्ता : @USER@ -सम्पादन सारांस: @SUMMARY@ -पुरानो संस्करण : @OLDPAGE@ -नविन संस्करण: @NEWPAGE@ - -यस्ता जानकारीहरु रद्द गर्नको लागि -@DOKUWIKIURL@ मा प्रवेश गरी -@NEWPAGE@ अवलोकन पश्चात -पृष्ठ या नेमस्पेस परिवर्तन जानकारी ग्राह्यता बदर गर्नुहो - --- -यो पत्र DokuWiki ले -@DOKUWIKIURL@ मा स्वत: बनाएको हो ।
\ No newline at end of file diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php index 9d81d0ff4..7dbde5ac8 100644 --- a/inc/lang/nl/lang.php +++ b/inc/lang/nl/lang.php @@ -11,8 +11,7 @@ * @author John de Graaff <john@de-graaff.net> * @author Dion Nicolaas <dion@nicolaas.net> * @author Danny Rotsaert <danny.rotsaert@edpnet.be> - * @author Marijn Hofstra hofstra.m@gmail.com - * @author Matthias Carchon webmaster@c-mattic.be + * @author Matthias Carchon <webmaster@c-mattic.be> * @author Marijn Hofstra <hofstra.m@gmail.com> * @author Timon Van Overveldt <timonvo@gmail.com> */ @@ -55,6 +54,7 @@ $lang['btn_draft'] = 'Bewerk concept'; $lang['btn_recover'] = 'Herstel concept'; $lang['btn_draftdel'] = 'Verwijder concept'; $lang['btn_revert'] = 'Herstellen'; +$lang['btn_register'] = 'Registreren'; $lang['loggedinas'] = 'Ingelogd als'; $lang['user'] = 'Gebruikersnaam'; $lang['pass'] = 'Wachtwoord'; @@ -64,7 +64,6 @@ $lang['passchk'] = 'nogmaals'; $lang['remember'] = 'Bewaar'; $lang['fullname'] = 'Volledige naam'; $lang['email'] = 'E-mail'; -$lang['register'] = 'Registreren'; $lang['profile'] = 'Gebruikersprofiel'; $lang['badlogin'] = 'Sorry, gebruikersnaam of wachtwoord onjuist'; $lang['minoredit'] = 'Kleine wijziging'; @@ -167,6 +166,9 @@ $lang['yours'] = 'Jouw versie'; $lang['diff'] = 'Toon verschillen met huidige revisie'; $lang['diff2'] = 'Toon verschillen tussen geselecteerde revisies'; $lang['difflink'] = 'Link naar deze vergelijking'; +$lang['diff_type'] = 'Bekijk verschillen:'; +$lang['diff_inline'] = 'Inline'; +$lang['diff_side'] = 'Zij aan zij'; $lang['line'] = 'Regel'; $lang['breadcrumb'] = 'Spoor'; $lang['youarehere'] = 'Je bent hier'; diff --git a/inc/lang/nl/subscribermail.txt b/inc/lang/nl/subscribermail.txt deleted file mode 100644 index 5b092a9a6..000000000 --- a/inc/lang/nl/subscribermail.txt +++ /dev/null @@ -1,16 +0,0 @@ -Hallo! - -De pagina @PAGE@ op de @TITLE@ wiki is gewijzigd. -Hier zijn de aanpassingen: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Om deze berichten niet meer te ontvangen van @DOKUWIKIURL@ , ga naar -@NEWPAGE@ -en kies 'Opzeggen wijzigingen'. - --- -Dit bericht is gegenereerd door DokuWiki op -@DOKUWIKIURL@ diff --git a/inc/lang/no/lang.php b/inc/lang/no/lang.php index ca63c0094..d2be945e6 100644 --- a/inc/lang/no/lang.php +++ b/inc/lang/no/lang.php @@ -5,17 +5,16 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Reidar Mosvold <Reidar.Mosvold@hit.no> * @author Jorge Barrera Grandon <jorge@digitalwolves.org> - * @author Rune Rasmussen http://www.syntaxerror.no/ + * @author Rune Rasmussen [http://www.syntaxerror.no/] * @author Thomas Nygreen <nygreen@gmail.com> * @author Arild Burud <arildb@met.no> * @author Torkill Bruland <torkar-b@online.no> * @author Rune M. Andersen <rune.andersen@gmail.com> - * @author Jakob Vad Nielsen (me@jakobnielsen.net) + * @author Jakob Vad Nielsen <me@jakobnielsen.net> * @author Kjell Tore Næsgaard <kjell.t.nasgaard@ntnu.no> * @author Knut Staring <knutst@gmail.com> * @author Lisa Ditlefsen <lisa@vervesearch.com> * @author Erik Pedersen <erik.pedersen@shaw.ca> - * @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -59,6 +58,7 @@ $lang['btn_draft'] = 'Rediger kladd'; $lang['btn_recover'] = 'Gjennvinn kladd'; $lang['btn_draftdel'] = 'Slett kladd'; $lang['btn_revert'] = 'Gjenopprette'; +$lang['btn_register'] = 'Registrer deg'; $lang['loggedinas'] = 'Innlogget som'; $lang['user'] = 'Brukernavn'; $lang['pass'] = 'Passord'; @@ -68,7 +68,6 @@ $lang['passchk'] = 'Bekreft passord'; $lang['remember'] = 'Husk meg'; $lang['fullname'] = 'Fullt navn'; $lang['email'] = 'E-post'; -$lang['register'] = 'Registrer deg'; $lang['profile'] = 'Brukerprofil'; $lang['badlogin'] = 'Ugyldig brukernavn og/eller passord.'; $lang['minoredit'] = 'Mindre endringer'; diff --git a/inc/lang/no/subscribermail.txt b/inc/lang/no/subscribermail.txt deleted file mode 100644 index 999f75787..000000000 --- a/inc/lang/no/subscribermail.txt +++ /dev/null @@ -1,16 +0,0 @@ -Hei! - -Siden @PAGE@ i @TITLE@-wikien har blitt endret. -Her er endringene: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -For å avslutte abonnering på denne siden logg inn -på wikien på @DOKUWIKIURL@, besøk deretter @NEWPAGE@ -og velg 'Ikke abonner på endringer'. - --- -Denne mailen ble generert av DokuWiki på -@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/pl/lang.php b/inc/lang/pl/lang.php index 5a366fbb5..bc0509df3 100644 --- a/inc/lang/pl/lang.php +++ b/inc/lang/pl/lang.php @@ -51,6 +51,7 @@ $lang['btn_draft'] = 'Edytuj szkic'; $lang['btn_recover'] = 'Przywróć szkic'; $lang['btn_draftdel'] = 'Usuń szkic'; $lang['btn_revert'] = 'Przywróć'; +$lang['btn_register'] = 'Zarejestruj się!'; $lang['loggedinas'] = 'Zalogowany jako'; $lang['user'] = 'Użytkownik'; $lang['pass'] = 'Hasło'; @@ -60,7 +61,6 @@ $lang['passchk'] = 'Powtórz hasło'; $lang['remember'] = 'Zapamiętaj'; $lang['fullname'] = 'Imię i nazwisko'; $lang['email'] = 'E-mail'; -$lang['register'] = 'Zarejestruj się!'; $lang['profile'] = 'Profil użytkownika'; $lang['badlogin'] = 'Nazwa użytkownika lub hasło są nieprawidłowe.'; $lang['minoredit'] = 'Mniejsze zmiany'; diff --git a/inc/lang/pl/subscribermail.txt b/inc/lang/pl/subscribermail.txt deleted file mode 100644 index 76300177e..000000000 --- a/inc/lang/pl/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Witaj! - -Strona @PAGE@ w wiki @TITLE@ została zmieniona. -Szczegóły: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Aby zaprzestać subskrypcji zmian tej strony zaloguj się na -@DOKUWIKIURL@ a następnie przejdź do strony -@NEWPAGE@ -i wybierz 'zaprzestań subskrypcji zmian'. - --- -List został wygenerowany przez DokuWiki pod adresem -@DOKUWIKIURL@ diff --git a/inc/lang/pt-br/lang.php b/inc/lang/pt-br/lang.php index 6bbd4c520..e3568b56b 100644 --- a/inc/lang/pt-br/lang.php +++ b/inc/lang/pt-br/lang.php @@ -13,13 +13,12 @@ * @author Jeferson Propheta <jeferson.propheta@gmail.com> * @author jair.henrique@gmail.com * @author Luis Dantas <luis@dantas.com> - * @author Frederico Guimarães <frederico@teia.bio.br> - * @author Jair Henrique <jair.henrique@gmail.com> * @author Luis Dantas <luisdantas@gmail.com> - * @author Sergio Motta sergio@cisne.com.br + * @author Jair Henrique <jair.henrique@gmail.com> + * @author Sergio Motta <sergio@cisne.com.br> * @author Isaias Masiero Filho <masiero@masiero.org> */ -$lang['encoding'] = 'utf-8<'; +$lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; $lang['doublequoteopening'] = '“'; $lang['doublequoteclosing'] = '”'; @@ -58,6 +57,7 @@ $lang['btn_draft'] = 'Editar o rascunho'; $lang['btn_recover'] = 'Recuperar o rascunho'; $lang['btn_draftdel'] = 'Excluir o rascunho'; $lang['btn_revert'] = 'Restaure'; +$lang['btn_register'] = 'Registrar'; $lang['loggedinas'] = 'Autenticado(a) como'; $lang['user'] = 'Nome de usuário'; $lang['pass'] = 'Senha'; @@ -67,7 +67,6 @@ $lang['passchk'] = 'mais uma vez'; $lang['remember'] = 'Lembre-se de mim'; $lang['fullname'] = 'Nome completo'; $lang['email'] = 'E-mail'; -$lang['register'] = 'Registrar'; $lang['profile'] = 'Perfil do usuário'; $lang['badlogin'] = 'Desculpe, mas o nome de usuário ou a senha estão incorretos.'; $lang['minoredit'] = 'Alterações mínimas'; diff --git a/inc/lang/pt-br/subscribermail.txt b/inc/lang/pt-br/subscribermail.txt deleted file mode 100644 index 157196c15..000000000 --- a/inc/lang/pt-br/subscribermail.txt +++ /dev/null @@ -1,24 +0,0 @@ -Olá! - -A página @PAGE@, no wiki @TITLE@ foi modificada. -Aqui estão as mudanças: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Data : @DATE@ -Usuário : @USER@ -Resumo da edição: @SUMMARY@ -Revisão antiga: @OLDPAGE@ -Revisão nova: @NEWPAGE@ - -Para cancelar as notificações dessa página, identifique-se em -@DOKUWIKIURL@, vá até -@NEWPAGE@ -e cancele o monitoramento das alterações da página e/ou do -espaço de nomes. - --- -Essa mensagem foi gerada pelo DokuWiki em -@DOKUWIKIURL@ diff --git a/inc/lang/pt/admin.txt b/inc/lang/pt/admin.txt index fccd9ca33..366792a9b 100644 --- a/inc/lang/pt/admin.txt +++ b/inc/lang/pt/admin.txt @@ -1,5 +1,3 @@ ====== Administração ====== -Esta é a lista de tarefas de Administração permitidas pelo DokuWiki. - ----- +Abaixo pode encontrar uma lista de tarefas de administrativas permitidas pelo DokuWiki.
\ No newline at end of file diff --git a/inc/lang/pt/denied.txt b/inc/lang/pt/denied.txt index 71355b01f..eb2614387 100644 --- a/inc/lang/pt/denied.txt +++ b/inc/lang/pt/denied.txt @@ -1,5 +1,3 @@ ====== Permissão Negada ====== -Não possui direitos e permissões suficientes para continuar. Talvez se tenha esquecido de entrar em sessão? - ----- +Não possui direitos e permissões suficientes para continuar. Talvez se tenha esquecido de iniciar sessão?
\ No newline at end of file diff --git a/inc/lang/pt/editrev.txt b/inc/lang/pt/editrev.txt index 9845a6915..2c7697b52 100644 --- a/inc/lang/pt/editrev.txt +++ b/inc/lang/pt/editrev.txt @@ -1,5 +1 @@ -**Atenção**: Carregou uma revisão antiga do documento! - -Se gravar esta revisão irá criar uma nova versão actual do documento com este conteúdo, que substituirá a versão actual. - ----- +**Carregou uma revisão antiga do documento!** Se a gravar irá criar uma nova versão do documento com este conteúdo, que substituirá a versão actual.
\ No newline at end of file diff --git a/inc/lang/pt/index.txt b/inc/lang/pt/index.txt index f490b7a5c..46a807d2d 100644 --- a/inc/lang/pt/index.txt +++ b/inc/lang/pt/index.txt @@ -1,6 +1,3 @@ ====== Índice ====== -Este índice mostra todos os documentos disponíveis neste site Wiki, [[doku>namespaces | agrupados]] por assunto. - ----- - +Este índice mostra todas as páginas disponíveis, agrupadas por [[doku>namespaces|espaço de nome]].
\ No newline at end of file diff --git a/inc/lang/pt/lang.php b/inc/lang/pt/lang.php index d0861f3ef..976077d40 100644 --- a/inc/lang/pt/lang.php +++ b/inc/lang/pt/lang.php @@ -41,15 +41,14 @@ $lang['btn_back'] = 'Voltar'; $lang['btn_backlink'] = 'Backlinks'; $lang['btn_backtomedia'] = 'Voltar à Selecção de Media'; $lang['btn_subscribe'] = 'Subscrever Alterações'; -$lang['btn_unsubscribe'] = 'Não Subscrever Alterações'; -$lang['btn_subscribens'] = 'Subscrever Mudanças de Espaço de Nome'; -$lang['btn_unsubscribens'] = 'Cancelar Subscrição de Mudanças de Espaço de Nome'; $lang['btn_profile'] = 'Actualizar Perfil'; $lang['btn_reset'] = 'Limpar'; $lang['btn_resendpwd'] = 'Enviar nova senha'; $lang['btn_draft'] = 'Editar rascunho'; $lang['btn_recover'] = 'Recuperar rascunho'; $lang['btn_draftdel'] = 'Apagar rascunho'; +$lang['btn_revert'] = 'Restaurar'; +$lang['btn_register'] = 'Registar'; $lang['loggedinas'] = 'Está em sessão como'; $lang['user'] = 'Utilizador'; $lang['pass'] = 'Senha'; @@ -59,7 +58,6 @@ $lang['passchk'] = 'Confirmar novamente'; $lang['remember'] = 'Memorizar?'; $lang['fullname'] = 'Nome completo'; $lang['email'] = 'Email'; -$lang['register'] = 'Registar'; $lang['profile'] = 'Perfil do Utilizador'; $lang['badlogin'] = 'O utilizador inválido ou senha inválida.'; $lang['minoredit'] = 'Alterações Menores'; @@ -88,13 +86,46 @@ $lang['resendpwdconfirm'] = 'O link de confirmação foi enviado por e-mail $lang['resendpwdsuccess'] = 'A nova senha foi enviada por e-mail.'; $lang['license'] = 'Excepto menção em contrário, o conteúdo neste wiki está sob a seguinte licença:'; $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_overwrt'] = 'Escrever por cima do ficheiro já existente'; $lang['lockedby'] = 'Bloqueado por'; $lang['lockexpire'] = 'Expira em'; $lang['willexpire'] = 'O bloqueio de edição para este documento irá expirar num minuto.\nPara evitar conflitos de edição, clique no botão <Prever> para re-iniciar o temporizador de bloqueio.'; -$lang['js']['notsavedyet'] = "Existem alterações não gravadas, que serão perdidas se continuar.\nDeseja realmente continuar?"; +$lang['js']['notsavedyet'] = 'Existem alterações não gravadas, que serão perdidas se continuar. +Deseja realmente continuar?'; +$lang['js']['searchmedia'] = 'Procurar por ficheiros'; +$lang['js']['keepopen'] = 'Mantenha a janela aberta durante a selecção'; +$lang['js']['hidedetails'] = 'Esconder Detalhes'; +$lang['js']['mediatitle'] = 'Propriedades de ligação'; +$lang['js']['mediadisplay'] = 'Tipo de ligação'; +$lang['js']['mediaalign'] = 'Alinhamento'; +$lang['js']['mediasize'] = 'Tamanho da imagem'; +$lang['js']['mediatarget'] = 'Alvo da ligação'; +$lang['js']['mediaclose'] = 'Fechar'; +$lang['js']['mediainsert'] = 'Inserir'; +$lang['js']['mediadisplayimg'] = 'Mostrar a imagem'; +$lang['js']['mediadisplaylnk'] = 'Mostrar apenas a ligação'; +$lang['js']['mediasmall'] = 'Versão pequena'; +$lang['js']['mediamedium'] = 'Versão média'; +$lang['js']['medialarge'] = 'Versão grande'; +$lang['js']['mediaoriginal'] = 'Versão original'; +$lang['js']['medialnk'] = 'Ligação para a página de detalhe'; +$lang['js']['mediadirect'] = 'Ligação directa para o original'; +$lang['js']['medianolnk'] = 'Nenhuma ligação'; +$lang['js']['medianolink'] = 'Não ligar à imagem'; +$lang['js']['medialeft'] = 'Alinhar a imagem à esquerda.'; +$lang['js']['mediaright'] = 'Alinhar a imagem à direita.'; +$lang['js']['mediacenter'] = 'Alinhar a imagem ao centro.'; +$lang['js']['medianoalign'] = 'Não usar alinhamento algum.'; +$lang['js']['nosmblinks'] = 'Ligação a pastas Windows partilhadas apenas funciona com o Microsoft Internet Explorer. +Pode no entanto copiar e colar o link.'; +$lang['js']['linkwiz'] = 'Assistente de Criação de Ligação'; +$lang['js']['linkto'] = 'Ligação para:'; +$lang['js']['del_confirm'] = 'Remover esta entrada?'; +$lang['js']['mu_btn'] = 'Enviar múltiplos ficheiros de uma vez'; $lang['rssfailed'] = 'Ocorreu um erro neste canal RSS: '; $lang['nothingfound'] = 'Nada foi encontrado.'; $lang['mediaselect'] = 'Selecção de ficheiros'; @@ -112,14 +143,7 @@ $lang['deletefail'] = 'O ficheiro "%s" não pode ser removido, por fa $lang['mediainuse'] = 'O ficheiro "%s" não foi removido porque está ainda a ser usado.'; $lang['namespaces'] = 'Grupos'; $lang['mediafiles'] = 'Ficheiros disponíveis em'; -$lang['js']['keepopen'] = 'Mantenha a janela aberta durante a selecção'; -$lang['js']['hidedetails'] = 'Esconder Detalhes'; -$lang['js']['nosmblinks'] = 'Ligação a pastas Windows partilhadas apenas funciona com o Microsoft Internet Explorer. -Pode no entanto copiar e colar o link.'; -$lang['js']['linkwiz'] = 'Assistente de Criação de Ligação'; -$lang['js']['linkto'] = 'Ligação para:'; -$lang['js']['del_confirm'] = 'Remover esta entrada?'; -$lang['js']['mu_btn'] = 'Enviar múltiplos ficheiros de uma vez'; +$lang['accessdenied'] = 'Não tem permissão para ver esta página.'; $lang['mediausage'] = 'Use a seguinte sintaxe para referenciar este ficheiro:'; $lang['mediaview'] = 'Ver ficheiro original'; $lang['mediaroot'] = 'root'; @@ -135,6 +159,9 @@ $lang['current'] = 'Actual'; $lang['yours'] = 'A sua versão'; $lang['diff'] = 'mostrar diferenças com a versão actual'; $lang['diff2'] = 'mostrar diferenças entre versões escolhidas'; +$lang['difflink'] = 'Ligação para esta vista de comparação'; +$lang['diff_type'] = 'Ver diferenças'; +$lang['diff_side'] = 'Lado a lado'; $lang['line'] = 'Linha'; $lang['breadcrumb'] = 'Está em'; $lang['youarehere'] = 'Está aqui'; @@ -149,6 +176,7 @@ $lang['noflash'] = 'O <a href="http://www.adobe.com/products/flash $lang['download'] = 'Descarregar Snippet'; $lang['mail_newpage'] = 'documento adicionado:'; $lang['mail_changed'] = 'documento modificado:'; +$lang['mail_subscribe_list'] = 'páginas alteradas no espaço de nome:'; $lang['mail_new_user'] = 'Novo utilizador:'; $lang['mail_upload'] = 'Ficheiro carregado:'; $lang['qb_bold'] = 'Texto com Ênfase'; @@ -191,11 +219,22 @@ $lang['img_copyr'] = 'Copyright'; $lang['img_format'] = 'Formato'; $lang['img_camera'] = 'Câmara'; $lang['img_keywords'] = 'Palavras-Chave'; -$lang['subscribe_success'] = '%s adicionado à lista de subscritores de %s'; -$lang['subscribe_error'] = 'Erro ao adicionar %s à lista de subscritores de %s'; -$lang['subscribe_noaddress'] = 'Não existe nenhum endereço associado ao seu perfil, por isso não pode ser adicionado à lista de subscritores.'; -$lang['unsubscribe_success'] = '%s removido da lista de subscritores de %s'; -$lang['unsubscribe_error'] = 'Erro ao remover %s da lista de subscritores de %s'; +$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'; +$lang['subscr_unsubscribe_success'] = 'Removido %s da lista de subscrição para %s'; +$lang['subscr_unsubscribe_error'] = 'Erro ao remover %s da lista de subscrição para %s'; +$lang['subscr_already_subscribed'] = '%s já está subscrito em %s'; +$lang['subscr_not_subscribed'] = '%s não está subscrito em %s'; +$lang['subscr_m_not_subscribed'] = 'Não está subscrito à página ou espaço de nome corrente.'; +$lang['subscr_m_new_header'] = 'Adicionar subscrição'; +$lang['subscr_m_current_header'] = 'Subscrições correntes'; +$lang['subscr_m_unsubscribe'] = 'Des-subscrever'; +$lang['subscr_m_subscribe'] = 'Subscrever'; +$lang['subscr_m_receive'] = 'Receber'; +$lang['subscr_style_every'] = 'email em qualquer alteração'; +$lang['subscr_style_digest'] = '"digest email" de alterações em cada página (cada %.2f dias)'; +$lang['subscr_style_list'] = 'lista de páginas alteradas desde o último email (cada %.2f dias)'; $lang['authmodfailed'] = 'Configuração de autenticação errada. Por favor, informe o Wiki Admin.'; $lang['authtempfail'] = 'Autenticação temporariamente indisponível. Se a situação persistir, por favor informe o Wiki Admin.'; $lang['i_chooselang'] = 'Escolha a linguagem'; @@ -219,6 +258,7 @@ $lang['i_pol0'] = 'Wiki Aberto (ler, escrever e carregar para tod $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_retry'] = 'Repetir'; +$lang['i_license'] = 'Por favor escolha a licença sob a qual quer colocar o seu conteúdo:'; $lang['mu_intro'] = 'Aqui podes enviar múltiplos ficheiros de uma vez. Clique no botão de navegação para adicioná-los na fila. Premir upload quando pronto.'; $lang['mu_gridname'] = 'Nome do ficheiro'; $lang['mu_gridsize'] = 'Tamanho'; @@ -235,3 +275,11 @@ $lang['mu_filetypes'] = 'Tipos de Ficheiros Permitidos'; $lang['mu_info'] = 'Ficheiros carregados.'; $lang['mu_lasterr'] = 'Último erro:'; $lang['recent_global'] = 'Você está a observar as alterações dentro do espaço de nomes <b>%s</b>. Também é possível ver as <a href="%s">modificações recentes no wiki inteiro</a>.'; +$lang['years'] = '%d anos atrás'; +$lang['months'] = '%d meses atrás'; +$lang['weeks'] = '%d semanas atrás'; +$lang['days'] = '%d dias atrás'; +$lang['hours'] = '%d horas atrás'; +$lang['minutes'] = '%d minutos atrás'; +$lang['seconds'] = '%d segundos atrás'; +$lang['wordblock'] = 'A sua alteração não foi guardada porque contém texto bloqueado (spam).'; diff --git a/inc/lang/pt/locked.txt b/inc/lang/pt/locked.txt index b9df29cb5..a4bb4d606 100644 --- a/inc/lang/pt/locked.txt +++ b/inc/lang/pt/locked.txt @@ -1,5 +1,3 @@ ====== Página em Edição ====== -Esta página está bloqueada por outro utilizador, que se encontra a editá-la neste momento.\\ Terá que aguardar que o utilizador termine a edição e grava as alterações ou então que temporizador de bloqueio expire. - ----- +Esta página está bloqueada por outro utilizador, que se encontra a editá-la neste momento. Terá que aguardar que o utilizador termine a edição ou que o bloqueio expire.
\ No newline at end of file diff --git a/inc/lang/pt/login.txt b/inc/lang/pt/login.txt index e8000bbab..42c2a983c 100644 --- a/inc/lang/pt/login.txt +++ b/inc/lang/pt/login.txt @@ -1,7 +1,3 @@ ====== Entrar ====== -Não está actualmente em sessão!\\ Introduza os seus dados de utilizador para entrar em sessão. - -**Nota**: Precisa de ter //cookies// activos no seu navegador. - ----- +Não está actualmente em sessão! Introduza as suas credenciais de autenticação abaixo para para entrar em sessão. Precisa de ter cookies activos no seu navegador.
\ No newline at end of file diff --git a/inc/lang/pt/newpage.txt b/inc/lang/pt/newpage.txt index 4db706be1..2d9c95599 100644 --- a/inc/lang/pt/newpage.txt +++ b/inc/lang/pt/newpage.txt @@ -1,7 +1,3 @@ ====== Documento Inexistente ====== -Acaba de tentar aceder a um documento que ainda não existe. - -Pode criar o conteúdo deste novo documento após clicar no botão <Criar página>. - ----- +Seguiu uma ligação para um documento que ainda não existe. Pode criá-lo usando o botão "Criar página", se as permissões lho permitirem.
\ No newline at end of file diff --git a/inc/lang/pt/password.txt b/inc/lang/pt/password.txt index f0b46e038..70ecf91eb 100644 --- a/inc/lang/pt/password.txt +++ b/inc/lang/pt/password.txt @@ -1,12 +1,10 @@ Olá, @FULLNAME@! -Efectuou a inscrição no WikiSite @TITLE@, em @DOKUWIKIURL@ - -Aqui estão as suas credenciais de autenticação: +Aqui estão as suas credenciais de autenticação para @TITLE@, em @DOKUWIKIURL@ Utilizador : @LOGIN@ Senha : @PASSWORD@ ---- - -Esta mensagem foi gerada pelo DokuWiki em @DOKUWIKIURL@ +Esta mensagem foi gerada pelo DokuWiki em +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/pt/preview.txt b/inc/lang/pt/preview.txt index 077665881..1a8dab0b8 100644 --- a/inc/lang/pt/preview.txt +++ b/inc/lang/pt/preview.txt @@ -1,7 +1,3 @@ ====== Previsão ====== -Esta é a previsão de como irá ficar o conteúdo do documento se clicar no botão <Gravar>. - -**Atenção**: O documento ainda não se encontra gravado.\\ É necessário clicar no botão <Gravar> para efectivar as modificações que tenha realizado. - ----- +Esta é uma previsão de como ficará o conteúdo. Lembre-se: ainda **não está gravado**!
\ No newline at end of file diff --git a/inc/lang/pt/read.txt b/inc/lang/pt/read.txt index 92be189f3..177b1e81d 100644 --- a/inc/lang/pt/read.txt +++ b/inc/lang/pt/read.txt @@ -1,3 +1 @@ -**Atenção**: Este documento é apenas de leitura.\\ Pode ver o documento em bruto mas não pode gravar qualquer alteração.\\ \\ Informe-se com o administrador deste Wiki se achar que isto não está correcto. - ----- +Esta página é apenas de leitura. Pode ver a fonte, mas não alterá-la. Informe-se com o administrador deste Wiki se achar que isto não está correcto.
\ No newline at end of file diff --git a/inc/lang/pt/recent.txt b/inc/lang/pt/recent.txt index 339041468..3957df484 100644 --- a/inc/lang/pt/recent.txt +++ b/inc/lang/pt/recent.txt @@ -1,5 +1,3 @@ ====== Alterações Recentes ====== -Os seguintes documentos foram alterados recentemente. - ----- +Os seguintes documentos foram alterados recentemente.
\ No newline at end of file diff --git a/inc/lang/pt/register.txt b/inc/lang/pt/register.txt index c647a4615..228cb9979 100644 --- a/inc/lang/pt/register.txt +++ b/inc/lang/pt/register.txt @@ -1,7 +1,3 @@ -====== Inscrição ====== +====== Inscrição como novo utilizador ====== -Por favor, preencha todos os campos com a informação correspondente, para poder criar uma nova conta neste SiteWiki. - -**Nota**: O nome de utilizador deve cumprir as mesmas regras de nomeação de documentos Wiki válidos.\\ **Atenção**: Verifique que o endereço de correio electrónico que preencheu é válido, pois a sua senha será enviada por e-mail. - ----- +Preencha toda a informação abaixo para criar uma nova conta nesta wiki. Assegure que providencia um **endereço de email válido** - se não lhe for pedido que introduza uma nova palavra chave aqui, ser-lhe-á enviada uma para esse endereço. O nome de utilizador deve ser um [[doku>pagename|nome de página]] válido.
\ No newline at end of file diff --git a/inc/lang/pt/revisions.txt b/inc/lang/pt/revisions.txt index 213022f91..0a0d35950 100644 --- a/inc/lang/pt/revisions.txt +++ b/inc/lang/pt/revisions.txt @@ -1,5 +1,3 @@ -====== Revisões ====== +====== Revisões antigas ====== -Estas são as revisões ao documento corrente.\\ Para reverter o documento para uma destas revisões: * Escolha a revisão do documento da lista abaixo; * Clique depois no botão <Editar página>; * Faça as alterações que veja necessárias - opcional; * Grava a revisão antiga como sendo a revisão actual do documento. Após a gravação, o documento da versão actual será substituído pelo documento da revisão escolhida. - ----- +Estas são as revisões antigas do documento corrente. Para reverter para uma destas revisões, escolha-a abaixo, clique no botão "Editar página" e grave.
\ No newline at end of file diff --git a/inc/lang/pt/searchpage.txt b/inc/lang/pt/searchpage.txt index 49a0b16ea..2239330dd 100644 --- a/inc/lang/pt/searchpage.txt +++ b/inc/lang/pt/searchpage.txt @@ -1,7 +1,5 @@ ====== Pesquisa ====== -Os resultados da sua pesquisa encontram-se mais abaixo. - -Se não encontrou o que procurava, pode criar uma nova página com o nome da sua pesquisa, usando o botão <Editar página>. +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. ===== Resultados ===== diff --git a/inc/lang/pt/showrev.txt b/inc/lang/pt/showrev.txt index e8ad7f47a..25d617fa3 100644 --- a/inc/lang/pt/showrev.txt +++ b/inc/lang/pt/showrev.txt @@ -1,3 +1 @@ -**Atenção**: Esta é uma versão antiga do documento! - ----- +**Esta é uma versão antiga do documento!**
\ No newline at end of file diff --git a/inc/lang/pt/subscr_digest.txt b/inc/lang/pt/subscr_digest.txt new file mode 100644 index 000000000..3f8a814c6 --- /dev/null +++ b/inc/lang/pt/subscr_digest.txt @@ -0,0 +1,20 @@ +Olá! + +A página @PAGE@ na wiki @TITLE@ mudou. +Eis as mudanças: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Revisão Antiga: @OLDPAGE@ +Revisão Nova: @NEWPAGE@ + +Para cancelar as notificações de página, inicie sessão na wiki em +@DOKUWIKIURL@, visite +@SUBSCRIBE@ +e des-subscreva as alterações à página e/ou nome espaço de nome. + +-- +Este email foi gerado por DokuWiki em +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/pt/subscr_form.txt b/inc/lang/pt/subscr_form.txt new file mode 100644 index 000000000..9bb7b6b45 --- /dev/null +++ b/inc/lang/pt/subscr_form.txt @@ -0,0 +1,3 @@ +====== Gestão de Subscrição ====== + +Esta página permite-lhe gerir as suas subscrições para a página e espaço de nomes correntes.
\ No newline at end of file diff --git a/inc/lang/pt/subscr_list.txt b/inc/lang/pt/subscr_list.txt new file mode 100644 index 000000000..65325b9ea --- /dev/null +++ b/inc/lang/pt/subscr_list.txt @@ -0,0 +1,17 @@ +Olá! + +Páginas no espaço de nome @PAGE@ da wiki @TITLE@ mudaram. +Eis as páginas alteradas: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Para cancelar as notificações de páginas, inicie sessão na wiki em +@DOKUWIKIURL@, visite +@SUBSCRIBE@ +e des-subscreva às alterações da página e/ou espaço de nome. + +-- +Este email foi gerado por DokuWiki em +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/pt/subscr_single.txt b/inc/lang/pt/subscr_single.txt new file mode 100644 index 000000000..1187b5911 --- /dev/null +++ b/inc/lang/pt/subscr_single.txt @@ -0,0 +1,23 @@ +Olá! + +A página @PAGE@ no wiki @TITLE@ mudou. +Eis as alterações: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Data : @DATE@ +Utilizador : @USER@ +Sumário de Edição: @SUMMARY@ +Revisão Antiga: @OLDPAGE@ +Revisão Nova: @NEWPAGE@ + +Para cancelar as notificações de página, inicie sessão no wiki em +@DOKUWIKIURL@, visite +@NEWPAGE@ +e des-subscreva às alterações de página e/ou espaço de nome. + +-- +Este email foi gerado automaticamente por DokuWiki em +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/pt/subscribermail.txt b/inc/lang/pt/subscribermail.txt deleted file mode 100644 index 3a9e40d20..000000000 --- a/inc/lang/pt/subscribermail.txt +++ /dev/null @@ -1,15 +0,0 @@ -Olá, - -A página @PAGE@ em @TITLE@ foi alterda. -Aqui estão as diferenças: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Para receber mais notificações desta página alterada, por favor, entre no Wiki em @DOKUWIKIURL@ e aceda a @NEWPAGE@ para depois poder clicar no botão [ Não Subscrever ]. - - ----- - -Esta mensagem foi gerada pelo DokuWiki em @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/pt/uploadmail.txt b/inc/lang/pt/uploadmail.txt index 249d66234..597ba4a01 100644 --- a/inc/lang/pt/uploadmail.txt +++ b/inc/lang/pt/uploadmail.txt @@ -11,4 +11,5 @@ Utilizador : @USER@ ---- -Esta mensagem foi gerada pelo DokuWiki em @DOKUWIKIURL@
\ No newline at end of file +Esta mensagem foi gerada pelo DokuWiki em +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/ro/lang.php b/inc/lang/ro/lang.php index d21249d91..cbecf6f6c 100644 --- a/inc/lang/ro/lang.php +++ b/inc/lang/ro/lang.php @@ -5,11 +5,8 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Tiberiu Micu <tibimicu@gmx.net> * @author Sergiu Baltariu <s_baltariu@yahoo.com> - * @author s_baltariu@yahoo.com - * @author Emanuel-Emeric Andrasi <n30@mandrivausers.ro> * @author Emanuel-Emeric Andrași <n30@mandrivausers.ro> * @author Emanuel-Emeric Andraşi <em.andrasi@mandrivausers.ro> - * @author Emanuel-Emeric Andrasi <em.andrasi@mandrivausers.ro> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -50,6 +47,7 @@ $lang['btn_draft'] = 'Editează schiţă'; $lang['btn_recover'] = 'Recuperează schiţă'; $lang['btn_draftdel'] = 'Şterge schiţă'; $lang['btn_revert'] = 'Revenire'; +$lang['btn_register'] = 'Înregistrează'; $lang['loggedinas'] = 'Logat ca şi'; $lang['user'] = 'Utilizator'; $lang['pass'] = 'Parola'; @@ -59,7 +57,6 @@ $lang['passchk'] = 'încă o dată'; $lang['remember'] = 'Ţine-mă minte'; $lang['fullname'] = 'Nume complet'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Înregistrează'; $lang['profile'] = 'Profil Utilizator'; $lang['badlogin'] = 'Imi pare rău, utilizatorul şi/sau parola au fost greşite.'; $lang['minoredit'] = 'Modificare Minoră'; @@ -162,6 +159,9 @@ $lang['yours'] = 'Versiunea ta'; $lang['diff'] = 'arată diferenţele faţă de versiunea curentă'; $lang['diff2'] = 'Arată diferenţele dintre versiunile selectate'; $lang['difflink'] = 'Link către această vizualizare comparativă'; +$lang['diff_type'] = 'Vezi diferențe:'; +$lang['diff_inline'] = 'Succesiv'; +$lang['diff_side'] = 'Alăturate'; $lang['line'] = 'Linia'; $lang['breadcrumb'] = 'Traseu'; $lang['youarehere'] = 'Sunteţi aici'; diff --git a/inc/lang/ro/subscribermail.txt b/inc/lang/ro/subscribermail.txt deleted file mode 100644 index 23374dc6f..000000000 --- a/inc/lang/ro/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Bună! - -Pagina @PAGE@ din @TITLE@ wiki a fost modificată. -Iată modificările: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Pentru a vă dezabona, logaţi-vă la wiki la -@DOKUWIKIURL@, apoi vizitaţi -@NEWPAGE@ -şi alegeţi 'Anulează modificările'. - --- -Acest mail a fost generat automat de către DokuWiki la -@DOKUWIKIURL@ diff --git a/inc/lang/ru/conflict.txt b/inc/lang/ru/conflict.txt index f1ac60bd4..6c5e33dce 100644 --- a/inc/lang/ru/conflict.txt +++ b/inc/lang/ru/conflict.txt @@ -2,4 +2,4 @@ Существует более новая версия документа, который вы редактировали. Такое случается, когда другой пользователь изменил документ, пока вы делали то же самое. -Внимательно изучите различия, приведенные ниже и решите, какую версию оставить. Если вы выберете ''Сохранить'', то ваша версия будет сохранена. Нажав ''Отменить',' вы оставите текущую версию. +Внимательно изучите различия, приведенные ниже, и решите, какую версию оставить. Если вы выберете «Сохранить», то ваша версия будет сохранена. Нажав «Отменить», вы оставите текущую версию. diff --git a/inc/lang/ru/draft.txt b/inc/lang/ru/draft.txt index bbd2e5913..cb35f72b6 100644 --- a/inc/lang/ru/draft.txt +++ b/inc/lang/ru/draft.txt @@ -1,6 +1,6 @@ ====== Найден черновик ====== -Последний раз редактирование этой страницы не было корректно завершено. Во время вашей работы был автоматически сохранён черновик, который вы теперь можете восстановить и продолжить прерванную правку. Ниже вы видите автоматически сохраненную версию. +Последний раз редактирование этой страницы не было корректно завершено. Во время вашей работы был автоматически сохранён черновик, который вы теперь можете восстановить и продолжить прерванную правку. Ниже вы видите автоматически сохранённую версию. Пожалуйста, решите, хотите ли вы //восстановить// потерянную версию, //удалить// черновик, или //отменить// редактирование. diff --git a/inc/lang/ru/edit.txt b/inc/lang/ru/edit.txt index 6398e8e83..aac399d7c 100644 --- a/inc/lang/ru/edit.txt +++ b/inc/lang/ru/edit.txt @@ -1,2 +1,2 @@ -Отредактируйте страницу и нажмите ''Сохранить''. Прочтите [[wiki:syntax]] для ознакомления с синтаксисом вики. Пожалуйста, редактируйте только в том случае, если планируете **улучшить** содержимое. Если вы просто хотите потестировать что-либо, воспользуйтесь специальной страницей: [[playground:playground]]. +Отредактируйте страницу и нажмите «Сохранить». Прочтите [[wiki:syntax|справочную страницу]] для ознакомления с синтаксисом вики. Пожалуйста, редактируйте только в том случае, если планируете **улучшить** содержимое. Если вы просто хотите потестировать что-либо, воспользуйтесь специальной страницей: [[playground:playground]]. diff --git a/inc/lang/ru/editrev.txt b/inc/lang/ru/editrev.txt index db843ec1c..97b799a70 100644 --- a/inc/lang/ru/editrev.txt +++ b/inc/lang/ru/editrev.txt @@ -1,2 +1,2 @@ -**Вы загрузили старую ревизию документа!** Сохранив её, вы создадите новую текущую версию с этим содержимым. +**Вы загрузили старую ревизию документа.** Сохранив её, вы создадите новую текущую версию с этим содержимым. ---- diff --git a/inc/lang/ru/install.html b/inc/lang/ru/install.html index da0c5e239..b830b06c0 100644 --- a/inc/lang/ru/install.html +++ b/inc/lang/ru/install.html @@ -1,6 +1,6 @@ -<p>Эта страница предназначена помочь в первоначальной установке и конфигурации «<a href="http://www.dokuwiki.org">ДокуВики</a>». Дополнительная информация о программе установки доступна на её <a href="http://www.dokuwiki.org/installer">странице документации</a>.</p> +<p>Эта страница предназначена помочь в первоначальной установке и конфигурации «<a href="http://www.dokuwiki.org/">ДокуВики</a>». Дополнительная информация о программе установки доступна на её <a href="http://www.dokuwiki.org/installer">странице документации</a>.</p> -<p>«ДокуВики» использует обычные файлы для хранения страниц и дополнительной информации (например, изображений, поискового индекса, предыдущих версий страницы, и т. д.). Для успешной работы «ДокуВики» <strong>необходим</strong> доступ на запись к директориям с этими файлами. Данная программа установки не может самостоятельно изменять системные права доступа к директориям. Обычно это делается напрямую из командной строки (shell), или, если вы используете удалённый хостинг, через FTP или панель управления вашего хостинга (например, cPanel).</p> +<p>«ДокуВики» использует обычные файлы для хранения страниц и дополнительной информации (например, изображений, поискового индекса, предыдущих версий страницы, и т. д.). Для успешной работы «ДокуВики» <strong>необходим</strong> доступ на запись к директориям с этими файлами. Данная программа установки не может самостоятельно изменять системные права доступа к директориям. Обычно это делается напрямую из командной строки (shell), или, если вы используете удалённый хостинг, через FTP или панель управления своего хостинга (например, cPanel).</p> <p>Программа установки включит использование списков контроля доступа (<acronym title="access control list">ACL</acronym>) в вашей «ДокуВики». Это позволит администратору, после авторизации в «ДокуВики», использовать специальное меню для установки плагинов, управления пользователями и доступом к страницам вики, а также для настройки конфигурационных параметров. Списки контроля доступа не обязательны для работы «ДокуВики», однако они позволяют упростить управление вашей «ДокуВики».</p> diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php index 88692ae93..1eaa488ec 100644 --- a/inc/lang/ru/lang.php +++ b/inc/lang/ru/lang.php @@ -8,15 +8,17 @@ * @author Denis Simakov <akinoame1@gmail.com> * @author Kaens Bard <kaens@mail.ru> * @author Andrew Pleshakov <beotiger@mail.ru> - * @author Змей Этерийский evil_snake@eternion.ru + * @author Змей Этерийский <evil_snake@eternion.ru> * @author Hikaru Nakajima <jisatsu@mail.ru> * @author Alexei Tereschenko <alexeitlex@yahoo.com> - * @author Irina Ponomareva irinaponomareva@webperfectionist.com + * @author Irina Ponomareva <irinaponomareva@webperfectionist.com> * @author Alexander Sorkin <kibizoid@gmail.com> * @author Kirill Krasnov <krasnovforum@gmail.com> * @author Vlad Tsybenko <vlad.development@gmail.com> * @author Aleksey Osadchiy <rfc@nm.ru> * @author Aleksandr Selivanov <alexgearbox@gmail.com> + * @author Ladyko Andrey <fylh@succexy.spb.ru> + * @author Eugene <windy.wanderer@gmail.com> */ $lang['encoding'] = ' utf-8'; $lang['direction'] = 'ltr'; @@ -57,6 +59,7 @@ $lang['btn_draft'] = 'Править черновик'; $lang['btn_recover'] = 'Восстановить черновик'; $lang['btn_draftdel'] = 'Удалить черновик'; $lang['btn_revert'] = 'Восстановить'; +$lang['btn_register'] = 'Зарегистрироваться'; $lang['loggedinas'] = 'Зашли как'; $lang['user'] = 'Логин'; $lang['pass'] = 'Пароль'; @@ -66,7 +69,6 @@ $lang['passchk'] = 'повторите'; $lang['remember'] = 'Запомнить меня'; $lang['fullname'] = 'Полное имя'; $lang['email'] = 'Эл. адрес'; -$lang['register'] = 'Зарегистрироваться'; $lang['profile'] = 'Профиль пользователя'; $lang['badlogin'] = 'Извините, неверное имя пользователя или пароль.'; $lang['minoredit'] = 'Небольшие изменения'; @@ -76,7 +78,7 @@ $lang['regmissing'] = 'Извините, вам следует зап $lang['reguexists'] = 'Извините, пользователь с таким логином уже существует.'; $lang['regsuccess'] = 'Пользователь создан, пароль выслан на адрес электронной почты.'; $lang['regsuccess2'] = 'Пользователь создан.'; -$lang['regmailfail'] = 'Похоже, проблема с отправкой пароля по почте. Пожалуйста, сообщите администратору.'; +$lang['regmailfail'] = 'Похоже есть проблема с отправкой пароля по почте. Пожалуйста, сообщите об этом администратору.'; $lang['regbadmail'] = 'Данный вами адрес электронной почты выглядит неправильным. Если вы считаете это ошибкой, сообщите администратору.'; $lang['regbadpass'] = 'Два введённых пароля не идентичны. Пожалуйста, попробуйте ещё раз.'; $lang['regpwmail'] = 'Ваш пароль для системы «ДокуВики»'; @@ -94,7 +96,7 @@ $lang['resendpwdbadauth'] = 'Извините, неверный код ав $lang['resendpwdconfirm'] = 'Ссылка для подтверждения пароля была выслана по электронной почте. '; $lang['resendpwdsuccess'] = 'Ваш новый пароль был выслан по электронной почте.'; $lang['license'] = 'За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:'; -$lang['licenseok'] = 'Примечание: редактируя эту страницу, вы соглашаетесь на использование вашего вклада на условиях следующей лицензии:'; +$lang['licenseok'] = 'Примечание: редактируя эту страницу, вы соглашаетесь на использование своего вклада на условиях следующей лицензии:'; $lang['searchmedia'] = 'Поиск по имени файла:'; $lang['searchmedia_in'] = 'Поиск в %s'; $lang['txt_upload'] = 'Выберите файл для загрузки'; @@ -103,8 +105,7 @@ $lang['txt_overwrt'] = 'Перезаписать существующ $lang['lockedby'] = 'В данный момент заблокирован'; $lang['lockexpire'] = 'Блокировка истекает в'; $lang['willexpire'] = 'Ваша блокировка редактирования этой страницы истекает в течение минуты.\nЧтобы избежать конфликтов и сбросить таймер блокировки, нажмите кнопку просмотра.'; -$lang['js']['notsavedyet'] = 'Несохранённые изменения будут потеряны. -Вы действительно хотите продолжить?'; +$lang['js']['notsavedyet'] = 'Несохранённые изменения будут потеряны. Вы действительно хотите продолжить?'; $lang['js']['searchmedia'] = 'Поиск файлов'; $lang['js']['keepopen'] = 'Не закрывать окно после выбора'; $lang['js']['hidedetails'] = 'Скрыть детали'; @@ -112,7 +113,7 @@ $lang['js']['mediatitle'] = 'Настройки ссылок'; $lang['js']['mediadisplay'] = 'Тип ссылки'; $lang['js']['mediaalign'] = 'Выравнивание'; $lang['js']['mediasize'] = 'Размер изображения'; -$lang['js']['mediatarget'] = 'target ссылки'; +$lang['js']['mediatarget'] = 'Значение target ссылки'; $lang['js']['mediaclose'] = 'Закрыть'; $lang['js']['mediainsert'] = 'Вставить'; $lang['js']['mediadisplayimg'] = 'Показывать изображение.'; @@ -129,8 +130,7 @@ $lang['js']['medialeft'] = 'Выровнять изображение по $lang['js']['mediaright'] = 'Выровнять изображение по правому краю.'; $lang['js']['mediacenter'] = 'Выровнять изображение по центру.'; $lang['js']['medianoalign'] = 'Не выравнивать.'; -$lang['js']['nosmblinks'] = 'Ссылка на сетевые каталоги Windows работает только из Интернет Эксплорера -Но вы можете скопировать ссылку.'; +$lang['js']['nosmblinks'] = 'Ссылка на сетевые каталоги Windows работает только из Интернет Эксплорера. Но вы можете скопировать ссылку.'; $lang['js']['linkwiz'] = 'Мастер ссылок'; $lang['js']['linkto'] = 'Ссылка на:'; $lang['js']['del_confirm'] = 'Вы на самом деле желаете удалить выбранное?'; @@ -149,18 +149,18 @@ $lang['uploadxss'] = 'Загрузка заблокирована п $lang['uploadsize'] = 'Загруженный файл был слишком большой. (макс. %s)'; $lang['deletesucc'] = 'Файл "%s" был удалён.'; $lang['deletefail'] = 'Невозможно удалить файл "%s". Проверьте права доступа к файлу.'; -$lang['mediainuse'] = 'Файл "%s" не был удалён - файл всё ещё используется.'; +$lang['mediainuse'] = 'Файл "%s" не был удалён — файл всё ещё используется.'; $lang['namespaces'] = 'Пространства имён'; $lang['mediafiles'] = 'Доступные файлы'; $lang['accessdenied'] = 'Вы не можете просмотреть эту страницу.'; $lang['mediausage'] = 'Для ссылки на этот файл используйте следующий синтаксис:'; $lang['mediaview'] = 'Посмотреть исходный файл'; $lang['mediaroot'] = 'корень'; -$lang['mediaupload'] = 'Здесь можно загрузить файл в текущий каталог («пространство имен»). Чтобы создать подкаталоги, добавьте их к началу имени файла («Загрузить как»). Имена подкаталогов разделяются двоеточиями. '; +$lang['mediaupload'] = 'Здесь можно загрузить файл в текущий каталог («пространство имён»). Чтобы создать подкаталоги, добавьте их к началу имени файла («Загрузить как»). Имена подкаталогов разделяются двоеточиями. '; $lang['mediaextchange'] = 'Расширение изменилось: с .%s на .%s!'; $lang['reference'] = 'Ссылки для'; -$lang['ref_inuse'] = 'Этот файл не может быть удалён, так как он используется следующими страницами:'; -$lang['ref_hidden'] = 'Некоторые ссылки находятся на страницах, на чтение которых у вас нет прав'; +$lang['ref_inuse'] = 'Этот файл не может быть удалён, так как он используется на следующих страницах:'; +$lang['ref_hidden'] = 'Некоторые ссылки находятся на страницах, на чтение которых у вас нет прав доступа'; $lang['hits'] = 'соответствий'; $lang['quickhits'] = 'Соответствия в названиях страниц'; $lang['toc'] = 'Содержание'; @@ -169,6 +169,9 @@ $lang['yours'] = 'Ваша версия'; $lang['diff'] = 'показать отличия от текущей версии'; $lang['diff2'] = 'Показать различия между ревизиями '; $lang['difflink'] = 'Ссылка на это сравнение'; +$lang['diff_type'] = 'Посмотреть отличия'; +$lang['diff_inline'] = 'Встроенный'; +$lang['diff_side'] = 'Бок о бок'; $lang['line'] = 'Строка'; $lang['breadcrumb'] = 'Вы посетили'; $lang['youarehere'] = 'Вы находитесь здесь'; @@ -183,7 +186,7 @@ $lang['noflash'] = 'Для просмотра этого соде $lang['download'] = 'Скачать код'; $lang['mail_newpage'] = 'страница добавлена:'; $lang['mail_changed'] = 'страница изменена:'; -$lang['mail_subscribe_list'] = 'изменились страницы в пространстве имен:'; +$lang['mail_subscribe_list'] = 'изменились страницы в пространстве имён:'; $lang['mail_new_user'] = 'новый пользователь:'; $lang['mail_upload'] = 'файл закачан:'; $lang['qb_bold'] = 'Полужирный'; @@ -210,7 +213,7 @@ $lang['qb_media'] = 'Добавить изображения или $lang['qb_sig'] = 'Вставить подпись'; $lang['qb_smileys'] = 'Смайлики'; $lang['qb_chars'] = 'Специальные символы'; -$lang['upperns'] = 'Перейти в родительское пространство имен'; +$lang['upperns'] = 'Перейти в родительское пространство имён'; $lang['admin_register'] = 'Добавить пользователя'; $lang['metaedit'] = 'Править метаданные'; $lang['metasaveerr'] = 'Ошибка записи метаданных'; @@ -233,7 +236,7 @@ $lang['subscr_unsubscribe_success'] = 'Удалён %s из подписки н $lang['subscr_unsubscribe_error'] = 'Ошибка удаления %s из подписки на %s'; $lang['subscr_already_subscribed'] = '%s уже подписан на %s'; $lang['subscr_not_subscribed'] = '%s не подписан на %s'; -$lang['subscr_m_not_subscribed'] = 'Вы не подписаны на текущую страницу или пространство имен.'; +$lang['subscr_m_not_subscribed'] = 'Вы не подписаны на текущую страницу или пространство имён.'; $lang['subscr_m_new_header'] = 'Добавить подписку'; $lang['subscr_m_current_header'] = 'Текущие подписки'; $lang['subscr_m_unsubscribe'] = 'Отменить подписку'; @@ -242,8 +245,8 @@ $lang['subscr_m_receive'] = 'Получить'; $lang['subscr_style_every'] = 'уведомлять о каждом изменении'; $lang['subscr_style_digest'] = 'сводка изменений по каждой странице'; $lang['subscr_style_list'] = 'перечислять изменившиеся страницы с прошлого уведомления'; -$lang['authmodfailed'] = 'Неправильная конфигурация аутентификации пользователя. Пожалуйста, сообщите об этом вашему администратору вики.'; -$lang['authtempfail'] = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом вашему администратору вики.'; +$lang['authmodfailed'] = 'Неправильная конфигурация аутентификации пользователя. Пожалуйста, сообщите об этом своему администратору вики.'; +$lang['authtempfail'] = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом своему администратору вики.'; $lang['i_chooselang'] = 'Выберите свой язык/Choose your language'; $lang['i_installer'] = 'Установка «ДокуВики»'; $lang['i_wikiname'] = 'Название вики'; @@ -258,18 +261,18 @@ $lang['i_phpver'] = 'Ваша версия PHP (<code>%s</code>) н $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_badhash'] = 'dokuwiki.php не распознан или изменён (хэш=<code>%s</code>)'; $lang['i_badval'] = '<code>%s</code> — недопустимое или пустое значение'; $lang['i_success'] = 'Конфигурация прошла успешно. Теперь вы можете удалить файл install.php. Переходите к - <a href="doku.php">вашей новой «ДокуВики»</a>.'; -$lang['i_failure'] = 'При записи в файлы конфигурации были обнаружены ошибки. Возможно, вам придется исправить их вручную, прежде чем вы сможете использовать <a href="doku.php">вашу новую «ДокуВики»</a>.'; + <a href="doku.php">своей новой «ДокуВики»</a>.'; +$lang['i_failure'] = 'При записи в файлы конфигурации были обнаружены ошибки. Возможно, вам придётся исправить их вручную, прежде чем вы сможете использовать <a href="doku.php">свою новую «ДокуВики»</a>.'; $lang['i_policy'] = 'Исходная политика прав доступа'; $lang['i_pol0'] = 'Открытая вики (чтение, запись, закачка файлов для всех)'; $lang['i_pol1'] = 'Общедоступная вики (чтение для всех, запись и загрузка файлов для зарегистрированных пользователей)'; $lang['i_pol2'] = 'Закрытая вики (чтение, запись и загрузка файлов только для зарегистрированных пользователей)'; $lang['i_retry'] = 'Повторить попытку'; -$lang['i_license'] = 'Пожалуйста, выберите тип лицензии для вашей вики:'; -$lang['mu_intro'] = 'Здесь вы можете загрузить несколько файлов сразу. Кликните на «обзор», чтобы добавить их в список. Нажмите «загрузить» когда будете готовы.'; +$lang['i_license'] = 'Пожалуйста, выберите тип лицензии для своей вики:'; +$lang['mu_intro'] = 'Здесь вы можете загрузить несколько файлов сразу. Кликните на «обзор», чтобы добавить их в список. Нажмите «загрузить», когда будете готовы.'; $lang['mu_gridname'] = 'Имя файла'; $lang['mu_gridsize'] = 'Размер'; $lang['mu_gridstat'] = 'Статус'; @@ -284,7 +287,7 @@ $lang['mu_progress'] = '@PCT@% загружено'; $lang['mu_filetypes'] = 'Допустимые типы файлов'; $lang['mu_info'] = 'файлов загружено.'; $lang['mu_lasterr'] = 'Последняя ошибка:'; -$lang['recent_global'] = 'Вы просматриваете изменения в пространстве имён <b>%s</b>. Вы можете также <a href="%s">просмотреть недавние изменения на всей вики</a>.'; +$lang['recent_global'] = 'Вы просматриваете изменения в пространстве имён <b>%s</b>. Вы можете также <a href="%s">просмотреть недавние изменения во всей вики</a>.'; $lang['years'] = '%d лет назад'; $lang['months'] = '%d месяц(ев) назад'; $lang['weeks'] = '%d недель назад'; diff --git a/inc/lang/ru/norev.txt b/inc/lang/ru/norev.txt index db36a0ddd..388d6149d 100644 --- a/inc/lang/ru/norev.txt +++ b/inc/lang/ru/norev.txt @@ -1,4 +1,4 @@ ====== Такой версии не существует ====== -Указанная версия страницы не существует. Нажмите на кнопку ''История страницы'', чтобы получить список доступных предыдущих версий этого документа. +Указанная версия страницы не существует. Нажмите на кнопку «История страницы», чтобы получить список доступных предыдущих версий этого документа. diff --git a/inc/lang/ru/password.txt b/inc/lang/ru/password.txt index af6a7d14d..91117ca56 100644 --- a/inc/lang/ru/password.txt +++ b/inc/lang/ru/password.txt @@ -1,9 +1,10 @@ -Здравствуйте, @FULLNAME@! +Здравствуйте, @FULLNAME@. Ваши данные для @TITLE@ (@DOKUWIKIURL@) -Имя пользователя : @LOGIN@ -Пароль : @PASSWORD@ +Имя пользователя: @LOGIN@ + +Пароль: @PASSWORD@ -- Это письмо было сгенерировано «ДокуВики» по адресу diff --git a/inc/lang/ru/preview.txt b/inc/lang/ru/preview.txt index 2bc383eb2..401827607 100644 --- a/inc/lang/ru/preview.txt +++ b/inc/lang/ru/preview.txt @@ -1,4 +1,4 @@ ====== Просмотр ====== -Здесь показано, как ваш текст будет выглядеть. Внимание: текст ещё **не сохранён!** +Здесь показано, как ваш текст будет выглядеть. Внимание: текст ещё **не сохранён.** diff --git a/inc/lang/ru/pwconfirm.txt b/inc/lang/ru/pwconfirm.txt index 3e2331269..9c27af752 100644 --- a/inc/lang/ru/pwconfirm.txt +++ b/inc/lang/ru/pwconfirm.txt @@ -1,4 +1,4 @@ -Здравствуйте, @FULLNAME@! +Здравствуйте, @FULLNAME@. Кто-то запросил новый пароль для входа в @TITLE@ по адресу @DOKUWIKIURL@ diff --git a/inc/lang/ru/revisions.txt b/inc/lang/ru/revisions.txt index 06022323f..55072cd8a 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 608220495..04feb21cd 100644 --- a/inc/lang/ru/searchpage.txt +++ b/inc/lang/ru/searchpage.txt @@ -1,5 +1,5 @@ ====== Поиск ====== -Перед вами результаты поиска. Если вы не нашли то, что искали, вы можете создать новую страницу с именем, совпадающим с запросом. Чтобы сделать это, просто нажмите на кнопку ''Создать страницу''. +Перед вами результаты поиска. Если вы не нашли то, что искали, вы можете создать новую страницу с именем, совпадающим с запросом. Чтобы сделать это, просто нажмите на кнопку «Создать страницу». ===== Результаты =====
\ No newline at end of file diff --git a/inc/lang/ru/showrev.txt b/inc/lang/ru/showrev.txt index b3f3852eb..596815870 100644 --- a/inc/lang/ru/showrev.txt +++ b/inc/lang/ru/showrev.txt @@ -1,2 +1,2 @@ -**Это старая версия документа!** +**Это старая версия документа.** ---- diff --git a/inc/lang/ru/subscr_digest.txt b/inc/lang/ru/subscr_digest.txt index 3d1d35d30..41774a4e9 100644 --- a/inc/lang/ru/subscr_digest.txt +++ b/inc/lang/ru/subscr_digest.txt @@ -1,4 +1,4 @@ -Привет! +Привет. Страница @PAGE@ в вики @TITLE@ изменилась. Список изменений: diff --git a/inc/lang/ru/subscr_list.txt b/inc/lang/ru/subscr_list.txt index 9d0eb10e0..41e1323bc 100644 --- a/inc/lang/ru/subscr_list.txt +++ b/inc/lang/ru/subscr_list.txt @@ -1,6 +1,6 @@ -Привет! +Привет. -Страницы в пространстве имен @PAGE@ в вики @TITLE@ были изменены. +Страницы в пространстве имён @PAGE@ в вики @TITLE@ были изменены. Список изменившихся страниц: -------------------------------------------------------- @@ -10,7 +10,7 @@ Чтобы отписаться от уведомлений об изменениях, войдите в вики @DOKUWIKIURL@ в раздел @SUBSCRIBE@ -и отмените подписку на страницу и/или пространство имен. +и отмените подписку на страницу и/или пространство имён. -- Это письмо создано «ДокуВики» с сайта diff --git a/inc/lang/ru/subscr_single.txt b/inc/lang/ru/subscr_single.txt index ed8ead4cd..0e67d8f59 100644 --- a/inc/lang/ru/subscr_single.txt +++ b/inc/lang/ru/subscr_single.txt @@ -1,4 +1,5 @@ -Привет! +Привет. + Страница @PAGE@ в вики @TITLE@ изменилась. Список изменений: @@ -7,8 +8,9 @@ @DIFF@ -------------------------------------------------------- -Дата : @DATE@ -Автор : @USER@ +Дата: @DATE@ +Автор: @USER@ + Примечание: @SUMMARY@ Старая версия: @OLDPAGE@ Новая версия: @NEWPAGE@ @@ -16,7 +18,7 @@ Чтобы отписаться от уведомлений об изменениях, войдите в вики @DOKUWIKIURL@ в раздел @SUBSCRIBE@ -и отмените подписку на страницу и/или пространство имен. +и отмените подписку на страницу и/или пространство имён. -- Это письмо создано «ДокуВики» с сайта diff --git a/inc/lang/ru/subscribermail.txt b/inc/lang/ru/subscribermail.txt deleted file mode 100644 index 1a846ac32..000000000 --- a/inc/lang/ru/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Здравствуйте! - -Страница @PAGE@ в вики @TITLE@ была изменена. -Ниже представлены изменения: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Чтобы отписаться от изменений этой страницы, -войдите под своим именем в Вики по адресу -@DOKUWIKIURL@, перейдите на страницу -@NEWPAGE@ и нажмите 'Отписаться'. - --- -Это сообщение было сгенерировано DokuWiki по адресу -@DOKUWIKIURL@ diff --git a/inc/lang/sk/lang.php b/inc/lang/sk/lang.php index dde10c543..eaef4b679 100644 --- a/inc/lang/sk/lang.php +++ b/inc/lang/sk/lang.php @@ -47,6 +47,7 @@ $lang['btn_draft'] = 'Upraviť koncept'; $lang['btn_recover'] = 'Obnoviť koncept'; $lang['btn_draftdel'] = 'Zmazať koncept'; $lang['btn_revert'] = 'Obnoviť'; +$lang['btn_register'] = 'Registrovať'; $lang['loggedinas'] = 'Prihlásený(á) ako'; $lang['user'] = 'Užívateľské meno'; $lang['pass'] = 'Heslo'; @@ -56,7 +57,6 @@ $lang['passchk'] = 'Ešte raz znovu'; $lang['remember'] = 'Zapamätaj si ma'; $lang['fullname'] = 'Celé meno'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Registrovať'; $lang['profile'] = 'Užívateľský profil'; $lang['badlogin'] = 'Zadané užívateľské meno a heslo nie je správne.'; $lang['minoredit'] = 'Menšie zmeny'; diff --git a/inc/lang/sk/subscribermail.txt b/inc/lang/sk/subscribermail.txt deleted file mode 100644 index 47505bc1c..000000000 --- a/inc/lang/sk/subscribermail.txt +++ /dev/null @@ -1,18 +0,0 @@ -Zdravím! - -Stránka @PAGE@ v @TITLE@ wiki bola zmenená. -Tu sú zmeny: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Pre odhlásenie sa z tejto stránky choďte na -@DOKUWIKIURL@, potom navštívte -@NEWPAGE@ -a zvoľte 'Neposielať zmeny'. - --- -Tento mail bol vygenerovaný DokuWiki na -@DOKUWIKIURL@ - diff --git a/inc/lang/sl/admin.txt b/inc/lang/sl/admin.txt new file mode 100644 index 000000000..cee19deff --- /dev/null +++ b/inc/lang/sl/admin.txt @@ -0,0 +1,3 @@ +===== Skrbništvo ===== + +Navedene možnosti omogočajo skrbniško prilagajanje nastavitev sistema DokuWiki. diff --git a/inc/lang/sl/adminplugins.txt b/inc/lang/sl/adminplugins.txt new file mode 100644 index 000000000..899c854fc --- /dev/null +++ b/inc/lang/sl/adminplugins.txt @@ -0,0 +1 @@ +===== Dodatni vstavki =====
\ No newline at end of file diff --git a/inc/lang/sl/backlinks.txt b/inc/lang/sl/backlinks.txt index e637199c0..5e4d8ffa7 100644 --- a/inc/lang/sl/backlinks.txt +++ b/inc/lang/sl/backlinks.txt @@ -1,4 +1,3 @@ -====== Kaj je povezano sem ====== - -To je seznam strani, ki so povezane na trenutno stran. Opomba: CamelCase povezave niso zaznane kot take povezave. +====== Povratne povezave ====== +Spodaj je naveden seznam strani, ki so povezane na trenutno stran. EnoBesedne povezave niso zaznane kot povratne povezave. diff --git a/inc/lang/sl/conflict.txt b/inc/lang/sl/conflict.txt index 7ada08b5f..ec5b37016 100644 --- a/inc/lang/sl/conflict.txt +++ b/inc/lang/sl/conflict.txt @@ -1,6 +1,5 @@ -====== Obstaja novejša različica ====== +====== Obstaja novejša različica dokumenta ====== -Obstaja novejša različica dokumenta, ki ga urejate. Do tega pride, ko kak drugi uporabnik spremeni dokument med vašim urejanjem. - -Temeljito preglejte spodaj prikazane razlike in se potem odločite, katero verzijo želite obdržati. Če izberete ''shrani'', bo shranjena vaša različica. Pritisnite ''prekliči'', če želite ohraniti trenutno različico. +Obstaja novejša različica dokumenta, ki ga trenutno urejate. Do zapleta pride, ko drug uporabnik spremeni dokument med vašim urejanjem in ga pred vami shrani. +Temeljito preglejte spodaj izpisane razlike med dokumentoma in izberite različico, ki jo želite ohraniti. V kolikor je izbrana možnost ''shrani'', bo shranjena vaša zadnja različica. Z izbiro možnosti ''prekliči'', pa bo ohranjena trenutno shranjena različica. diff --git a/inc/lang/sl/denied.txt b/inc/lang/sl/denied.txt index 96c03a569..5b5fd4d3a 100644 --- a/inc/lang/sl/denied.txt +++ b/inc/lang/sl/denied.txt @@ -1,4 +1,3 @@ -====== Nimate dovoljenja ====== - -Oprostite, za nadaljevanje nimati dovolj dovoljenj. Mogoče ste se pozabili prijaviti? +====== Ni ustreznih dovoljenj ====== +Za nadaljevanje opravila je treba imeti ustrezna dovoljenja. Ali ste se morda pozabili prijaviti? diff --git a/inc/lang/sl/diff.txt b/inc/lang/sl/diff.txt index f98f7e5ce..5cb2e3a12 100644 --- a/inc/lang/sl/diff.txt +++ b/inc/lang/sl/diff.txt @@ -1,4 +1,3 @@ -====== Primerjaj izbrane različice ====== - -Prikazana je razlika med izbrano in trenutno različico te strani. +====== Primerjava izbranih različic ====== +Prikazane so razlike med izbrano in trenutno različico strani. diff --git a/inc/lang/sl/draft.txt b/inc/lang/sl/draft.txt new file mode 100644 index 000000000..b3fe4de35 --- /dev/null +++ b/inc/lang/sl/draft.txt @@ -0,0 +1,5 @@ +===== Zaznan je shranjen osnutek strani ===== + +Zadnja seja te strani ni bila pravilno zaključena. Sistem DokuWiki je samodejno shranil osnutek strani, ki ga je mogoče naprej urejati. Spodaj so navedeni podatki samodejnega shranjevanja zadnje seje. + +Vsebino osnutka je mogoče //obnoviti// na zadnjo sejo, //izbrisati// samodejno shranjen osnutek ali pa //prekiniti// urejanje.
\ No newline at end of file diff --git a/inc/lang/sl/edit.txt b/inc/lang/sl/edit.txt index 180a97ade..71d5fb02f 100644 --- a/inc/lang/sl/edit.txt +++ b/inc/lang/sl/edit.txt @@ -1,2 +1 @@ -Uredite stran in pritisnite ''Shrani''. Glej [[wiki:syntax]] za navodila za urejanje. Prosimo vas, da stran spremenite le, če jo nameravate **izboljšati**. Če hočete preizkusiti kakšno zadevo, se poigrajte v [[playground:playground|peskovniku]]. - +Po koncu urejanja strani, je stran treba ''shraniti''. Navodila in podrobnosti za urejanje je mogoče najti na strani [[wiki:syntax|skladnje]]. Možnosti urejanja in pravila skladnje je mogoče varno preizkusiti v [[playground:playground|peskovniku]]. diff --git a/inc/lang/sl/editrev.txt b/inc/lang/sl/editrev.txt index cf2b4ec7b..baaacd270 100644 --- a/inc/lang/sl/editrev.txt +++ b/inc/lang/sl/editrev.txt @@ -1,2 +1,2 @@ -**Naložili ste staro različico dokumenta!** Če jo shranite, boste ustvarili novo različico s to vsebino. +**Naložena je stara različica dokumenta!** V kolikor staro različico shranite, bo shranjena kot najnovejša različica. ----
\ No newline at end of file diff --git a/inc/lang/sl/index.txt b/inc/lang/sl/index.txt index 89dd05fbe..dd54d2bed 100644 --- a/inc/lang/sl/index.txt +++ b/inc/lang/sl/index.txt @@ -1,4 +1,4 @@ ====== Kazalo ====== -To je kazalo vseh strani, ki so na voljo, urejenimi po [[doku>namespaces|imenskih prostorih]]. +Na spodnjem seznamu so izpisane vse wiki strani, ki so na voljo, razvrščene pa so po posameznih [[doku>namespaces|imenskih prostorih]]. diff --git a/inc/lang/sl/install.html b/inc/lang/sl/install.html new file mode 100644 index 000000000..6fb6bead3 --- /dev/null +++ b/inc/lang/sl/install.html @@ -0,0 +1,20 @@ +<p>Stran je namenjena pomoči pri prvi namestitvi in nastavitvi spletišča +<a href="http://dokuwiki.org">Dokuwiki</a>. Več podrobnosti o tem je mogoče najti na straneh dokumentacije +<a href="http://dokuwiki.org/installer">namestitve</a>.</p> + +<p>Sistem DokuWiki uporablja običajne besedilne datoteke za shranjevanje +wiki strani in drugih podrobnosti o teh straneh (npr. slike, kazalo, stare +različice in drugo). Za pravilno delovanje <strong>mora</strong> imeti sistem DokuWiki prost +dostop do map in datotek, zato je ključno, da so dovoljenja določena pravilno. +Z namestilnikom ni mogoče spreminjanje dovoljenj map. To je običajno najlažje +narediti v ukazni lupini ali pa, če spletišče Wiki gostuje na zunanjih +strežnikih, preko nadzornika FTP povezave (npr. cPanel).</p> + +<p>Z namestilnikom lahko spremenite nastavitve dostopa sistema Dokuwiki +<acronym title="access control list">ACL</acronym>, ki omogoča skrbniško prijavo in dostop do upravljanja z vstavki, +uporabniki, dovoljenji dostopa uporabnikov do določenih strani in do nekaterih +nastavitev. Za delovanje sistema ACL ni bistven, vendar pa močno vpliva na +enostavnost upravljanja strani in nastavitev.</p> + +<p>Zahtevnejši uporabniki ali skrbniki s posebnimi zahtevami namestitve sistema +si lahko več podrobnosti ogledajo na straneh <a href="http://dokuwiki.org/install">navodil namestitve</a> in <a href="http://dokuwiki.org/config">nastavitve</a>.</p>
\ No newline at end of file diff --git a/inc/lang/sl/lang.php b/inc/lang/sl/lang.php index 9d94bab49..0e6c0a706 100644 --- a/inc/lang/sl/lang.php +++ b/inc/lang/sl/lang.php @@ -1,146 +1,209 @@ <?php /** - * slovenian language file + * Slovenian language file * - * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Jaka Kranjc <lynxlupodian@hotmail.com> * @author Boštjan Seničar <senicar@gmail.com> * @author Dejan Levec <webphp@gmail.com> + * @author Gregor Skumavc (grega.skumavc@gmail.com) + * @author Matej Urbančič (mateju@svn.gnome.org) */ $lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; $lang['doublequoteopening'] = '„'; $lang['doublequoteclosing'] = '“'; $lang['singlequoteopening'] = '‚'; $lang['singlequoteclosing'] = '‘'; $lang['apostrophe'] = '’'; -$lang['btn_edit'] = 'Uredi to stran'; -$lang['btn_source'] = 'Prikaži izvorno kodo strani'; -$lang['btn_show'] = 'Prikaži stran'; -$lang['btn_create'] = 'Ustvari to stran'; -$lang['btn_search'] = 'Išči'; +$lang['btn_edit'] = 'Uredi stran'; +$lang['btn_source'] = 'Pokaži izvorno kodo strani'; +$lang['btn_show'] = 'Pokaži stran'; +$lang['btn_create'] = 'Ustvari stran'; +$lang['btn_search'] = 'Poišči'; $lang['btn_save'] = 'Shrani'; $lang['btn_preview'] = 'Predogled'; $lang['btn_top'] = 'Nazaj na vrh'; $lang['btn_newer'] = '<< novejši'; $lang['btn_older'] = 'starejši >>'; $lang['btn_revs'] = 'Stare različice'; -$lang['btn_recent'] = 'Novosti'; +$lang['btn_recent'] = 'Nedavne spremembe'; $lang['btn_upload'] = 'Pošlji'; $lang['btn_cancel'] = 'Prekliči'; $lang['btn_index'] = 'Kazalo'; $lang['btn_secedit'] = 'Uredi'; $lang['btn_login'] = 'Prijava'; $lang['btn_logout'] = 'Odjava'; -$lang['btn_admin'] = 'Administrator'; +$lang['btn_admin'] = 'Skrbništvo'; $lang['btn_update'] = 'Posodobi'; $lang['btn_delete'] = 'Izbriši'; $lang['btn_back'] = 'Nazaj'; +$lang['btn_backlink'] = 'Povratne povezave'; +$lang['btn_backtomedia'] = 'Nazaj na izbiro predstavnih datotek'; +$lang['btn_subscribe'] = 'Urejanje naročnin'; $lang['btn_profile'] = 'Posodobi profil'; $lang['btn_reset'] = 'Ponastavi'; $lang['btn_resendpwd'] = 'Pošlji novo geslo'; $lang['btn_draft'] = 'Uredi osnutek'; $lang['btn_recover'] = 'Obnovi osnutek'; $lang['btn_draftdel'] = 'Izbriši osnutek'; -$lang['loggedinas'] = 'Prijavljen kot'; +$lang['btn_revert'] = 'Povrni'; +$lang['loggedinas'] = 'Prijava kot'; $lang['user'] = 'Uporabniško ime'; $lang['pass'] = 'Geslo'; $lang['newpass'] = 'Novo geslo'; $lang['oldpass'] = 'Potrdi trenutno geslo'; -$lang['passchk'] = 'ponovno'; +$lang['passchk'] = 'Ponovi novo geslo'; $lang['remember'] = 'Zapomni si me'; $lang['fullname'] = 'Pravo ime'; -$lang['email'] = 'Elektronska pošta'; -$lang['register'] = 'Odpri nov račun'; -$lang['profile'] = 'Profil uporabnika'; -$lang['badlogin'] = 'Oprostite, uporabniško ime ali geslo ni pravo.'; +$lang['email'] = 'Elektronski naslov'; +$lang['register'] = 'Vpis računa'; +$lang['profile'] = 'Uporabniški profil'; +$lang['badlogin'] = 'Uporabniško ime ali geslo je napačno.'; $lang['minoredit'] = 'Manjše spremembe'; -$lang['draftdate'] = 'Samodejno shranjevanje osnutka vključeno'; -$lang['regmissing'] = 'Oprostite, zapolniti morate vsa polja.'; -$lang['reguexists'] = 'Oprostite, uporabnik s tem imenom že obstaja.'; -$lang['regsuccess'] = 'Uporabnik je bil ustvarjen. Geslo je bilo poslano na vaš elektronski naslov.'; -$lang['regsuccess2'] = 'Uporabnik je bil ustvarjen.'; -$lang['regmailfail'] = 'Zgleda, da je prišlo do napake pri pošiljanju gesla. Prosimo da stopite v stik z administratorjem!'; -$lang['regbadmail'] = 'Podan elektronski naslov izgleda neveljaven - če mislite da je to napaka, stopite v stik z administratorjem.'; -$lang['regbadpass'] = 'Gesli nista enaki.'; -$lang['regpwmail'] = 'Vaše geslo za DokuWiki'; -$lang['reghere'] = 'Nimate še računa? Priskrbite si ga'; -$lang['profnochange'] = 'Brez sprememb, ničesar za storiti.'; -$lang['profchanged'] = 'Uporabniški profil uspešno posodobljen'; -$lang['pwdforget'] = 'Pozabili geslo? Pridobite novega'; +$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['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.'; +$lang['regsuccess2'] = 'Uporabniški račun je uspešno ustvarjen.'; +$lang['regmailfail'] = 'Videti je, da je prišlo do napake med pošiljanjem gesla. Stopite v stik s skrbnikom sistema!'; +$lang['regbadmail'] = 'Videti je, da je naveden elektronski naslov neveljaven - v kolikor je to napaka, stopite v stik s skrbnikom sistema.'; +$lang['regbadpass'] = 'Gesli nista enaki. Poskusite znova.'; +$lang['regpwmail'] = 'Geslo za DokuWiki'; +$lang['reghere'] = 'Nimate še računa? Vpišite se za nov račun.'; +$lang['profna'] = 'Wiki ne podpira spreminjanja profila.'; +$lang['profnochange'] = 'Brez sprememb.'; +$lang['profnoempty'] = 'Prazno polje elektronskega naslova ali imena ni dovoljeno.'; +$lang['profchanged'] = 'Uporabniški profil je uspešno posodobljen.'; +$lang['pwdforget'] = 'Ali ste pozabili geslo? Pridobite si novo geslo.'; +$lang['resendna'] = 'Wiki ne podpira možnosti ponovnega pošiljanja gesel.'; $lang['resendpwd'] = 'Pošlji novo geslo za'; -$lang['resendpwdmissing'] = 'Se opravičujemo, vendar morate izpolniti vsa polja.'; -$lang['resendpwdnouser'] = 'Se opravičujemo, vendar tega uporabniškega imena ni v bazi.'; -$lang['resendpwdconfirm'] = 'Potrditvena povezava je bila poslana na vaš elektronski naslov'; -$lang['resendpwdsuccess'] = 'Vaše novo geslo je bilo poslano na vaš elektronski naslov'; +$lang['resendpwdmissing'] = 'Izpolniti je treba vsa polja.'; +$lang['resendpwdnouser'] = 'Podanega uporabniškega imena v podatkovni zbirki ni mogoče najti.'; +$lang['resendpwdbadauth'] = 'Koda za overitev ni prava. Prepričajte se, da ste uporabili celotno povezavo za potrditev.'; +$lang['resendpwdconfirm'] = 'Povezava za potrditev računa je bila poslana na elektronski naslov.'; +$lang['resendpwdsuccess'] = 'Novo geslo je bilo poslano na elektronski naslov.'; +$lang['license'] = 'V kolikor ni posebej določeno, je vsebina Wiki strani objavljena pod pogoji dovoljenja:'; +$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'] = 'Vnesite wikiname (neobvezno)'; +$lang['txt_filename'] = 'Pošlji z imenom (izborno)'; $lang['txt_overwrt'] = 'Prepiši obstoječo datoteko'; -$lang['lockedby'] = 'Trenutno zaklenjeno od'; -$lang['lockexpire'] = 'Zaklep preteče'; -$lang['willexpire'] = 'Vaš zaklep za urejevanje bo pretekel čez eno minuto.\nDa se izognete konfliktom, uporabite predogled, da se merilnik časa za zaklep ponastavi.'; -$lang['js']['notsavedyet'] = "Obstajajo neshranjene spremembe, ki bodo izgubljene.\nRes želite nadaljevati?"; -$lang['rssfailed'] = 'Prišlo je do napake pri prenašanju tega dovoda: '; -$lang['nothingfound'] = 'Nič ni bilo najdeno.'; -$lang['mediaselect'] = 'Mediafile Izbira'; -$lang['fileupload'] = 'Mediafile Pošiljanje'; -$lang['uploadsucc'] = 'Pošiljanje uspelo'; -$lang['uploadfail'] = 'Pošiljanje je spodletelo. Mogoče nimate dovoljenj?'; -$lang['uploadwrong'] = 'Pošiljanje zavrnjeno. Ta datotečna končnica je prepovedana'; -$lang['uploadexist'] = 'Dokument že obstaja. Brez sprememb.'; -$lang['uploadxss'] = 'Prenos je bil zaustavljen zaradi možne zlonamerne vsebine.'; -$lang['uploadsize'] = 'Prenesen dokument je prevelik. (max. %s)'; -$lang['deletesucc'] = 'Datoteka "%s" je bila izbrisana.'; -$lang['mediainuse'] = 'Dokument "%s" ni bil izbrisan - je še vedno v uporabi.'; -$lang['namespaces'] = 'Imenski prostori'; -$lang['mediafiles'] = 'Datoteke ki so na voljo v'; +$lang['lockedby'] = 'Trenutno je zaklenjeno s strani'; +$lang['lockexpire'] = 'Zaklep preteče ob'; +$lang['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'; +$lang['js']['keepopen'] = 'Od izbiri ohrani okno odprto'; $lang['js']['hidedetails'] = 'Skrij podrobnosti'; -$lang['js']['nosmblinks'] = 'Povezovanje do Windows deljenih datotek deluje samo v Microsoft Internet Explorer-ju. -Še vedno pa lahko ročno kopirate povezavo.'; -$lang['js']['mu_btn'] = 'Prenesite več dokumentov naenkrat.'; -$lang['mediaview'] = 'Poglej originalno datoteko'; -$lang['hits'] = 'Zadetkov'; -$lang['quickhits'] = 'Ujemanja v imenih strani'; +$lang['js']['mediatitle'] = 'Nastavitve povezave'; +$lang['js']['mediadisplay'] = 'Vrsta povezave'; +$lang['js']['mediaalign'] = 'Poravnava'; +$lang['js']['mediasize'] = 'Velikost slike'; +$lang['js']['mediatarget'] = 'Mesto povezave'; +$lang['js']['mediaclose'] = 'Zapri'; +$lang['js']['mediainsert'] = 'Vstavi'; +$lang['js']['mediadisplayimg'] = 'Pokaži sliko.'; +$lang['js']['mediadisplaylnk'] = 'Pokaži le povezavo.'; +$lang['js']['mediasmall'] = 'Majhna različica'; +$lang['js']['mediamedium'] = 'Srednja različica'; +$lang['js']['medialarge'] = 'Velika različica'; +$lang['js']['mediaoriginal'] = 'Izvorna različica'; +$lang['js']['medialnk'] = 'Povezava na strani podrobnosti'; +$lang['js']['mediadirect'] = 'Neposredna povezava do izvorne različice'; +$lang['js']['medianolnk'] = 'Brez povezave'; +$lang['js']['medianolink'] = 'Ne poveži s sliko'; +$lang['js']['medialeft'] = 'Poravnaj sliko na levo.'; +$lang['js']['mediaright'] = 'Poravnaj sliko na desno.'; +$lang['js']['mediacenter'] = 'Poravnaj sliko na sredini.'; +$lang['js']['medianoalign'] = 'Ne uporabi poravnave.'; +$lang['js']['nosmblinks'] = 'Povezovanje do souporabnih datotek sistema Windows deluje le pri uporabi brskalnika Microsoft Internet Explorer. Povezavo je mogoče kopirati ročno.'; +$lang['js']['linkwiz'] = 'Čarovnik za povezave'; +$lang['js']['linkto'] = 'Poveži na:'; +$lang['js']['del_confirm'] = 'Ali naj se res izbrišejo izbrani predmeti?'; +$lang['js']['mu_btn'] = 'Pošiljanje več dokumentov hkrati.'; +$lang['rssfailed'] = 'Prišlo je do napake med pridobivanjem vira: '; +$lang['nothingfound'] = 'Ni najdenih predmetov.'; +$lang['mediaselect'] = 'Predstavne datoteke'; +$lang['fileupload'] = 'Pošiljanje predstavnih datotek'; +$lang['uploadsucc'] = 'Pošiljanje je bilo uspešno končano.'; +$lang['uploadfail'] = 'Pošiljanje je spodletelo. Morda so uporabljena neustrezna dovoljenja.'; +$lang['uploadwrong'] = 'Pošiljanje je zavrnjeno. Uporabljena pripona datoteke je prepovedana.'; +$lang['uploadexist'] = 'Datoteka že obstaja. Ni sprememb.'; +$lang['uploadbadcontent'] = 'Poslana datoteka se ne sklada s pripono (%s) datoteke.'; +$lang['uploadspam'] = 'Pošiljanje je bilo ustavljeno na podlagi zapisa na črnem seznamu neželenih datotek.'; +$lang['uploadxss'] = 'Pošiljanje je zaustavljeno zaradi morebitne zlonamerne vsebine.'; +$lang['uploadsize'] = 'poslana datoteka prevelika (največja dovoljena velikost je %s).'; +$lang['deletesucc'] = 'Datoteka "%s" je izbrisana.'; +$lang['deletefail'] = 'Datoteke "%s" ni mogoče izbrisati - preverite uporabniška dovoljenja.'; +$lang['mediainuse'] = 'Datoteka "%s" ni izbrisana - datoteka je še vedno v uporabi.'; +$lang['namespaces'] = 'Imenski prostori'; +$lang['mediafiles'] = 'Datoteke, ki so na voljo v'; +$lang['accessdenied'] = 'Za ogled te strani so zahtevana posebna dovoljenja.'; +$lang['mediausage'] = 'Za navajanje datoteke je treba uporabiti navedeno skladnjo:'; +$lang['mediaview'] = 'Pogled izvorne datoteke'; +$lang['mediaroot'] = 'koren'; +$lang['mediaupload'] = 'Pošiljanje datoteke v trenutni imenski prostor. Za ustvarjanje novih imenskih prostorov, jih pripnite k imenu datoteke navedene pri vnosnem polju "Naloži kot" in jih ločite z dvopičjem.'; +$lang['mediaextchange'] = 'Pripona datoteke je spremenjena iz .%s v .%s!'; +$lang['reference'] = 'Sklic za'; +$lang['ref_inuse'] = 'Datoteke ni mogoče izbrisati, saj je še vedno povezana s stranmi:'; +$lang['ref_hidden'] = 'Nekaj sklicev je navedenih na straneh, do katerih s trenutnimi dovoljenji ni mogoč dostop.'; +$lang['hits'] = 'Zadetki'; +$lang['quickhits'] = 'Ujemanje imen strani'; $lang['toc'] = 'Kazalo'; -$lang['current'] = 'trenutna'; +$lang['current'] = 'Trenutna'; $lang['yours'] = 'Vaša različica'; -$lang['diff'] = 'prikaži razlike s trenutno različico'; +$lang['diff'] = 'Pokaži razlike s trenutno različico'; +$lang['diff2'] = 'Pokaži razlike med izbranimi različicami.'; +$lang['difflink'] = 'Poveži s tem pogledom primerjave.'; $lang['line'] = 'Vrstica'; $lang['breadcrumb'] = 'Sled'; -$lang['youarehere'] = 'Tukaj ste'; -$lang['lastmod'] = 'Zadnjič spremenil/a'; -$lang['by'] = 'od'; +$lang['youarehere'] = 'Trenutno dejavna stran'; +$lang['lastmod'] = 'Zadnja sprememba'; +$lang['by'] = 'uporabnika'; $lang['deleted'] = 'odstranjena'; $lang['created'] = 'ustvarjena'; -$lang['restored'] = 'stara različica povrnjena'; +$lang['restored'] = 'povrnjena stara različica'; +$lang['external_edit'] = 'urejanje v zunanjem urejevalniku'; $lang['summary'] = 'Povzetek urejanja'; -$lang['noflash'] = 'Za prikaz vsebine potrebujete <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>'; +$lang['noflash'] = 'Za prikaz vsebine je treba namestiti <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>'; +$lang['download'] = 'Naloži izrezek'; $lang['mail_newpage'] = '[DokuWiki] stran dodana:'; $lang['mail_changed'] = '[DokuWiki] stran spremenjena:'; -$lang['mail_new_user'] = 'nov uporabnik.'; +$lang['mail_subscribe_list'] = 'strani s spremenjenim imenom:'; +$lang['mail_new_user'] = 'nov uporabnik:'; $lang['mail_upload'] = 'naložena datoteka:'; -$lang['qb_bold'] = 'Krepki tisk'; -$lang['qb_italic'] = 'Ležeči tisk'; +$lang['qb_bold'] = 'Krepko besedilo'; +$lang['qb_italic'] = 'Ležeče besedilo'; $lang['qb_underl'] = 'Podčrtano besedilo'; -$lang['qb_code'] = 'Koda'; +$lang['qb_code'] = 'Oznaka kode'; $lang['qb_strike'] = 'Prečrtano besedilo'; -$lang['qb_h1'] = 'Naslov prve stopnje'; -$lang['qb_h2'] = 'Naslov drugee stopnje'; -$lang['qb_h3'] = 'Naslov tretje stopnje'; -$lang['qb_h4'] = 'Naslov četrte stopnje'; -$lang['qb_h5'] = 'Naslov pete stopnje'; +$lang['qb_h1'] = 'Naslov prve ravni'; +$lang['qb_h2'] = 'Naslov druge ravni'; +$lang['qb_h3'] = 'Naslov tretje ravni'; +$lang['qb_h4'] = 'Naslov četrte ravni'; +$lang['qb_h5'] = 'Naslov pete ravni'; +$lang['qb_h'] = 'Naslov'; +$lang['qb_hs'] = 'Izberi naslov'; +$lang['qb_hplus'] = 'Naslov na višji ravni'; +$lang['qb_hminus'] = 'Naslov na nižji ravni'; +$lang['qb_hequal'] = 'Naslov na isti ravni'; $lang['qb_link'] = 'Notranja povezava'; $lang['qb_extlink'] = 'Zunanja povezava'; $lang['qb_hr'] = 'Vodoravna črta'; -$lang['qb_ol'] = 'Element urejenega seznama'; -$lang['qb_ul'] = 'Element neurejenega seznama'; -$lang['qb_media'] = 'Dodaj slike in druge datoteke'; +$lang['qb_ol'] = 'Številčna oznaka predmeta'; +$lang['qb_ul'] = 'Vrstična oznaka predmeta'; +$lang['qb_media'] = 'Dodajanje slik in drugih datotek'; $lang['qb_sig'] = 'Vstavi podpis'; $lang['qb_smileys'] = 'Smeški'; $lang['qb_chars'] = 'Posebni znaki'; +$lang['upperns'] = 'skoči na nadrejeni imenski prostor'; $lang['admin_register'] = 'Dodaj novega uporabnika'; -$lang['metaedit'] = 'Popravi metapodatke'; -$lang['metasaveerr'] = 'Zapisovanje metapodatkov ni uspelo'; -$lang['metasaveok'] = 'Meta podatki shranjeni'; +$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'; @@ -148,15 +211,71 @@ $lang['img_date'] = 'Datum'; $lang['img_fname'] = 'Ime datoteke'; $lang['img_fsize'] = 'Velikost'; $lang['img_artist'] = 'Fotograf'; -$lang['img_format'] = 'Velikost'; +$lang['img_copyr'] = 'Avtorska pravica'; +$lang['img_format'] = 'Zapis'; $lang['img_camera'] = 'Fotoaparat'; $lang['img_keywords'] = 'Ključne besede'; +$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.'; +$lang['subscr_unsubscribe_success'] = 'Uporabniški račun %s je odstranjen s seznama naročnin na %s'; +$lang['subscr_unsubscribe_error'] = 'Napaka med odstranjevanjem %s s seznama naročnin na %s'; +$lang['subscr_already_subscribed'] = '%s je že naročen na %s'; +$lang['subscr_not_subscribed'] = '%s ni naročen na %s'; +$lang['subscr_m_not_subscribed'] = 'Trenutni uporabniški račun nima prijavljene naročnine na trenutno stran ali imenski prostor.'; +$lang['subscr_m_new_header'] = 'Naročanje'; +$lang['subscr_m_current_header'] = 'Trenutne naročnine'; +$lang['subscr_m_unsubscribe'] = 'Prekliči naročnino'; +$lang['subscr_m_subscribe'] = 'Prijavi naročnino'; +$lang['subscr_m_receive'] = 'Prejmi'; +$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['authmodfailed'] = 'Slaba nastavitev overitve uporabniškega računa. Stopite v stik s skrbnikom sistema wiki.'; +$lang['authtempfail'] = 'Potrditev uporabnika je trenutno nedostopna. Stopite v stik s skrbnikom sistema wiki.'; $lang['i_chooselang'] = 'Izberite jezik'; $lang['i_installer'] = 'DokuWiki namestitev'; -$lang['i_wikiname'] = 'Wiki ime'; +$lang['i_wikiname'] = 'Ime Wiki spletišča'; $lang['i_enableacl'] = 'Omogoči ACL (priporočeno)'; -$lang['i_superuser'] = 'Naduporabnik'; -$lang['i_confexists'] = '<code>%s</code> že obstaja'; +$lang['i_superuser'] = 'Skrbnik'; +$lang['i_problems'] = 'Namestilnik je naletel na težave, ki so izpisane spodaj. Namestitve ni mogoče nadaljevati, dokler težave ne bodo odpravljene.'; +$lang['i_modified'] = 'Iz varnostnih razlogov skript deluje le v novi in neprilagojeni namestitvi sistema DokuWiki. Postopek namestitve je treba začeti znova ali pa sistem namestiti ročno s pomočjo <a href="http://dokuwiki.org/install">navodil nameščanja Dokuwiki</a>.'; +$lang['i_funcna'] = 'Funkcija PHP <code>%s</code> ni na voljo. Morda je možnost na strežniku zaradi varnostnih razlogov onemogočena.'; +$lang['i_phpver'] = 'Različica PHP <code>%s</code> je nižja od zahtevane različice <code>%s</code>. Pred nadaljevanjem je treba posodobiti namestitev PHP.'; +$lang['i_permfail'] = 'Predmet <code>%s</code> ni zapisljiv. Zahtevana je sprememba dovoljenj za to mapo.'; +$lang['i_confexists'] = 'Predmet <code>%s</code> že obstaja.'; +$lang['i_writeerr'] = 'Ni mogoče ustvariti predmeta <code>%s</code>. Preveriti je treba dovoljenja datotek in map in nato ustvariti datoteko ročno.'; +$lang['i_badhash'] = 'nepoznana ali spremenjena datoteka dokuwiki.php (razpršilo=<code>%s</code>)'; +$lang['i_badval'] = '<code>%s</code> - neveljavna ali prazna vrednost'; +$lang['i_success'] = 'Nastavitev je uspešno končana. Datoteko install.php lahko sedaj izbrišete. Nadaljujte v <a href="doku.php">novi DokuWiki</a>.'; +$lang['i_failure'] = 'Med zapisovanjem nastavitvenih datotek je prišlo do napak. Preden lahko uporabite vaš <a href="doku.php">DokuWiki</a>, jih je treba odpraviti.'; +$lang['i_policy'] = 'Začetna določila ACL'; +$lang['i_pol0'] = 'Odprt Wiki (branje, zapis, nalaganje datotek je javno za vse)'; +$lang['i_pol1'] = 'Javni Wiki (branje za vse, zapis in nalaganje datotek za prijavljene uporabnike)'; +$lang['i_pol2'] = 'Zaprt Wiki (berejo in urejajo lahko le prijavljeni uporabniki)'; +$lang['i_retry'] = 'Ponovni poskus'; +$lang['i_license'] = 'Izbor dovoljenja objave vsebine:'; +$lang['mu_intro'] = 'Naložiti je mogoče več datotek hkrati. S klikom na gumb "Prebrskaj", jih je mogoče dodati v vrsto. S klikom na povezavo "naloži" bodo datoteke poslane na strežnik.'; +$lang['mu_gridname'] = 'Ime datoteke'; $lang['mu_gridsize'] = 'Velikost'; +$lang['mu_gridstat'] = 'Stanje'; +$lang['mu_namespace'] = 'Imenski prostor'; +$lang['mu_browse'] = 'Prebrskaj'; +$lang['mu_toobig'] = 'prevelika datoteka'; +$lang['mu_ready'] = 'pripravljena na pošiljanje'; $lang['mu_done'] = 'končano'; -$lang['mu_filetypes'] = 'Dovoljeni tipi datotek'; +$lang['mu_fail'] = 'ni uspelo'; +$lang['mu_authfail'] = 'seja je potekla'; +$lang['mu_progress'] = '@PCT@% je poslano'; +$lang['mu_filetypes'] = 'Dovoljene vrste datotek'; +$lang['mu_info'] = 'poslanih datotek.'; +$lang['mu_lasterr'] = 'Zadnja napaka:'; +$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'; +$lang['weeks'] = '%d tednov nazaj'; +$lang['days'] = '%d dni nazaj'; +$lang['hours'] = '%d ur nazaj'; +$lang['minutes'] = '%d minut nazaj'; +$lang['seconds'] = '%d sekund nazaj'; +$lang['wordblock'] = 'Spremembe niso shranjene, ker je v vsebini navedeno neželeno besedilo (spam).'; diff --git a/inc/lang/sl/locked.txt b/inc/lang/sl/locked.txt index dbdcf48a1..d51e940b7 100644 --- a/inc/lang/sl/locked.txt +++ b/inc/lang/sl/locked.txt @@ -1,3 +1,3 @@ ====== Stran je zaklenjena ====== -To stran je nekdo zaklenjenil za urejanje. Počakati morate, da jo ta uporabnik neha urejati ali pa da poteče zaklep. +Stran je zaklenjenjena za urejanje. Počakati je treba, da zaklep strani poteče. diff --git a/inc/lang/sl/login.txt b/inc/lang/sl/login.txt index f385d0099..eeae0c96c 100644 --- a/inc/lang/sl/login.txt +++ b/inc/lang/sl/login.txt @@ -1,4 +1,3 @@ ====== Prijava ====== -Niste prijavljeni! Spodaj vnesite svoje podatke in se prijavite. Da se lahko prijavite, morate imeti omogočene piškotke. - +Niste prijavljeni! Spodaj vnesite ustrezne podatke in se prijavite. Prijaviti se je mogoče le, če so omogočeni piškotki. diff --git a/inc/lang/sl/mailtext.txt b/inc/lang/sl/mailtext.txt index a46c672d6..e08d01d9e 100644 --- a/inc/lang/sl/mailtext.txt +++ b/inc/lang/sl/mailtext.txt @@ -2,16 +2,14 @@ Stran na vašem DokuWiki je bila dodana ali spremenjena. Podrobnosti: Datum : @DATE@ Brskalnik : @BROWSER@ -IP-naslov : @IPADDRESS@ -Gostitelj : @HOSTNAME@ +Naslov IP : @IPADDRESS@ +Ime gostitelja : @HOSTNAME@ Stara različica : @OLDPAGE@ -Nova Različica : @NEWPAGE@ +Nova različica : @NEWPAGE@ Povzetek urejanja: @SUMMARY@ Uporabnik : @USER@ @DIFF@ - --- -To sporočilo je ustvaril DokuWiki na -@DOKUWIKIURL@ +-- +Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@ diff --git a/inc/lang/sl/newpage.txt b/inc/lang/sl/newpage.txt index c58ab17ff..2f11bbf55 100644 --- a/inc/lang/sl/newpage.txt +++ b/inc/lang/sl/newpage.txt @@ -1,3 +1,3 @@ -====== Ta stran še ne obstaja ====== +====== Stran še ne obstaja ====== -Sledili ste povezavi na stran, ki še ne obstaja. Ustvarite jo lahko, tako da pritisnete na ''Ustvari to stran''. +Sledili ste povezavi na stran, ki še ne obstaja. Stran je mogoče ustvariti preko povezave ''Ustvari stran''. diff --git a/inc/lang/sl/norev.txt b/inc/lang/sl/norev.txt index 28b9f8ac5..adaa22d11 100644 --- a/inc/lang/sl/norev.txt +++ b/inc/lang/sl/norev.txt @@ -1,4 +1,3 @@ -====== Ta različica ne obstaja ====== - -Podana različica ne obstaja. Uporabite gumb ''Stare različice'' za seznam starih različic tega dokumenta. +====== Neobstoječa različica strani ====== +Zahtevana različica strani ne obstaja. Uporabite gumb ''Stare različice'' za izpis seznama starih različic tega dokumenta. diff --git a/inc/lang/sl/password.txt b/inc/lang/sl/password.txt index 794fd97b1..61929dccd 100644 --- a/inc/lang/sl/password.txt +++ b/inc/lang/sl/password.txt @@ -1,10 +1,9 @@ -Pozdravljeni @FULLNAME@! +Pozdravljeni, @FULLNAME@! -Tukaj so vaši podatki za @TITLE@ na @DOKUWIKIURL@ +Spodaj so navedeni podatki za @TITLE@ na wiki spletišču @DOKUWIKIURL@ -Uporabniško ime : @LOGIN@ -Geslo : @PASSWORD@ +Uporabniško ime: @LOGIN@ +Geslo : @PASSWORD@ --- -To sporočilo je ustvaril DokuWiki na -@DOKUWIKIURL@ +-- +Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@ diff --git a/inc/lang/sl/preview.txt b/inc/lang/sl/preview.txt index 4ebf183ec..c49de6617 100644 --- a/inc/lang/sl/preview.txt +++ b/inc/lang/sl/preview.txt @@ -1,4 +1,3 @@ ====== Predogled ====== -To je predogled strani. Lahko si ogledate kako bo izgledal dokument. Ne pozabite pa, da še ni shranjen! - +Prikazan je predogled strani. Stran še ni shranjena! diff --git a/inc/lang/sl/pwconfirm.txt b/inc/lang/sl/pwconfirm.txt index 96c3a64d5..a621821e5 100644 --- a/inc/lang/sl/pwconfirm.txt +++ b/inc/lang/sl/pwconfirm.txt @@ -1,13 +1,11 @@ -Pozdravljen @FULLNAME@! +Pozdravljeni, @FULLNAME@! -Nekdo je v vašem imenu zahteval novo geslo za uporabniško ime @TITLE@ na @DOKUWIKIURL@. +S podatki vašega imena je bila poslana zahteva za pridobitev novega gesla za uporabniško ime @TITLE@ na wiki spletišču @DOKUWIKIURL@. -Če novega gesla niste zahtevali, prezrite to sporočilo. - -Za potrditev novega gesla, kliknite spodnjo povezavo. + - V kolikor novega gesla niste zahtevali, prezrite to sporočilo. + - Za potrditev zahteve za pridobitev novega gesla, kliknite spodnjo povezavo. @CONFIRM@ --- -To sporočilo je ustvaril DokuWiki na -@DOKUWIKIURL@ +-- +Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@ diff --git a/inc/lang/sl/read.txt b/inc/lang/sl/read.txt index 1423a4f16..5ba9a2eb0 100644 --- a/inc/lang/sl/read.txt +++ b/inc/lang/sl/read.txt @@ -1,2 +1,2 @@ -Ta stran je samo za branje. Lahko si ogledate njeno izvorno kodo, spreminjati pa je ne morete. Vprašajte administratorja, če se vam to zdi narobe. +Stran je odprta z dovoljenji le za branje. Dovoljeno je ogledati si izvorno kodo strani, vsebine pa ni mogoče spreminjati. Za več podrobnosti stopite v stik s skrbnikom sistema. diff --git a/inc/lang/sl/recent.txt b/inc/lang/sl/recent.txt index 534063384..282a492be 100644 --- a/inc/lang/sl/recent.txt +++ b/inc/lang/sl/recent.txt @@ -1,5 +1,3 @@ -====== Trenutne spremembe ====== - -Sledeče strani so bile nedavno spremenjene. - +====== Nedavne spremembe ====== +Izpisane wiki strani so bile nedavno spremenjene. diff --git a/inc/lang/sl/register.txt b/inc/lang/sl/register.txt index d1f7ab49e..f1b22f933 100644 --- a/inc/lang/sl/register.txt +++ b/inc/lang/sl/register.txt @@ -1,4 +1,3 @@ -====== Odpri nov račun ====== - -Vnesite vse potrebne podatke in si ustvarite račun za ta wiki. Preverite da ste vnesli **veljaven e-mail naslov** - tja bo poslano geslo. Uporabniško ime mora biti veljavno [[doku>pagename|ime strani]]. +====== Vpis novega računa ====== +V spodnji obrazec je treba vnesti vse zahtevane podatke za ustvarjanje novega računa. Vnesti je treba veljaven **elektronski naslov**, na katerega bo poslano geslo. Uporabniško ime mora biti veljavno [[doku>pagename|ime strani]]. diff --git a/inc/lang/sl/registermail.txt b/inc/lang/sl/registermail.txt index d9622325e..801b7d0db 100644 --- a/inc/lang/sl/registermail.txt +++ b/inc/lang/sl/registermail.txt @@ -1,14 +1,14 @@ -Nov uporabnik registriran. Podatki: +Nov uporabniški račun je uspešno vpisan. +Podatki računa: -Uporabniško ime: @NEWUSER@ -Polno ime: @NEWNAME@ -E-mail: @NEWEMAIL@ +Uporabniško ime : @NEWUSER@ +Polno ime : @NEWNAME@ +Elektronski naslov: @NEWEMAIL@ -Datum: @DATE@ -Brskalnik: @BROWSER@ -IP naslov: @IPADDRESS@ -Hostname: @HOSTNAME@ +Datum : @DATE@ +Brskalnik : @BROWSER@ +Naslov IP : @IPADDRESS@ +Ime gostitelja : @HOSTNAME@ -- -To sporočilo je ustvaril DokuWiki na -@DOKUWIKIURL@ +Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@ diff --git a/inc/lang/sl/resendpwd.txt b/inc/lang/sl/resendpwd.txt index 9f46a7a59..8a1e614f7 100644 --- a/inc/lang/sl/resendpwd.txt +++ b/inc/lang/sl/resendpwd.txt @@ -1,3 +1,3 @@ -====== Pošlji novo geslo ====== +====== Pošiljanje novega gesla ====== -Za pridobitev novega gesla, vnesite vaše uporabniško ime v obrazec spodaj. Na vaš email naslov bo poslano sporočilo s povezavo za potrditev avtentičnosti.
\ No newline at end of file +Za pridobitev novega gesla, vnesite vaše uporabniško ime ustrezno polje spodnjega obrazca. Na naveden elektronski naslov bo poslano sporočilo v katerem bo navedena povezava do strani za overjanje istovetnosti uporabnika. diff --git a/inc/lang/sl/revisions.txt b/inc/lang/sl/revisions.txt index 19bf39a87..86ede9ded 100644 --- a/inc/lang/sl/revisions.txt +++ b/inc/lang/sl/revisions.txt @@ -1,4 +1,3 @@ ====== Stare različice ====== -To so stare različice tega dokumenta. Da ga povrnete na starejšo različico, to prvo izberite, pritisnite na ''Uredi to stran'' in jo še shranite. - +Prikazana je stara različica tega dokumenta. Stran je mogoče povrniti na starejšo različico tako, da stran izberete, pritisnete na povezavo ''Uredi stran'' in stran nato shranite. diff --git a/inc/lang/sl/searchpage.txt b/inc/lang/sl/searchpage.txt index b41c6dd44..736a36182 100644 --- a/inc/lang/sl/searchpage.txt +++ b/inc/lang/sl/searchpage.txt @@ -1,5 +1,5 @@ -====== Išči ====== +====== Iskanje ====== -Spodaj so prikazani rezultati vašega iskanja. Če niste našli kar ste iskali, lahko ustvarite novo stran z imenom vaše poizvedbe, tako da uporabite gumb ''Uredi to stran''. +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''. ===== Rezultati =====
\ No newline at end of file diff --git a/inc/lang/sl/showrev.txt b/inc/lang/sl/showrev.txt index 00111ffc5..838339217 100644 --- a/inc/lang/sl/showrev.txt +++ b/inc/lang/sl/showrev.txt @@ -1,2 +1,2 @@ -**To je stara različica tega dokumenta!** +**Stara različica tega dokumenta!** ---- diff --git a/inc/lang/sl/stopwords.txt b/inc/lang/sl/stopwords.txt new file mode 100644 index 000000000..5d61539e7 --- /dev/null +++ b/inc/lang/sl/stopwords.txt @@ -0,0 +1,18 @@ +# To je seznam besed, ki jih ustvarjalnik kazala prezre. Seznam je sestavljen iz +# besede, ki so zapisane vsaka v svoji vrstici. Datoteka mora biti zapisana s konnim +# UNIX znakom vrstice. Besede kraje od treh znakov so iz kazala izloene samodejno +# zaradi preglednosti. Seznam se s bo s asom spreminjal in dopolnjeval. +moja +moje +moji +mojo +njegovi +njegove +njegovo +njeno +njeni +njene +njihova +njihove +njihovi +njihovo diff --git a/inc/lang/sl/subscr_digest.txt b/inc/lang/sl/subscr_digest.txt new file mode 100644 index 000000000..aeb548beb --- /dev/null +++ b/inc/lang/sl/subscr_digest.txt @@ -0,0 +1,19 @@ +Pozdravljeni! + +Strani v imenskem prostoru @PAGE@ wiki spletišča @TITLE@ so spremenjene. +Podrobnosti sprememb so navedene spodaj. + +------------------------------------------------ +@DIFF@ +------------------------------------------------ + +Stara različica: @OLDPAGE@ +Nova različica : @NEWPAGE@ + +Za odjavo prejemanja podrobnosti sprememb, se je treba prijaviti na spletišče +@DOKUWIKIURL@ in med možnostmi naročanja +@SUBSCRIBE@ +odjaviti prejemanje poročil sprememb strani ali imenskega prostora. + +-- +Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@ diff --git a/inc/lang/sl/subscr_form.txt b/inc/lang/sl/subscr_form.txt new file mode 100644 index 000000000..46be8c954 --- /dev/null +++ b/inc/lang/sl/subscr_form.txt @@ -0,0 +1,3 @@ +===== Urejanje naročnin ==== + +Ta stran vam omogoča urejanje vaših naročnin za trenutno stran in imenski prostor.
\ No newline at end of file diff --git a/inc/lang/sl/subscr_list.txt b/inc/lang/sl/subscr_list.txt new file mode 100644 index 000000000..253cb4104 --- /dev/null +++ b/inc/lang/sl/subscr_list.txt @@ -0,0 +1,16 @@ +Pozdravljeni! + +Strani v imenskem prostoru @PAGE@ wiki spletišča @TITLE@ so spremenjene. +Podrobnosti sprememb so navedene spodaj. + +------------------------------------------------ +@DIFF@ +------------------------------------------------ + +Za odjavo prejemanja podrobnosti sprememb, se je treba prijaviti na spletišče +@DOKUWIKIURL@ in med možnostmi naročanja +@SUBSCRIBE@ +odjaviti prejemanje poročil sprememb strani ali imenskega prostora. + +-- +Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@ diff --git a/inc/lang/sl/subscr_single.txt b/inc/lang/sl/subscr_single.txt new file mode 100644 index 000000000..9fd64be0e --- /dev/null +++ b/inc/lang/sl/subscr_single.txt @@ -0,0 +1,22 @@ +Pozdravljeni! + +Stran @PAGE@ na spletišču Wiki @TITLE@ je spremenjena. +Spremenjeno je: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Datum : @DATE@ +Uporabnik : @USER@ +Povzetek urejanja: @SUMMARY@ +Stara različica : @OLDPAGE@ +Nova različica : @NEWPAGE@ + +Preklic obveščanja o spremembah strani je mogoče določiti +na Wiki naslovu @DOKUWIKIURL@ in z obiskom @NEWPAGE@, +kjer se je mogoče odjaviti od spremljanja strani ali +imenskega prostora. + +-- +Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/sl/updateprofile.txt b/inc/lang/sl/updateprofile.txt new file mode 100644 index 000000000..5e939f2f2 --- /dev/null +++ b/inc/lang/sl/updateprofile.txt @@ -0,0 +1,3 @@ +===== Posodabljanje računa ===== + +Posodobiti ali spremeniti je mogoče le nekatere podatke. Uporabniškega imena ni mogoče spremeniti.
\ No newline at end of file diff --git a/inc/lang/sl/uploadmail.txt b/inc/lang/sl/uploadmail.txt new file mode 100644 index 000000000..0479be75f --- /dev/null +++ b/inc/lang/sl/uploadmail.txt @@ -0,0 +1,14 @@ +Datoteka je bila uspešno naložena na DokuWiki spletišče. +Podrobnosti o datoteki: + +Datoteka : @MEDIA@ +Datum : @DATE@ +Brskalnik : @BROWSER@ +Naslov IP : @IPADDRESS@ +Ponudnik : @HOSTNAME@ +Velikost : @SIZE@ +Vrsta MIME: @MIME@ +Uporabnik : @USER@ + +-- +Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/sq/lang.php b/inc/lang/sq/lang.php index 0213ba28b..47a54d2ea 100644 --- a/inc/lang/sq/lang.php +++ b/inc/lang/sq/lang.php @@ -8,7 +8,7 @@ * lines starting with @author * * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesSq.php?view=co - * @author Leonard Elezi leonard.elezi@depinfo.info + * @author Leonard Elezi <leonard.elezi@depinfo.info> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -49,6 +49,7 @@ $lang['btn_draft'] = 'Redakto skicën'; $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['user'] = 'Nofka e përdoruesit:'; $lang['pass'] = 'Fjalëkalimi'; @@ -58,7 +59,6 @@ $lang['passchk'] = 'Edhe një herë'; $lang['remember'] = 'Më mbaj mend'; $lang['fullname'] = 'Emri i vërtetë'; $lang['email'] = 'Adresa e email-it*'; -$lang['register'] = 'Regjsitrohuni'; $lang['profile'] = 'Profili i përdoruesit'; $lang['badlogin'] = 'Na vjen keq, emri ose fjalëkalimi është gabim.'; $lang['minoredit'] = 'Ndryshime të Vogla'; diff --git a/inc/lang/sr/lang.php b/inc/lang/sr/lang.php index 71dde4062..b35956f03 100644 --- a/inc/lang/sr/lang.php +++ b/inc/lang/sr/lang.php @@ -4,8 +4,7 @@ * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Filip Brcic <brcha@users.sourceforge.net> - * @author Иван Петровић petrovicivan@ubuntusrbija.org - * @author Ivan Petrovic <petrovicivan@ubuntusrbija.org> + * @author Иван Петровић (Ivan Petrovic) <petrovicivan@ubuntusrbija.org> * @author Miroslav Šolti <solti.miroslav@gmail.com> */ $lang['encoding'] = 'utf-8'; @@ -47,6 +46,7 @@ $lang['btn_draft'] = 'Измени нацрт'; $lang['btn_recover'] = 'Опорави нацрт'; $lang['btn_draftdel'] = 'Обриши нацрт'; $lang['btn_revert'] = 'Врати на пређашњу верзију'; +$lang['btn_register'] = 'Региструј се'; $lang['loggedinas'] = 'Пријављен као'; $lang['user'] = 'Корисничко име'; $lang['pass'] = 'Лозинка'; @@ -56,7 +56,6 @@ $lang['passchk'] = 'поново'; $lang['remember'] = 'Запамти ме'; $lang['fullname'] = 'Име и презиме'; $lang['email'] = 'Е-адреса'; -$lang['register'] = 'Региструј се'; $lang['profile'] = 'Кориснички профил'; $lang['badlogin'] = 'Извините, није добро корисничко име или шифра.'; $lang['minoredit'] = 'Мала измена'; diff --git a/inc/lang/sr/subscribermail.txt b/inc/lang/sr/subscribermail.txt deleted file mode 100644 index fd3de7d38..000000000 --- a/inc/lang/sr/subscribermail.txt +++ /dev/null @@ -1,17 +0,0 @@ -Здраво! - -Измењена је страница @PAGE@ на @TITLE@ викију. -Ево измена: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Да се одјавите са ове странице, пријавите се на вики на -@DOKUWIKIURL@ и онда посетите -@NEWPAGE@ -и изаберите 'Одјави се са измена'. - --- -Ову поруку је генерисао DokuWiki на -@DOKUWIKIURL@ diff --git a/inc/lang/sv/lang.php b/inc/lang/sv/lang.php index 09dec8edd..801e2d879 100644 --- a/inc/lang/sv/lang.php +++ b/inc/lang/sv/lang.php @@ -7,15 +7,15 @@ * @author Per Foreby <per@foreby.se> * @author Nicklas Henriksson <nicklas[at]nihe.se> * @author Håkan Sandell <hakan.sandell[at]mydata.se> + * @author Håkan Sandell <hakan.sandell@home.se> * @author Dennis Karlsson * @author Tormod Otter Johansson <tormod@latast.se> + * @author Tormod Johansson <tormod.otter.johansson@gmail.com> * @author emil@sys.nu * @author Pontus Bergendahl <pontus.bergendahl@gmail.com> - * @author Tormod Johansson tormod.otter.johansson@gmail.com * @author Emil Lind <emil@sys.nu> * @author Bogge Bogge <bogge@bogge.com> * @author Peter Åström <eaustreum@gmail.com> - * @author Håkan Sandell <hakan.sandell@home.se> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -49,10 +49,6 @@ $lang['btn_back'] = 'Tillbaka'; $lang['btn_backlink'] = 'Tillbakalänkar'; $lang['btn_backtomedia'] = 'Tillbaka till val av Mediafil'; $lang['btn_subscribe'] = 'Prenumerera på ändringar'; -$lang['btn_unsubscribe'] = 'Säg upp prenumeration på ändringar'; -$lang['btn_subscribens'] = 'Prenumerera på namnrymdsändringar'; -$lang['btn_unsubscribens'] = 'Sluta prenumerera på namnrymdsändringar -'; $lang['btn_profile'] = 'Uppdatera profil'; $lang['btn_reset'] = 'Återställ'; $lang['btn_resendpwd'] = 'Skicka nytt lösenord'; @@ -60,6 +56,7 @@ $lang['btn_draft'] = 'Redigera utkast'; $lang['btn_recover'] = 'Återskapa utkast'; $lang['btn_draftdel'] = 'Radera utkast'; $lang['btn_revert'] = 'Återställ'; +$lang['btn_register'] = 'Registrera'; $lang['loggedinas'] = 'Inloggad som'; $lang['user'] = 'Användarnamn'; $lang['pass'] = 'Lösenord'; @@ -69,7 +66,6 @@ $lang['passchk'] = 'en gång till'; $lang['remember'] = 'Kom ihåg mig'; $lang['fullname'] = 'Namn'; $lang['email'] = 'E-post'; -$lang['register'] = 'Registrera'; $lang['profile'] = 'Användarprofil'; $lang['badlogin'] = 'Felaktigt användarnamn eller lösenord.'; $lang['minoredit'] = 'Små ändringar'; @@ -106,7 +102,35 @@ $lang['txt_overwrt'] = 'Skriv över befintlig fil'; $lang['lockedby'] = 'Låst av'; $lang['lockexpire'] = 'Lås upphör att gälla'; $lang['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.\nÄr du säker på att du vill fortsätta?"; +$lang['js']['notsavedyet'] = 'Det finns ändringar som inte är sparade. +Är du säker på att du vill fortsätta?'; +$lang['js']['searchmedia'] = 'Sök efter filer'; +$lang['js']['keepopen'] = 'Lämna fönstret öppet efter val av fil'; +$lang['js']['hidedetails'] = 'Dölj detaljer'; +$lang['js']['mediatitle'] = 'Länkinställningar'; +$lang['js']['mediadisplay'] = 'Länktyp'; +$lang['js']['mediaalign'] = 'Justering'; +$lang['js']['mediasize'] = 'Bildstorlek'; +$lang['js']['mediatarget'] = 'Länköppning'; +$lang['js']['mediaclose'] = 'Stäng'; +$lang['js']['mediadisplayimg'] = 'Visa bilden.'; +$lang['js']['mediadisplaylnk'] = 'Visa endast länken.'; +$lang['js']['mediasmall'] = 'Liten storlek'; +$lang['js']['mediamedium'] = 'Mellanstor storlek'; +$lang['js']['medialarge'] = 'Stor storlek'; +$lang['js']['mediaoriginal'] = 'Originalstorlek'; +$lang['js']['mediadirect'] = 'Direktlänk till originalet'; +$lang['js']['medianolnk'] = 'Ingen länk'; +$lang['js']['medianolink'] = 'Länka inte bilden'; +$lang['js']['medialeft'] = 'Justera bilden till vänster.'; +$lang['js']['mediaright'] = 'Justera bilden till höger.'; +$lang['js']['mediacenter'] = 'Centrera bilden.'; +$lang['js']['nosmblinks'] = 'Länkning till Windowsresurser fungerar bara med Microsofts Internet Explorer. +Du kan fortfarande klippa och klistra in länken om du använder en annan webbläsare än MSIE.'; +$lang['js']['linkwiz'] = 'Snabbguide Länkar'; +$lang['js']['linkto'] = 'Länk till:'; +$lang['js']['del_confirm'] = 'Vill du verkligen radera?'; +$lang['js']['mu_btn'] = 'Ladda upp flera filer samtidigt'; $lang['rssfailed'] = 'Ett fel uppstod när detta RSS-flöde skulle hämtas: '; $lang['nothingfound'] = 'Inga filer hittades.'; $lang['mediaselect'] = 'Mediafiler'; @@ -124,15 +148,7 @@ $lang['deletefail'] = 'Kunde inte radera "%s" - kontrollera filskydd. $lang['mediainuse'] = 'Filen "%s" har inte raderats - den används fortfarande.'; $lang['namespaces'] = 'Namnrymder'; $lang['mediafiles'] = 'Tillgängliga filer i'; -$lang['js']['searchmedia'] = 'Sök efter filer'; -$lang['js']['keepopen'] = 'Lämna fönstret öppet efter val av fil'; -$lang['js']['hidedetails'] = 'Dölj detaljer'; -$lang['js']['nosmblinks'] = 'Länkning till Windowsresurser fungerar bara med Microsofts Internet Explorer. -Du kan fortfarande klippa och klistra in länken om du använder en annan webbläsare än MSIE.'; -$lang['js']['linkwiz'] = 'Snabbguide Länkar'; -$lang['js']['linkto'] = 'Länk till:'; -$lang['js']['del_confirm'] = 'Vill du verkligen radera?'; -$lang['js']['mu_btn'] = 'Ladda upp flera filer samtidigt'; +$lang['accessdenied'] = 'Du får inte läsa den här sidan.'; $lang['mediausage'] = 'Använd följande syntax för att referera till denna fil:'; $lang['mediaview'] = 'Visa originalfilen'; $lang['mediaroot'] = 'rot'; @@ -148,6 +164,9 @@ $lang['current'] = 'aktuell'; $lang['yours'] = 'Din version'; $lang['diff'] = 'visa skillnader mot aktuell version'; $lang['diff2'] = 'Visa skillnader mellan valda versioner'; +$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'; @@ -204,11 +223,12 @@ $lang['img_copyr'] = 'Copyright'; $lang['img_format'] = 'Format'; $lang['img_camera'] = 'Kamera'; $lang['img_keywords'] = 'Nyckelord'; -$lang['subscribe_success'] = 'Lade till %s i prenumerationslistan för %s'; -$lang['subscribe_error'] = 'Fel vid tillägg av %s i prenumerationslistan för %s'; -$lang['subscribe_noaddress'] = 'Det finns ingen adress knuten till ditt konto, det går inte att lägga till dig i prenumerationslistan'; -$lang['unsubscribe_success'] = 'Tog bort %s från prenumerationslistan för %s'; -$lang['unsubscribe_error'] = 'Fel vid borttagning %s från prenumerationslistan list för %s'; +$lang['subscr_m_new_header'] = 'Lägg till prenumeration'; +$lang['subscr_m_current_header'] = 'Nuvarande prenumerationer'; +$lang['subscr_m_unsubscribe'] = 'Prenumerera'; +$lang['subscr_m_subscribe'] = 'Avsluta prenumeration'; +$lang['subscr_m_receive'] = 'Ta emot'; +$lang['subscr_style_every'] = 'skicka epost vid varje ändring'; $lang['authmodfailed'] = 'Felaktiga inställningar för användarautentisering. Var vänlig meddela wikiadministratören.'; $lang['authtempfail'] = 'Tillfälligt fel på användarautentisering. Om felet kvarstår, var vänlig meddela wikiadministratören.'; $lang['i_chooselang'] = 'Välj språk'; @@ -259,3 +279,4 @@ $lang['days'] = '%d dagar sedan'; $lang['hours'] = '%d timmar sedan'; $lang['minutes'] = '%d minuter sedan'; $lang['seconds'] = '%d sekunder sedan'; +$lang['wordblock'] = 'Din ändring sparades inte för att den innehåller otillåten text (spam).'; diff --git a/inc/lang/sv/subscribermail.txt b/inc/lang/sv/subscribermail.txt deleted file mode 100644 index 147585caf..000000000 --- a/inc/lang/sv/subscribermail.txt +++ /dev/null @@ -1,24 +0,0 @@ -Hej! - -Sidan @PAGE@ i wikin @TITLE@ har ändrats. -Här är ändringarna: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Datum : @DATE@ -Användare : @USER@ -Kommentar : @SUMMARY@ -Gammal sida : @OLDPAGE@ -Ny sida : @NEWPAGE@ - -För att säga upp prenumerationen på den här sidan, -logga in i wikin på -@DOKUWIKIURL@ och gå till -@NEWPAGE@ -där du väljer 'Säg upp prenumeration på ändringar'. - --- -Detta meddelande har skapats av DokuWiki på -@DOKUWIKIURL@ diff --git a/inc/lang/th/lang.php b/inc/lang/th/lang.php index ea27793b8..d40f30f4a 100644 --- a/inc/lang/th/lang.php +++ b/inc/lang/th/lang.php @@ -9,7 +9,6 @@ * * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesTh.php?view=co * @author Komgrit Niyomrath <n.komgrit@gmail.com> - * @author Kittithat Arnontavilas mrtomyum@gmail.com * @author Arthit Suriyawongkul <arthit@gmail.com> * @author Kittithat Arnontavilas <mrtomyum@gmail.com> * @author Thanasak Sompaisansin <jombthep@gmail.com> @@ -56,6 +55,7 @@ $lang['btn_draft'] = 'แก้ไขเอกสารฉบับ $lang['btn_recover'] = 'กู้คืนเอกสารฉบับร่าง'; $lang['btn_draftdel'] = 'ลบเอกสารฉบับร่าง'; $lang['btn_revert'] = 'กู้คืน'; +$lang['btn_register'] = 'สร้างบัญชีผู้ใช้'; $lang['loggedinas'] = 'ลงชื่อเข้าใช้เป็น'; $lang['user'] = 'ชื่อผู้ใช้:'; $lang['pass'] = 'รหัสผ่าน'; @@ -65,7 +65,6 @@ $lang['passchk'] = 'พิมพ์รหัสผ่านอี $lang['remember'] = 'จำชื่อและรหัสผ่าน'; $lang['fullname'] = 'ชื่อจริง:'; $lang['email'] = 'อีเมล:'; -$lang['register'] = 'สร้างบัญชีผู้ใช้'; $lang['profile'] = 'ข้อมูลส่วนตัวผู้ใช้'; $lang['badlogin'] = 'ขัดข้อง:'; $lang['minoredit'] = 'เป็นการแก้ไขเล็กน้อย'; diff --git a/inc/lang/th/subscribermail.txt b/inc/lang/th/subscribermail.txt deleted file mode 100644 index 8f65b1061..000000000 --- a/inc/lang/th/subscribermail.txt +++ /dev/null @@ -1,22 +0,0 @@ -สวัสดี! - -เพจ @PAGE@ ในวิกิ @TITLE@ ถูกแก้ไข และนี่คือรายการเปลี่ยนแปลง: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -วันที่ : @DATE@ -ผู้ใช้: @USER@ -สรุปการแก้ไข: @SUMMARY@ -ฉบับเก่า: @OLDPAGE@ -ฉบับใหม่: @NEWPAGE@ - -เพื่อยกเลิกการแจ้งเตือนในเพจนี้, ให้ล็อกอินเข้าไปยังวิกิที่ -@DOKUWIKIURL@ แล้วเข้าไปที่ยัง -@NEWPAGE@ -และยกเลิกการลงทะเบียนเฝ้าดูการเปลี่ยนแปลงของเพจ หรือ เนมสเปซ นั้นๆ - --- -จดหมายนี้ถูกสร้างขึ้นโดย โดกุวิกิที่ -@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/tr/lang.php b/inc/lang/tr/lang.php index c6d20c805..0509113b0 100644 --- a/inc/lang/tr/lang.php +++ b/inc/lang/tr/lang.php @@ -4,11 +4,10 @@ * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Selim Farsakoğlu <farsakogluselim@yahoo.de> - * @author Aydın Coşkuner aydinweb@gmail.com * @author Aydın Coşkuner <aydinweb@gmail.com> - * @author yavuzselim@gmail.com - * @author Cihan Kahveci kahvecicihan@gmail.com + * @author Cihan Kahveci <kahvecicihan@gmail.com> * @author Yavuz Selim <yavuzselim@gmail.com> + * @author Caleb Maclennan <caleb@alerque.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -49,6 +48,7 @@ $lang['btn_draft'] = 'Taslağı düzenle'; $lang['btn_recover'] = 'Taslağı geri yükle'; $lang['btn_draftdel'] = 'Taslağı sil'; $lang['btn_revert'] = 'Geri Yükle'; +$lang['btn_register'] = 'Kayıt ol'; $lang['loggedinas'] = 'Giriş ismi'; $lang['user'] = 'Kullanıcı ismi'; $lang['pass'] = 'Parola'; @@ -58,7 +58,6 @@ $lang['passchk'] = 'Bir kez daha girin'; $lang['remember'] = 'Beni hatırla'; $lang['fullname'] = 'Tam isim'; $lang['email'] = 'E-posta'; -$lang['register'] = 'Kayıt ol'; $lang['profile'] = 'Kullanıcı Bilgileri'; $lang['badlogin'] = 'Üzgünüz, Kullanıcı adı veya şifre yanlış oldu.'; $lang['minoredit'] = 'Küçük Değişiklikler'; @@ -186,6 +185,9 @@ $lang['qb_h2'] = '2. Seviye Başlık'; $lang['qb_h3'] = '3. Seviye Başlık'; $lang['qb_h4'] = '4. Seviye Başlık'; $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_link'] = 'İç Bağlantı'; $lang['qb_extlink'] = 'Dış Bağlantı'; $lang['qb_hr'] = 'Yatay Çizgi'; diff --git a/inc/lang/tr/subscribermail.txt b/inc/lang/tr/subscribermail.txt deleted file mode 100644 index a37a8cf41..000000000 --- a/inc/lang/tr/subscribermail.txt +++ /dev/null @@ -1,18 +0,0 @@ -Merhaba! - - - -@TITLE@ wikisindeki @PAGE@ sayfası değiştirildi. -Değişiklikler aşağıdadır: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Bu sayfaya abonelikten çıkmak için -@DOKUWIKIURL@ adresindeki wikiye gir, ardından -@NEWPAGE@ -sayfasına git ve 'Sayfa Değişikliklerini Bildirme' butonuna tıkla. - --- -Bu e-posta @DOKUWIKIURL@ adresindeki DokuWiki tarafından hazırlandı. diff --git a/inc/lang/uk/lang.php b/inc/lang/uk/lang.php index d3d5d7acf..e5f14879f 100644 --- a/inc/lang/uk/lang.php +++ b/inc/lang/uk/lang.php @@ -5,10 +5,9 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Oleksiy Voronin <ovoronin@gmail.com> * @author serg_stetsuk@ukr.net - * @author okunia@gmail.com * @author Oleksandr Kunytsia <okunia@gmail.com> - * @author Uko uko@uar.net - * @author Ulrikhe Lukoie <lukoie@gmail>.com + * @author Uko <uko@uar.net> + * @author Ulrikhe Lukoie <lukoie@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -49,6 +48,7 @@ $lang['btn_draft'] = 'Редагувати чернетку'; $lang['btn_recover'] = 'Відновити чернетку'; $lang['btn_draftdel'] = 'Знищити чернетку'; $lang['btn_revert'] = 'Відновити'; +$lang['btn_register'] = 'Реєстрація'; $lang['loggedinas'] = 'Ви'; $lang['user'] = 'Користувач'; $lang['pass'] = 'Пароль'; @@ -58,7 +58,6 @@ $lang['passchk'] = 'ще раз'; $lang['remember'] = 'Запам\'ятати мене'; $lang['fullname'] = 'Повне ім\'я'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Реєстрація'; $lang['profile'] = 'Профіль користувача'; $lang['badlogin'] = 'Вибачте, невірне ім\'я чи пароль.'; $lang['minoredit'] = 'Незначні зміни'; diff --git a/inc/lang/uk/subscribermail.txt b/inc/lang/uk/subscribermail.txt deleted file mode 100644 index 8d4dfebb4..000000000 --- a/inc/lang/uk/subscribermail.txt +++ /dev/null @@ -1,22 +0,0 @@ -Доброго дня! - -Сторінка @PAGE@ в вікі @TITLE@ змінилася. -Перегляньте зміни: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -Дата: @DATE@ -Користувач : @USER@ -Підсумок змін: @SUMMARY@ -Стара ревізія: @OLDPAGE@ -Нова ревізця: @NEWPAGE@ - -Щоб відписатися від цих повідомлень, увійдіть в вікі за адресою -@DOKUWIKIURL@, відвідайте @NEWPAGE@ -та оберіть 'Відписатися' - --- -Це повідомлення створене ДокуВікі з -@DOKUWIKIURL@ diff --git a/inc/lang/vi/lang.php b/inc/lang/vi/lang.php index 168fe3595..89c9e9cfc 100644 --- a/inc/lang/vi/lang.php +++ b/inc/lang/vi/lang.php @@ -27,6 +27,7 @@ $lang['btn_logout'] = 'Thoát'; $lang['btn_admin'] = 'Quản lý'; $lang['btn_update'] = 'Cập nhật'; $lang['btn_delete'] = 'Xoá'; +$lang['btn_register'] = 'Đăng ký'; $lang['loggedinas'] = 'Username đang dùng'; $lang['user'] = 'Username'; @@ -34,7 +35,6 @@ $lang['pass'] = 'Password'; $lang['remember'] = 'Lưu username/password lại'; $lang['fullname'] = 'Họ và tên'; $lang['email'] = 'E-Mail'; -$lang['register'] = 'Đăng ký'; $lang['badlogin'] = 'Username hoặc password không đúng.'; $lang['regmissing'] = 'Bạn cần điền vào tất cả các trường'; @@ -103,4 +103,4 @@ $lang['qb_sig'] = 'Đặt chữ ký'; $lang['js']['del_confirm']= 'Xoá mục này?'; -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/lang/zh-tw/backlinks.txt b/inc/lang/zh-tw/backlinks.txt index 381a76812..5b36728e7 100644 --- a/inc/lang/zh-tw/backlinks.txt +++ b/inc/lang/zh-tw/backlinks.txt @@ -1,5 +1,4 @@ -====== 被引用的連結(Backlinks) ====== - -這裡是有引用、連結到原先頁面的清單。 +====== 反向連結 ====== +這裡是引用、連結到目前頁面的頁面清單。 diff --git a/inc/lang/zh-tw/conflict.txt b/inc/lang/zh-tw/conflict.txt index e52613dc8..4f31f665f 100644 --- a/inc/lang/zh-tw/conflict.txt +++ b/inc/lang/zh-tw/conflict.txt @@ -1,4 +1,5 @@ -====== 有一個更新的版本已存在 ====== +====== 已存在更新版本 ====== -有一個您所編輯的更新版本已經存在了。\\ 這狀況之所以會發生:乃是因為當您正在編修它的時候,而其他使用者已變更這份文件。\\ 請檢驗以下的差異,然後決定要用哪一份。\\ 若您選擇「''儲存''」,那您的版本就會被存下來了。而「取消」則會保留為現在這版本。 +此檔案已存在更新的版本。這是因為有其他使用者在您編輯時變更了這份文件。 +請仔細檢查以下差異,再決定保留哪份。您可選擇「儲存」您的版本或「取消」保留目前版本。
\ No newline at end of file diff --git a/inc/lang/zh-tw/denied.txt b/inc/lang/zh-tw/denied.txt index 20c512abc..5a4d483a5 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/diff.txt b/inc/lang/zh-tw/diff.txt index a064f81ed..b2b662ec3 100644 --- a/inc/lang/zh-tw/diff.txt +++ b/inc/lang/zh-tw/diff.txt @@ -1,4 +1,4 @@ ====== 差異處 ====== -這裡會顯示出所選的版次與目前版次的差異處。 +這裡顯示二個版本的差異處。 diff --git a/inc/lang/zh-tw/draft.txt b/inc/lang/zh-tw/draft.txt index 81a092be0..f14702efb 100644 --- a/inc/lang/zh-tw/draft.txt +++ b/inc/lang/zh-tw/draft.txt @@ -1,5 +1,5 @@ ====== 發現草稿檔案 ====== -您上次編輯此頁面並未正確的完成。DokuWiki在您編輯的時候自動儲存一份草稿使得您可以繼續編輯。以下您可以觀看上次編輯的資料。 +您上次的編輯程序並未正確完成。DokuWiki 已在您編輯時自動儲存了一份草稿使您可以繼續編輯。以下是上次的編輯資料。 -請決定你要//復原//您遺失的編輯文件,//刪除//這份草稿,或者//取消//目前的編輯程序。 +請決定要//復原//您遺失的編輯文件,//刪除//這份草稿,或者//取消//編輯程序。 diff --git a/inc/lang/zh-tw/edit.txt b/inc/lang/zh-tw/edit.txt index 5be7fbb4e..bbe5bb8ed 100644 --- a/inc/lang/zh-tw/edit.txt +++ b/inc/lang/zh-tw/edit.txt @@ -1 +1 @@ -提示:編修本頁並按「''儲存''」即可。 不懂 Wiki 語法?沒關係點一下 [[wiki:syntax|中文語法]] 。若您覺得可讓本文品質「**更好**」的話,那就請繼續吧 :) \\ 但若只想練習或測試東西的話,那麼請先多利用 [[playground:playground|新手試煉場]] 來試煉您的身手吧。 +編輯本頁並按下''儲存''即可。可在[[wiki:syntax|維基語法]]找到語法說明。請只在能讓本文品質「**更好**」時才編輯。如果只是要測試,請使用 [[playground:playground|遊樂場]]。 diff --git a/inc/lang/zh-tw/editrev.txt b/inc/lang/zh-tw/editrev.txt index b344e0772..96f9a7c6a 100644 --- a/inc/lang/zh-tw/editrev.txt +++ b/inc/lang/zh-tw/editrev.txt @@ -1,2 +1,2 @@ -**您目前載入的是本份文件的舊版!!** 若存檔的話,那這些資料就會被存成另一份了喔。 +**您目前載入的是本份文件的舊版!** 您如果存檔,這些資料就會被存成另一份。 ---- diff --git a/inc/lang/zh-tw/index.txt b/inc/lang/zh-tw/index.txt index 961095bff..11ec223d9 100644 --- a/inc/lang/zh-tw/index.txt +++ b/inc/lang/zh-tw/index.txt @@ -1,3 +1,3 @@ -====== 索引頁 ====== +====== 站台地圖 ====== -目前您所看到的是用 [[doku>namespaces|namespaces]] 來排序目前所有可用的頁面清單。\\ 請直接按您想要的頁面或者用「顯示頁面」來檢視目前所在頁面 +這個站台地圖列出了所有允許的頁面,依 [[doku>namespaces|命名空間]] 排序。 diff --git a/inc/lang/zh-tw/install.html b/inc/lang/zh-tw/install.html index 879c152b5..88af0b394 100644 --- a/inc/lang/zh-tw/install.html +++ b/inc/lang/zh-tw/install.html @@ -1,8 +1,8 @@ -<p>本页面旨在帮助您完成第一次安装和配置 <a href="http://dokuwiki.org">Dokuwiki</a>。关于安装工具的更多信息请参阅其 <a href="http://dokuwiki.org/installer">官方文档页面</a>。</p> +<p>本頁面旨在幫助您完成第一次安装和配置 <a href="http://dokuwiki.org">Dokuwiki</a>。關於安裝工具的更多訊息請參閱 <a href="http://dokuwiki.org/installer">官方文檔頁面</a>。</p> -<p>DokuWiki 使用普通的文件保存维基页面和其他与这些页面挂钩的信息(例如:图像,搜索索引,修订记录等)。为了能正常运行,DokuWiki <strong>必须</strong> 拥有针对那些路径和文件的写权限。本安装工具不能用于设置这些权限。对权限的操作通常通过命令行或使用您的网络服务提供商的 FTP 或控制面板(例如 cPanel)进行操作。</p> +<p>DokuWiki 使用普通檔案儲存維基頁面以及與頁面相關的訊息(例如:圖像,搜尋索引,修訂記錄等)。為了正常運作,DokuWiki <strong>必須</strong> 擁有針對那些路徑和檔案的寫入權限。本安裝工具無法設定目錄權限,這通常要透過命令行、FTP 或您主機上的控制台(如cPanel)進行。</p> -<p>本安装工具将设置您的 DokuWiki 配置 <acronym title="访问控制列表">ACL</acronym>,它能让管理员登录并使用“管理”功能来安装插件,管理用户,管理访问权限和其他配置设置。它并不是 DokuWiki 正常运行所必须的,但安装之后它将更方便您的管理。</p> +<p>本安裝工具將設定您的 DokuWiki 用於 <acronym title="訪問控制列表">ACL</acronym> 的配置檔,它能讓管理員登入並使用「管理」功能來安裝插件、管理用户、管理訪問權限和其他配置設定。它並不是 DokuWiki 正常運作所必須,但安裝之後將更方便管理。</p> -<p>有经验的用户或有特殊需求的用户请参阅更详细的 <a href="http://dokuwiki.org/install">安装指南</a> -和 <a href="http://dokuwiki.org/config">配置设置</a>。</p>
\ No newline at end of file +<p>有經驗的用戶或有特殊需求的用戶請參閱更詳細的 <a href="http://dokuwiki.org/install">安裝指南</a> +和 <a href="http://dokuwiki.org/config">配置設定</a>。</p>
\ No newline at end of file diff --git a/inc/lang/zh-tw/lang.php b/inc/lang/zh-tw/lang.php index eca7de4c8..074c510e9 100644 --- a/inc/lang/zh-tw/lang.php +++ b/inc/lang/zh-tw/lang.php @@ -7,8 +7,9 @@ * @author Li-Jiun Huang <ljhuang.tw@gmail.com> * @author http://www.chinese-tools.com/tools/converter-simptrad.html * @author Wayne San <waynesan@zerozone.tw> - * @author Li-Jiun Huang <ljhuang.tw@gmai.com> * @author Cheng-Wei Chien <e.cwchien@gmail.com> + * @author Danny Lin + * @author Shuo-Ting Jian <shoting@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -18,7 +19,7 @@ $lang['singlequoteopening'] = '‘'; $lang['singlequoteclosing'] = '’'; $lang['apostrophe'] = '’'; $lang['btn_edit'] = '編修本頁'; -$lang['btn_source'] = '顯示頁面來源'; +$lang['btn_source'] = '顯示原始碼'; $lang['btn_show'] = '顯示頁面'; $lang['btn_create'] = '建立此頁'; $lang['btn_search'] = '搜尋'; @@ -31,7 +32,7 @@ $lang['btn_revs'] = '舊版'; $lang['btn_recent'] = '最近更新'; $lang['btn_upload'] = '上傳'; $lang['btn_cancel'] = '取消'; -$lang['btn_index'] = '索引頁'; +$lang['btn_index'] = '站台地圖'; $lang['btn_secedit'] = '改這段'; $lang['btn_login'] = '登入'; $lang['btn_logout'] = '登出'; @@ -42,9 +43,6 @@ $lang['btn_back'] = '回上一步'; $lang['btn_backlink'] = '反向連結'; $lang['btn_backtomedia'] = '重新選擇圖檔'; $lang['btn_subscribe'] = '訂閱更動通知'; -$lang['btn_unsubscribe'] = '退訂更動通知'; -$lang['btn_subscribens'] = '訂閱命名空間更改'; -$lang['btn_unsubscribens'] = '退訂命名空間更改'; $lang['btn_profile'] = '更新個人資料'; $lang['btn_reset'] = '資料重設'; $lang['btn_resendpwd'] = '寄新密碼'; @@ -52,108 +50,135 @@ $lang['btn_draft'] = '編輯草稿'; $lang['btn_recover'] = '復原草稿'; $lang['btn_draftdel'] = '捨棄草稿'; $lang['btn_revert'] = '復原'; +$lang['btn_register'] = '註冊'; $lang['loggedinas'] = '登入為'; $lang['user'] = '帳號'; $lang['pass'] = '密碼'; -$lang['newpass'] = '新的密碼'; -$lang['oldpass'] = '目前的密碼'; -$lang['passchk'] = '再次打新的密碼'; +$lang['newpass'] = '新密碼'; +$lang['oldpass'] = '目前密碼'; +$lang['passchk'] = '確認密碼'; $lang['remember'] = '記住帳號密碼'; -$lang['fullname'] = '暱稱'; +$lang['fullname'] = '真實姓名'; $lang['email'] = 'E-Mail'; -$lang['register'] = '註冊'; $lang['profile'] = '使用者個人資料'; $lang['badlogin'] = '很抱歉,您的使用者名稱或密碼可能有錯誤'; -$lang['minoredit'] = '次要性的修改'; -$lang['draftdate'] = '草稿自動存檔於'; -$lang['nosecedit'] = '此頁面已經同時被修改,部份過時的資料取代了全頁。'; -$lang['regmissing'] = '很抱歉,所有的欄位都要填哦'; -$lang['reguexists'] = '很抱歉,已有人註冊該帳號了喔'; -$lang['regsuccess'] = '使用者已建立,密碼已經用 email 寄到您信箱了唷。'; +$lang['minoredit'] = '小修改'; +$lang['draftdate'] = '草稿已自動存檔於'; +$lang['nosecedit'] = '頁面在這之間已被修改,過時的區段資料已載入全頁取代。'; +$lang['regmissing'] = '很抱歉,所有欄位都要填寫'; +$lang['reguexists'] = '很抱歉,本帳號已被註冊'; +$lang['regsuccess'] = '使用者已建立,密碼已寄發至該 email。'; $lang['regsuccess2'] = '使用者已建立'; -$lang['regmailfail'] = '寄出密碼信似乎發生錯誤,請跟管理者聯絡!'; -$lang['regbadmail'] = '您輸入的 email 似乎不對,如果您認為是正確的,請與管理者聯絡。'; -$lang['regbadpass'] = '兩次打的密碼不一致,請再重試,謝謝。'; +$lang['regmailfail'] = '寄出密碼信似乎發生錯誤,請跟管理員聯絡!'; +$lang['regbadmail'] = '您輸入的 email 似乎不對,如果您認為是正確的,請與管理員聯絡。'; +$lang['regbadpass'] = '兩次輸入的密碼不一致,請再試一次。'; $lang['regpwmail'] = '您的 DokuWiki 帳號密碼'; -$lang['reghere'] = '您還沒有帳號對吧?來註冊一個吧。'; -$lang['profna'] = '本 wiki 不開放修改個人資料'; +$lang['reghere'] = '您還沒有帳號嗎?註冊一個吧。'; +$lang['profna'] = '本維基不開放修改個人資料'; $lang['profnochange'] = '未做任何變更'; -$lang['profnoempty'] = '帳號或 email 地址不可以沒有寫喔!'; +$lang['profnoempty'] = '帳號或 email 地址不可空白!'; $lang['profchanged'] = '個人資料已成功更新囉。'; -$lang['pwdforget'] = '忘記密碼嗎?寄新密碼!'; -$lang['resendna'] = '本 wiki 不開放重寄新密碼'; +$lang['pwdforget'] = '忘記密碼了?索取新密碼!'; +$lang['resendna'] = '本維基不開放重寄密碼'; $lang['resendpwd'] = '寄新密碼給'; -$lang['resendpwdmissing'] = '很抱歉,您必須全填這些資料才可以'; -$lang['resendpwdnouser'] = '很抱歉,資料庫內查無此人'; -$lang['resendpwdbadauth'] = '對不起,該認証碼錯誤。請使用完整的確認鏈接。'; -$lang['resendpwdconfirm'] = '確認鏈接已經通過郵件發送給您了。'; -$lang['resendpwdsuccess'] = '新密碼函已經以 email 寄出了。'; -$lang['license'] = '如未特別註明,此 wiki 上得內容都是根據以下的授權方式:'; -$lang['licenseok'] = '注意:編輯此頁面表示你已同意以下的授權方式:'; +$lang['resendpwdmissing'] = '抱歉,您必須填寫所有欄位。'; +$lang['resendpwdnouser'] = '抱歉,資料庫內找不到這個使用者'; +$lang['resendpwdbadauth'] = '抱歉,認證碼無效。請確認您使用了完整的確認連結。'; +$lang['resendpwdconfirm'] = '確認連結已通過郵件發送給您了。'; +$lang['resendpwdsuccess'] = '您的新密碼已寄出。'; +$lang['license'] = '若未特別註明,此維基上的內容都是採用以下授權方式:'; +$lang['licenseok'] = '注意:編輯此頁面表示您已同意以下的授權方式:'; $lang['searchmedia'] = '搜尋檔名:'; $lang['searchmedia_in'] = '在 %s 裡搜尋'; $lang['txt_upload'] = '請選擇要上傳的檔案'; -$lang['txt_filename'] = '請輸入要存在 wiki 內的檔案名稱 (非必要)'; +$lang['txt_filename'] = '請輸入要存在維基內的檔案名稱 (非必要)'; $lang['txt_overwrt'] = '是否要覆蓋原有檔案'; $lang['lockedby'] = '目前已被下列人員鎖定'; $lang['lockexpire'] = '預計解除鎖定於'; -$lang['willexpire'] = '您目前編輯這頁的鎖定將會在一分鐘內解除。\若要避免發生意外,請按「預覽」鍵來重新設定鎖定狀態'; -$lang['js']['notsavedyet'] = "有尚未儲存的變更將會遺失。\n真的要繼續嗎?"; -$lang['rssfailed'] = '當抓取餵送過來的 RSS 資料時發生錯誤: '; -$lang['nothingfound'] = '沒找到任何結果。'; -$lang['mediaselect'] = '選擇圖檔'; -$lang['fileupload'] = '上傳圖檔'; -$lang['uploadsucc'] = '上傳成功'; -$lang['uploadfail'] = '上傳失敗。或許權限設定錯誤了嗎?'; -$lang['uploadwrong'] = '拒絕上傳。該檔案類型不被支援。'; -$lang['uploadexist'] = '該檔案已有存在了喔,故取消上傳動作。'; -$lang['uploadbadcontent'] = '上傳檔案的內容不符合 %s 檔的副檔名'; -$lang['uploadspam'] = '被SPAM黑名單限制上傳'; -$lang['uploadxss'] = '因為可能惡意的內容被限制上傳'; -$lang['uploadsize'] = '上傳的檔案尺寸過大(最大:%s)'; -$lang['deletesucc'] = '"%s" 檔已刪除完畢。'; -$lang['deletefail'] = '"%s" 檔無法刪除,請先檢查權限設定。'; -$lang['mediainuse'] = '"%s" 檔因還在使用中,故目前尚無法刪除。'; -$lang['namespaces'] = '命名空間'; -$lang['mediafiles'] = '可用的檔案有'; +$lang['willexpire'] = '本頁的編輯鎖定將在一分鐘內到期。要避免發生衝突,請按「預覽」鍵重設鎖定計時。'; +$lang['js']['notsavedyet'] = '未儲存的變更將會遺失,繼續嗎?'; $lang['js']['searchmedia'] = '搜尋檔案'; -$lang['js']['keepopen'] = '於選擇時保持視窗開啟'; +$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'] = '只有在 Microsoft IE 下才能執行「連結到 Windows shares」。 -不過您仍可拷貝、複製這連結'; +不過您仍可複製及貼上這個連結'; $lang['js']['linkwiz'] = '建立連結精靈'; -$lang['js']['linkto'] = '連至:'; -$lang['js']['del_confirm'] = '確定要刪除該管理規則?'; +$lang['js']['linkto'] = '連結至:'; +$lang['js']['del_confirm'] = '確定刪除選取的項目?'; $lang['js']['mu_btn'] = '上傳多個檔案'; +$lang['rssfailed'] = '擷取 RSS 饋送檔時發生錯誤:'; +$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'] = 'root'; -$lang['mediaupload'] = '上傳文件至當前的命名空間。要創建次級命名空間,將其名稱加在“上傳並重命名為”文件名的前面,並用英文冒號隔開'; -$lang['mediaextchange'] = '檔案類型已由 .%s 變更為 .%s 囉!'; +$lang['mediaupload'] = '上傳檔案至目前的命名空間。要建立次級命名空間,將其名稱加在「上傳並重命名為」檔案名的前面,並用英文冒號隔開'; +$lang['mediaextchange'] = '檔案類型已由 .%s 變更為 .%s !'; $lang['reference'] = '引用到本頁的,合計有'; -$lang['ref_inuse'] = '這檔還不能刪除,因為還有以下的頁面在使用它:'; -$lang['ref_hidden'] = '有些引用到這個的頁面,您目前還沒有權限可讀取喔。'; +$lang['ref_inuse'] = '此檔案無法刪除,因為它正被以下頁面使用:'; +$lang['ref_hidden'] = '一些參考內容位於您沒有讀取權限的頁面中'; $lang['hits'] = '個符合'; $lang['quickhits'] = '符合的頁面名稱'; -$lang['toc'] = '本頁目錄'; +$lang['toc'] = '目錄表'; $lang['current'] = '目前版本'; $lang['yours'] = '您的版本'; -$lang['diff'] = '顯示跟目前版本的差異'; -$lang['diff2'] = '顯示與選擇版本的差異'; +$lang['diff'] = '顯示與目前版本的差異'; +$lang['diff2'] = '顯示選擇版本間的差異'; +$lang['difflink'] = '連向這個比對檢視'; +$lang['diff_type'] = '檢視差異:'; +$lang['diff_inline'] = '行內'; +$lang['diff_side'] = '並排'; $lang['line'] = '行'; -$lang['breadcrumb'] = '目前的足跡'; -$lang['youarehere'] = '(目前所在位置)'; +$lang['breadcrumb'] = '足跡'; +$lang['youarehere'] = '您在這裡'; $lang['lastmod'] = '上一次變更'; -$lang['by'] = '來自'; +$lang['by'] = '由'; $lang['deleted'] = '移除'; $lang['created'] = '建立'; -$lang['restored'] = '已恢復為舊版'; +$lang['restored'] = '恢復為舊版'; $lang['external_edit'] = '外部編輯'; $lang['summary'] = '編輯摘要'; -$lang['noflash'] = '顯示此內容需要<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>'; +$lang['noflash'] = '顯示此內容需要 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>'; $lang['download'] = '下載程式碼片段'; $lang['mail_newpage'] = '增加的頁面:'; $lang['mail_changed'] = '變更的頁面:'; +$lang['mail_subscribe_list'] = '命名空間中更動的頁面:'; $lang['mail_new_user'] = '新使用者:'; $lang['mail_upload'] = '已上傳檔案:'; $lang['qb_bold'] = '粗體'; @@ -171,20 +196,20 @@ $lang['qb_hs'] = '選擇標題'; $lang['qb_hplus'] = '較大標題'; $lang['qb_hminus'] = '較小標題'; $lang['qb_hequal'] = '同等標題'; -$lang['qb_link'] = 'WIKI內部連結'; -$lang['qb_extlink'] = '連結外部URL'; +$lang['qb_link'] = '內部連結'; +$lang['qb_extlink'] = '外部連結'; $lang['qb_hr'] = '水平線'; -$lang['qb_ol'] = '項目表(數字)'; -$lang['qb_ul'] = '項目表(符號)'; +$lang['qb_ol'] = '有序列表項目'; +$lang['qb_ul'] = '無序列表項目'; $lang['qb_media'] = '加入圖片或檔案'; $lang['qb_sig'] = '插入簽名'; $lang['qb_smileys'] = '表情符號'; $lang['qb_chars'] = '特殊字元'; -$lang['upperns'] = '前往父命名空間'; -$lang['admin_register'] = '新增使用者中'; -$lang['metaedit'] = '更改相片資料(EXIF)'; -$lang['metasaveerr'] = '相片資料(EXIF)儲存失敗喔'; -$lang['metasaveok'] = '相片資料已成功儲存'; +$lang['upperns'] = '前往父層命名空間'; +$lang['admin_register'] = '新增使用者'; +$lang['metaedit'] = '編輯後設資料'; +$lang['metasaveerr'] = '後設資料寫入失敗'; +$lang['metasaveok'] = '後設資料已儲存'; $lang['img_backto'] = '回上一頁'; $lang['img_title'] = '標題'; $lang['img_caption'] = '照片說明'; @@ -196,37 +221,48 @@ $lang['img_copyr'] = '版權'; $lang['img_format'] = '格式'; $lang['img_camera'] = '相機'; $lang['img_keywords'] = '關鍵字'; -$lang['subscribe_success'] = '已將『%s』加入 %s 訂閱清單內'; -$lang['subscribe_error'] = '要把『%s』加入 %s 訂閱清單時,發生錯誤'; -$lang['subscribe_noaddress'] = '您的帳號內並無 Email 資料,因此還無法使用訂閱功能唷。'; -$lang['unsubscribe_success'] = '已將『%s』從 %s 訂閱清單中移除'; -$lang['unsubscribe_error'] = '要把『%s』從 %s 訂閱清單中移除時,發生錯誤'; -$lang['authmodfailed'] = '帳號認證的設定不正確,請通知該 Wiki 管理員。'; -$lang['authtempfail'] = '帳號認證目前暫不提供,若本狀況持續發生的話,請通知該 Wiki 管理員。'; +$lang['subscr_subscribe_success'] = '已將 %s 加入至 %s 的訂閱列表'; +$lang['subscr_subscribe_error'] = '將 %s 加入至 %s 的訂閱列表時發生錯誤'; +$lang['subscr_subscribe_noaddress'] = '沒有與您登入相關的地址,無法將您加入訂閱列表'; +$lang['subscr_unsubscribe_success'] = '已將 %s 移除自 %s 的訂閱列表'; +$lang['subscr_unsubscribe_error'] = '將 %s 移除自 %s 的訂閱列表時發生錯誤'; +$lang['subscr_already_subscribed'] = '%s 已經被 %s 訂閱了'; +$lang['subscr_not_subscribed'] = '%s 尚未被 %s 訂閱'; +$lang['subscr_m_not_subscribed'] = '您尚未訂閱目前的頁面或命名空間。'; +$lang['subscr_m_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 天)'; +$lang['authmodfailed'] = '帳號認證的設定不正確,請通知該維基管理員。'; +$lang['authtempfail'] = '帳號認證目前暫不提供,若本狀況持續發生的話,請通知該維基管理員。'; $lang['i_chooselang'] = '選擇您的語系'; $lang['i_installer'] = 'DokuWiki 安裝工具'; -$lang['i_wikiname'] = 'Wiki名稱'; -$lang['i_enableacl'] = '使用ACL(建議)'; +$lang['i_wikiname'] = '維基名稱'; +$lang['i_enableacl'] = '啟用 ACL (建議)'; $lang['i_superuser'] = '超級用戶'; -$lang['i_problems'] = 'Installer發現一些問題,顯示如下。您將無法繼續直到您修正它們。'; -$lang['i_modified'] = '由於安全上的考慮,該腳本隻能用於全新且做任何改動的 Dokuwiki 安裝包。 - 您可以重新解壓下載的程序包,或查閱完整的 - <a href=\"http://dokuwiki.org/install\">Dokuwiki 安裝指南</a>'; -$lang['i_funcna'] = 'PHP function <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>. 您必須檢查目錄/檔案的權限並手動建立該檔案.'; -$lang['i_badhash'] = '無法辨識或被變更的dokuwiki.php (hash=<code>%s</code>)'; -$lang['i_badval'] = '<code>%s</code> - 非法或是空的值'; -$lang['i_success'] = '設定已經成功地完成. 您現在可以刪除 install.php 這個檔案. 繼續到 +$lang['i_problems'] = '安裝程式發現如下的問題。您必須修正它們才能繼續。'; +$lang['i_modified'] = '出於安全考量,本腳本只能用於安裝全新且未修改的 Dokuwiki。 +您可以重新解壓下載的封包或查閱完整的<a href=\"http://dokuwiki.org/install\">Dokuwiki 安裝指南</a>'; +$lang['i_funcna'] = 'PHP 函數 <code>%s</code> 無法使用。也許您的主機供應者基於某些理由停用了它?'; +$lang['i_phpver'] = '您的 PHP 版本 <code>%s</code> 比需要的版本 <code>%s</code> 還低。您必須更新您的PHP。'; +$lang['i_permfail'] = '<code>%s</code> 無法被 DokuWiki 寫入。您必須修正該目錄的權限!'; +$lang['i_confexists'] = '<code>%s</code> 已經存在'; +$lang['i_writeerr'] = '無法建立 <code>%s</code>。您必須檢查目錄/檔案的權限並手動建立該檔案。'; +$lang['i_badhash'] = '無法辨識或被變更的 dokuwiki.php (hash=<code>%s</code>)'; +$lang['i_badval'] = '<code>%s</code> - 非法或空白的值'; +$lang['i_success'] = '設定已成功完成。您現在可以刪除 install.php 檔案。繼續到 <a href="doku.php">您的新 DokuWiki</a>.'; -$lang['i_failure'] = '在寫入設定檔時發生了一些錯誤.您必須在使用<a href="doku.php">你的新 Dokuwiki</a> 之前手動修正它們'; -$lang['i_policy'] = '初步的ACL政策'; -$lang['i_pol0'] = '開放的 Wiki (可被任何人讀, 寫, 上傳)'; -$lang['i_pol1'] = '公開的 Wiki (可被任何人讀, 但是只能被註冊的使用者寫與上傳)'; -$lang['i_pol2'] = '封閉的 Wiki (只能被註冊的使用者讀, 寫, 上傳)'; +$lang['i_failure'] = '寫入設定檔時發生了一些錯誤。您必須在使用<a href="doku.php">您的新 Dokuwiki</a> 之前手動修正它們。'; +$lang['i_policy'] = '初步的 ACL 政策'; +$lang['i_pol0'] = '開放的維基 (任何人可讀取、寫入、上傳)'; +$lang['i_pol1'] = '公開的維基 (任何人可讀取,註冊使用者可寫入與上傳)'; +$lang['i_pol2'] = '封閉的維基 (只有註冊使用者可讀取、寫入、上傳)'; $lang['i_retry'] = '重試'; +$lang['i_license'] = '請選擇您想要的內容發布許可協議:'; $lang['mu_intro'] = '您可以在這裡一次上傳多個檔案。按下瀏覽按鈕加入檔案,然後按上傳按鈕開始上傳。'; $lang['mu_gridname'] = '檔案名稱'; $lang['mu_gridsize'] = '檔案大小'; @@ -242,7 +278,7 @@ $lang['mu_progress'] = '@PCT@% 已上傳'; $lang['mu_filetypes'] = '接受的檔案類型'; $lang['mu_info'] = '檔案已上傳。'; $lang['mu_lasterr'] = '最新一筆錯誤紀錄:'; -$lang['recent_global'] = '您正在閱讀命名空間: <b>%s</b> 中的變更。您亦可觀看整個 wiki 的<a href="%s">最近更新</a>。'; +$lang['recent_global'] = '您正在閱讀命名空間: <b>%s</b> 中的變更。您亦可觀看整個維基的<a href="%s">最近更新</a>。'; $lang['years'] = '%d 年前'; $lang['months'] = '%d 個月前'; $lang['weeks'] = '%d 週前'; @@ -250,3 +286,4 @@ $lang['days'] = '%d 天前'; $lang['hours'] = '%d 個小時前'; $lang['minutes'] = '%d 分鐘前'; $lang['seconds'] = '%s 秒鐘前'; +$lang['wordblock'] = '您的更改沒有被儲存,因为它包含被阻擋的文字 (垃圾訊息)。'; diff --git a/inc/lang/zh-tw/locked.txt b/inc/lang/zh-tw/locked.txt index 16a06e802..e13fdc890 100644 --- a/inc/lang/zh-tw/locked.txt +++ b/inc/lang/zh-tw/locked.txt @@ -1,3 +1,3 @@ -====== 頁面目前是鎖定狀態中 ====== +====== 頁面鎖定 ====== -本頁目前正由其他使用者編修中,您必須先等到他完成或者鎖定狀態自動解除。 +本頁目前正由其他使用者編修中,您必須等他完成編輯或等鎖定時間過去。 diff --git a/inc/lang/zh-tw/login.txt b/inc/lang/zh-tw/login.txt index fda49a199..058cc5712 100644 --- a/inc/lang/zh-tw/login.txt +++ b/inc/lang/zh-tw/login.txt @@ -1,5 +1,5 @@ ====== 登入 ====== -您尚未登入,請輸入您的使用者名稱跟密碼。 另外,瀏覽器需要打開 cookies 設定以進行登入。 +您尚未登入,請輸入您的使用者名稱和密碼。 另外,瀏覽器需要打開 cookies 設定以進行登入。 diff --git a/inc/lang/zh-tw/mailtext.txt b/inc/lang/zh-tw/mailtext.txt index f6bb0480e..3b6ece377 100644 --- a/inc/lang/zh-tw/mailtext.txt +++ b/inc/lang/zh-tw/mailtext.txt @@ -1,16 +1,17 @@ -在您的 DokuWiki 有新增、變動過一頁了。以下是細節資料: +您的 DokuWiki 有個新增或變動的頁面。詳細資料如下: -日期 : @DATE@ -瀏覽器 : @BROWSER@ -IP-Address : @IPADDRESS@ -機器名稱 : @HOSTNAME@ -舊版次 : @OLDPAGE@ -新版次 : @NEWPAGE@ -編輯摘要 : @SUMMARY@ -User : @USER@ +日期 : @DATE@ +瀏覽器 : @BROWSER@ +IP位址 : @IPADDRESS@ +主機名稱 : @HOSTNAME@ +舊版本 : @OLDPAGE@ +新版本 : @NEWPAGE@ +編輯摘要 : @SUMMARY@ +使用者 : @USER@ @DIFF@ --- -這封信是由 @DOKUWIKIURL@ 的 DokuWiki 自動產生 +-- +本信件由以下 DokuWiki 站台產生: +@DOKUWIKIURL@ diff --git a/inc/lang/zh-tw/newpage.txt b/inc/lang/zh-tw/newpage.txt index bd38f5586..06ccd3d75 100644 --- a/inc/lang/zh-tw/newpage.txt +++ b/inc/lang/zh-tw/newpage.txt @@ -1,3 +1,3 @@ -====== 目前尚未有該主題喔 ====== +====== 此主題不存在 ====== -您目前到的這主題尚未建立頁面。但也可以用 「''建立此頁''」來建立。
\ No newline at end of file +您來到了一個未建立頁面的主題。如果權限允許,您可以用 「建立此頁」按鈕建立頁面。
\ No newline at end of file diff --git a/inc/lang/zh-tw/norev.txt b/inc/lang/zh-tw/norev.txt index e2b6a175b..bd1c7a623 100644 --- a/inc/lang/zh-tw/norev.txt +++ b/inc/lang/zh-tw/norev.txt @@ -1,4 +1,3 @@ -====== 很抱歉,並無該版次的 ====== - -該版次的文件並不存在。請用 「''舊版''」 鍵來檢視目前該文件的所有舊版次。 +====== 無此版本 ====== +該版本的文件不存在。請用 「舊版」按鈕檢視該文件所有舊版本清單。
\ No newline at end of file diff --git a/inc/lang/zh-tw/password.txt b/inc/lang/zh-tw/password.txt index 14edb6016..5d383b528 100644 --- a/inc/lang/zh-tw/password.txt +++ b/inc/lang/zh-tw/password.txt @@ -1,11 +1,10 @@ -(NOTE: This mail is an UTF-8 encoding email) +@FULLNAME@ 您好! -嗨,@LOGIN@(@FULLNAME@) 您好! +這是您在位於 @DOKUWIKIURL@ 之 @TITLE@ 的使用者資料 -這裡是您在 @TITLE@(@DOKUWIKIURL@) 的使用者資料 +帳號 : @LOGIN@ +密碼 : @PASSWORD@ -使用者名稱: @LOGIN@ - 密碼: @PASSWORD@ - --- -這封信是由 @DOKUWIKIURL@ 的 DokuWiki 自動產生。 +-- +本信件由以下 DokuWiki 站台產生: +@DOKUWIKIURL@ diff --git a/inc/lang/zh-tw/pwconfirm.txt b/inc/lang/zh-tw/pwconfirm.txt index b8ad7e1ed..994367980 100644 --- a/inc/lang/zh-tw/pwconfirm.txt +++ b/inc/lang/zh-tw/pwconfirm.txt @@ -1,13 +1,13 @@ @FULLNAME@ 您好! -有人請求為您在 @DOKUWIKIURL@ 注冊的用戶名 @TITLE@ 發送新密碼 +有人為您在 @DOKUWIKIURL@ 註冊的使用者 @TITLE@ 請求新密碼 -如果您沒有請求發送新密碼,請忽略這封郵件。 +如果您沒有請求新密碼,請忽略這封郵件。 -為了確認發送新密碼請求的確來自您,請使用下面的鏈接。 +要確認使用新密碼,請拜訪以下的連結。 @CONFIRM@ --- -本郵件由 DokuWiki 自動創建 -@DOKUWIKIURL@
\ No newline at end of file +-- +本信件由以下 DokuWiki 站台產生: +@DOKUWIKIURL@ diff --git a/inc/lang/zh-tw/read.txt b/inc/lang/zh-tw/read.txt index 364f4adea..a8305611f 100644 --- a/inc/lang/zh-tw/read.txt +++ b/inc/lang/zh-tw/read.txt @@ -1,3 +1 @@ -本頁是唯讀的,可以看是怎麼寫的,但不能更動它。如這是誤判,請向管理員詢問。 - - +本頁是唯讀的,您可以看到原始碼,但不能更動它。您如果覺得這是誤判,請詢問管理員。
\ No newline at end of file diff --git a/inc/lang/zh-tw/register.txt b/inc/lang/zh-tw/register.txt index 1a5ec67e7..0da401ccd 100644 --- a/inc/lang/zh-tw/register.txt +++ b/inc/lang/zh-tw/register.txt @@ -1,4 +1,4 @@ ====== 註冊新使用者 ====== -請填以下欄位的資料來註冊 wiki 帳號,\\ 還有請確定您有提供一個 **合法的 e-mail 地址** - 也就是您的新密碼會被寄到那。\\ 而登錄的使用者名稱應該是合法的。 [[doku>pagename|pagename]]. +填寫以下資料以註冊維基帳號,請確定您提供的是**合法的 email 地址**-如果這裡沒要求您填寫密碼,您的新密碼會自動產生並寄送到該地址。登錄名稱必須是合法的[[doku>pagename|頁面名稱]]。 diff --git a/inc/lang/zh-tw/registermail.txt b/inc/lang/zh-tw/registermail.txt index 434f4f877..489e3f9d3 100644 --- a/inc/lang/zh-tw/registermail.txt +++ b/inc/lang/zh-tw/registermail.txt @@ -1,13 +1,14 @@ -一個新使用者已經註冊. 以下是詳細內容: +有新的使用者註冊。詳細資料如下: -帳號 : @NEWUSER@ -全名 : @NEWNAME@ -E-mail : @NEWEMAIL@ +帳號 : @NEWUSER@ +姓名 : @NEWNAME@ +E-mail : @NEWEMAIL@ -日期 : @DATE@ -瀏覽器 : @BROWSER@ -IP-Address : @IPADDRESS@ -Hostname : @HOSTNAME@ +日期 : @DATE@ +瀏覽器 : @BROWSER@ +IP位址 : @IPADDRESS@ +主機名稱 : @HOSTNAME@ --- -這封信是由 @DOKUWIKIURL@ 的 DokuWiki 所產生的
\ No newline at end of file +-- +本信件由以下 DokuWiki 站台產生: +@DOKUWIKIURL@ diff --git a/inc/lang/zh-tw/resendpwd.txt b/inc/lang/zh-tw/resendpwd.txt index 9250bf4e0..3dbfad750 100644 --- a/inc/lang/zh-tw/resendpwd.txt +++ b/inc/lang/zh-tw/resendpwd.txt @@ -1,3 +1,3 @@ ====== 寄送新密碼 ====== -請在下面的欄位填上資料,以便重新寄發新的 wiki 密碼到您註冊時所填的 email 地址。 帳號(user name)就是你的 wiki 帳號。 +請在以下欄位輸入您的帳號,新密碼將會寄送到您註冊時填寫的 email 地址。 diff --git a/inc/lang/zh-tw/searchpage.txt b/inc/lang/zh-tw/searchpage.txt index 9f3d8ee94..e0f04c433 100644 --- a/inc/lang/zh-tw/searchpage.txt +++ b/inc/lang/zh-tw/searchpage.txt @@ -1,5 +1,5 @@ ====== 搜尋精靈 ====== -提示:您可以在下列找到您的搜尋結果。若沒找到妳想找的東西,那麼可以在妳查詢之後用「建立此頁」來建立新的頁面哦。 +提示:您可以在下面找到您的搜尋結果。若沒找到您想要的,可按下按鈕建立或編輯和查詢關鍵字同名的頁面。 ===== 搜尋結果 ===== diff --git a/inc/lang/zh-tw/showrev.txt b/inc/lang/zh-tw/showrev.txt index 35b6aa59f..306aa6ea7 100644 --- a/inc/lang/zh-tw/showrev.txt +++ b/inc/lang/zh-tw/showrev.txt @@ -1,2 +1,2 @@ -**這是本文件的舊版了喔!** +**這是本文件的舊版!** ---- diff --git a/inc/lang/zh-tw/subscr_digest.txt b/inc/lang/zh-tw/subscr_digest.txt new file mode 100644 index 000000000..a26e73050 --- /dev/null +++ b/inc/lang/zh-tw/subscr_digest.txt @@ -0,0 +1,19 @@ +您好! + +維基 @TITLE@ 的頁面 @PAGE@ 已更改。 +更改內容如下: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +舊版本:@OLDPAGE@ +新版本:@NEWPAGE@ + +要取消頁面提醒,請登入維基 @DOKUWIKIURL@ +然後拜訪 @SUBSCRIBE@ +並取消訂閱頁面或命名空間的更改。 + +-- +本信件由以下 DokuWiki 站台產生: +@DOKUWIKIURL@ diff --git a/inc/lang/zh-tw/subscr_form.txt b/inc/lang/zh-tw/subscr_form.txt new file mode 100644 index 000000000..0ad675cc8 --- /dev/null +++ b/inc/lang/zh-tw/subscr_form.txt @@ -0,0 +1,3 @@ +====== 訂閱管理 ====== + +這個頁面允許您管理在目前頁面和命名空間的訂閱。
\ No newline at end of file diff --git a/inc/lang/zh-tw/subscr_list.txt b/inc/lang/zh-tw/subscr_list.txt new file mode 100644 index 000000000..2a1b26c6e --- /dev/null +++ b/inc/lang/zh-tw/subscr_list.txt @@ -0,0 +1,16 @@ +您好! + +維基 @TITLE@ 的 @PAGE@ 命名空間的頁面已更改。 +更改內容如下: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +要取消頁面提醒,請登入維基 @DOKUWIKIURL@ +然後拜訪 @SUBSCRIBE@ +並取消訂閱頁面或命名空間的更改。 + +-- +本信件由以下 DokuWiki 站台產生: +@DOKUWIKIURL@ diff --git a/inc/lang/zh-tw/subscr_single.txt b/inc/lang/zh-tw/subscr_single.txt new file mode 100644 index 000000000..f3c623c5c --- /dev/null +++ b/inc/lang/zh-tw/subscr_single.txt @@ -0,0 +1,22 @@ +您好! + +維基 @TITLE@ 的頁面 @PAGE@ 已更改。 +更改內容如下: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +時間 : @DATE@ +使用者 : @USER@ +編輯摘要 : @SUMMARY@ +舊版本 : @OLDPAGE@ +新版本 : @NEWPAGE@ + +要取消頁面提醒,請登入維基 @DOKUWIKIURL@ +然後拜訪 @NEWPAGE@ +並取消訂閱頁面或命名空間的更改。 + +-- +本信件由以下 DokuWiki 站台產生: +@DOKUWIKIURL@ diff --git a/inc/lang/zh-tw/subscribermail.txt b/inc/lang/zh-tw/subscribermail.txt deleted file mode 100644 index 3ccb80091..000000000 --- a/inc/lang/zh-tw/subscribermail.txt +++ /dev/null @@ -1,16 +0,0 @@ -哈囉,您好! - -在 @TITLE@ 的 @PAGE@ 頁面已經有了變更囉,以下是變動幅度紀錄: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -若要取消本頁的變動訂閱通知,請先登入 -@DOKUWIKIURL@ ,然後進入 -@NEWPAGE@ -並選擇 『退訂更動通知』,謝謝 ^_^ - --- -本信是由 DokuWiki 系統自動產生 -@DOKUWIKIURL@ diff --git a/inc/lang/zh-tw/updateprofile.txt b/inc/lang/zh-tw/updateprofile.txt index f92c215ea..47f2ae1c4 100644 --- a/inc/lang/zh-tw/updateprofile.txt +++ b/inc/lang/zh-tw/updateprofile.txt @@ -1,5 +1,3 @@ ====== 更新個人資料 ====== -請注意:只需變更想更新的資料欄位就好,而帳號名稱是不可以變更的。 - - +您只需變更想更新的欄位就好,帳號名稱不能變更。
\ No newline at end of file diff --git a/inc/lang/zh-tw/uploadmail.txt b/inc/lang/zh-tw/uploadmail.txt index e7222959b..b4c1311ba 100644 --- a/inc/lang/zh-tw/uploadmail.txt +++ b/inc/lang/zh-tw/uploadmail.txt @@ -1,13 +1,14 @@ -一個檔案已經被上傳到您的 DokuWiki. 以下是詳細內容: +有人把檔案上傳到您的 DokuWiki。詳細資料如下: -檔名 : @MEDIA@ -日期 : @DATE@ -瀏覽器 : @BROWSER@ -IP-Address : @IPADDRESS@ -Hostname : @HOSTNAME@ -尺寸 : @SIZE@ -MIME Type : @MIME@ -帳號 : @USER@ +檔名 : @MEDIA@ +日期 : @DATE@ +瀏覽器 : @BROWSER@ +IP位址 : @IPADDRESS@ +主機名稱 : @HOSTNAME@ +大小 : @SIZE@ +MIME類型 : @MIME@ +使用者 : @USER@ --- -這封信是由 @DOKUWIKIURL@ 的 DokuWiki 所產生的
\ No newline at end of file +-- +本信件由以下 DokuWiki 站台產生: +@DOKUWIKIURL@ diff --git a/inc/lang/zh/lang.php b/inc/lang/zh/lang.php index 2de962ce9..ea677ac2e 100644 --- a/inc/lang/zh/lang.php +++ b/inc/lang/zh/lang.php @@ -5,10 +5,13 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author ZDYX <zhangduyixiong@gmail.com> * @author http://www.chinese-tools.com/tools/converter-tradsimp.html - * @author George Sheraton guxd@163.com + * @author George Sheraton <guxd@163.com> * @author Simon zhan <simonzhan@21cn.com> * @author mr.jinyi@gmail.com * @author ben <ben@livetom.com> + * @author lainme <lainme993@gmail.com> + * @author caii <zhoucaiqi@gmail.com> + * @author Hiphen Lee <jacob.b.leung@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -42,9 +45,6 @@ $lang['btn_back'] = '返回'; $lang['btn_backlink'] = '反向链接'; $lang['btn_backtomedia'] = '返回到媒体文件选择工具'; $lang['btn_subscribe'] = '订阅本页更改'; -$lang['btn_unsubscribe'] = '退订本页更改'; -$lang['btn_subscribens'] = '订阅命名空间更改'; -$lang['btn_unsubscribens'] = '退订命名空间更改'; $lang['btn_profile'] = '更新个人信息'; $lang['btn_reset'] = '重设'; $lang['btn_resendpwd'] = '发送新密码'; @@ -52,6 +52,7 @@ $lang['btn_draft'] = '编辑草稿'; $lang['btn_recover'] = '恢复草稿'; $lang['btn_draftdel'] = '删除草稿'; $lang['btn_revert'] = '恢复'; +$lang['btn_register'] = '注册'; $lang['loggedinas'] = '登录为'; $lang['user'] = '用户名'; $lang['pass'] = '密码'; @@ -61,10 +62,9 @@ $lang['passchk'] = '请再输一次'; $lang['remember'] = '记住我'; $lang['fullname'] = '全名'; $lang['email'] = 'E-Mail'; -$lang['register'] = '注册'; $lang['profile'] = '用户信息'; $lang['badlogin'] = '对不起,用户名或密码错误。'; -$lang['minoredit'] = '轻微修改'; +$lang['minoredit'] = '细微修改'; $lang['draftdate'] = '草稿自动保存于'; $lang['nosecedit'] = '在您编辑期间本页刚被他人修改过,局部信息已过期,故载入全页。'; $lang['regmissing'] = '对不起,您必须填写所有的区域。'; @@ -98,7 +98,38 @@ $lang['txt_overwrt'] = '覆盖已存在的同名文件'; $lang['lockedby'] = '目前已被下列人员锁定'; $lang['lockexpire'] = '预计锁定解除于'; $lang['willexpire'] = '您对本页的独有编辑权将于一分钟之后解除。\n为了防止与其他人的编辑冲突,请使用预览按钮重设计时器。'; -$lang['js']['notsavedyet'] = "未保存的更改将丢失。\n真的要继续?"; +$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'] = '连接到 Windows 共享功能只有在 IE 浏览器中才能正常使用。 +但您仍能复制并粘贴该链接。'; +$lang['js']['linkwiz'] = '链接向导'; +$lang['js']['linkto'] = '链接到:'; +$lang['js']['del_confirm'] = '真的要删除选中的项目吗?'; +$lang['js']['mu_btn'] = '一次上传了多个文件'; $lang['rssfailed'] = '获取该 RSS 信息时产生错误:'; $lang['nothingfound'] = '什么都没有找到。'; $lang['mediaselect'] = '媒体文件'; @@ -116,15 +147,7 @@ $lang['deletefail'] = '无法删除“%s”- 请检查权限。'; $lang['mediainuse'] = '文件“%s”无法删除 - 它正被使用中。'; $lang['namespaces'] = '命名空间'; $lang['mediafiles'] = '可用的文件'; -$lang['js']['searchmedia'] = '查找文件'; -$lang['js']['keepopen'] = '选中后不自动关闭窗口'; -$lang['js']['hidedetails'] = '隐藏详细信息'; -$lang['js']['nosmblinks'] = '连接到 Windows 共享功能只有在 IE 浏览器中才能正常使用。 -但您仍能复制并粘贴该链接。'; -$lang['js']['linkwiz'] = '链接向导'; -$lang['js']['linkto'] = '链接到:'; -$lang['js']['del_confirm'] = '真的要删除选中的项目吗?'; -$lang['js']['mu_btn'] = '一次上传了多个文件'; +$lang['accessdenied'] = '您没有权限浏览此页面。'; $lang['mediausage'] = '使用下列字符链接到该文件:'; $lang['mediaview'] = '查看该文件'; $lang['mediaroot'] = '根目录'; @@ -140,6 +163,8 @@ $lang['current'] = '当前版本'; $lang['yours'] = '您的版本'; $lang['diff'] = '显示与当前版本的差别'; $lang['diff2'] = '显示跟目前版本的差异'; +$lang['difflink'] = '到此差别页面的链接'; +$lang['diff_type'] = '查看差异:'; $lang['line'] = '行'; $lang['breadcrumb'] = '您的足迹'; $lang['youarehere'] = '您在这里'; @@ -151,8 +176,10 @@ $lang['restored'] = '已恢复为旧版'; $lang['external_edit'] = '外部编辑'; $lang['summary'] = '编辑摘要'; $lang['noflash'] = '需要 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash 插件</a> 来播放本内容。 '; +$lang['download'] = '下载片段'; $lang['mail_newpage'] = '添加页面:'; $lang['mail_changed'] = '更改页面:'; +$lang['mail_subscribe_list'] = '命名空间中改变的页面:'; $lang['mail_new_user'] = '新用户:'; $lang['mail_upload'] = '已上传的文件:'; $lang['qb_bold'] = '粗体'; @@ -195,11 +222,22 @@ $lang['img_copyr'] = '版权'; $lang['img_format'] = '格式'; $lang['img_camera'] = '相机'; $lang['img_keywords'] = '关键字'; -$lang['subscribe_success'] = '已将 %s 成功添加到 %s 的订阅列表'; -$lang['subscribe_error'] = '无法将 %s 添加到 %s 的订阅列表'; -$lang['subscribe_noaddress'] = '您的登录信息中不包含电子邮件地址,您无法加入订阅列表'; -$lang['unsubscribe_success'] = '已将 %s 从 %s 的订阅列表中成功删除'; -$lang['unsubscribe_error'] = '无法将 %s 从 %s 的订阅列表中删除'; +$lang['subscr_subscribe_success'] = '添加 %s 到 %s 的订阅列表'; +$lang['subscr_subscribe_error'] = '添加 %s 到 %s 的订阅列表中出现错误'; +$lang['subscr_subscribe_noaddress'] = '没有与您登录信息相关联的地址,您无法被添加到订阅列表'; +$lang['subscr_unsubscribe_success'] = '%s 被移出 %s 的订阅列表'; +$lang['subscr_unsubscribe_error'] = '%s 被移出 %s 的订阅列表中出现错误'; +$lang['subscr_already_subscribed'] = '%s 已经订阅了 %s'; +$lang['subscr_not_subscribed'] = '%s 没有订阅 %s'; +$lang['subscr_m_not_subscribed'] = '您现在没有订阅当前页面或者命名空间。'; +$lang['subscr_m_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 天)'; $lang['authmodfailed'] = '错误的用户认证设置。请通知维基管理员。'; $lang['authtempfail'] = '用户认证暂时无法使用。如果该状态一直存在,请通知维基管理员。'; $lang['i_chooselang'] = '选择您的语言'; @@ -227,6 +265,7 @@ $lang['i_pol0'] = '开放的维基(任何人都有读、写、 $lang['i_pol1'] = '公共的维基(任何人都有读的权限,只有注册用户才有写和上传的权限)'; $lang['i_pol2'] = '关闭的维基(只有注册用户才有读、写、上传的权限)'; $lang['i_retry'] = '重试'; +$lang['i_license'] = '请选择您希望的内容发布许可协议:'; $lang['mu_intro'] = '您可以在此一次上传多个文件。点按浏览按钮添加文件到上传队列中,先好后按上传钮。'; $lang['mu_gridname'] = '文件名'; $lang['mu_gridsize'] = '大小'; @@ -241,6 +280,7 @@ $lang['mu_authfail'] = '会话过期'; $lang['mu_progress'] = '@PCT@% 上传完成'; $lang['mu_filetypes'] = '允许的文件类型'; $lang['mu_info'] = '文件已上传。'; +$lang['mu_lasterr'] = '最后一个错误:'; $lang['recent_global'] = '您当前看到的是<b>%s</b> 名称空间的变动。你还可以在<a href="%s">查看整个维基的近期变动</a>。'; $lang['years'] = '%d年前'; $lang['months'] = '%d月前'; @@ -249,3 +289,4 @@ $lang['days'] = '%d天前'; $lang['hours'] = '%d小时前'; $lang['minutes'] = '%d分钟前'; $lang['seconds'] = '%d秒前'; +$lang['wordblock'] = '您的更改没有被保存,因为它包含被屏蔽的文字(垃圾信息)。'; diff --git a/inc/lang/zh/subscr_digest.txt b/inc/lang/zh/subscr_digest.txt new file mode 100644 index 000000000..3c73ff4c5 --- /dev/null +++ b/inc/lang/zh/subscr_digest.txt @@ -0,0 +1,19 @@ +您好! + +@TITLE@ 维基中的页面 @PAGE@ 已经更改。 +这里是更改的内容: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +旧版本:@OLDPAGE@ +新版本:@NEWPAGE@ + +要取消页面提醒,从 @DOKUWIKIURL@ 登录维基,然后浏览 +@SUBSCRIBE@ +并退订页面以及/或者命名空间的更改。 + +-- +本邮件由以下 DokuWiki 产生 +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/zh/subscr_form.txt b/inc/lang/zh/subscr_form.txt new file mode 100644 index 000000000..65bfd4041 --- /dev/null +++ b/inc/lang/zh/subscr_form.txt @@ -0,0 +1,3 @@ +====== 订阅管理 ====== + +这个页面允许您管理在当前页面和命名空间的订阅。
\ No newline at end of file diff --git a/inc/lang/zh/subscr_list.txt b/inc/lang/zh/subscr_list.txt new file mode 100644 index 000000000..1fc1e213c --- /dev/null +++ b/inc/lang/zh/subscr_list.txt @@ -0,0 +1,16 @@ +您好! + +@TITLE@ 维基中的命名空间 @PAGE@ 的页面已经更改。 +这里是更改的页面: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +要取消页面提醒,从 @DOKUWIKIURL@ 登录维基,然后浏览 +@SUBSCRIBE@ +并退订页面以及/或者命名空间的更改。 + +-- +本邮件由以下 DokuWiki 产生 +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/zh/subscr_single.txt b/inc/lang/zh/subscr_single.txt new file mode 100644 index 000000000..7da57d570 --- /dev/null +++ b/inc/lang/zh/subscr_single.txt @@ -0,0 +1,22 @@ +您好! + +@TITLE@ 维基中的页面 @PAGE@ 已经更改。 +这里是更改的内容: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +时间:@DATE@ +用户:@USER@ +编辑摘要:@SUMMARY@ +旧版本:@OLDPAGE@ +新版本:@NEWPAGE@ + +要取消页面提醒,从 @DOKUWIKIURL@ 登录维基,然后浏览 +@SUBSCRIBE@ +并退订页面以及/或者命名空间的更改。 + +-- +本邮件由以下 DokuWiki 产生 +@DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/zh/subscribermail.txt b/inc/lang/zh/subscribermail.txt deleted file mode 100644 index 1a0a0aa16..000000000 --- a/inc/lang/zh/subscribermail.txt +++ /dev/null @@ -1,19 +0,0 @@ -您好! - -@TITLE@ 中的 @PAGE@ 页面已更改。 -下面是更改的详细情况: - --------------------------------------------------------- -@DIFF@ --------------------------------------------------------- - -要退订本页,请登录维基 -@DOKUWIKIURL@ 然后访问 -@NEWPAGE@ -并选择'退订更改'。 - --- -本邮件由 DokuWiki 自动创建 -@DOKUWIKIURL@ - - diff --git a/inc/load.php b/inc/load.php index 2f5be6d63..ef6f7f31c 100644 --- a/inc/load.php +++ b/inc/load.php @@ -74,6 +74,8 @@ function load_autoload($name){ 'DokuWikiFeedCreator' => DOKU_INC.'inc/feedcreator.class.php', 'Doku_Parser_Mode' => 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', 'DokuWiki_Action_Plugin' => DOKU_PLUGIN.'action.php', 'DokuWiki_Admin_Plugin' => DOKU_PLUGIN.'admin.php', diff --git a/inc/mail.php b/inc/mail.php index 38232d110..bd6c0db6a 100644 --- a/inc/mail.php +++ b/inc/mail.php @@ -11,7 +11,6 @@ if(!defined('DOKU_INC')) die('meh.'); // end of line for mail lines - RFC822 says CRLF but postfix (and other MTAs?) // think different if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL',"\n"); -if(!defined('QUOTEDPRINTABLE_EOL')) define('QUOTEDPRINTABLE_EOL',"\015\012"); #define('MAILHEADER_ASCIIONLY',1); /** @@ -30,7 +29,41 @@ if(!defined('QUOTEDPRINTABLE_EOL')) define('QUOTEDPRINTABLE_EOL',"\015\012"); 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)'); +/** + * Prepare mailfrom replacement patterns + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +function mail_setup(){ + global $conf; + global $USERINFO; + + $replace = array(); + if(!empty($USERINFO['mail'])){ + $replace['@MAIL@'] = $USERINFO['mail']; + }else{ + $host = @parse_url(DOKU_URL,PHP_URL_HOST); + if(!$host) $host = 'example.com'; + $replace['@MAIL@'] = 'noreply@'.$host; + } + + if(!empty($_SERVER['REMOTE_USER'])){ + $replace['@USER@'] = $_SERVER['REMOTE_USER']; + }else{ + $replace['@USER@'] = 'noreply'; + } + + if(!empty($USERINFO['name'])){ + $replace['@NAME@'] = $USERINFO['name']; + }else{ + $replace['@NAME@'] = ''; + } + + $conf['mailfrom'] = str_replace(array_keys($replace), + array_values($replace), + $conf['mailfrom']); +} /** * UTF-8 autoencoding replacement for PHPs mail function @@ -79,9 +112,16 @@ function _mail_send_action($data) { } if(!utf8_isASCII($subject)) { - $subject = '=?UTF-8?Q?'.mail_quotedprintable_encode($subject,0).'?='; + $enc_subj = '=?UTF-8?Q?'.mail_quotedprintable_encode($subject,0).'?='; // Spaces must be encoded according to rfc2047. Use the "_" shorthand - $subject = preg_replace('/ /', '_', $subject); + $enc_sub = preg_replace('/ /', '_', $enc_sub); + + // quoted printable has length restriction, use base64 if needed + if(strlen($subject) > 74){ + $enc_subj = '=?UTF-8?B?'.base64_encode($subject).'?='; + } + + $subject = $enc_subj; } $header = ''; @@ -163,7 +203,16 @@ function mail_encode_address($string,$header='',$names=true){ } if(!utf8_isASCII($text)){ - $text = '=?UTF-8?Q?'.mail_quotedprintable_encode($text,0).'?='; + // put the quotes outside as in =?UTF-8?Q?"Elan Ruusam=C3=A4e"?= vs "=?UTF-8?Q?Elan Ruusam=C3=A4e?=" + if (preg_match('/^"(.+)"$/', $text, $matches)) { + $text = '"=?UTF-8?Q?'.mail_quotedprintable_encode($matches[1], 0).'?="'; + } else { + $text = '=?UTF-8?Q?'.mail_quotedprintable_encode($text, 0).'?='; + } + // additionally the space character should be encoded as =20 (or each + // word QP encoded separately). + // however this is needed only in mail headers, not globally in mail_quotedprintable_encode(). + $text = str_replace(" ", "=20", $text); } }else{ $text = ''; @@ -193,6 +242,7 @@ function mail_encode_address($string,$header='',$names=true){ */ function mail_isvalid($email){ $validator = new EmailAddressValidator; + $validator->allowLocalAddresses = true; return $validator->check_email_address($email); } @@ -255,11 +305,11 @@ function mail_quotedprintable_encode($sText,$maxlen=74,$bEmulate_imap_8bit=true) // but this wouldn't be caught by such an easy RegExp if($maxlen){ preg_match_all( '/.{1,'.($maxlen - 2).'}([^=]{0,2})?/', $sLine, $aMatch ); - $sLine = implode( '=' . QUOTEDPRINTABLE_EOL, $aMatch[0] ); // add soft crlf's + $sLine = implode( '=' . MAILHEADER_EOL, $aMatch[0] ); // add soft crlf's } } // join lines into text - return implode(QUOTEDPRINTABLE_EOL,$aLines); + return implode(MAILHEADER_EOL,$aLines); } diff --git a/inc/media.php b/inc/media.php index b54fd000f..dcef25cfd 100644 --- a/inc/media.php +++ b/inc/media.php @@ -141,7 +141,7 @@ function media_metaform($id,$auth){ } /** - * Conveinience function to check if a media file is still in use + * Convenience function to check if a media file is still in use * * @author Michael Klier <chi@chimeric.de> */ @@ -160,19 +160,26 @@ function media_inuse($id) { } } +define('DOKU_MEDIA_DELETED', 1); +define('DOKU_MEDIA_NOT_AUTH', 2); +define('DOKU_MEDIA_INUSE', 4); +define('DOKU_MEDIA_EMPTY_NS', 8); + /** * Handles media file deletions * * If configured, checks for media references before deletion * * @author Andreas Gohr <andi@splitbrain.org> - * @return mixed false on error, true on delete or array with refs + * @return int One of: 0, + DOKU_MEDIA_DELETED, + DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS, + DOKU_MEDIA_NOT_AUTH, + DOKU_MEDIA_INUSE */ function media_delete($id,$auth){ - if($auth < AUTH_DELETE) return false; - if(!checkSecurityToken()) return false; - global $conf; - global $lang; + if($auth < AUTH_DELETE) return DOKU_MEDIA_NOT_AUTH; + if(media_inuse($id)) return DOKU_MEDIA_INUSE; $file = mediaFN($id); @@ -196,38 +203,22 @@ function media_delete($id,$auth){ unset($evt); if($data['unl'] && $data['del']){ - // current namespace was removed. redirecting to root ns passing msg along - send_redirect(DOKU_URL.'lib/exe/mediamanager.php?msg1='. - rawurlencode(sprintf(noNS($id),$lang['deletesucc']))); + return DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS; } - return $data['unl']; + return $data['unl'] ? DOKU_MEDIA_DELETED : 0; } /** * Handles media file uploads * - * This generates an action event and delegates to _media_upload_action(). - * Action plugins are allowed to pre/postprocess the uploaded file. - * (The triggered event is preventable.) - * - * Event data: - * $data[0] fn_tmp: the temporary file name (read from $_FILES) - * $data[1] fn: the file name of the uploaded file - * $data[2] id: the future directory id of the uploaded file - * $data[3] imime: the mimetype of the uploaded file - * $data[4] overwrite: if an existing file is going to be overwritten - * - * @triggers MEDIA_UPLOAD_FINISH * @author Andreas Gohr <andi@splitbrain.org> * @author Michael Klier <chi@chimeric.de> * @return mixed false on error, id of the new file on success */ function media_upload($ns,$auth){ - if($auth < AUTH_UPLOAD) return false; if(!checkSecurityToken()) return false; global $lang; - global $conf; // get file and id $id = $_POST['id']; @@ -249,8 +240,50 @@ function media_upload($ns,$auth){ msg(sprintf($lang['mediaextchange'],$fext,$iext)); } + $res = media_save(array('name' => $file['tmp_name'], + 'mime' => $imime, + 'ext' => $iext), $ns.':'.$id, + $_REQUEST['ow'], $auth, 'move_uploaded_file'); + if (is_array($res)) { + msg($res[0], $res[1]); + return false; + } + return $res; +} + +/** + * This generates an action event and delegates to _media_upload_action(). + * Action plugins are allowed to pre/postprocess the uploaded file. + * (The triggered event is preventable.) + * + * Event data: + * $data[0] fn_tmp: the temporary file name (read from $_FILES) + * $data[1] fn: the file name of the uploaded file + * $data[2] id: the future directory id of the uploaded file + * $data[3] imime: the mimetype of the uploaded file + * $data[4] overwrite: if an existing file is going to be overwritten + * + * @triggers MEDIA_UPLOAD_FINISH + */ +function media_save($file, $id, $ow, $auth, $move) { + if($auth < AUTH_UPLOAD) { + return array("You don't have permissions to upload files.", -1); + } + + if (!isset($file['mime']) || !isset($file['ext'])) { + list($ext, $mime) = mimetype($id); + if (!isset($file['mime'])) { + $file['mime'] = $mime; + } + if (!isset($file['ext'])) { + $file['ext'] = $ext; + } + } + + global $lang; + // get filename - $id = cleanID($ns.':'.$id,false,true); + $id = cleanID($id,false,true); $fn = mediaFN($id); // get filetype regexp @@ -259,40 +292,35 @@ function media_upload($ns,$auth){ $regex = join('|',$types); // because a temp file was created already - if(preg_match('/\.('.$regex.')$/i',$fn)){ - //check for overwrite - $overwrite = @file_exists($fn); - if($overwrite && (!$_REQUEST['ow'] || $auth < AUTH_DELETE)){ - msg($lang['uploadexist'],0); - return false; - } - // check for valid content - $ok = media_contentcheck($file['tmp_name'],$imime); - if($ok == -1){ - msg(sprintf($lang['uploadbadcontent'],".$iext"),-1); - return false; - }elseif($ok == -2){ - msg($lang['uploadspam'],-1); - return false; - }elseif($ok == -3){ - msg($lang['uploadxss'],-1); - return false; - } + if(!preg_match('/\.('.$regex.')$/i',$fn)) { + return array($lang['uploadwrong'],-1); + } - // prepare event data - $data[0] = $file['tmp_name']; - $data[1] = $fn; - $data[2] = $id; - $data[3] = $imime; - $data[4] = $overwrite; + //check for overwrite + $overwrite = @file_exists($fn); + if($overwrite && (!$ow || $auth < AUTH_DELETE)) { + return array($lang['uploadexist'], 0); + } + // check for valid content + $ok = media_contentcheck($file['name'], $file['mime']); + if($ok == -1){ + return array(sprintf($lang['uploadbadcontent'],'.' . $file['ext']),-1); + }elseif($ok == -2){ + return array($lang['uploadspam'],-1); + }elseif($ok == -3){ + return array($lang['uploadxss'],-1); + } - // trigger event - return trigger_event('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true); + // prepare event data + $data[0] = $file['name']; + $data[1] = $fn; + $data[2] = $id; + $data[3] = $file['mime']; + $data[4] = $overwrite; + $data[5] = $move; - }else{ - msg($lang['uploadwrong'],-1); - } - return false; + // trigger event + return trigger_event('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true); } /** @@ -301,8 +329,8 @@ function media_upload($ns,$auth){ */ function _media_upload_action($data) { // fixme do further sanity tests of given data? - if(is_array($data) && count($data)===5) { - return media_upload_finish($data[0], $data[1], $data[2], $data[3], $data[4]); + if(is_array($data) && count($data)===6) { + return media_upload_finish($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]); } else { return false; //callback error } @@ -314,14 +342,14 @@ function _media_upload_action($data) { * @author Andreas Gohr <andi@splitbrain.org> * @author Michael Klier <chi@chimeric.de> */ -function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite) { +function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'move_uploaded_file') { global $conf; global $lang; // prepare directory io_createNamespace($id, 'media'); - if(move_uploaded_file($fn_tmp, $fn)) { + if($move($fn_tmp, $fn)) { // Set the correct permission here. // Always chmod media because they may be saved with different permissions than expected from the php umask. // (Should normally chmod to $conf['fperm'] only if $conf['fperm'] is set.) @@ -336,7 +364,7 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite) { } return $id; }else{ - msg($lang['uploadfail'],-1); + return array($lang['uploadfail'],-1); } } @@ -407,14 +435,9 @@ function media_notify($id,$file,$mime){ $text = str_replace('@MEDIA@',ml($id,'',true,'&',true),$text); $text = str_replace('@SIZE@',filesize_h(filesize($file)),$text); - $from = $conf['mailfrom']; - $from = str_replace('@USER@',$_SERVER['REMOTE_USER'],$from); - $from = str_replace('@NAME@',$INFO['userinfo']['name'],$from); - $from = str_replace('@MAIL@',$INFO['userinfo']['mail'],$from); - $subject = '['.$conf['title'].'] '.$lang['mail_upload'].' '.$id; - mail_send($conf['notify'],$subject,$text,$from); + mail_send($conf['notify'],$subject,$text,$conf['mailfrom']); } /** diff --git a/inc/pageutils.php b/inc/pageutils.php index 42a485bdf..cd01dcae7 100644 --- a/inc/pageutils.php +++ b/inc/pageutils.php @@ -311,14 +311,13 @@ function metaFN($id,$ext){ * returns an array of full paths to all metafiles of a given ID * * @author Esther Brunner <esther@kaffeehaus.ch> + * @author Michael Hamann <michael@content-space.de> */ function metaFiles($id){ - $name = noNS($id); - $ns = getNS($id); - $dir = ($ns) ? metaFN($ns,'').'/' : metaFN($ns,''); - $files = array(); - $files = glob($dir.$name.'.*'); - return $files; + $basename = metaFN($id, ''); + $files = glob($basename.'.*', GLOB_MARK); + // filter files like foo.bar.meta when $id == 'foo' + return $files ? preg_grep('/^'.preg_quote($basename, '/').'\.[^.\/]*$/u', $files) : array(); } /** @@ -344,10 +343,13 @@ function mediaFN($id){ */ function localeFN($id){ global $conf; - $file = DOKU_INC.'inc/lang/'.$conf['lang'].'/'.$id.'.txt'; + $file = DOKU_CONF.'/lang/'.$conf['lang'].'/'.$id.'.txt'; if(!@file_exists($file)){ - //fall back to english - $file = DOKU_INC.'inc/lang/en/'.$id.'.txt'; + $file = DOKU_INC.'inc/lang/'.$conf['lang'].'/'.$id.'.txt'; + if(!@file_exists($file)){ + //fall back to english + $file = DOKU_INC.'inc/lang/en/'.$id.'.txt'; + } } return $file; } diff --git a/inc/parser/handler.php b/inc/parser/handler.php index a96e6b9db..22a50d1b7 100644 --- a/inc/parser/handler.php +++ b/inc/parser/handler.php @@ -720,6 +720,7 @@ class Doku_Handler_CallWriter { // function is required, but since this call writer is first/highest in // the chain it is not required to do anything function finalise() { + unset($this->Handler); } } @@ -764,6 +765,7 @@ class Doku_Handler_Nest { $this->process(); $this->CallWriter->finalise(); + unset($this->CallWriter); } function process() { @@ -817,6 +819,7 @@ class Doku_Handler_List { $this->process(); $this->CallWriter->finalise(); + unset($this->CallWriter); } //------------------------------------------------------------------------ @@ -1014,6 +1017,7 @@ class Doku_Handler_Preformatted { $this->process(); $this->CallWriter->finalise(); + unset($this->CallWriter); } function process() { @@ -1070,6 +1074,7 @@ class Doku_Handler_Quote { $this->process(); $this->CallWriter->finalise(); + unset($this->CallWriter); } function process() { @@ -1165,6 +1170,7 @@ class Doku_Handler_Table { $this->process(); $this->CallWriter->finalise(); + unset($this->CallWriter); } //------------------------------------------------------------------------ @@ -1427,14 +1433,8 @@ class Doku_Handler_Table { * @author Harry Fuecks <hfuecks@gmail.com> */ class Doku_Handler_Block { - var $calls = array(); - - var $blockStack = array(); - - var $inParagraph = false; - var $atStart = true; - var $skipEolKey = -1; + var $skipEol = false; // Blocks these should not be inside paragraphs var $blockOpen = array( @@ -1442,9 +1442,9 @@ class Doku_Handler_Block { 'listu_open','listo_open','listitem_open','listcontent_open', 'table_open','tablerow_open','tablecell_open','tableheader_open', 'quote_open', - 'section_open', // Needed to prevent p_open between header and section_open 'code','file','hr','preformatted','rss', 'htmlblock','phpblock', + 'footnote_open', ); var $blockClose = array( @@ -1452,18 +1452,18 @@ class Doku_Handler_Block { 'listu_close','listo_close','listitem_close','listcontent_close', 'table_close','tablerow_close','tablecell_close','tableheader_close', 'quote_close', - 'section_close', // Needed to prevent p_close after section_close 'code','file','hr','preformatted','rss', 'htmlblock','phpblock', + 'footnote_close', ); // Stacks can contain paragraphs var $stackOpen = array( - 'footnote_open','section_open', + 'section_open', ); var $stackClose = array( - 'footnote_close','section_close', + 'section_close', ); @@ -1489,6 +1489,13 @@ class Doku_Handler_Block { } } + function openParagraph($pos){
+ if ($this->inParagraph) return; + $this->calls[] = array('p_open',array(), $pos); + $this->inParagraph = true;
+ $this->skipEol = true; + } + /** * Close a paragraph if needed * @@ -1496,7 +1503,8 @@ class Doku_Handler_Block { * * @author Andreas Gohr <andi@splitbrain.org> */ - function closeParagraph($pos){ + function closeParagraph($pos){
+ if (!$this->inParagraph) return; // look back if there was any content - we don't want empty paragraphs $content = ''; for($i=count($this->calls)-1; $i>=0; $i--){ @@ -1513,11 +1521,29 @@ class Doku_Handler_Block { if(trim($content)==''){ //remove the whole paragraph array_splice($this->calls,$i); - }else{ + }else{
+ // remove ending linebreaks in the paragraph
+ $i=count($this->calls)-1;
+ if ($this->calls[$i][0] == 'cdata') $this->calls[$i][1][0] = rtrim($this->calls[$i][1][0],DOKU_PARSER_EOL); $this->calls[] = array('p_close',array(), $pos); } - $this->inParagraph = false; + $this->inParagraph = false;
+ $this->skipEol = true; + } + + function addCall($call) { + $key = count($this->calls); + if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) { + $this->calls[$key-1][1][0] .= $call[1][0]; + } else { + $this->calls[] = $call; + } + } + + // simple version of addCall, without checking cdata + function storeCall($call) { + $this->calls[] = $call; } /** @@ -1525,186 +1551,71 @@ class Doku_Handler_Block { * * @author Harry Fuecks <hfuecks@gmail.com> * @author Andreas Gohr <andi@splitbrain.org> - * @todo This thing is really messy and should be rewritten */ function process($calls) { + // open first paragraph
+ $this->openParagraph(0); foreach ( $calls as $key => $call ) { $cname = $call[0]; - if($cname == 'plugin') { + if ($cname == 'plugin') { $cname='plugin_'.$call[1][0]; - $plugin = true; $plugin_open = (($call[1][2] == DOKU_LEXER_ENTER) || ($call[1][2] == DOKU_LEXER_SPECIAL)); $plugin_close = (($call[1][2] == DOKU_LEXER_EXIT) || ($call[1][2] == DOKU_LEXER_SPECIAL)); } else { $plugin = false; } - - // Process blocks which are stack like... (contain linefeeds) + /* stack */ + if ( in_array($cname,$this->stackClose ) && (!$plugin || $plugin_close)) { + $this->closeParagraph($call[2]); + $this->storeCall($call); + $this->openParagraph($call[2]); + continue; + } if ( in_array($cname,$this->stackOpen ) && (!$plugin || $plugin_open) ) { - - // Hack - footnotes shouldn't immediately contain a p_open - if ($this->addToStack($cname != 'footnote_open')) { - $this->closeParagraph($call[2]); - } - $this->calls[] = $call; - + $this->closeParagraph($call[2]); + $this->storeCall($call); + $this->openParagraph($call[2]); continue; } - - if ( in_array($cname,$this->stackClose ) && (!$plugin || $plugin_close)) { - - if ( $this->inParagraph ) { - $this->closeParagraph($call[2]); - } - $this->calls[] = $call; - if ($this->removeFromStack()) { - $this->calls[] = array('p_open',array(), $call[2]); - } + /* block */ + // If it's a substition it opens and closes at the same call. + // To make sure next paragraph is correctly started, let close go first. + if ( in_array($cname, $this->blockClose) && (!$plugin || $plugin_close)) { + $this->closeParagraph($call[2]); + $this->storeCall($call); + $this->openParagraph($call[2]); continue; } - - if ( !$this->atStart ) { - - if ( $cname == 'eol' ) { - - // Check this isn't an eol instruction to skip... - if ( $this->skipEolKey != $key ) { - // Look to see if the next instruction is an EOL - if ( isset($calls[$key+1]) && $calls[$key+1][0] == 'eol' ) { - - if ( $this->inParagraph ) { - //$this->calls[] = array('p_close',array(), $call[2]); - $this->closeParagraph($call[2]); - } - - $this->calls[] = array('p_open',array(), $call[2]); - $this->inParagraph = true; - - - // Mark the next instruction for skipping - $this->skipEolKey = $key+1; - - }else{ - //if this is just a single eol make a space from it - $this->addCall(array('cdata',array(DOKU_PARSER_EOL), $call[2])); - } - } - - - } else { - - $storeCall = true; - if ( $this->inParagraph && (in_array($cname, $this->blockOpen) && (!$plugin || $plugin_open))) { + if ( in_array($cname, $this->blockOpen) && (!$plugin || $plugin_open)) { + $this->closeParagraph($call[2]); + $this->storeCall($call); + continue; + } + /* eol */ + if ( $cname == 'eol' ) { + // Check this isn't an eol instruction to skip... + if ( !$this->skipEol ) { + // Next is EOL => double eol => mark as paragraph + if ( isset($calls[$key+1]) && $calls[$key+1][0] == 'eol' ) { $this->closeParagraph($call[2]); - $this->calls[] = $call; - $storeCall = false; - } - - if ( in_array($cname, $this->blockClose) && (!$plugin || $plugin_close)) { - if ( $this->inParagraph ) { - $this->closeParagraph($call[2]); - } - if ( $storeCall ) { - $this->calls[] = $call; - $storeCall = false; - } - - // This really sucks and suggests this whole class sucks but... - if ( isset($calls[$key+1])) { - $cname_plusone = $calls[$key+1][0]; - if ($cname_plusone == 'plugin') { - $cname_plusone = 'plugin'.$calls[$key+1][1][0]; - - // plugin test, true if plugin has a state which precludes it requiring blockOpen or blockClose - $plugin_plusone = true; - $plugin_test = ($call[$key+1][1][2] == DOKU_LEXER_MATCHED) || ($call[$key+1][1][2] == DOKU_LEXER_MATCHED); - } else { - $plugin_plusone = false; - } - if ((!in_array($cname_plusone, $this->blockOpen) && !in_array($cname_plusone, $this->blockClose)) || - ($plugin_plusone && $plugin_test) - ) { - - $this->calls[] = array('p_open',array(), $call[2]); - $this->inParagraph = true; - } - } - } - - if ( $storeCall ) { - $this->addCall($call); - } - - } - - - } else { - - // Unless there's already a block at the start, start a paragraph - if ( !in_array($cname,$this->blockOpen) ) { - $this->calls[] = array('p_open',array(), $call[2]); - if ( $call[0] != 'eol' ) { - $this->calls[] = $call; + $this->openParagraph($call[2]); + } else { + //if this is just a single eol make a space from it + $this->addCall(array('cdata',array(DOKU_PARSER_EOL), $call[2])); } - $this->atStart = false; - $this->inParagraph = true; - } else { - $this->addCall($call); - $this->atStart = false; } - - } - - } - - if ( $this->inParagraph ) { - if ( $cname == 'p_open' ) { - // Ditch the last call - array_pop($this->calls); - } else if ( !in_array($cname, $this->blockClose) ) { - //$this->calls[] = array('p_close',array(), $call[2]); - $this->closeParagraph($call[2]); - } else { - $last_call = array_pop($this->calls); - //$this->calls[] = array('p_close',array(), $call[2]); - $this->closeParagraph($call[2]); - $this->calls[] = $last_call; + continue; } + /* normal */ + $this->addCall($call); + $this->skipEol = false; } - + // close last paragraph + $call = end($this->calls); + $this->closeParagraph($call[2]); return $this->calls; } - - /** - * - * @return bool true when a p_close() is required - */ - function addToStack($newStart = true) { - $ret = $this->inParagraph; - $this->blockStack[] = array($this->atStart, $this->inParagraph); - $this->atStart = $newStart; - $this->inParagraph = false; - - return $ret; - } - - function removeFromStack() { - $state = array_pop($this->blockStack); - $this->atStart = $state[0]; - $this->inParagraph = $state[1]; - - return $this->inParagraph; - } - - function addCall($call) { - $key = count($this->calls); - if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) { - $this->calls[$key-1][1][0] .= $call[1][0]; - } else { - $this->calls[] = $call; - } - } } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/parser/lexer.php b/inc/parser/lexer.php index 211945d8f..b5bcb9612 100644 --- a/inc/parser/lexer.php +++ b/inc/parser/lexer.php @@ -597,4 +597,4 @@ function Doku_Lexer_Escape($str) { return preg_replace($chars, $escaped, $str); } -//Setup VIM: ex: et ts=4 sw=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 sw=4 : diff --git a/inc/parser/metadata.php b/inc/parser/metadata.php index f635ea1d5..fc2c8cbc5 100644 --- a/inc/parser/metadata.php +++ b/inc/parser/metadata.php @@ -45,6 +45,9 @@ class Doku_Renderer_metadata extends Doku_Renderer { if(!$this->persistent['date']['created']){ $this->persistent['date']['created'] = filectime(wikiFN($ID)); } + if(!isset($this->persistent['user'])){ + $this->persistent['user'] = ''; + } if(!isset($this->persistent['creator'])){ $this->persistent['creator'] = ''; } @@ -461,7 +464,7 @@ class Doku_Renderer_metadata extends Doku_Renderer { } else if (is_string($title)){ return $title; } else if (is_array($title)){ - return '['.$title['title'].']'; + if($title['title']) return '['.$title['title'].']'; } } @@ -479,4 +482,4 @@ class Doku_Renderer_metadata extends Doku_Renderer { } } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/parser/parser.php b/inc/parser/parser.php index 435b8aa46..e47ce56fa 100644 --- a/inc/parser/parser.php +++ b/inc/parser/parser.php @@ -90,7 +90,6 @@ class Doku_Parser { if ( $mode == 'base' ) { continue; } - $this->modes[$mode]->preConnect(); foreach ( array_keys($this->modes) as $cm ) { @@ -218,11 +217,11 @@ class Doku_Parser_Mode_footnote extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_header extends Doku_Parser_Mode { - function preConnect() { + function connectTo($mode) { //we're not picky about the closing ones, two are enough $this->Lexer->addSpecialPattern( '[ \t]*={2,}[^\n]+={2,}[ \t]*(?=\n)', - 'base', + $mode, 'header' ); } @@ -298,6 +297,10 @@ class Doku_Parser_Mode_hr extends Doku_Parser_Mode { } //------------------------------------------------------------------- +/** + * This class sets the markup for bold (=strong), + * italic (=emphasis), underline etc. + */ class Doku_Parser_Mode_formatting extends Doku_Parser_Mode { var $type; @@ -825,7 +828,7 @@ class Doku_Parser_Mode_internallink extends Doku_Parser_Mode { function connectTo($mode) { // Word boundaries? - $this->Lexer->addSpecialPattern("\[\[.+?\]\]",$mode,'internallink'); + $this->Lexer->addSpecialPattern("\[\[(?:(?:[^[\]]*?\[.*?\])|.+?)\]\]",$mode,'internallink'); } function getSort() { @@ -867,7 +870,7 @@ class Doku_Parser_Mode_externallink extends Doku_Parser_Mode { if(count($this->patterns)) return; $ltrs = '\w'; - $gunk = '/\#~:.?+=&%@!\-'; + $gunk = '/\#~:.?+=&%@!\-\[\]'; $punc = '.:?\-;,'; $host = $ltrs.$punc; $any = $ltrs.$gunk.$punc; @@ -953,4 +956,4 @@ class Doku_Parser_Mode_emaillink extends Doku_Parser_Mode { } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php index b54ccf050..7002fd0cb 100644 --- a/inc/parser/renderer.php +++ b/inc/parser/renderer.php @@ -239,9 +239,9 @@ class Doku_Renderer extends DokuWiki_Plugin { $src,$title=NULL,$align=NULL,$width=NULL,$height=NULL,$cache=NULL ) {} - function table_open($maxcols = NULL, $numrows = NULL, $pos){} + function table_open($maxcols = null, $numrows = null, $pos = null){} - function table_close($pos){} + function table_close($pos = null){} function tablerow_open(){} @@ -319,4 +319,4 @@ class Doku_Renderer extends DokuWiki_Plugin { } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php index 5a3d945d1..9405d9420 100644 --- a/inc/parser/xhtml.php +++ b/inc/parser/xhtml.php @@ -734,9 +734,9 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $name = $this->_getLinkTitle($name, '', $isImage); if ( !$isImage ) { - $link['class']='mail JSnocheck'; + $link['class']='mail'; } else { - $link['class']='media JSnocheck'; + $link['class']='media'; } $address = $this->_xmlEntities($address); @@ -902,16 +902,23 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } // $numrows not yet implemented - function table_open($maxcols = NULL, $numrows = NULL, $pos){ + function table_open($maxcols = null, $numrows = null, $pos = null){ global $lang; // initialize the row counter used for classes $this->_counter['row_counter'] = 0; - $this->doc .= '<div class="table ' . $this->startSectionEdit($pos, 'table') . '"><table class="inline">'.DOKU_LF; + $class = 'table'; + if ($pos !== null) { + $class .= ' ' . $this->startSectionEdit($pos, 'table'); + } + $this->doc .= '<div class="' . $class . '"><table class="inline">' . + DOKU_LF; } - function table_close($pos){ + function table_close($pos = null){ $this->doc .= '</table></div>'.DOKU_LF; - $this->finishSectionEdit($pos); + if ($pos !== null) { + $this->finishSectionEdit($pos); + } } function tablerow_open(){ @@ -1198,4 +1205,4 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/parser/xhtmlsummary.php b/inc/parser/xhtmlsummary.php index b187fef01..95f86cbef 100644 --- a/inc/parser/xhtmlsummary.php +++ b/inc/parser/xhtmlsummary.php @@ -87,4 +87,4 @@ class Doku_Renderer_xhtmlsummary extends Doku_Renderer_xhtml { } -//Setup VIM: ex: et ts=2 enc=utf-8 : +//Setup VIM: ex: et ts=2 : diff --git a/inc/parserutils.php b/inc/parserutils.php index 27a5190bd..9b2d99328 100644 --- a/inc/parserutils.php +++ b/inc/parserutils.php @@ -10,6 +10,13 @@ if(!defined('DOKU_INC')) die('meh.'); /** + * For how many different pages shall the first heading be loaded from the + * metadata? When this limit is reached the title index is loaded and used for + * all following requests. + */ +if (!defined('P_GET_FIRST_HEADING_METADATA_LIMIT')) define('P_GET_FIRST_HEADING_METADATA_LIMIT', 10); + +/** * Returns the parsed Wikitext in XHTML for the given id and revision. * * If $excuse is true an explanation is returned if the file @@ -220,10 +227,16 @@ 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 boolean $render If the page should be rendererd when the cache can't be used - default true + * @return mixed The requested metadata fields + * * @author Esther Brunner <esther@kaffeehaus.ch> + * @author Michael Hamann <michael@content-space.de> */ -function p_get_metadata($id, $key='', $render=false){ - global $ID, $INFO, $cache_metadata; +function p_get_metadata($id, $key='', $render=true){ + global $ID; // cache the current page // Benchmarking shows the current page's metadata is generally the only page metadata @@ -231,14 +244,26 @@ function p_get_metadata($id, $key='', $render=false){ $cache = ($ID == $id); $meta = p_read_metadata($id, $cache); - // metadata has never been rendered before - do it! (but not for non-existent pages) - if ($render && !isset($meta['current']['description']['abstract']) && page_exists($id)){ - $meta = p_render_metadata($id, $meta); - io_saveFile(metaFN($id, '.meta'), serialize($meta)); + // prevent recursive calls in the cache + static $recursion = false; + if (!$recursion && $render){ + $recursion = true; + + $cachefile = new cache_renderer($id, wikiFN($id), 'metadata'); + + if (page_exists($id) && !$cachefile->useCache()){ + $old_meta = $meta; + $meta = p_render_metadata($id, $meta); + // only update the file when the metadata has been changed + if ($meta == $old_meta || p_save_metadata($id, $meta)) { + // store a timestamp in order to make sure that the cachefile is touched + $cachefile->storeCache(time()); + } elseif ($meta != $old_meta) { + msg('Unable to save metadata file. Hint: disk full; file permissions; safe_mode setting.',-1); + } + } - // sync cached copies, including $INFO metadata - if (!empty($cache_metadata[$id])) $cache_metadata[$id] = $meta; - if (!empty($INFO) && ($id == $INFO['id'])) { $INFO['meta'] = $meta['current']; } + $recursion = false; } $val = $meta['current']; @@ -256,19 +281,35 @@ function p_get_metadata($id, $key='', $render=false){ /** * sets metadata elements of a page * + * @see http://www.dokuwiki.org/devel:metadata#functions_to_get_and_set_metadata + * + * @param String $id is the ID of a wiki page + * @param Array $data is an array with key ⇒ value pairs to be set in the metadata + * @param Boolean $render whether or not the page metadata should be generated with the renderer + * @param Boolean $persistent indicates whether or not the particular metadata value will persist through + * the next metadata rendering. + * @return boolean true on success + * * @author Esther Brunner <esther@kaffeehaus.ch> + * @author Michael Hamann <michael@content-space.de> */ function p_set_metadata($id, $data, $render=false, $persistent=true){ if (!is_array($data)) return false; - global $ID; + global $ID, $METADATA_RENDERERS; - // cache the current page - $cache = ($ID == $id); - $orig = p_read_metadata($id, $cache); + // if there is currently a renderer change the data in the renderer instead + if (isset($METADATA_RENDERERS[$id])) { + $orig =& $METADATA_RENDERERS[$id]; + $meta = $orig; + } else { + // cache the current page + $cache = ($ID == $id); + $orig = p_read_metadata($id, $cache); - // render metadata first? - $meta = $render ? p_render_metadata($id, $orig) : $orig; + // render metadata first? + $meta = $render ? p_render_metadata($id, $orig) : $orig; + } // now add the passed metadata $protected = array('description', 'date', 'contributor'); @@ -305,13 +346,13 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){ // save only if metadata changed if ($meta == $orig) return true; - // sync cached copies, including $INFO metadata - global $cache_metadata, $INFO; - - if (!empty($cache_metadata[$id])) $cache_metadata[$id] = $meta; - if (!empty($INFO) && ($id == $INFO['id'])) { $INFO['meta'] = $meta['current']; } - - return io_saveFile(metaFN($id, '.meta'), serialize($meta)); + if (isset($METADATA_RENDERERS[$id])) { + // set both keys individually as the renderer has references to the individual keys + $METADATA_RENDERERS[$id]['current'] = $meta['current']; + $METADATA_RENDERERS[$id]['persistent'] = $meta['persistent']; + } else { + return p_save_metadata($id, $meta); + } } /** @@ -321,25 +362,22 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){ * @author Michael Klier <chi@chimeric.de> */ function p_purge_metadata($id) { - $metafn = metaFN('id', '.meta'); - $meta = p_read_metadata($id); + $meta = p_read_metadata($id); foreach($meta['current'] as $key => $value) { if(is_array($meta[$key])) { $meta['current'][$key] = array(); } else { $meta['current'][$key] = ''; } + } - return io_saveFile(metaFN($id, '.meta'), serialize($meta)); + return p_save_metadata($id, $meta); } /** * read the metadata from source/cache for $id * (internal use only - called by p_get_metadata & p_set_metadata) * - * this function also converts the metadata from the original format to - * the current format ('current' & 'persistent' arrays) - * * @author Christopher Smith <chris@jalakai.co.uk> * * @param string $id absolute wiki page id @@ -356,26 +394,6 @@ function p_read_metadata($id,$cache=false) { $file = metaFN($id, '.meta'); $meta = @file_exists($file) ? unserialize(io_readFile($file, false)) : array('current'=>array(),'persistent'=>array()); - // convert $meta from old format to new (current+persistent) format - if (!isset($meta['current'])) { - $meta = array('current'=>$meta,'persistent'=>$meta); - - // remove non-persistent keys - unset($meta['persistent']['title']); - unset($meta['persistent']['description']['abstract']); - unset($meta['persistent']['description']['tableofcontents']); - unset($meta['persistent']['relation']['haspart']); - unset($meta['persistent']['relation']['references']); - unset($meta['persistent']['date']['valid']); - - if (empty($meta['persistent']['description'])) unset($meta['persistent']['description']); - if (empty($meta['persistent']['relation'])) unset($meta['persistent']['relation']); - if (empty($meta['persistent']['date'])) unset($meta['persistent']['date']); - - // save converted metadata - io_saveFile($file, serialize($meta)); - } - if ($cache) { $cache_metadata[(string)$id] = $meta; } @@ -384,13 +402,39 @@ function p_read_metadata($id,$cache=false) { } /** + * This is the backend function to save a metadata array to a file + * + * @param string $id absolute wiki page id + * @param array $meta metadata + * + * @return bool success / fail + */ +function p_save_metadata($id, $meta) { + // sync cached copies, including $INFO metadata + global $cache_metadata, $INFO; + + if (isset($cache_metadata[$id])) $cache_metadata[$id] = $meta; + if (!empty($INFO) && ($id == $INFO['id'])) { $INFO['meta'] = $meta['current']; } + + return io_saveFile(metaFN($id, '.meta'), serialize($meta)); +} + +/** * renders the metadata of a page * * @author Esther Brunner <esther@kaffeehaus.ch> */ function p_render_metadata($id, $orig){ // make sure the correct ID is in global ID - global $ID; + global $ID, $METADATA_RENDERERS; + + // avoid recursive rendering processes for the same id + if (isset($METADATA_RENDERERS[$id])) + return $orig; + + // store the original metadata in the global $METADATA_RENDERERS so p_set_metadata can use it + $METADATA_RENDERERS[$id] =& $orig; + $keep = $ID; $ID = $id; @@ -405,13 +449,14 @@ function p_render_metadata($id, $orig){ $instructions = p_cached_instructions(wikiFN($id),false,$id); if(is_null($instructions)){ $ID = $keep; + unset($METADATA_RENDERERS[$id]); return null; // something went wrong with the instructions } // set up the renderer $renderer = new Doku_Renderer_metadata(); - $renderer->meta = $orig['current']; - $renderer->persistent = $orig['persistent']; + $renderer->meta =& $orig['current']; + $renderer->persistent =& $orig['persistent']; // loop through the instructions foreach ($instructions as $instruction){ @@ -419,11 +464,13 @@ function p_render_metadata($id, $orig){ call_user_func_array(array(&$renderer, $instruction[0]), (array) $instruction[1]); } - $evt->result = array('current'=>$renderer->meta,'persistent'=>$renderer->persistent); + $evt->result = array('current'=>&$renderer->meta,'persistent'=>&$renderer->persistent); } $evt->advise_after(); + // clean up $ID = $keep; + unset($METADATA_RENDERERS[$id]); return $evt->result; } @@ -609,9 +656,41 @@ function & p_get_renderer($mode) { * headings ... and so on. * * @author Andreas Gohr <andi@splitbrain.org> + * @author Michael Hamann <michael@content-space.de> */ function p_get_first_heading($id, $render=true){ - return p_get_metadata($id,'title',$render); + // counter how many titles have been requested using p_get_metadata + static $count = 1; + // the index of all titles, only loaded when many titles are requested + static $title_index = null; + // cache for titles requested using p_get_metadata + static $title_cache = array(); + + $id = cleanID($id); + + // check if this title has already been requested + if (isset($title_cache[$id])) + return $title_cache[$id]; + + // check if already too many titles have been requested and probably + // using the title index is better + if ($count > P_GET_FIRST_HEADING_METADATA_LIMIT) { + if (is_null($title_index)) { + $pages = array_map('rtrim', idx_getIndex('page', '')); + $titles = array_map('rtrim', idx_getIndex('title', '')); + // check for corrupt title index #FS2076 + if(count($pages) != count($titles)){ + $titles = array_fill(0,count($pages),''); + @unlink($conf['indexdir'].'/title.idx'); // will be rebuilt in inc/init.php + } + $title_index = array_combine($pages, $titles); + } + return $title_index[$id]; + } + + ++$count; + $title_cache[$id] = p_get_metadata($id,'title',$render); + return $title_cache[$id]; } /** diff --git a/inc/plugin.php b/inc/plugin.php index aff07c1e5..ec94433b6 100644 --- a/inc/plugin.php +++ b/inc/plugin.php @@ -33,7 +33,15 @@ class DokuWiki_Plugin { $parts = explode('_',get_class($this)); $info = DOKU_PLUGIN.'/'.$parts[2].'/plugin.info.txt'; if(@file_exists($info)) return confToHash($info); - trigger_error('getInfo() not implemented in '.get_class($this).' and '.$info.' not found', E_USER_WARNING); + + 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); + return array( + 'date' => '0000-00-00', + 'name' => $parts[2].' plugin', + ); } // plugin introspection methods @@ -88,10 +96,13 @@ class DokuWiki_Plugin { function localFN($id) { global $conf; $plugin = $this->getPluginName(); - $file = DOKU_PLUGIN.$plugin.'/lang/'.$conf['lang'].'/'.$id.'.txt'; - if(!@file_exists($file)){ - //fall back to english - $file = DOKU_PLUGIN.$plugin.'/lang/en/'.$id.'.txt'; + $file = DOKU_CONF.'/plugin_lang/'.$plugin.'/'.$conf['lang'].'/'.$id.'.txt'; + if (!@file_exists($file)){ + $file = DOKU_PLUGIN.$plugin.'/lang/'.$conf['lang'].'/'.$id.'.txt'; + if(!@file_exists($file)){ + //fall back to english + $file = DOKU_PLUGIN.$plugin.'/lang/en/'.$id.'.txt'; + } } return $file; } diff --git a/inc/plugincontroller.class.php b/inc/plugincontroller.class.php index ad394e11f..cec5c73a9 100644 --- a/inc/plugincontroller.class.php +++ b/inc/plugincontroller.class.php @@ -96,7 +96,15 @@ class Doku_Plugin_Controller { //construct class and instantiate $class = $type.'_plugin_'.$name; - if (!class_exists($class)) return null; + if (!class_exists($class)){ + # the plugin might be in the wrong directory + $inf = confToHash(DOKU_PLUGIN."$dir/plugin.info.txt"); + if($inf['base'] && $inf['base'] != $plugin){ + msg("Plugin installed incorrectly. Rename plugin directory '". + hsc($plugin)."' to '".hsc($inf['base'])."'.",-1); + } + return null; + } $DOKU_PLUGINS[$type][$name] = new $class; return $DOKU_PLUGINS[$type][$name]; @@ -125,6 +133,7 @@ class Doku_Plugin_Controller { } function _populateMasterList() { + global $conf; if ($dh = opendir(DOKU_PLUGIN)) { while (false !== ($plugin = readdir($dh))) { if ($plugin[0] == '.') continue; // skip hidden entries @@ -134,7 +143,9 @@ class Doku_Plugin_Controller { // the plugin was disabled by rc2009-01-26 // disabling mechanism was changed back very soon again // to keep everything simple we just skip the plugin completely - }elseif(@file_exists(DOKU_PLUGIN.$plugin.'/disabled')){ + }elseif(@file_exists(DOKU_PLUGIN.$plugin.'/disabled') || + ($plugin === 'plugin' && isset($conf['pluginmanager']) && + !$conf['pluginmanager'])){ $this->list_disabled[] = $plugin; } else { $this->list_enabled[] = $plugin; diff --git a/inc/search.php b/inc/search.php index 8273eef8c..db0b008f0 100644 --- a/inc/search.php +++ b/inc/search.php @@ -119,7 +119,7 @@ function search_index(&$data,$base,$file,$type,$lvl,$opts){ return false; } - $id = pathID($file); + $id = pathID($file,($type == 'd')); if($type=='d' && $conf['sneaky_index'] && auth_quickaclcheck($id.':') < AUTH_READ){ return false; @@ -511,8 +511,7 @@ function pathID($path,$keeptxt=false){ $id = utf8_decodeFN($path); $id = str_replace('/',':',$id); if(!$keeptxt) $id = preg_replace('#\.txt$#','',$id); - $id = preg_replace('#^:+#','',$id); - $id = preg_replace('#:+$#','',$id); + $id = trim($id, ':'); return $id; } @@ -550,7 +549,7 @@ 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,$opts['keeptxt']); + $item['id'] = pathID($file,($type == 'd' || $opts['keeptxt'])); if($item['id'] != cleanID($item['id'])){ if($opts['showmsg']) msg(hsc($item['id']).' is not a valid file name for DokuWiki - skipped',-1); @@ -625,4 +624,4 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){ return $return; } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : diff --git a/inc/subscription.php b/inc/subscription.php index 52091bafe..8e3a99a8f 100644 --- a/inc/subscription.php +++ b/inc/subscription.php @@ -44,9 +44,27 @@ function subscription_filename($id) { * * @author Adrian Lang <lang@cosmocode.de> */ +function subscription_lock_filename ($id){ + global $conf; + return $conf['lockdir'].'/_subscr_' . md5($id) . '.lock'; +} + function subscription_lock($id) { - $lockf = subscription_filename($id) . '.lock'; - return !file_exists($lockf) && touch($lockf); + global $conf; + $lock = subscription_lock_filename($id); + + if (is_dir($lock) && time()-@filemtime($lock) > 60*5) { + // looks like a stale lock - remove it + @rmdir($lock); + } + + // try creating the lock directory + if (!@mkdir($lock,$conf['dmode'])) { + return false; + } + + if($conf['dperm']) chmod($lock, $conf['dperm']); + return true; } /** @@ -58,8 +76,8 @@ function subscription_lock($id) { * @author Adrian Lang <lang@cosmocode.de> */ function subscription_unlock($id) { - $lockf = subscription_filename($id) . '.lock'; - return file_exists($lockf) && unlink($lockf); + $lockf = subscription_lock_filename($id); + return @rmdir($lockf); } /** @@ -98,7 +116,7 @@ function subscription_set($user, $page, $style, $data = null, // io_deleteFromFile does not return false if no line matched. return io_deleteFromFile($file, - subscription_regex(array('user' => $user)), + subscription_regex(array('user' => auth_nameencode($user))), true); } @@ -158,6 +176,10 @@ function subscription_find($page, $pre) { // This is an old subscription file. $subscription = trim($subscription) . " every\n"; } + + list($user, $rest) = explode(' ', $subscription, 2); + $subscription = rawurldecode($user) . " " . $rest; + if (preg_match(subscription_regex($pre), $subscription, $line_matches) === 0) { continue; @@ -251,7 +273,7 @@ function subscription_addresslist(&$data){ $self = $data['self']; $addresslist = $data['addresslist']; - if (!$conf['subscribers']) { + if (!$conf['subscribers'] || $auth === null) { return ''; } $pres = array('style' => 'every', 'escaped' => true); diff --git a/inc/template.php b/inc/template.php index c2ce130ff..0f0fb92a0 100644 --- a/inc/template.php +++ b/inc/template.php @@ -93,7 +93,7 @@ function tpl_content_core(){ break; case 'index': html_index($IDX); #FIXME can this be pulled from globals? is it sanitized correctly? - break; + break; case 'backlink': html_backlinks(); break; @@ -209,14 +209,9 @@ function tpl_admin(){ } if ($plugin !== null){ - if($plugin->forAdminOnly() && !$INFO['isadmin']){ - msg('For admins only',-1); - html_admin(); - }else{ - if(!is_array($TOC)) $TOC = $plugin->getTOC(); //if TOC wasn't requested yet - if($INFO['prependTOC']) tpl_toc(); - $plugin->html(); - } + if(!is_array($TOC)) $TOC = $plugin->getTOC(); //if TOC wasn't requested yet + if($INFO['prependTOC']) tpl_toc(); + $plugin->html(); }else{ html_admin(); } @@ -581,18 +576,25 @@ function tpl_get_action($type) { $accesskey = 'b'; break; case 'login': - if(!$conf['useacl'] || !$auth){ - return false; - } $params['sectok'] = getSecurityToken(); if(isset($_SERVER['REMOTE_USER'])){ - if (!$auth->canDo('logout')) { + if (!actionOK('logout')) { return false; } $params['do'] = 'logout'; $type = 'logout'; } break; + case 'register': + if($_SERVER['REMOTE_USER']){ + return false; + } + break; + case 'resendpwd': + if($_SERVER['REMOTE_USER']){ + return false; + } + break; case 'admin': if(!$INFO['ismanager']){ return false; @@ -609,20 +611,19 @@ function tpl_get_action($type) { $type = 'subscribe'; $params['do'] = 'subscribe'; case 'subscribe': - if(!$conf['useacl'] || !$auth || $ACT !== 'show' || !$conf['subscribers'] || !$_SERVER['REMOTE_USER']){ + if(!$_SERVER['REMOTE_USER']){ return false; } break; case 'backlink': break; case 'profile': - if(!$conf['useacl'] || !$auth || !isset($_SERVER['REMOTE_USER']) || - !$auth->canDo('Profile') || ($ACT=='profile')){ + if(!isset($_SERVER['REMOTE_USER'])){ return false; } break; case 'subscribens': - // Superseeded by subscribe/subscription + // Superseded by subscribe/subscription return ''; break; default: @@ -685,7 +686,7 @@ function tpl_searchform($ajax=true,$autocomplete=true){ * * @author Andreas Gohr <andi@splitbrain.org> */ -function tpl_breadcrumbs($sep='»'){ +function tpl_breadcrumbs($sep='•'){ global $lang; global $conf; @@ -739,48 +740,30 @@ function tpl_youarehere($sep=' » '){ $parts = explode(':', $ID); $count = count($parts); - if($GLOBALS['ACT'] == 'search') - { - $parts = array($conf['start']); - $count = 1; - } - echo '<span class="bchead">'.$lang['youarehere'].': </span>'; // always print the startpage - $title = useHeading('navigation') ? p_get_first_heading($conf['start']) : $conf['start']; - if(!$title) $title = $conf['start']; - tpl_link(wl($conf['start']),hsc($title),'title="'.$conf['start'].'"'); + tpl_pagelink(':'.$conf['start']); // print intermediate namespace links $part = ''; for($i=0; $i<$count - 1; $i++){ $part .= $parts[$i].':'; $page = $part; - resolve_pageid('',$page,$exists); if ($page == $conf['start']) continue; // Skip startpage // output echo $sep; - if($exists){ - $title = useHeading('navigation') ? p_get_first_heading($page) : $parts[$i]; - tpl_link(wl($page),hsc($title),'title="'.$page.'"'); - }else{ - tpl_link(wl($page),$parts[$i],'title="'.$page.'" class="wikilink2" rel="nofollow"'); - } + tpl_pagelink($page); } // print current page, skipping start page, skipping for namespace index + resolve_pageid('',$page,$exists); if(isset($page) && $page==$part.$parts[$i]) return; $page = $part.$parts[$i]; if($page == $conf['start']) return; echo $sep; - if(page_exists($page)){ - $title = useHeading('navigation') ? p_get_first_heading($page) : $parts[$i]; - tpl_link(wl($page),hsc($title),'title="'.$page.'"'); - }else{ - tpl_link(wl($page),$parts[$i],'title="'.$page.'" class="wikilink2" rel="nofollow"'); - } + tpl_pagelink($page); return true; } @@ -796,7 +779,7 @@ function tpl_userinfo(){ global $lang; global $INFO; if(isset($_SERVER['REMOTE_USER'])){ - print $lang['loggedinas'].': '.$INFO['userinfo']['name'].' ('.$_SERVER['REMOTE_USER'].')'; + print $lang['loggedinas'].': '.hsc($INFO['userinfo']['name']).' ('.hsc($_SERVER['REMOTE_USER']).')'; return true; } return false; @@ -1000,8 +983,6 @@ function tpl_indexerWebBug(){ global $INFO; if(!$INFO['exists']) return false; - if(isHiddenPage($ID)) return false; //no need to index hidden pages - $p = array(); $p['src'] = DOKU_BASE.'lib/exe/indexer.php?id='.rawurlencode($ID). '&'.time(); @@ -1178,7 +1159,7 @@ function tpl_actiondropdown($empty='',$button='>'){ if($REV) echo '<input type="hidden" name="rev" value="'.$REV.'" />'; echo '<input type="hidden" name="sectok" value="'.getSecurityToken().'" />'; - echo '<select name="do" id="action__selector" class="edit">'; + echo '<select name="do" class="edit quickselect">'; echo '<option value="">'.$empty.'</option>'; echo '<optgroup label=" — ">'; @@ -1218,7 +1199,7 @@ function tpl_actiondropdown($empty='',$button='>'){ echo '</optgroup>'; echo '</select>'; - echo '<input type="submit" value="'.$button.'" id="action__selectorbtn" />'; + echo '<input type="submit" value="'.$button.'" />'; echo '</form>'; } @@ -1248,7 +1229,7 @@ function tpl_license($img='badge',$imgonly=false,$return=false){ } if(!$imgonly) { $out .= $lang['license']; - $out .= '<a href="'.$lic['url'].'" rel="license" class="urlextern"'; + $out .= ' <a href="'.$lic['url'].'" rel="license" class="urlextern"'; if($conf['target']['extern']) $out .= ' target="'.$conf['target']['extern'].'"'; $out .= '>'.$lic['name'].'</a>'; } @@ -1359,5 +1340,18 @@ function tpl_flush(){ } -//Setup VIM: ex: et ts=4 enc=utf-8 : +/** + * Use favicon.ico from data/media root directory if it exists, otherwise use + * the one in the template's image directory. + * + * @author Anika Henke <anika@selfthinker.org> + */ +function tpl_getFavicon() { + if (file_exists(mediaFN('favicon.ico'))) + return ml('favicon.ico'); + return DOKU_TPL.'images/favicon.ico'; +} + + +//Setup VIM: ex: et ts=4 : diff --git a/inc/toolbar.php b/inc/toolbar.php index 8bcf6f030..58d80043c 100644 --- a/inc/toolbar.php +++ b/inc/toolbar.php @@ -252,4 +252,4 @@ function toolbar_signature(){ return $sig; } -//Setup VIM: ex: et ts=4 enc=utf-8 : +//Setup VIM: ex: et ts=4 : |