summaryrefslogtreecommitdiff
path: root/inc
diff options
context:
space:
mode:
Diffstat (limited to 'inc')
-rw-r--r--inc/HTTPClient.php2
-rw-r--r--inc/Input.class.php20
-rw-r--r--inc/RemoteAPICore.php11
-rw-r--r--inc/changelog.php825
-rw-r--r--inc/common.php165
-rw-r--r--inc/form.php18
-rw-r--r--inc/html.php456
-rw-r--r--inc/indexer.php15
-rw-r--r--inc/lang/af/lang.php2
-rw-r--r--inc/lang/ar/lang.php4
-rw-r--r--inc/lang/az/lang.php2
-rw-r--r--inc/lang/bg/lang.php34
-rw-r--r--inc/lang/bg/register.txt2
-rw-r--r--inc/lang/bg/resendpwd.txt2
-rw-r--r--inc/lang/bn/lang.php1
-rw-r--r--inc/lang/ca-valencia/lang.php2
-rw-r--r--inc/lang/ca/lang.php2
-rw-r--r--inc/lang/cs/lang.php4
-rw-r--r--inc/lang/da/lang.php4
-rw-r--r--inc/lang/de-informal/lang.php4
-rw-r--r--inc/lang/de/lang.php6
-rw-r--r--inc/lang/el/lang.php4
-rw-r--r--inc/lang/en/lang.php10
-rw-r--r--inc/lang/eo/denied.txt2
-rw-r--r--inc/lang/eo/lang.php9
-rw-r--r--inc/lang/es/jquery.ui.datepicker.js4
-rw-r--r--inc/lang/es/lang.php25
-rw-r--r--inc/lang/et/lang.php2
-rw-r--r--inc/lang/eu/lang.php4
-rw-r--r--inc/lang/fa/lang.php4
-rw-r--r--inc/lang/fi/lang.php4
-rw-r--r--inc/lang/fo/lang.php2
-rw-r--r--inc/lang/fr/lang.php13
-rw-r--r--inc/lang/fr/subscr_form.txt2
-rw-r--r--inc/lang/gl/lang.php4
-rw-r--r--inc/lang/he/lang.php6
-rw-r--r--inc/lang/hi/lang.php2
-rw-r--r--inc/lang/hr/lang.php2
-rw-r--r--inc/lang/hu/lang.php4
-rw-r--r--inc/lang/ia/lang.php2
-rw-r--r--inc/lang/id/lang.php110
-rw-r--r--inc/lang/id/resetpwd.txt3
-rw-r--r--inc/lang/id/subscr_digest.txt17
-rw-r--r--inc/lang/is/lang.php2
-rw-r--r--inc/lang/it/lang.php4
-rw-r--r--inc/lang/ja/lang.php4
-rw-r--r--inc/lang/ka/admin.txt4
-rw-r--r--inc/lang/ka/adminplugins.txt1
-rw-r--r--inc/lang/ka/backlinks.txt4
-rw-r--r--inc/lang/ka/conflict.txt5
-rw-r--r--inc/lang/ka/denied.txt3
-rw-r--r--inc/lang/ka/diff.txt3
-rw-r--r--inc/lang/ka/draft.txt3
-rw-r--r--inc/lang/ka/edit.txt2
-rw-r--r--inc/lang/ka/editrev.txt2
-rw-r--r--inc/lang/ka/index.txt1
-rw-r--r--inc/lang/ka/lang.php117
-rw-r--r--inc/lang/kk/lang.php2
-rw-r--r--inc/lang/km/lang.php2
-rw-r--r--inc/lang/ko/lang.php46
-rw-r--r--inc/lang/ko/searchpage.txt2
-rw-r--r--inc/lang/ko/subscr_digest.txt2
-rw-r--r--inc/lang/ko/updateprofile.txt2
-rw-r--r--inc/lang/ku/lang.php2
-rw-r--r--inc/lang/la/lang.php2
-rw-r--r--inc/lang/lb/lang.php2
-rw-r--r--inc/lang/lt/lang.php2
-rw-r--r--inc/lang/lv/lang.php4
-rw-r--r--inc/lang/mk/lang.php2
-rw-r--r--inc/lang/mr/lang.php4
-rw-r--r--inc/lang/ne/lang.php2
-rw-r--r--inc/lang/nl/lang.php9
-rw-r--r--inc/lang/no/lang.php11
-rw-r--r--inc/lang/no/resetpwd.txt3
-rw-r--r--inc/lang/pl/lang.php4
-rw-r--r--inc/lang/pt-br/lang.php4
-rw-r--r--inc/lang/pt/lang.php4
-rw-r--r--inc/lang/ro/lang.php4
-rw-r--r--inc/lang/ru/lang.php8
-rw-r--r--inc/lang/sk/lang.php4
-rw-r--r--inc/lang/sl/lang.php11
-rw-r--r--inc/lang/sq/lang.php2
-rw-r--r--inc/lang/sr/lang.php2
-rw-r--r--inc/lang/sv/lang.php4
-rw-r--r--inc/lang/th/lang.php2
-rw-r--r--inc/lang/tr/lang.php4
-rw-r--r--inc/lang/uk/lang.php2
-rw-r--r--inc/lang/vi/lang.php4
-rw-r--r--inc/lang/zh-tw/lang.php4
-rw-r--r--inc/lang/zh/lang.php8
-rw-r--r--inc/media.php24
-rw-r--r--inc/parser/handler.php73
-rw-r--r--inc/parser/renderer.php52
-rw-r--r--inc/parser/xhtml.php27
-rw-r--r--inc/parserutils.php5
-rw-r--r--inc/plugin.php2
-rw-r--r--inc/subscription.php6
-rw-r--r--inc/template.php125
98 files changed, 1920 insertions, 535 deletions
diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php
index 53f3c9a78..f8b836753 100644
--- a/inc/HTTPClient.php
+++ b/inc/HTTPClient.php
@@ -552,7 +552,7 @@ class HTTPClient {
$request = "CONNECT {$requestinfo['host']}:{$requestinfo['port']} HTTP/1.0".HTTP_NL;
$request .= "Host: {$requestinfo['host']}".HTTP_NL;
if($this->proxy_user) {
- $request .= 'Proxy-Authorization Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass).HTTP_NL;
+ $request .= 'Proxy-Authorization: Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass).HTTP_NL;
}
$request .= HTTP_NL;
diff --git a/inc/Input.class.php b/inc/Input.class.php
index de8bf5b97..e7eef1c29 100644
--- a/inc/Input.class.php
+++ b/inc/Input.class.php
@@ -144,6 +144,26 @@ class Input {
}
/**
+ * Access a request parameter and make sure it is has a valid value
+ *
+ * Please note that comparisons to the valid values are not done typesafe (request vars
+ * are always strings) however the function will return the correct type from the $valids
+ * array when an match was found.
+ *
+ * @param string $name Parameter name
+ * @param array $valids Array of valid values
+ * @param mixed $default Default to return if parameter isn't set or not valid
+ * @return null|mixed
+ */
+ public function valid($name, $valids, $default = null) {
+ if(!isset($this->access[$name])) return $default;
+ if(is_array($this->access[$name])) return $default; // we don't allow arrays
+ $found = array_search($this->access[$name], $valids);
+ if($found !== false) return $valids[$found]; // return the valid value for type safety
+ return $default;
+ }
+
+ /**
* Access a request parameter as bool
*
* Note: $nonempty is here for interface consistency and makes not much sense for booleans
diff --git a/inc/RemoteAPICore.php b/inc/RemoteAPICore.php
index a26c2d0de..ffa03ee93 100644
--- a/inc/RemoteAPICore.php
+++ b/inc/RemoteAPICore.php
@@ -378,7 +378,8 @@ class RemoteAPICore {
throw new RemoteException('The requested page does not exist', 121);
}
- $info = getRevisionInfo($id, $time, 1024);
+ $pagelog = new PageChangeLog($id, 1024);
+ $info = $pagelog->getRevisionInfo($time);
$data = array(
'name' => $id,
@@ -650,11 +651,12 @@ class RemoteAPICore {
throw new RemoteException('Empty page ID', 131);
}
- $revisions = getRevisions($id, $first, $conf['recent']+1);
+ $pagelog = new PageChangeLog($id);
+ $revisions = $pagelog->getRevisions($first, $conf['recent']+1);
if(count($revisions)==0 && $first!=0) {
$first=0;
- $revisions = getRevisions($id, $first, $conf['recent']+1);
+ $revisions = $pagelog->getRevisions($first, $conf['recent']+1);
}
if(count($revisions)>0 && $first==0) {
@@ -676,7 +678,8 @@ class RemoteAPICore {
// case this can lead to less pages being returned than
// specified via $conf['recent']
if($time){
- $info = getRevisionInfo($id, $time, 1024);
+ $pagelog->setChunkSize(1024);
+ $info = $pagelog->getRevisionInfo($time);
if(!empty($info)) {
$data['user'] = $info['user'];
$data['ip'] = $info['ip'];
diff --git a/inc/changelog.php b/inc/changelog.php
index cd46b1ec0..de06c9683 100644
--- a/inc/changelog.php
+++ b/inc/changelog.php
@@ -338,95 +338,684 @@ function _handleRecent($line,$ns,$flags,&$seen){
}
/**
- * Get the changelog information for a specific page id
- * and revision (timestamp). Adjacent changelog lines
- * are optimistically parsed and cached to speed up
- * consecutive calls to getRevisionInfo. For large
- * changelog files, only the chunk containing the
- * requested changelog line is read.
- *
- * @author Ben Coburn <btcoburn@silicodon.net>
- * @author Kate Arzamastseva <pshns@ukr.net>
+ * Class ChangeLog
+ * methods for handling of changelog of pages or media files
*/
-function getRevisionInfo($id, $rev, $chunk_size=8192, $media=false) {
- global $cache_revinfo;
- $cache =& $cache_revinfo;
- if (!isset($cache[$id])) { $cache[$id] = array(); }
- $rev = max($rev, 0);
-
- // check if it's already in the memory cache
- if (isset($cache[$id]) && isset($cache[$id][$rev])) {
- return $cache[$id][$rev];
+abstract class ChangeLog {
+
+ /** @var string */
+ protected $id;
+ /** @var int */
+ protected $chunk_size;
+ /** @var array */
+ protected $cache;
+
+ /**
+ * Constructor
+ *
+ * @param string $id page id
+ * @param int $chunk_size maximum block size read from file
+ */
+ public function __construct($id, $chunk_size = 8192) {
+ global $cache_revinfo;
+
+ $this->cache =& $cache_revinfo;
+ if(!isset($this->cache[$id])) {
+ $this->cache[$id] = array();
+ }
+
+ $this->id = $id;
+ $this->setChunkSize($chunk_size);
+
}
- if ($media) {
- $file = mediaMetaFN($id, '.changes');
- } else {
- $file = metaFN($id, '.changes');
+ /**
+ * Set chunk size for file reading
+ * Chunk size zero let read whole file at once
+ *
+ * @param int $chunk_size maximum block size read from file
+ */
+ public function setChunkSize($chunk_size) {
+ if(!is_numeric($chunk_size)) $chunk_size = 0;
+
+ $this->chunk_size = (int) max($chunk_size, 0);
}
- if (!@file_exists($file)) { return false; }
- if (filesize($file)<$chunk_size || $chunk_size==0) {
- // read whole file
- $lines = file($file);
- if ($lines===false) { return false; }
- } else {
- // read by chunk
- $fp = fopen($file, 'rb'); // "file pointer"
- if ($fp===false) { return false; }
- $head = 0;
- fseek($fp, 0, SEEK_END);
- $tail = ftell($fp);
- $finger = 0;
- $finger_rev = 0;
-
- // find chunk
- while ($tail-$head>$chunk_size) {
- $finger = $head+floor(($tail-$head)/2.0);
- fseek($fp, $finger);
- fgets($fp); // slip the finger forward to a new line
- $finger = ftell($fp);
- $tmp = fgets($fp); // then read at that location
- $tmp = parseChangelogLine($tmp);
- $finger_rev = $tmp['date'];
- if ($finger==$head || $finger==$tail) { break; }
- if ($finger_rev>$rev) {
- $tail = $finger;
- } else {
- $head = $finger;
+
+ /**
+ * Returns path to changelog
+ *
+ * @return string path to file
+ */
+ abstract protected function getChangelogFilename();
+
+ /**
+ * Returns path to current page/media
+ *
+ * @return string path to file
+ */
+ abstract protected function getFilename();
+
+ /**
+ * Get the changelog information for a specific page id and revision (timestamp)
+ *
+ * Adjacent changelog lines are optimistically parsed and cached to speed up
+ * consecutive calls to getRevisionInfo. For large changelog files, only the chunk
+ * containing the requested changelog line is read.
+ *
+ * @param int $rev revision timestamp
+ * @return bool|array false or array with entries:
+ * - date: unix timestamp
+ * - ip: IPv4 address (127.0.0.1)
+ * - type: log line type
+ * - id: page id
+ * - user: user name
+ * - sum: edit summary (or action reason)
+ * - extra: extra data (varies by line type)
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+ public function getRevisionInfo($rev) {
+ $rev = max($rev, 0);
+
+ // check if it's already in the memory cache
+ if(isset($this->cache[$this->id]) && isset($this->cache[$this->id][$rev])) {
+ return $this->cache[$this->id][$rev];
+ }
+
+ //read lines from changelog
+ list($fp, $lines) = $this->readloglines($rev);
+ if($fp) {
+ fclose($fp);
+ }
+ if(empty($lines)) return false;
+
+ // parse and cache changelog lines
+ foreach($lines as $value) {
+ $tmp = parseChangelogLine($value);
+ if($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ }
+ }
+ if(!isset($this->cache[$this->id][$rev])) {
+ return false;
+ }
+ return $this->cache[$this->id][$rev];
+ }
+
+ /**
+ * Return a list of page revisions numbers
+ *
+ * Does not guarantee that the revision exists in the attic,
+ * only that a line with the date exists in the changelog.
+ * By default the current revision is skipped.
+ *
+ * The current revision is automatically skipped when the page exists.
+ * See $INFO['meta']['last_change'] for the current revision.
+ * A negative $first let read the current revision too.
+ *
+ * For efficiency, the log lines are parsed and cached for later
+ * calls to getRevisionInfo. Large changelog files are read
+ * backwards in chunks until the requested number of changelog
+ * lines are recieved.
+ *
+ * @param int $first skip the first n changelog lines
+ * @param int $num number of revisions to return
+ * @return array with the revision timestamps
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+ public function getRevisions($first, $num) {
+ $revs = array();
+ $lines = array();
+ $count = 0;
+
+ $num = max($num, 0);
+ if($num == 0) {
+ return $revs;
+ }
+
+ if($first < 0) {
+ $first = 0;
+ } else if(@file_exists($this->getFilename())) {
+ // skip current revision if the page exists
+ $first = max($first + 1, 0);
+ }
+
+ $file = $this->getChangelogFilename();
+
+ if(!@file_exists($file)) {
+ return $revs;
+ }
+ if(filesize($file) < $this->chunk_size || $this->chunk_size == 0) {
+ // read whole file
+ $lines = file($file);
+ if($lines === false) {
+ return $revs;
+ }
+ } else {
+ // read chunks backwards
+ $fp = fopen($file, 'rb'); // "file pointer"
+ if($fp === false) {
+ return $revs;
+ }
+ fseek($fp, 0, SEEK_END);
+ $tail = ftell($fp);
+
+ // chunk backwards
+ $finger = max($tail - $this->chunk_size, 0);
+ while($count < $num + $first) {
+ $nl = $this->getNewlinepointer($fp, $finger);
+
+ // was the chunk big enough? if not, take another bite
+ if($nl > 0 && $tail <= $nl) {
+ $finger = max($finger - $this->chunk_size, 0);
+ continue;
+ } else {
+ $finger = $nl;
+ }
+
+ // read chunk
+ $chunk = '';
+ $read_size = max($tail - $finger, 0); // found chunk size
+ $got = 0;
+ while($got < $read_size && !feof($fp)) {
+ $tmp = @fread($fp, max(min($this->chunk_size, $read_size - $got), 0));
+ if($tmp === false) {
+ break;
+ } //error state
+ $got += strlen($tmp);
+ $chunk .= $tmp;
+ }
+ $tmp = explode("\n", $chunk);
+ array_pop($tmp); // remove trailing newline
+
+ // combine with previous chunk
+ $count += count($tmp);
+ $lines = array_merge($tmp, $lines);
+
+ // next chunk
+ if($finger == 0) {
+ break;
+ } // already read all the lines
+ else {
+ $tail = $finger;
+ $finger = max($tail - $this->chunk_size, 0);
+ }
}
+ fclose($fp);
+ }
+
+ // skip parsing extra lines
+ $num = max(min(count($lines) - $first, $num), 0);
+ if ($first > 0 && $num > 0) { $lines = array_slice($lines, max(count($lines) - $first - $num, 0), $num); }
+ else if($first > 0 && $num == 0) { $lines = array_slice($lines, 0, max(count($lines) - $first, 0)); }
+ else if($first == 0 && $num > 0) { $lines = array_slice($lines, max(count($lines) - $num, 0)); }
+
+ // handle lines in reverse order
+ for($i = count($lines) - 1; $i >= 0; $i--) {
+ $tmp = parseChangelogLine($lines[$i]);
+ if($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ $revs[] = $tmp['date'];
+ }
+ }
+
+ return $revs;
+ }
+
+ /**
+ * Get the nth revision left or right handside for a specific page id and revision (timestamp)
+ *
+ * For large changelog files, only the chunk containing the
+ * reference revision $rev is read and sometimes a next chunck.
+ *
+ * Adjacent changelog lines are optimistically parsed and cached to speed up
+ * consecutive calls to getRevisionInfo.
+ *
+ * @param int $rev revision timestamp used as startdate (doesn't need to be revisionnumber)
+ * @param int $direction give position of returned revision with respect to $rev; positive=next, negative=prev
+ * @return bool|int
+ * timestamp of the requested revision
+ * otherwise false
+ */
+ public function getRelativeRevision($rev, $direction) {
+ $rev = max($rev, 0);
+ $direction = (int) $direction;
+
+ //no direction given or last rev, so no follow-up
+ if(!$direction || ($direction > 0 && $this->isCurrentRevision($rev))) {
+ return false;
}
- if ($tail-$head<1) {
- // cound not find chunk, assume requested rev is missing
+ //get lines from changelog
+ list($fp, $lines, $head, $tail, $eof) = $this->readloglines($rev);
+ if(empty($lines)) return false;
+
+ // look for revisions later/earlier then $rev, when founded count till the wanted revision is reached
+ // also parse and cache changelog lines for getRevisionInfo().
+ $revcounter = 0;
+ $relativerev = false;
+ $checkotherchunck = true; //always runs once
+ while(!$relativerev && $checkotherchunck) {
+ $tmp = array();
+ //parse in normal or reverse order
+ $count = count($lines);
+ if($direction > 0) {
+ $start = 0;
+ $step = 1;
+ } else {
+ $start = $count - 1;
+ $step = -1;
+ }
+ for($i = $start; $i >= 0 && $i < $count; $i = $i + $step) {
+ $tmp = parseChangelogLine($lines[$i]);
+ if($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ //look for revs older/earlier then reference $rev and select $direction-th one
+ if(($direction > 0 && $tmp['date'] > $rev) || ($direction < 0 && $tmp['date'] < $rev)) {
+ $revcounter++;
+ if($revcounter == abs($direction)) {
+ $relativerev = $tmp['date'];
+ }
+ }
+ }
+ }
+
+ //true when $rev is found, but not the wanted follow-up.
+ $checkotherchunck = $fp
+ && ($tmp['date'] == $rev || ($revcounter > 0 && !$relativerev))
+ && !(($tail == $eof && $direction > 0) || ($head == 0 && $direction < 0));
+
+ if($checkotherchunck) {
+ list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, $direction);
+
+ if(empty($lines)) break;
+ }
+ }
+ if($fp) {
fclose($fp);
+ }
+
+ return $relativerev;
+ }
+
+ /**
+ * Returns revisions around rev1 and rev2
+ * When available it returns $max entries for each revision
+ *
+ * @param int $rev1 oldest revision timestamp
+ * @param int $rev2 newest revision timestamp (0 looks up last revision)
+ * @param int $max maximum number of revisions returned
+ * @return array with two arrays with revisions surrounding rev1 respectively rev2
+ */
+ public function getRevisionsAround($rev1, $rev2, $max = 50) {
+ $max = floor(abs($max) / 2)*2 + 1;
+ $rev1 = max($rev1, 0);
+ $rev2 = max($rev2, 0);
+
+ if($rev2) {
+ if($rev2 < $rev1) {
+ $rev = $rev2;
+ $rev2 = $rev1;
+ $rev1 = $rev;
+ }
+ } else {
+ //empty right side means a removed page. Look up last revision.
+ $revs = $this->getRevisions(-1, 1);
+ $rev2 = $revs[0];
+ }
+ //collect revisions around rev2
+ list($revs2, $allrevs, $fp, $lines, $head, $tail) = $this->retrieveRevisionsAround($rev2, $max);
+
+ if(empty($revs2)) return array(array(), array());
+
+ //collect revisions around rev1
+ $index = array_search($rev1, $allrevs);
+ if($index === false) {
+ //no overlapping revisions
+ list($revs1,,,,,) = $this->retrieveRevisionsAround($rev1, $max);
+ if(empty($revs1)) $revs1 = array();
+ } else {
+ //revisions overlaps, reuse revisions around rev2
+ $revs1 = $allrevs;
+ while($head > 0) {
+ for($i = count($lines) - 1; $i >= 0; $i--) {
+ $tmp = parseChangelogLine($lines[$i]);
+ if($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ $revs1[] = $tmp['date'];
+ $index++;
+
+ if($index > floor($max / 2)) break 2;
+ }
+ }
+
+ list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, -1);
+ }
+ sort($revs1);
+ //return wanted selection
+ $revs1 = array_slice($revs1, max($index - floor($max/2), 0), $max);
+ }
+
+ return array(array_reverse($revs1), array_reverse($revs2));
+ }
+
+ /**
+ * Returns lines from changelog.
+ * If file larger than $chuncksize, only chunck is read that could contain $rev.
+ *
+ * @param int $rev revision timestamp
+ * @return array(fp, array(changeloglines), $head, $tail, $eof)|bool
+ * returns false when not succeed. fp only defined for chuck reading, needs closing.
+ */
+ protected function readloglines($rev) {
+ $file = $this->getChangelogFilename();
+
+ if(!@file_exists($file)) {
return false;
}
- // read chunk
+ $fp = null;
+ $head = 0;
+ $tail = 0;
+ $eof = 0;
+
+ if(filesize($file) < $this->chunk_size || $this->chunk_size == 0) {
+ // read whole file
+ $lines = file($file);
+ if($lines === false) {
+ return false;
+ }
+ } else {
+ // read by chunk
+ $fp = fopen($file, 'rb'); // "file pointer"
+ if($fp === false) {
+ return false;
+ }
+ $head = 0;
+ fseek($fp, 0, SEEK_END);
+ $eof = ftell($fp);
+ $tail = $eof;
+
+ // find chunk
+ while($tail - $head > $this->chunk_size) {
+ $finger = $head + floor(($tail - $head) / 2.0);
+ $finger = $this->getNewlinepointer($fp, $finger);
+ $tmp = fgets($fp);
+ if($finger == $head || $finger == $tail) {
+ break;
+ }
+ $tmp = parseChangelogLine($tmp);
+ $finger_rev = $tmp['date'];
+
+ if($finger_rev > $rev) {
+ $tail = $finger;
+ } else {
+ $head = $finger;
+ }
+ }
+
+ if($tail - $head < 1) {
+ // cound not find chunk, assume requested rev is missing
+ fclose($fp);
+ return false;
+ }
+
+ $lines = $this->readChunk($fp, $head, $tail);
+ }
+ return array(
+ $fp,
+ $lines,
+ $head,
+ $tail,
+ $eof
+ );
+ }
+
+ /**
+ * Read chunk and return array with lines of given chunck.
+ * Has no check if $head and $tail are really at a new line
+ *
+ * @param $fp resource filepointer
+ * @param $head int start point chunck
+ * @param $tail int end point chunck
+ * @return array lines read from chunck
+ */
+ protected function readChunk($fp, $head, $tail) {
$chunk = '';
- $chunk_size = max($tail-$head, 0); // found chunk size
+ $chunk_size = max($tail - $head, 0); // found chunk size
$got = 0;
fseek($fp, $head);
- while ($got<$chunk_size && !feof($fp)) {
- $tmp = @fread($fp, max($chunk_size-$got, 0));
- if ($tmp===false) { break; } //error state
+ while($got < $chunk_size && !feof($fp)) {
+ $tmp = @fread($fp, max(min($this->chunk_size, $chunk_size - $got), 0));
+ if($tmp === false) { //error state
+ break;
+ }
$got += strlen($tmp);
$chunk .= $tmp;
}
$lines = explode("\n", $chunk);
array_pop($lines); // remove trailing newline
- fclose($fp);
+ return $lines;
+ }
+
+ /**
+ * Set pointer to first new line after $finger and return its position
+ *
+ * @param resource $fp filepointer
+ * @param $finger int a pointer
+ * @return int pointer
+ */
+ protected function getNewlinepointer($fp, $finger) {
+ fseek($fp, $finger);
+ $nl = $finger;
+ if($finger > 0) {
+ fgets($fp); // slip the finger forward to a new line
+ $nl = ftell($fp);
+ }
+ return $nl;
+ }
+
+ /**
+ * Check whether given revision is the current page
+ *
+ * @param int $rev timestamp of current page
+ * @return bool true if $rev is current revision, otherwise false
+ */
+ public function isCurrentRevision($rev) {
+ return $rev == @filemtime($this->getFilename());
+ }
+
+ /**
+ * Returns the next lines of the changelog of the chunck before head or after tail
+ *
+ * @param resource $fp filepointer
+ * @param int $head position head of last chunk
+ * @param int $tail position tail of last chunk
+ * @param int $direction positive forward, negative backward
+ * @return array with entries:
+ * - $lines: changelog lines of readed chunk
+ * - $head: head of chunk
+ * - $tail: tail of chunk
+ */
+ protected function readAdjacentChunk($fp, $head, $tail, $direction) {
+ if(!$fp) return array(array(), $head, $tail);
+
+ if($direction > 0) {
+ //read forward
+ $head = $tail;
+ $tail = $head + floor($this->chunk_size * (2 / 3));
+ $tail = $this->getNewlinepointer($fp, $tail);
+ } else {
+ //read backward
+ $tail = $head;
+ $head = max($tail - $this->chunk_size, 0);
+ while(true) {
+ $nl = $this->getNewlinepointer($fp, $head);
+ // was the chunk big enough? if not, take another bite
+ if($nl > 0 && $tail <= $nl) {
+ $head = max($head - $this->chunk_size, 0);
+ } else {
+ $head = $nl;
+ break;
+ }
+ }
+ }
+
+ //load next chunck
+ $lines = $this->readChunk($fp, $head, $tail);
+ return array($lines, $head, $tail);
}
- // parse and cache changelog lines
- foreach ($lines as $value) {
- $tmp = parseChangelogLine($value);
- if ($tmp!==false) {
- $cache[$id][$tmp['date']] = $tmp;
+ /**
+ * Collect the $max revisions near to the timestamp $rev
+ *
+ * @param int $rev revision timestamp
+ * @param int $max maximum number of revisions to be returned
+ * @return bool|array
+ * return array with entries:
+ * - $requestedrevs: array of with $max revision timestamps
+ * - $revs: all parsed revision timestamps
+ * - $fp: filepointer only defined for chuck reading, needs closing.
+ * - $lines: non-parsed changelog lines before the parsed revisions
+ * - $head: position of first readed changelogline
+ * - $lasttail: position of end of last readed changelogline
+ * otherwise false
+ */
+ protected function retrieveRevisionsAround($rev, $max) {
+ //get lines from changelog
+ list($fp, $lines, $starthead, $starttail, $eof) = $this->readloglines($rev);
+ if(empty($lines)) return false;
+
+ //parse chunk containing $rev, and read forward more chunks until $max/2 is reached
+ $head = $starthead;
+ $tail = $starttail;
+ $revs = array();
+ $aftercount = $beforecount = 0;
+ while(count($lines) > 0) {
+ foreach($lines as $line) {
+ $tmp = parseChangelogLine($line);
+ if($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ $revs[] = $tmp['date'];
+ if($tmp['date'] >= $rev) {
+ //count revs after reference $rev
+ $aftercount++;
+ if($aftercount == 1) $beforecount = count($revs);
+ }
+ //enough revs after reference $rev?
+ if($aftercount > floor($max / 2)) break 2;
+ }
+ }
+ //retrieve next chunk
+ list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, 1);
+ }
+ if($aftercount == 0) return false;
+
+ $lasttail = $tail;
+
+ //read additional chuncks backward until $max/2 is reached and total number of revs is equal to $max
+ $lines = array();
+ $i = 0;
+ if($aftercount > 0) {
+ $head = $starthead;
+ $tail = $starttail;
+ while($head > 0) {
+ list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, -1);
+
+ for($i = count($lines) - 1; $i >= 0; $i--) {
+ $tmp = parseChangelogLine($lines[$i]);
+ if($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ $revs[] = $tmp['date'];
+ $beforecount++;
+ //enough revs before reference $rev?
+ if($beforecount > max(floor($max / 2), $max - $aftercount)) break 2;
+ }
+ }
+ }
}
+ sort($revs);
+
+ //keep only non-parsed lines
+ $lines = array_slice($lines, 0, $i);
+ //trunk desired selection
+ $requestedrevs = array_slice($revs, -$max, $max);
+
+ return array($requestedrevs, $revs, $fp, $lines, $head, $lasttail);
}
- if (!isset($cache[$id][$rev])) { return false; }
- return $cache[$id][$rev];
+}
+
+/**
+ * Class PageChangelog handles changelog of a wiki page
+ */
+class PageChangelog extends ChangeLog {
+
+ /**
+ * Returns path to changelog
+ *
+ * @return string path to file
+ */
+ protected function getChangelogFilename() {
+ return metaFN($this->id, '.changes');
+ }
+
+ /**
+ * Returns path to current page/media
+ *
+ * @return string path to file
+ */
+ protected function getFilename() {
+ return wikiFN($this->id);
+ }
+}
+
+/**
+ * Class MediaChangelog handles changelog of a media file
+ */
+class MediaChangelog extends ChangeLog {
+
+ /**
+ * Returns path to changelog
+ *
+ * @return string path to file
+ */
+ protected function getChangelogFilename() {
+ return mediaMetaFN($this->id, '.changes');
+ }
+
+ /**
+ * Returns path to current page/media
+ *
+ * @return string path to file
+ */
+ protected function getFilename() {
+ return mediaFN($this->id);
+ }
+}
+
+/**
+ * Get the changelog information for a specific page id
+ * and revision (timestamp). Adjacent changelog lines
+ * are optimistically parsed and cached to speed up
+ * consecutive calls to getRevisionInfo. For large
+ * changelog files, only the chunk containing the
+ * requested changelog line is read.
+ *
+ * @deprecated 20-11-2013
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+function getRevisionInfo($id, $rev, $chunk_size = 8192, $media = false) {
+ if($media) {
+ $changelog = new MediaChangeLog($id, $chunk_size);
+ } else {
+ $changelog = new PageChangeLog($id, $chunk_size);
+ }
+ return $changelog->getRevisionInfo($rev);
}
/**
@@ -447,106 +1036,16 @@ function getRevisionInfo($id, $rev, $chunk_size=8192, $media=false) {
* backwards in chunks until the requested number of changelog
* lines are recieved.
*
+ * @deprecated 20-11-2013
+ *
* @author Ben Coburn <btcoburn@silicodon.net>
* @author Kate Arzamastseva <pshns@ukr.net>
*/
-function getRevisions($id, $first, $num, $chunk_size=8192, $media=false) {
- global $cache_revinfo;
- $cache =& $cache_revinfo;
- if (!isset($cache[$id])) { $cache[$id] = array(); }
-
- $revs = array();
- $lines = array();
- $count = 0;
- if ($media) {
- $file = mediaMetaFN($id, '.changes');
+function getRevisions($id, $first, $num, $chunk_size = 8192, $media = false) {
+ if($media) {
+ $changelog = new MediaChangeLog($id, $chunk_size);
} else {
- $file = metaFN($id, '.changes');
- }
- $num = max($num, 0);
- if ($num == 0) { return $revs; }
-
- $chunk_size = max($chunk_size, 0);
- if ($first<0) {
- $first = 0;
- } else if (!$media && @file_exists(wikiFN($id)) || $media && @file_exists(mediaFN($id))) {
- // skip current revision if the page exists
- $first = max($first+1, 0);
+ $changelog = new PageChangeLog($id, $chunk_size);
}
-
- if (!@file_exists($file)) { return $revs; }
- if (filesize($file)<$chunk_size || $chunk_size==0) {
- // read whole file
- $lines = file($file);
- if ($lines===false) { return $revs; }
- } else {
- // read chunks backwards
- $fp = fopen($file, 'rb'); // "file pointer"
- if ($fp===false) { return $revs; }
- fseek($fp, 0, SEEK_END);
- $tail = ftell($fp);
-
- // chunk backwards
- $finger = max($tail-$chunk_size, 0);
- while ($count<$num+$first) {
- fseek($fp, $finger);
- $nl = $finger;
- if ($finger>0) {
- fgets($fp); // slip the finger forward to a new line
- $nl = ftell($fp);
- }
-
- // was the chunk big enough? if not, take another bite
- if($nl > 0 && $tail <= $nl){
- $finger = max($finger-$chunk_size, 0);
- continue;
- }else{
- $finger = $nl;
- }
-
- // read chunk
- $chunk = '';
- $read_size = max($tail-$finger, 0); // found chunk size
- $got = 0;
- while ($got<$read_size && !feof($fp)) {
- $tmp = @fread($fp, max($read_size-$got, 0));
- if ($tmp===false) { break; } //error state
- $got += strlen($tmp);
- $chunk .= $tmp;
- }
- $tmp = explode("\n", $chunk);
- array_pop($tmp); // remove trailing newline
-
- // combine with previous chunk
- $count += count($tmp);
- $lines = array_merge($tmp, $lines);
-
- // next chunk
- if ($finger==0) { break; } // already read all the lines
- else {
- $tail = $finger;
- $finger = max($tail-$chunk_size, 0);
- }
- }
- fclose($fp);
- }
-
- // skip parsing extra lines
- $num = max(min(count($lines)-$first, $num), 0);
- if ($first>0 && $num>0) { $lines = array_slice($lines, max(count($lines)-$first-$num, 0), $num); }
- else if ($first>0 && $num==0) { $lines = array_slice($lines, 0, max(count($lines)-$first, 0)); }
- else if ($first==0 && $num>0) { $lines = array_slice($lines, max(count($lines)-$num, 0)); }
-
- // handle lines in reverse order
- for ($i = count($lines)-1; $i >= 0; $i--) {
- $tmp = parseChangelogLine($lines[$i]);
- if ($tmp!==false) {
- $cache[$id][$tmp['date']] = $tmp;
- $revs[] = $tmp['date'];
- }
- }
-
- return $revs;
+ return $changelog->getRevisions($first, $num);
}
-
-
diff --git a/inc/common.php b/inc/common.php
index 9fbebde94..110b91417 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -195,13 +195,14 @@ function pageinfo() {
$info['meta'] = p_get_metadata($ID);
//who's the editor
+ $pagelog = new PageChangeLog($ID, 1024);
if($REV) {
- $revinfo = getRevisionInfo($ID, $REV, 1024);
+ $revinfo = $pagelog->getRevisionInfo($REV);
} else {
if(!empty($info['meta']['last_change']) && is_array($info['meta']['last_change'])) {
$revinfo = $info['meta']['last_change'];
} else {
- $revinfo = getRevisionInfo($ID, $info['lastmod'], 1024);
+ $revinfo = $pagelog->getRevisionInfo($info['lastmod']);
// cache most recent changelog line in metadata if missing and still valid
if($revinfo !== false) {
$info['meta']['last_change'] = $revinfo;
@@ -1092,8 +1093,9 @@ function saveWikiText($id, $text, $summary, $minor = false) {
$wasRemoved = (trim($text) == ''); // check for empty or whitespace only
$wasCreated = !@file_exists($file);
$wasReverted = ($REV == true);
+ $pagelog = new PageChangeLog($id, 1024);
$newRev = false;
- $oldRev = getRevisions($id, -1, 1, 1024); // from changelog
+ $oldRev = $pagelog->getRevisions(-1, 1); // from changelog
$oldRev = (int) (empty($oldRev) ? 0 : $oldRev[0]);
if(!@file_exists(wikiFN($id, $old)) && @file_exists($file) && $old >= $oldRev) {
// add old revision to the attic if missing
@@ -1457,37 +1459,135 @@ function shorten($keep, $short, $max, $min = 9, $char = '…') {
* Return the users realname or e-mail address for use
* in page footer and recent changes pages
*
+ * @param string|bool $username or false when currently logged-in user should be used
+ * @param bool $textonly true returns only plain text, true allows returning html
+ * @return string html or plain text(not escaped) of formatted user name
+ *
* @author Andy Webber <dokuwiki AT andywebber DOT com>
*/
-function editorinfo($username) {
- global $conf;
+function editorinfo($username, $textonly = false) {
+ return userlink($username, $textonly);
+}
+
+/**
+ * Returns users realname w/o link
+ *
+ * @param string|bool $username or false when currently logged-in user should be used
+ * @param bool $textonly true returns only plain text, true allows returning html
+ * @return string html or plain text(not escaped) of formatted user name
+ *
+ * @triggers COMMON_USER_LINK
+ */
+function userlink($username = null, $textonly = false) {
+ global $conf, $INFO;
+ /** @var DokuWiki_Auth_Plugin $auth */
global $auth;
+ /** @var Input $INPUT */
+ global $INPUT;
- switch($conf['showuseras']) {
- case 'username':
- case 'email':
- case 'email_link':
- if($auth) $info = $auth->getUserData($username);
- break;
- default:
- return hsc($username);
- }
-
- if(isset($info) && $info) {
- switch($conf['showuseras']) {
- case 'username':
- return hsc($info['name']);
- case 'email':
- return obfuscate($info['mail']);
- case 'email_link':
- $mail = obfuscate($info['mail']);
- return '<a href="mailto:'.$mail.'">'.$mail.'</a>';
- default:
- return hsc($username);
+ // prepare initial event data
+ $data = array(
+ 'username' => $username, // the unique user name
+ 'name' => '',
+ 'link' => array( //setting 'link' to false disables linking
+ 'target' => '',
+ 'pre' => '',
+ 'suf' => '',
+ 'style' => '',
+ 'more' => '',
+ 'url' => '',
+ 'title' => '',
+ 'class' => ''
+ ),
+ 'userlink' => '', // formatted user name as will be returned
+ 'textonly' => $textonly
+ );
+ if($username === null) {
+ $data['username'] = $username = $INPUT->server->str('REMOTE_USER');
+ if($textonly){
+ $data['name'] = $INFO['userinfo']['name']. ' (' . $INPUT->server->str('REMOTE_USER') . ')';
+ }else {
+ $data['name'] = '<bdi>' . hsc($INFO['userinfo']['name']) . '</bdi> (<bdi>' . hsc($INPUT->server->str('REMOTE_USER')) . '</bdi>)';
+ }
+ }
+
+ $evt = new Doku_Event('COMMON_USER_LINK', $data);
+ if($evt->advise_before(true)) {
+ if(empty($data['name'])) {
+ if($conf['showuseras'] == 'loginname') {
+ $data['name'] = $textonly ? $data['username'] : hsc($data['username']);
+ } else {
+ if($auth) $info = $auth->getUserData($username);
+ if(isset($info) && $info) {
+ switch($conf['showuseras']) {
+ case 'username':
+ case 'username_link':
+ $data['name'] = $textonly ? $info['name'] : hsc($info['name']);
+ break;
+ case 'email':
+ case 'email_link':
+ $data['name'] = obfuscate($info['mail']);
+ break;
+ }
+ }
+ }
+ }
+
+ /** @var Doku_Renderer_xhtml $xhtml_renderer */
+ static $xhtml_renderer = null;
+
+ if(!$data['textonly'] && empty($data['link']['url'])) {
+
+ if(in_array($conf['showuseras'], array('email_link', 'username_link'))) {
+ if(!isset($info)) {
+ if($auth) $info = $auth->getUserData($username);
+ }
+ if(isset($info) && $info) {
+ if($conf['showuseras'] == 'email_link') {
+ $data['link']['url'] = 'mailto:' . obfuscate($info['mail']);
+ } else {
+ if(is_null($xhtml_renderer)) {
+ $xhtml_renderer = p_get_renderer('xhtml');
+ }
+ if(empty($xhtml_renderer->interwiki)) {
+ $xhtml_renderer->interwiki = getInterwiki();
+ }
+ $shortcut = 'user';
+ $exists = null;
+ $data['link']['url'] = $xhtml_renderer->_resolveInterWiki($shortcut, $username, $exists);
+ $data['link']['class'] .= ' interwiki iw_user';
+ if($exists !== null) {
+ if($exists) {
+ $data['link']['class'] .= ' wikilink1';
+ } else {
+ $data['link']['class'] .= ' wikilink2';
+ $data['link']['rel'] = 'nofollow';
+ }
+ }
+ }
+ } else {
+ $data['textonly'] = true;
+ }
+
+ } else {
+ $data['textonly'] = true;
+ }
+ }
+
+ if($data['textonly']) {
+ $data['userlink'] = $data['name'];
+ } else {
+ $data['link']['name'] = $data['name'];
+ if(is_null($xhtml_renderer)) {
+ $xhtml_renderer = p_get_renderer('xhtml');
+ }
+ $data['userlink'] = $xhtml_renderer->_formatLink($data['link']);
}
- } else {
- return hsc($username);
}
+ $evt->advise_after();
+ unset($evt);
+
+ return $data['userlink'];
}
/**
@@ -1675,4 +1775,13 @@ function set_doku_pref($pref, $val) {
}
}
+/**
+ * Strips source mapping declarations from given text #601
+ *
+ * @param &string $text reference to the CSS or JavaScript code to clean
+ */
+function stripsourcemaps(&$text){
+ $text = preg_replace('/^(\/\/|\/\*)[@#]\s+sourceMappingURL=.*?(\*\/)?$/im', '\\1\\2', $text);
+}
+
//Setup VIM: ex: et ts=2 :
diff --git a/inc/form.php b/inc/form.php
index 610f50200..9cd0491e0 100644
--- a/inc/form.php
+++ b/inc/form.php
@@ -561,10 +561,11 @@ function form_makeListboxField($name, $values, $selected='', $label=null, $id=''
if (is_null($label)) $label = $name;
$options = array();
reset($values);
- if (is_null($selected) || $selected == '')
+ if (is_null($selected) || $selected == '') {
$selected = array();
- elseif (!is_array($selected))
+ } elseif (!is_array($selected)) {
$selected = array($selected);
+ }
// FIXME: php doesn't know the difference between a string and an integer
if (is_string(key($values))) {
foreach ($values as $val=>$text) {
@@ -572,11 +573,13 @@ function form_makeListboxField($name, $values, $selected='', $label=null, $id=''
}
} else {
foreach ($values as $val) {
- if (is_array($val))
- @list($val,$text) = $val;
- else
+ $disabled = false;
+ if (is_array($val)) {
+ @list($val,$text,$disabled) = $val;
+ } else {
$text = null;
- $options[] = array($val,$text,in_array($val,$selected));
+ }
+ $options[] = array($val,$text,in_array($val,$selected),$disabled);
}
}
$elem = array('_elem'=>'listboxfield', '_options'=>$options, '_text'=>$label, '_class'=>$class,
@@ -930,11 +933,12 @@ function form_listboxfield($attrs) {
$s .= '<select '.buildAttributes($attrs,true).'>'.DOKU_LF;
if (!empty($attrs['_options'])) {
foreach ($attrs['_options'] as $opt) {
- @list($value,$text,$select) = $opt;
+ @list($value,$text,$select,$disabled) = $opt;
$p = '';
if(is_null($text)) $text = $value;
$p .= ' value="'.formText($value).'"';
if (!empty($select)) $p .= ' selected="selected"';
+ if ($disabled) $p .= ' disabled="disabled"';
$s .= '<option'.$p.'>'.formText($text).'</option>';
}
} else {
diff --git a/inc/html.php b/inc/html.php
index 4058440ca..be7afae0c 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -19,6 +19,7 @@ if(!defined('NL')) define('NL',"\n");
* @return string the HTML code of the link
*/
function html_wikilink($id,$name=null,$search=''){
+ /** @var Doku_Renderer_xhtml $xhtml_renderer */
static $xhtml_renderer = null;
if(is_null($xhtml_renderer)){
$xhtml_renderer = p_get_renderer('xhtml');
@@ -428,20 +429,23 @@ function html_revisions($first=0, $media_id = false){
global $conf;
global $lang;
$id = $ID;
+ if ($media_id) {
+ $id = $media_id;
+ $changelog = new MediaChangeLog($id);
+ } else {
+ $changelog = new PageChangeLog($id);
+ }
+
/* we need to get one additional log entry to be able to
* decide if this is the last page or is there another one.
* see html_recent()
*/
- if (!$media_id) $revisions = getRevisions($ID, $first, $conf['recent']+1);
- else {
- $revisions = getRevisions($media_id, $first, $conf['recent']+1, 8192, true);
- $id = $media_id;
- }
+
+ $revisions = $changelog->getRevisions($first, $conf['recent']+1);
if(count($revisions)==0 && $first!=0){
$first=0;
- if (!$media_id) $revisions = getRevisions($ID, $first, $conf['recent']+1);
- else $revisions = getRevisions($media_id, $first, $conf['recent']+1, 8192, true);
+ $revisions = $changelog->getRevisions($first, $conf['recent']+1);
}
$hasNext = false;
if (count($revisions)>$conf['recent']) {
@@ -500,15 +504,18 @@ function html_revisions($first=0, $media_id = false){
$form->addElement(form_makeCloseTag('span'));
}
+ $changelog->setChunkSize(1024);
+
$form->addElement(form_makeOpenTag('span', array('class' => 'user')));
- if (!$media_id) $editor = $INFO['editor'];
- else {
- $revinfo = getRevisionInfo($id, @filemtime(fullpath(mediaFN($id))), 1024, true);
- if($revinfo['user']){
+ if($media_id) {
+ $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id))));
+ if($revinfo['user']) {
$editor = $revinfo['user'];
- }else{
+ } else {
$editor = $revinfo['ip'];
}
+ } else {
+ $editor = $INFO['editor'];
}
$form->addElement((empty($editor))?('('.$lang['external_edit'].')'):editorinfo($editor));
$form->addElement(form_makeCloseTag('span'));
@@ -523,12 +530,11 @@ function html_revisions($first=0, $media_id = false){
foreach($revisions as $rev){
$date = dformat($rev);
- if (!$media_id) {
- $info = getRevisionInfo($id,$rev,true);
- $exists = page_exists($id,$rev);
- } else {
- $info = getRevisionInfo($id,$rev,true,true);
- $exists = @file_exists(mediaFN($id,$rev));
+ $info = $changelog->getRevisionInfo($rev);
+ if($media_id) {
+ $exists = @file_exists(mediaFN($id, $rev));
+ } else {
+ $exists = page_exists($id, $rev);
}
if ($info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT)
@@ -1022,10 +1028,15 @@ function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = fa
$ml_or_wl = $media ? 'ml' : 'wl';
$l_minor = $r_minor = '';
+ if($media) {
+ $changelog = new MediaChangeLog($id);
+ } else {
+ $changelog = new PageChangeLog($id);
+ }
if(!$l_rev){
$l_head = '&mdash;';
}else{
- $l_info = getRevisionInfo($id,$l_rev,true, $media);
+ $l_info = $changelog->getRevisionInfo($l_rev);
if($l_info['user']){
$l_user = '<bdi>'.editorinfo($l_info['user']).'</bdi>';
if(auth_ismanager()) $l_user .= ' <bdo dir="ltr">('.$l_info['ip'].')</bdo>';
@@ -1043,7 +1054,7 @@ function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = fa
}
if($r_rev){
- $r_info = getRevisionInfo($id,$r_rev,true, $media);
+ $r_info = $changelog->getRevisionInfo($r_rev);
if($r_info['user']){
$r_user = '<bdi>'.editorinfo($r_info['user']).'</bdi>';
if(auth_ismanager()) $r_user .= ' <bdo dir="ltr">('.$r_info['ip'].')</bdo>';
@@ -1059,7 +1070,7 @@ function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = fa
$r_head_title.'</a></bdi>'.
$head_separator.$r_user.' '.$r_sum;
}elseif($_rev = @filemtime($media_or_wikiFN($id))){
- $_info = getRevisionInfo($id,$_rev,true, $media);
+ $_info = $changelog->getRevisionInfo($_rev);
if($_info['user']){
$_user = '<bdi>'.editorinfo($_info['user']).'</bdi>';
if(auth_ismanager()) $_user .= ' <bdo dir="ltr">('.$_info['ip'].')</bdo>';
@@ -1083,162 +1094,386 @@ function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = fa
}
/**
- * show diff
+ * Show diff
+ * between current page version and provided $text
+ * or between the revisions provided via GET or POST
*
* @author Andreas Gohr <andi@splitbrain.org>
- * @param string $text - compare with this text with most current version
- * @param bool $intro - display the intro text
- * @param string $type type of the diff (inline or sidebyside)
+ * @param string $text when non-empty: compare with this text with most current version
+ * @param bool $intro display the intro text
+ * @param string $type type of the diff (inline or sidebyside)
*/
-function html_diff($text='',$intro=true,$type=null){
+function html_diff($text = '', $intro = true, $type = null) {
global $ID;
global $REV;
global $lang;
global $INPUT;
global $INFO;
+ $pagelog = new PageChangeLog($ID);
+ /*
+ * Determine diff type
+ */
if(!$type) {
$type = $INPUT->str('difftype');
- if (empty($type)) {
+ if(empty($type)) {
$type = get_doku_pref('difftype', $type);
- if (empty($type) && $INFO['ismobile']) {
+ if(empty($type) && $INFO['ismobile']) {
$type = 'inline';
}
}
}
if($type != 'inline') $type = 'sidebyside';
+ /*
+ * Determine requested revision(s)
+ */
// we're trying to be clever here, revisions to compare can be either
// given as rev and rev2 parameters, with rev2 being optional. Or in an
// array in rev2.
$rev1 = $REV;
$rev2 = $INPUT->ref('rev2');
- if(is_array($rev2)){
+ if(is_array($rev2)) {
$rev1 = (int) $rev2[0];
$rev2 = (int) $rev2[1];
- if(!$rev1){
+ if(!$rev1) {
$rev1 = $rev2;
unset($rev2);
}
- }else{
+ } else {
$rev2 = $INPUT->int('rev2');
}
+ /*
+ * Determine left and right revision, its texts and the header
+ */
$r_minor = '';
$l_minor = '';
- if($text){ // compare text to the most current revision
- $l_rev = '';
- $l_text = rawWiki($ID,'');
- $l_head = '<a class="wikilink1" href="'.wl($ID).'">'.
- $ID.' '.dformat((int) @filemtime(wikiFN($ID))).'</a> '.
+ if($text) { // compare text to the most current revision
+ $l_rev = '';
+ $l_text = rawWiki($ID, '');
+ $l_head = '<a class="wikilink1" href="' . wl($ID) . '">' .
+ $ID . ' ' . dformat((int) @filemtime(wikiFN($ID))) . '</a> ' .
$lang['current'];
- $r_rev = '';
- $r_text = cleanText($text);
- $r_head = $lang['yours'];
- }else{
- if($rev1 && isset($rev2) && $rev2){ // two specific revisions wanted
+ $r_rev = '';
+ $r_text = cleanText($text);
+ $r_head = $lang['yours'];
+ } else {
+ if($rev1 && isset($rev2) && $rev2) { // two specific revisions wanted
// make sure order is correct (older on the left)
- if($rev1 < $rev2){
+ if($rev1 < $rev2) {
$l_rev = $rev1;
$r_rev = $rev2;
- }else{
+ } else {
$l_rev = $rev2;
$r_rev = $rev1;
}
- }elseif($rev1){ // single revision given, compare to current
+ } elseif($rev1) { // single revision given, compare to current
$r_rev = '';
$l_rev = $rev1;
- }else{ // no revision was given, compare previous to current
+ } else { // no revision was given, compare previous to current
$r_rev = '';
- $revs = getRevisions($ID, 0, 1);
+ $revs = $pagelog->getRevisions(0, 1);
$l_rev = $revs[0];
$REV = $l_rev; // store revision back in $REV
}
// when both revisions are empty then the page was created just now
- if(!$l_rev && !$r_rev){
+ if(!$l_rev && !$r_rev) {
$l_text = '';
- }else{
- $l_text = rawWiki($ID,$l_rev);
+ } else {
+ $l_text = rawWiki($ID, $l_rev);
}
- $r_text = rawWiki($ID,$r_rev);
+ $r_text = rawWiki($ID, $r_rev);
list($l_head, $r_head, $l_minor, $r_minor) = html_diff_head($l_rev, $r_rev, null, false, $type == 'inline');
}
- $df = new Diff(explode("\n",$l_text),explode("\n",$r_text));
+ /*
+ * Build navigation
+ */
+ $l_nav = '';
+ $r_nav = '';
+ if(!$text) {
+ list($l_nav, $r_nav) = html_diff_navigation($pagelog, $type, $l_rev, $r_rev);
+ }
+ /*
+ * Create diff object and the formatter
+ */
+ $diff = new Diff(explode("\n", $l_text), explode("\n", $r_text));
- if($type == 'inline'){
- $tdf = new InlineDiffFormatter();
+ if($type == 'inline') {
+ $diffformatter = new InlineDiffFormatter();
} else {
- $tdf = new TableDiffFormatter();
+ $diffformatter = new TableDiffFormatter();
}
-
+ /*
+ * Display intro
+ */
if($intro) print p_locale_xhtml('diff');
- if (!$text) {
- ptln('<div class="diffoptions">');
-
- $form = new Doku_Form(array('action'=>wl()));
- $form->addHidden('id',$ID);
- $form->addHidden('rev2[0]',$l_rev);
- $form->addHidden('rev2[1]',$r_rev);
- $form->addHidden('do','diff');
- $form->addElement(form_makeListboxField(
- 'difftype',
- array(
- 'sidebyside' => $lang['diff_side'],
- 'inline' => $lang['diff_inline']),
- $type,
- $lang['diff_type'],
- '','',
- array('class'=>'quickselect')));
- $form->addElement(form_makeButton('submit', 'diff','Go'));
+ /*
+ * Display type and exact reference
+ */
+ if(!$text) {
+ ptln('<div class="diffoptions group">');
+
+
+ $form = new Doku_Form(array('action' => wl()));
+ $form->addHidden('id', $ID);
+ $form->addHidden('rev2[0]', $l_rev);
+ $form->addHidden('rev2[1]', $r_rev);
+ $form->addHidden('do', 'diff');
+ $form->addElement(
+ form_makeListboxField(
+ 'difftype',
+ array(
+ 'sidebyside' => $lang['diff_side'],
+ 'inline' => $lang['diff_inline']
+ ),
+ $type,
+ $lang['diff_type'],
+ '', '',
+ array('class' => 'quickselect')
+ )
+ );
+ $form->addElement(form_makeButton('submit', 'diff', 'Go'));
$form->printForm();
- $diffurl = wl($ID, array(
- 'do' => 'diff',
- 'rev2[0]' => $l_rev,
- 'rev2[1]' => $r_rev ? $r_rev : $INFO['currentrev'], // link to exactly this view FS#2835
- 'difftype' => $type,
- ));
- ptln('<p><a class="wikilink1" href="'.$diffurl.'">'.$lang['difflink'].'</a></p>');
- ptln('</div>');
+ ptln('<p>');
+ // link to exactly this view FS#2835
+ echo html_diff_navigationlink($type, 'difflink', $l_rev, $r_rev ? $r_rev : $INFO['currentrev']);
+ ptln('</p>');
+
+ ptln('</div>'); // .diffoptions
}
+
+ /*
+ * Display diff view table
+ */
?>
<div class="table">
- <table class="diff diff_<?php echo $type?>">
- <?php if ($type == 'inline') { ?>
- <tr>
- <th class="diff-lineheader">-</th><th <?php echo $l_minor?>>
- <?php echo $l_head?>
- </th>
- </tr>
- <tr>
- <th class="diff-lineheader">+</th><th <?php echo $r_minor?>>
- <?php echo $r_head?>
- </th>
- </tr>
- <?php } else { ?>
- <tr>
- <th colspan="2" <?php echo $l_minor?>>
- <?php echo $l_head?>
- </th>
- <th colspan="2" <?php echo $r_minor?>>
- <?php echo $r_head?>
- </th>
- </tr>
- <?php }
- echo html_insert_softbreaks($tdf->format($df)); ?>
+ <table class="diff diff_<?php echo $type ?>">
+
+ <?php
+ //navigation and header
+ if($type == 'inline') {
+ if(!$text) { ?>
+ <tr>
+ <td class="diff-lineheader">-</td>
+ <td class="diffnav"><?php echo $l_nav ?></td>
+ </tr>
+ <tr>
+ <th class="diff-lineheader">-</th>
+ <th <?php echo $l_minor ?>>
+ <?php echo $l_head ?>
+ </th>
+ </tr>
+ <?php } ?>
+ <tr>
+ <td class="diff-lineheader">+</td>
+ <td class="diffnav"><?php echo $r_nav ?></td>
+ </tr>
+ <tr>
+ <th class="diff-lineheader">+</th>
+ <th <?php echo $r_minor ?>>
+ <?php echo $r_head ?>
+ </th>
+ </tr>
+ <?php } else {
+ if(!$text) { ?>
+ <tr>
+ <td colspan="2" class="diffnav"><?php echo $l_nav ?></td>
+ <td colspan="2" class="diffnav"><?php echo $r_nav ?></td>
+ </tr>
+ <?php } ?>
+ <tr>
+ <th colspan="2" <?php echo $l_minor ?>>
+ <?php echo $l_head ?>
+ </th>
+ <th colspan="2" <?php echo $r_minor ?>>
+ <?php echo $r_head ?>
+ </th>
+ </tr>
+ <?php }
+
+ //diff view
+ echo html_insert_softbreaks($diffformatter->format($diff)); ?>
+
</table>
</div>
- <?php
+<?php
}
+/**
+ * Create html for revision navigation
+ *
+ * @param PageChangeLog $pagelog changelog object of current page
+ * @param string $type inline vs sidebyside
+ * @param int $l_rev left revision timestamp
+ * @param int $r_rev right revision timestamp
+ * @return string[] html of left and right navigation elements
+ */
+function html_diff_navigation($pagelog, $type, $l_rev, $r_rev) {
+ global $INFO, $ID;
+
+ // last timestamp is not in changelog, retrieve timestamp from metadata
+ // note: when page is removed, the metadata timestamp is zero
+ $r_rev = $r_rev ? $r_rev : $INFO['meta']['last_change']['date'];
+
+ //retrieve revisions with additional info
+ list($l_revs, $r_revs) = $pagelog->getRevisionsAround($l_rev, $r_rev);
+ $l_revisions = array();
+ if(!$l_rev) {
+ $l_revisions[0] = array(0, "", false); //no left revision given, add dummy
+ }
+ foreach($l_revs as $rev) {
+ $info = $pagelog->getRevisionInfo($rev);
+ $l_revisions[$rev] = array(
+ $rev,
+ dformat($info['date']) . ' ' . editorinfo($info['user'], true) . ' ' . $info['sum'],
+ $r_rev ? $rev >= $r_rev : false //disable?
+ );
+ }
+ $r_revisions = array();
+ if(!$r_rev) {
+ $r_revisions[0] = array(0, "", false); //no right revision given, add dummy
+ }
+ foreach($r_revs as $rev) {
+ $info = $pagelog->getRevisionInfo($rev);
+ $r_revisions[$rev] = array(
+ $rev,
+ dformat($info['date']) . ' ' . editorinfo($info['user'], true) . ' ' . $info['sum'],
+ $rev <= $l_rev //disable?
+ );
+ }
+
+ //determine previous/next revisions
+ $l_index = array_search($l_rev, $l_revs);
+ $l_prev = $l_revs[$l_index + 1];
+ $l_next = $l_revs[$l_index - 1];
+ if($r_rev) {
+ $r_index = array_search($r_rev, $r_revs);
+ $r_prev = $r_revs[$r_index + 1];
+ $r_next = $r_revs[$r_index - 1];
+ } else {
+ //removed page
+ if($l_next) {
+ $r_prev = $r_revs[0];
+ } else {
+ $r_prev = null;
+ }
+ $r_next = null;
+ }
+
+ /*
+ * Left side:
+ */
+ $l_nav = '';
+ //move back
+ if($l_prev) {
+ $l_nav .= html_diff_navigationlink($type, 'diffbothprevrev', $l_prev, $r_prev);
+ $l_nav .= html_diff_navigationlink($type, 'diffprevrev', $l_prev, $r_rev);
+ }
+ //dropdown
+ $form = new Doku_Form(array('action' => wl()));
+ $form->addHidden('id', $ID);
+ $form->addHidden('difftype', $type);
+ $form->addHidden('rev2[1]', $r_rev);
+ $form->addHidden('do', 'diff');
+ $form->addElement(
+ form_makeListboxField(
+ 'rev2[0]',
+ $l_revisions,
+ $l_rev,
+ '', '', '',
+ array('class' => 'quickselect')
+ )
+ );
+ $form->addElement(form_makeButton('submit', 'diff', 'Go'));
+ $l_nav .= $form->getForm();
+ //move forward
+ if($l_next && ($l_next < $r_rev || !$r_rev)) {
+ $l_nav .= html_diff_navigationlink($type, 'diffnextrev', $l_next, $r_rev);
+ }
+
+ /*
+ * Right side:
+ */
+ $r_nav = '';
+ //move back
+ if($l_rev < $r_prev) {
+ $r_nav .= html_diff_navigationlink($type, 'diffprevrev', $l_rev, $r_prev);
+ }
+ //dropdown
+ $form = new Doku_Form(array('action' => wl()));
+ $form->addHidden('id', $ID);
+ $form->addHidden('rev2[0]', $l_rev);
+ $form->addHidden('difftype', $type);
+ $form->addHidden('do', 'diff');
+ $form->addElement(
+ form_makeListboxField(
+ 'rev2[1]',
+ $r_revisions,
+ $r_rev,
+ '', '', '',
+ array('class' => 'quickselect')
+ )
+ );
+ $form->addElement(form_makeButton('submit', 'diff', 'Go'));
+ $r_nav .= $form->getForm();
+ //move forward
+ if($r_next) {
+ if($pagelog->isCurrentRevision($r_next)) {
+ $r_nav .= html_diff_navigationlink($type, 'difflastrev', $l_rev); //last revision is diff with current page
+ } else {
+ $r_nav .= html_diff_navigationlink($type, 'diffnextrev', $l_rev, $r_next);
+ }
+ $r_nav .= html_diff_navigationlink($type, 'diffbothnextrev', $l_next, $r_next);
+ }
+ return array($l_nav, $r_nav);
+}
+
+/**
+ * Create html link to a diff defined by two revisions
+ *
+ * @param string $difftype display type
+ * @param string $linktype
+ * @param int $lrev oldest revision
+ * @param int $rrev newest revision or null for diff with current revision
+ * @return string html of link to a diff
+ */
+function html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null) {
+ global $ID, $lang;
+ if(!$rrev) {
+ $urlparam = array(
+ 'do' => 'diff',
+ 'rev' => $lrev,
+ 'difftype' => $difftype,
+ );
+ } else {
+ $urlparam = array(
+ 'do' => 'diff',
+ 'rev2[0]' => $lrev,
+ 'rev2[1]' => $rrev,
+ 'difftype' => $difftype,
+ );
+ }
+ return '<a class="' . $linktype . '" href="' . wl($ID, $urlparam) . '" title="' . $lang[$linktype] . '">' .
+ '<span>' . $lang[$linktype] . '</span>' .
+ '</a>' . "\n";
+}
+
+/**
+ * Insert soft breaks in diff html
+ *
+ * @param $diffhtml
+ * @return string
+ */
function html_insert_softbreaks($diffhtml) {
// search the diff html string for both:
// - html tags, so these can be ignored
@@ -1246,6 +1481,12 @@ function html_insert_softbreaks($diffhtml) {
return preg_replace_callback('/<[^>]*>|[^<> ]{12,}/','html_softbreak_callback',$diffhtml);
}
+/**
+ * callback which adds softbreaks
+ *
+ * @param array $match array with first the complete match
+ * @return string the replacement
+ */
function html_softbreak_callback($match){
// if match is an html tag, return it intact
if ($match[0]{0} == '<') return $match[0];
@@ -1357,7 +1598,7 @@ function html_updateprofile(){
global $conf;
global $INPUT;
global $INFO;
- /** @var auth_basic $auth */
+ /** @var DokuWiki_Auth_Plugin $auth */
global $auth;
print p_locale_xhtml('updateprofile');
@@ -1531,6 +1772,7 @@ function html_edit(){
* Display the default edit form
*
* Is the default action for HTML_EDIT_FORMSELECTION.
+ * @param mixed[] $param
*/
function html_edit_form($param) {
global $TEXT;
@@ -1573,7 +1815,7 @@ function html_minoredit(){
function html_debug(){
global $conf;
global $lang;
- /** @var auth_basic $auth */
+ /** @var DokuWiki_Auth_Plugin $auth */
global $auth;
global $INFO;
diff --git a/inc/indexer.php b/inc/indexer.php
index a167db47f..5ca2f0bb1 100644
--- a/inc/indexer.php
+++ b/inc/indexer.php
@@ -1218,19 +1218,18 @@ class Doku_Indexer {
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
protected function updateTuple($line, $id, $count) {
- $newLine = $line;
- if ($newLine !== ''){
- $newLine = preg_replace('/(^|:)'.preg_quote($id,'/').'\*\d*/', '', $newLine);
+ if ($line != ''){
+ $line = preg_replace('/(^|:)'.preg_quote($id,'/').'\*\d*/', '', $line);
}
- $newLine = trim($newLine, ':');
+ $line = trim($line, ':');
if ($count) {
- if (strlen($newLine) > 0) {
- return "$id*$count:".$newLine;
+ if ($line) {
+ return "$id*$count:".$line;
} else {
- return "$id*$count".$newLine;
+ return "$id*$count";
}
}
- return $newLine;
+ return $line;
}
/**
diff --git a/inc/lang/af/lang.php b/inc/lang/af/lang.php
index 826fda6e8..008110450 100644
--- a/inc/lang/af/lang.php
+++ b/inc/lang/af/lang.php
@@ -63,7 +63,7 @@ $lang['qb_extlink'] = 'Eksterne skakel';
$lang['qb_hr'] = 'Horisontale streep';
$lang['qb_sig'] = 'Handtekening met datum';
$lang['admin_register'] = 'Skep gerus \'n rekening';
-$lang['img_backto'] = 'Terug na';
+$lang['btn_img_backto'] = 'Terug na %s';
$lang['img_date'] = 'Datem';
$lang['img_camera'] = 'Camera';
$lang['i_wikiname'] = 'Wiki Naam';
diff --git a/inc/lang/ar/lang.php b/inc/lang/ar/lang.php
index 157513429..b0a2edc88 100644
--- a/inc/lang/ar/lang.php
+++ b/inc/lang/ar/lang.php
@@ -239,7 +239,7 @@ $lang['admin_register'] = 'أضف مستخدما جديدا';
$lang['metaedit'] = 'تحرير البيانات الشمولية ';
$lang['metasaveerr'] = 'فشلت كتابة البيانات الشمولية';
$lang['metasaveok'] = 'حُفظت البيانات الشمولية';
-$lang['img_backto'] = 'عودة إلى';
+$lang['btn_img_backto'] = 'عودة إلى %s';
$lang['img_title'] = 'العنوان';
$lang['img_caption'] = 'وصف';
$lang['img_date'] = 'التاريخ';
@@ -252,7 +252,7 @@ $lang['img_camera'] = 'الكمرا';
$lang['img_keywords'] = 'كلمات مفتاحية';
$lang['img_width'] = 'العرض';
$lang['img_height'] = 'الإرتفاع';
-$lang['img_manager'] = 'اعرض في مدير الوسائط';
+$lang['btn_mediaManager'] = 'اعرض في مدير الوسائط';
$lang['subscr_subscribe_success'] = 'اضيف %s لقائمة اشتراك %s';
$lang['subscr_subscribe_error'] = 'خطأ في إضافة %s لقائمة اشتراك %s';
$lang['subscr_subscribe_noaddress'] = 'ليس هناك عنوان مرتبط بولوجك، لا يمكن اضافتك لقائمة الاشتراك';
diff --git a/inc/lang/az/lang.php b/inc/lang/az/lang.php
index df54b4f10..8d51d2372 100644
--- a/inc/lang/az/lang.php
+++ b/inc/lang/az/lang.php
@@ -172,7 +172,7 @@ $lang['admin_register'] = 'İstifadəçi əlavə et';
$lang['metaedit'] = 'Meta-məlumatlarda düzəliş et';
$lang['metasaveerr'] = 'Meta-məlumatları yazan zamanı xəta';
$lang['metasaveok'] = 'Meta-məlumatlar yadda saxlandı';
-$lang['img_backto'] = 'Qayıd';
+$lang['btn_img_backto'] = 'Qayıd %s';
$lang['img_title'] = 'Başlıq';
$lang['img_caption'] = 'İmza';
$lang['img_date'] = 'Tarix';
diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php
index bb74ff1ca..77117154f 100644
--- a/inc/lang/bg/lang.php
+++ b/inc/lang/bg/lang.php
@@ -50,7 +50,7 @@ $lang['btn_revert'] = 'Възстановяване';
$lang['btn_register'] = 'Регистриране';
$lang['btn_apply'] = 'Прилагане';
$lang['btn_media'] = 'Диспечер на файлове';
-$lang['btn_deleteuser'] = 'Изтрий профила ми';
+$lang['btn_deleteuser'] = 'Изтриване на профила';
$lang['loggedinas'] = 'Вписани сте като';
$lang['user'] = 'Потребител';
$lang['pass'] = 'Парола';
@@ -62,7 +62,7 @@ $lang['fullname'] = 'Истинско име';
$lang['email'] = 'Електронна поща';
$lang['profile'] = 'Потребителски профил';
$lang['badlogin'] = 'Грешно потребителско име или парола.';
-$lang['badpassconfirm'] = 'Съжаляваме, паролата е грешна';
+$lang['badpassconfirm'] = 'За съжаление паролата е грешна';
$lang['minoredit'] = 'Промените са незначителни';
$lang['draftdate'] = 'Черновата е автоматично записана на';
$lang['nosecedit'] = 'Страницата бе междувременно променена, презареждане на страницата поради неактуална информация.';
@@ -77,13 +77,13 @@ $lang['regpwmail'] = 'Паролата ви за DokuWiki';
$lang['reghere'] = 'Все още нямате профил? Направете си';
$lang['profna'] = 'Wiki-то не поддържа промяна на профила';
$lang['profnochange'] = 'Няма промени.';
-$lang['profnoempty'] = 'Въвеждането на име и ел. поща е задължително';
+$lang['profnoempty'] = 'Въвеждането на име и имейл е задължително';
$lang['profchanged'] = 'Потребителският профил е обновен успешно.';
-$lang['profnodelete'] = 'Не е възможно изтриване на потребители в това wiki ';
-$lang['profdeleteuser'] = 'Изтрий профила ми';
+$lang['profnodelete'] = 'Изтриването на потребители в това wiki не е възможно';
+$lang['profdeleteuser'] = 'Изтриване на профила';
$lang['profdeleted'] = 'Вашият профил е премахнат от това wiki ';
-$lang['profconfdelete'] = 'Искам да изтрия профила си от това wiki. <br/> Веднъж изтрит, профила не може да бъде възстановен!';
-$lang['profconfdeletemissing'] = 'Не и маркирана опцията за потвърждение';
+$lang['profconfdelete'] = 'Искам да изтрия профила си от това wiki. <br/> Веднъж изтрит, профилът не може да бъде възстановен!';
+$lang['profconfdeletemissing'] = 'Не сте поставили отметка в кутията потвърждение';
$lang['pwdforget'] = 'Забравили сте паролата си? Получете нова';
$lang['resendna'] = 'Wiki-то не поддържа повторно пращане на паролата.';
$lang['resendpwd'] = 'Задаване на нова парола за';
@@ -140,7 +140,7 @@ $lang['js']['media_diff_portions'] = 'По половинка';
$lang['js']['media_select'] = 'Изберете файлове...';
$lang['js']['media_upload_btn'] = 'Качване';
$lang['js']['media_done_btn'] = 'Готово';
-$lang['js']['media_drop'] = 'Влачете и пуснете файливе тук, за да бъдат качени';
+$lang['js']['media_drop'] = 'Влачете и пуснете файлове тук, за да бъдат качени';
$lang['js']['media_cancel'] = 'премахване';
$lang['js']['media_overwrt'] = 'Презапиши съществуващите файлове';
$lang['rssfailed'] = 'Възникна грешка при получаването на емисията: ';
@@ -164,7 +164,7 @@ $lang['accessdenied'] = 'Нямате необходимите прав
$lang['mediausage'] = 'Ползвайте следния синтаксис, за да упоменете файла:';
$lang['mediaview'] = 'Преглед на оригиналния файл';
$lang['mediaroot'] = 'root';
-$lang['mediaupload'] = 'Качете файл в текущото именно пространство. За създаване на подимено пространство, добавете име преди това на файла като ги разделите с двоеточие в полето "Качи като"';
+$lang['mediaupload'] = 'Качете файл в текущото именно пространство. За създаване на подименно пространство, добавете име преди това на файла като ги разделите с двоеточие в полето "Качи като"';
$lang['mediaextchange'] = 'Разширението на файла е сменено от .%s на .%s!';
$lang['reference'] = 'Връзки за';
$lang['ref_inuse'] = 'Файлът не може да бъде изтрит, защото все още се ползва от следните страници:';
@@ -236,7 +236,7 @@ $lang['admin_register'] = 'Добавяне на нов потребит
$lang['metaedit'] = 'Редактиране на метаданни';
$lang['metasaveerr'] = 'Записването на метаданните се провали';
$lang['metasaveok'] = 'Метаданните са запазени успешно';
-$lang['img_backto'] = 'Назад към';
+$lang['btn_img_backto'] = 'Назад към %s';
$lang['img_title'] = 'Заглавие';
$lang['img_caption'] = 'Надпис';
$lang['img_date'] = 'Дата';
@@ -249,10 +249,10 @@ $lang['img_camera'] = 'Фотоапарат';
$lang['img_keywords'] = 'Ключови думи';
$lang['img_width'] = 'Ширина';
$lang['img_height'] = 'Височина';
-$lang['img_manager'] = 'Преглед в диспечера на файлове';
+$lang['btn_mediaManager'] = 'Преглед в диспечера на файлове';
$lang['subscr_subscribe_success'] = '%s е добавен към списъка с абониралите се за %s';
$lang['subscr_subscribe_error'] = 'Грешка при добавянето на %s към списъка с абониралите се за %s';
-$lang['subscr_subscribe_noaddress'] = 'Добавянето ви към списъка с абонати не е възможно поради липсата на свързан адрес (на ел. поща) с профила ви.';
+$lang['subscr_subscribe_noaddress'] = 'Добавянето ви към списъка с абонати не е възможно поради липсата на свързан адрес (имейл) с профила ви.';
$lang['subscr_unsubscribe_success'] = '%s е премахнат от списъка с абониралите се за %s';
$lang['subscr_unsubscribe_error'] = 'Грешка при премахването на %s от списъка с абониралите се за %s';
$lang['subscr_already_subscribed'] = '%s е вече абониран за %s';
@@ -263,12 +263,12 @@ $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['subscr_style_every'] = 'на имейл при всяка промяна';
+$lang['subscr_style_digest'] = 'на имейл с обобщение на промените във всяка страница (всеки %.2f дни)';
+$lang['subscr_style_list'] = 'на списък с променените страници от последния имейл (всеки %.2f дни)';
$lang['authtempfail'] = 'Удостоверяването на потребители не е възможно за момента. Ако продължи дълго, моля уведомете администратора на Wiki страницата.';
-$lang['authpwdexpire'] = 'Срока на паролата ви ще изтече след %d дни. Препорачително е да я смените по-скоро.';
-$lang['i_chooselang'] = 'Изберете вашия изик';
+$lang['authpwdexpire'] = 'Срока на паролата ви ще изтече след %d дни. Препоръчително е да я смените по-скоро.';
+$lang['i_chooselang'] = 'Изберете вашия език';
$lang['i_installer'] = 'Инсталатор на DokuWiki';
$lang['i_wikiname'] = 'Име на Wiki-то';
$lang['i_enableacl'] = 'Ползване на списък за достъп (ACL) [препоръчително]';
diff --git a/inc/lang/bg/register.txt b/inc/lang/bg/register.txt
index 51fbb83fe..333428005 100644
--- a/inc/lang/bg/register.txt
+++ b/inc/lang/bg/register.txt
@@ -1,4 +1,4 @@
====== Регистриране като нов потребител ======
-Моля, попълнете всичките полета отдолу, за да бъде създаден нов профил. Уверете се, че въведеният **адрес на ел. поща е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]].
+Моля, попълнете всичките полета отдолу, за да бъде създаден нов профил. Уверете се, че въведеният **имейл адрес е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]].
diff --git a/inc/lang/bg/resendpwd.txt b/inc/lang/bg/resendpwd.txt
index 38e2d1fe4..19dffc070 100644
--- a/inc/lang/bg/resendpwd.txt
+++ b/inc/lang/bg/resendpwd.txt
@@ -1,3 +1,3 @@
====== Пращане на нова парола ======
-Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. По ел. поща ще получите линк, с който да потвърдите.
+Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. Чрез имейл ще получите линк, с който да потвърдите.
diff --git a/inc/lang/bn/lang.php b/inc/lang/bn/lang.php
index 8dece4ea0..230f3ef80 100644
--- a/inc/lang/bn/lang.php
+++ b/inc/lang/bn/lang.php
@@ -66,7 +66,6 @@ $lang['minoredit'] = 'ক্ষুদ্র পরিবর্তন
$lang['draftdate'] = 'খসড়া উপর স্বতঃসংরক্ষণ';
$lang['nosecedit'] = 'পাতা ইতিমধ্যে পরিবর্তিত হয়েছিল, অধ্যায় তথ্যের পরিবর্তে পুরো পাতা লোড তারিখ সীমার বাইরে ছিল.
';
-$lang['notloggedin'] = 'সম্ভবত আপনি লগইন ভুলে গেছেন?';
$lang['regmissing'] = 'দুঃখিত, আপনি সমস্ত ক্ষেত্রগুলি পূরণ করা আবশ্যক.';
$lang['reguexists'] = 'দুঃখিত, এই লগইন সঙ্গে একটি ব্যবহারকারী ইতিমধ্যেই বিদ্যমান.';
$lang['regsuccess'] = 'ব্যবহারকারী তৈরি করা হয়েছে এবং পাসওয়ার্ড ইমেইল করে পাঠানো হয়েছিল.';
diff --git a/inc/lang/ca-valencia/lang.php b/inc/lang/ca-valencia/lang.php
index 9ab423783..6e6f2a662 100644
--- a/inc/lang/ca-valencia/lang.php
+++ b/inc/lang/ca-valencia/lang.php
@@ -174,7 +174,7 @@ $lang['admin_register'] = 'Afegir nou usuari';
$lang['metaedit'] = 'Editar meta-senyes';
$lang['metasaveerr'] = 'Erro escrivint meta-senyes';
$lang['metasaveok'] = 'Meta-senyes guardades';
-$lang['img_backto'] = 'Tornar a';
+$lang['btn_img_backto'] = 'Tornar a %s';
$lang['img_title'] = 'Títul';
$lang['img_caption'] = 'Subtítul';
$lang['img_date'] = 'Data';
diff --git a/inc/lang/ca/lang.php b/inc/lang/ca/lang.php
index fd19c6834..1d297a1b1 100644
--- a/inc/lang/ca/lang.php
+++ b/inc/lang/ca/lang.php
@@ -228,7 +228,7 @@ $lang['admin_register'] = 'Afegeix nou usuari';
$lang['metaedit'] = 'Edita metadades';
$lang['metasaveerr'] = 'No s\'han pogut escriure les metadades';
$lang['metasaveok'] = 'S\'han desat les metadades';
-$lang['img_backto'] = 'Torna a';
+$lang['btn_img_backto'] = 'Torna a %s';
$lang['img_title'] = 'Títol';
$lang['img_caption'] = 'Peu d\'imatge';
$lang['img_date'] = 'Data';
diff --git a/inc/lang/cs/lang.php b/inc/lang/cs/lang.php
index a0f69b3dc..a491c1533 100644
--- a/inc/lang/cs/lang.php
+++ b/inc/lang/cs/lang.php
@@ -248,7 +248,7 @@ $lang['admin_register'] = 'Přidat nového uživatele';
$lang['metaedit'] = 'Upravit Metadata';
$lang['metasaveerr'] = 'Chyba při zápisu metadat';
$lang['metasaveok'] = 'Metadata uložena';
-$lang['img_backto'] = 'Zpět na';
+$lang['btn_img_backto'] = 'Zpět na %s';
$lang['img_title'] = 'Titulek';
$lang['img_caption'] = 'Popis';
$lang['img_date'] = 'Datum';
@@ -261,7 +261,7 @@ $lang['img_camera'] = 'Typ fotoaparátu';
$lang['img_keywords'] = 'Klíčová slova';
$lang['img_width'] = 'Šířka';
$lang['img_height'] = 'Výška';
-$lang['img_manager'] = 'Zobrazit ve správě médií';
+$lang['btn_mediaManager'] = 'Zobrazit ve správě médií';
$lang['subscr_subscribe_success'] = '%s byl přihlášen do seznamu odběratelů %s';
$lang['subscr_subscribe_error'] = 'Došlo k chybě při přihlašování %s do seznamu odběratelů %s';
$lang['subscr_subscribe_noaddress'] = 'K Vašemu loginu neexistuje žádná adresa, nemohl jste být přihlášen do seznamu odběratelů.';
diff --git a/inc/lang/da/lang.php b/inc/lang/da/lang.php
index eb50bb240..bdf882ba7 100644
--- a/inc/lang/da/lang.php
+++ b/inc/lang/da/lang.php
@@ -246,7 +246,7 @@ $lang['admin_register'] = 'Tilføj ny bruger';
$lang['metaedit'] = 'Rediger metadata';
$lang['metasaveerr'] = 'Skrivning af metadata fejlede';
$lang['metasaveok'] = 'Metadata gemt';
-$lang['img_backto'] = 'Tilbage til';
+$lang['btn_img_backto'] = 'Tilbage til %s';
$lang['img_title'] = 'Titel';
$lang['img_caption'] = 'Billedtekst';
$lang['img_date'] = 'Dato';
@@ -259,7 +259,7 @@ $lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Emneord';
$lang['img_width'] = 'Bredde';
$lang['img_height'] = 'Højde';
-$lang['img_manager'] = 'Vis i Media Manager';
+$lang['btn_mediaManager'] = 'Vis i Media Manager';
$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';
diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php
index be3f14a18..2e2e04149 100644
--- a/inc/lang/de-informal/lang.php
+++ b/inc/lang/de-informal/lang.php
@@ -251,7 +251,7 @@ $lang['admin_register'] = 'Neuen Benutzer anmelden';
$lang['metaedit'] = 'Metadaten bearbeiten';
$lang['metasaveerr'] = 'Die Metadaten konnten nicht gesichert werden';
$lang['metasaveok'] = 'Metadaten gesichert';
-$lang['img_backto'] = 'Zurück zu';
+$lang['btn_img_backto'] = 'Zurück zu %s';
$lang['img_title'] = 'Titel';
$lang['img_caption'] = 'Bildunterschrift';
$lang['img_date'] = 'Datum';
@@ -264,7 +264,7 @@ $lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Schlagwörter';
$lang['img_width'] = 'Breite';
$lang['img_height'] = 'Höhe';
-$lang['img_manager'] = 'Im Medien-Manager anzeigen';
+$lang['btn_mediaManager'] = 'Im Medien-Manager anzeigen';
$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementliste von %s hinzugefügt';
$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementliste von %s';
$lang['subscr_subscribe_noaddress'] = 'In deinem Account ist keine E-Mail-Adresse hinterlegt. Dadurch kann die Seite nicht abonniert werden';
diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php
index 1840f2a6c..c6f11abc9 100644
--- a/inc/lang/de/lang.php
+++ b/inc/lang/de/lang.php
@@ -24,6 +24,7 @@
* @author Mateng Schimmerlos <mateng@firemail.de>
* @author Benedikt Fey <spam@lifeisgoooood.de>
* @author Joerg <scooter22@gmx.de>
+ * @author Simon <st103267@stud.uni-stuttgart.de>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -68,6 +69,8 @@ $lang['btn_register'] = 'Registrieren';
$lang['btn_apply'] = 'Übernehmen';
$lang['btn_media'] = 'Medien-Manager';
$lang['btn_deleteuser'] = 'Benutzerprofil löschen';
+$lang['btn_img_backto'] = 'Zurück zu %s';
+$lang['btn_mediaManager'] = 'Im Medien-Manager anzeigen';
$lang['loggedinas'] = 'Angemeldet als';
$lang['user'] = 'Benutzername';
$lang['pass'] = 'Passwort';
@@ -92,6 +95,7 @@ $lang['regbadmail'] = 'Die angegebene E-Mail-Adresse scheint ungülti
$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 registrieren';
+$lang['notloggedin'] = 'Haben Sie vergessen sich einzuloggen?';
$lang['profna'] = 'Änderung des Benutzerprofils in diesem Wiki nicht möglich.';
$lang['profnochange'] = 'Keine Änderungen, nichts zu tun.';
$lang['profnoempty'] = 'Es muss ein Name und eine E-Mail-Adresse angegeben werden.';
@@ -253,7 +257,6 @@ $lang['admin_register'] = 'Neuen Benutzer anmelden';
$lang['metaedit'] = 'Metadaten bearbeiten';
$lang['metasaveerr'] = 'Die Metadaten konnten nicht gesichert werden';
$lang['metasaveok'] = 'Metadaten gesichert';
-$lang['img_backto'] = 'Zurück zu';
$lang['img_title'] = 'Titel';
$lang['img_caption'] = 'Bildunterschrift';
$lang['img_date'] = 'Datum';
@@ -266,7 +269,6 @@ $lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Schlagwörter';
$lang['img_width'] = 'Breite';
$lang['img_height'] = 'Höhe';
-$lang['img_manager'] = 'Im Medien-Manager anzeigen';
$lang['subscr_subscribe_success'] = '%s hat nun Änderungen der Seite %s abonniert';
$lang['subscr_subscribe_error'] = '%s kann die Änderungen der Seite %s nicht abonnieren';
$lang['subscr_subscribe_noaddress'] = 'Weil Ihre E-Mail-Adresse fehlt, können Sie das Thema nicht abonnieren';
diff --git a/inc/lang/el/lang.php b/inc/lang/el/lang.php
index 170e101a5..d97721cdb 100644
--- a/inc/lang/el/lang.php
+++ b/inc/lang/el/lang.php
@@ -241,7 +241,7 @@ $lang['admin_register'] = 'Προσθήκη νέου χρήστη';
$lang['metaedit'] = 'Τροποποίηση metadata';
$lang['metasaveerr'] = 'Η αποθήκευση των metadata απέτυχε';
$lang['metasaveok'] = 'Επιτυχής αποθήκευση metadata';
-$lang['img_backto'] = 'Επιστροφή σε';
+$lang['btn_img_backto'] = 'Επιστροφή σε %s';
$lang['img_title'] = 'Τίτλος';
$lang['img_caption'] = 'Λεζάντα';
$lang['img_date'] = 'Ημερομηνία';
@@ -254,7 +254,7 @@ $lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Λέξεις-κλειδιά';
$lang['img_width'] = 'Πλάτος';
$lang['img_height'] = 'Ύψος';
-$lang['img_manager'] = 'Εμφάνιση στον διαχειριστή πολυμέσων';
+$lang['btn_mediaManager'] = 'Εμφάνιση στον διαχειριστή πολυμέσων';
$lang['subscr_subscribe_success'] = 'Ο/η %s προστέθηκε στην λίστα ειδοποιήσεων για το %s';
$lang['subscr_subscribe_error'] = 'Σφάλμα κατά την προσθήκη του/της %s στην λίστα ειδοποιήσεων για το %s';
$lang['subscr_subscribe_noaddress'] = 'Δεν υπάρχει διεύθυνση ταχυδρομείου συσχετισμένη με το όνομα χρήστη σας. Κατά συνέπεια δεν μπορείτε να προστεθείτε στην λίστα ειδοποιήσεων';
diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php
index fccb470e3..592289185 100644
--- a/inc/lang/en/lang.php
+++ b/inc/lang/en/lang.php
@@ -52,6 +52,8 @@ $lang['btn_register'] = 'Register';
$lang['btn_apply'] = 'Apply';
$lang['btn_media'] = 'Media Manager';
$lang['btn_deleteuser'] = 'Remove My Account';
+$lang['btn_img_backto'] = 'Back to %s';
+$lang['btn_mediaManager'] = 'View in media manager';
$lang['loggedinas'] = 'Logged in as';
$lang['user'] = 'Username';
@@ -78,7 +80,6 @@ $lang['regbadmail'] = 'The given email address looks invalid - if you
$lang['regbadpass'] = 'The two given passwords are not identical, please try again.';
$lang['regpwmail'] = 'Your DokuWiki password';
$lang['reghere'] = 'You don\'t have an account yet? Just get one';
-$lang['notloggedin'] = 'Perhaps you forgot to login?';
$lang['profna'] = 'This wiki does not support profile modification';
$lang['profnochange'] = 'No changes, nothing to do.';
@@ -192,6 +193,11 @@ $lang['difflink'] = 'Link to this comparison view';
$lang['diff_type'] = 'View differences:';
$lang['diff_inline'] = 'Inline';
$lang['diff_side'] = 'Side by Side';
+$lang['diffprevrev'] = 'Previous revision';
+$lang['diffnextrev'] = 'Next revision';
+$lang['difflastrev'] = 'Last revision';
+$lang['diffbothprevrev'] = 'Both sides previous revision';
+$lang['diffbothnextrev'] = 'Both sides next revision';
$lang['line'] = 'Line';
$lang['breadcrumb'] = 'Trace';
$lang['youarehere'] = 'You are here';
@@ -254,7 +260,6 @@ $lang['admin_register'] = 'Add new user';
$lang['metaedit'] = 'Edit Metadata';
$lang['metasaveerr'] = 'Writing metadata failed';
$lang['metasaveok'] = 'Metadata saved';
-$lang['img_backto'] = 'Back to';
$lang['img_title'] = 'Title';
$lang['img_caption'] = 'Caption';
$lang['img_date'] = 'Date';
@@ -267,7 +272,6 @@ $lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Keywords';
$lang['img_width'] = 'Width';
$lang['img_height'] = 'Height';
-$lang['img_manager'] = 'View in media manager';
$lang['subscr_subscribe_success'] = 'Added %s to subscription list for %s';
$lang['subscr_subscribe_error'] = 'Error adding %s to subscription list for %s';
diff --git a/inc/lang/eo/denied.txt b/inc/lang/eo/denied.txt
index 0be6a2e84..e0abba12c 100644
--- a/inc/lang/eo/denied.txt
+++ b/inc/lang/eo/denied.txt
@@ -1,4 +1,4 @@
====== Aliro malpermesita ======
-Vi ne havas sufiĉajn rajtojn rigardi ĉi tiujn paĝojn.
+Vi ne havas sufiĉajn rajtojn daŭrigi.
diff --git a/inc/lang/eo/lang.php b/inc/lang/eo/lang.php
index 97231bdce..4a4a52cac 100644
--- a/inc/lang/eo/lang.php
+++ b/inc/lang/eo/lang.php
@@ -54,6 +54,8 @@ $lang['btn_register'] = 'Registriĝi';
$lang['btn_apply'] = 'Apliki';
$lang['btn_media'] = 'Medio-administrilo';
$lang['btn_deleteuser'] = 'Forigi mian konton';
+$lang['btn_img_backto'] = 'Iri reen al %s';
+$lang['btn_mediaManager'] = 'Rigardi en aŭdvidaĵ-administrilo';
$lang['loggedinas'] = 'Ensalutinta kiel';
$lang['user'] = 'Uzant-nomo';
$lang['pass'] = 'Pasvorto';
@@ -184,6 +186,11 @@ $lang['difflink'] = 'Ligilo al kompara rigardo';
$lang['diff_type'] = 'Rigardi malsamojn:';
$lang['diff_inline'] = 'Samlinie';
$lang['diff_side'] = 'Apude';
+$lang['diffprevrev'] = 'Antaŭa revizio';
+$lang['diffnextrev'] = 'Sekva revizio';
+$lang['difflastrev'] = 'Lasta revizio';
+$lang['diffbothprevrev'] = 'Sur ambaŭ flankoj antaŭa revizio';
+$lang['diffbothnextrev'] = 'Sur ambaŭ flankoj sekva revizio';
$lang['line'] = 'Linio';
$lang['breadcrumb'] = 'Paŝoj';
$lang['youarehere'] = 'Vi estas ĉi tie';
@@ -240,7 +247,6 @@ $lang['admin_register'] = 'Aldoni novan uzanton';
$lang['metaedit'] = 'Redakti metadatumaron';
$lang['metasaveerr'] = 'La konservo de metadatumaro malsukcesis';
$lang['metasaveok'] = 'La metadatumaro konserviĝis';
-$lang['img_backto'] = 'Iri reen al';
$lang['img_title'] = 'Titolo';
$lang['img_caption'] = 'Priskribo';
$lang['img_date'] = 'Dato';
@@ -253,7 +259,6 @@ $lang['img_camera'] = 'Kamerao';
$lang['img_keywords'] = 'Ŝlosilvortoj';
$lang['img_width'] = 'Larĝeco';
$lang['img_height'] = 'Alteco';
-$lang['img_manager'] = 'Rigardi en aŭdvidaĵ-administrilo';
$lang['subscr_subscribe_success'] = 'Aldonis %s al la abonlisto por %s';
$lang['subscr_subscribe_error'] = 'Eraro dum aldono de %s al la abonlisto por %s';
$lang['subscr_subscribe_noaddress'] = 'Ne estas adreso ligita al via ensaluto, ne eblas aldoni vin al la abonlisto';
diff --git a/inc/lang/es/jquery.ui.datepicker.js b/inc/lang/es/jquery.ui.datepicker.js
index ae32124e7..763d4cedd 100644
--- a/inc/lang/es/jquery.ui.datepicker.js
+++ b/inc/lang/es/jquery.ui.datepicker.js
@@ -9,9 +9,9 @@ jQuery(function($){
monthNames: ['enero','febrero','marzo','abril','mayo','junio',
'julio','agosto','septiembre','octubre','noviembre','diciembre'],
monthNamesShort: ['ene','feb','mar','abr','may','jun',
- 'jul','ago','sep','oct','nov','dic'],
+ 'jul','ogo','sep','oct','nov','dic'],
dayNames: ['domingo','lunes','martes','miércoles','jueves','viernes','sábado'],
- dayNamesShort: ['dom','lun','mar','mié','jue','vie','sáb'],
+ dayNamesShort: ['dom','lun','mar','mié','juv','vie','sáb'],
dayNamesMin: ['D','L','M','X','J','V','S'],
weekHeader: 'Sm',
dateFormat: 'dd/mm/yy',
diff --git a/inc/lang/es/lang.php b/inc/lang/es/lang.php
index b9f81dd82..9525a4c08 100644
--- a/inc/lang/es/lang.php
+++ b/inc/lang/es/lang.php
@@ -32,6 +32,8 @@
* @author monica <may.dorado@gmail.com>
* @author Antonio Bueno <atnbueno@gmail.com>
* @author Juan De La Cruz <juann.dlc@gmail.com>
+ * @author Fernando <fdiezala@gmail.com>
+ * @author Eloy <ej.perezgomez@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -76,6 +78,8 @@ $lang['btn_register'] = 'Registrarse';
$lang['btn_apply'] = 'Aplicar';
$lang['btn_media'] = 'Gestor de ficheros';
$lang['btn_deleteuser'] = 'Elimina Mi Cuenta';
+$lang['btn_img_backto'] = 'Volver a %s';
+$lang['btn_mediaManager'] = 'Ver en el Administrador de medios';
$lang['loggedinas'] = 'Conectado como ';
$lang['user'] = 'Usuario';
$lang['pass'] = 'Contraseña';
@@ -207,6 +211,11 @@ $lang['difflink'] = 'Enlace a la vista de comparación';
$lang['diff_type'] = 'Ver diferencias';
$lang['diff_inline'] = 'En línea';
$lang['diff_side'] = 'Lado a lado';
+$lang['diffprevrev'] = 'Revisión previa';
+$lang['diffnextrev'] = 'Próxima revisión';
+$lang['difflastrev'] = 'Última revisión';
+$lang['diffbothprevrev'] = 'Ambos lados, revisión anterior';
+$lang['diffbothnextrev'] = 'Ambos lados, revisión siguiente';
$lang['line'] = 'Línea';
$lang['breadcrumb'] = 'Traza';
$lang['youarehere'] = 'Estás aquí';
@@ -263,7 +272,6 @@ $lang['admin_register'] = 'Añadir nuevo usuario';
$lang['metaedit'] = 'Editar metadatos';
$lang['metasaveerr'] = 'La escritura de los metadatos ha fallado';
$lang['metasaveok'] = 'Los metadatos han sido guardados';
-$lang['img_backto'] = 'Volver a';
$lang['img_title'] = 'Título';
$lang['img_caption'] = 'Epígrafe';
$lang['img_date'] = 'Fecha';
@@ -276,7 +284,6 @@ $lang['img_camera'] = 'Cámara';
$lang['img_keywords'] = 'Palabras claves';
$lang['img_width'] = 'Ancho';
$lang['img_height'] = 'Alto';
-$lang['img_manager'] = 'Ver en el Administrador de medios';
$lang['subscr_subscribe_success'] = 'Se agregó %s a las listas de suscripción para %s';
$lang['subscr_subscribe_error'] = 'Error al agregar %s a las listas de suscripción para %s';
$lang['subscr_subscribe_noaddress'] = 'No hay dirección asociada con tu registro, no se puede agregarte a la lista de suscripción';
@@ -322,13 +329,13 @@ $lang['i_license_none'] = 'No mostrar ninguna información sobre licencia
$lang['i_pop_field'] = 'Por favor, ayúdanos a mejorar la experiencia de DokuWiki:';
$lang['i_pop_label'] = 'Una vez al mes, enviar información anónima de uso de datos a los desarrolladores de DokuWiki';
$lang['recent_global'] = 'Actualmente estás viendo los cambios dentro del namespace <b>%s</b>. También puedes <a href="%s">ver los cambios recientes en el wiki completo</a>.';
-$lang['years'] = '%d años atrás';
-$lang['months'] = '%d meses atrás';
-$lang['weeks'] = '%d semanas atrás';
-$lang['days'] = '%d días atrás';
-$lang['hours'] = '%d horas atrás';
-$lang['minutes'] = '%d minutos atrás';
-$lang['seconds'] = '%d segundos atrás';
+$lang['years'] = 'hace %d años';
+$lang['months'] = 'hace %d meses';
+$lang['weeks'] = 'hace %d semanas';
+$lang['days'] = 'hace %d días';
+$lang['hours'] = 'hace %d horas';
+$lang['minutes'] = 'hace %d minutos';
+$lang['seconds'] = 'hace %d segundos';
$lang['wordblock'] = 'Sus cambios no se han guardado porque contienen textos bloqueados (spam).';
$lang['media_uploadtab'] = 'Cargar';
$lang['media_searchtab'] = 'Buscar';
diff --git a/inc/lang/et/lang.php b/inc/lang/et/lang.php
index ee9b1d969..49fc33e17 100644
--- a/inc/lang/et/lang.php
+++ b/inc/lang/et/lang.php
@@ -242,7 +242,7 @@ $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['btn_img_backto'] = 'Tagasi %s';
$lang['img_title'] = 'Tiitel';
$lang['img_caption'] = 'Kirjeldus';
$lang['img_date'] = 'Kuupäev';
diff --git a/inc/lang/eu/lang.php b/inc/lang/eu/lang.php
index c7e7ead9a..9a38099b3 100644
--- a/inc/lang/eu/lang.php
+++ b/inc/lang/eu/lang.php
@@ -227,7 +227,7 @@ $lang['admin_register'] = 'Erabiltzaile berria gehitu';
$lang['metaedit'] = 'Metadatua Aldatu';
$lang['metasaveerr'] = 'Metadatuaren idazketak huts egin du';
$lang['metasaveok'] = 'Metadatua gordea';
-$lang['img_backto'] = 'Atzera hona';
+$lang['btn_img_backto'] = 'Atzera hona %s';
$lang['img_title'] = 'Izenburua';
$lang['img_caption'] = 'Epigrafea';
$lang['img_date'] = 'Data';
@@ -240,7 +240,7 @@ $lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Hitz-gakoak';
$lang['img_width'] = 'Zabalera';
$lang['img_height'] = 'Altuera';
-$lang['img_manager'] = 'Media kudeatzailean ikusi';
+$lang['btn_mediaManager'] = 'Media kudeatzailean ikusi';
$lang['subscr_subscribe_success'] = '%s gehitua %s-ren harpidetza zerrendara';
$lang['subscr_subscribe_error'] = 'Errorea %s gehitzen %s-ren harpidetza zerrendara';
$lang['subscr_subscribe_noaddress'] = 'Ez dago helbiderik zure login-arekin lotuta, ezin zara harpidetza zerrendara gehitua izan.';
diff --git a/inc/lang/fa/lang.php b/inc/lang/fa/lang.php
index dbad62890..1e819419f 100644
--- a/inc/lang/fa/lang.php
+++ b/inc/lang/fa/lang.php
@@ -240,7 +240,7 @@ $lang['admin_register'] = 'یک حساب جدید بسازید';
$lang['metaedit'] = 'ویرایش داده‌های متا';
$lang['metasaveerr'] = 'نوشتن داده‌نما با مشکل مواجه شد';
$lang['metasaveok'] = 'داده‌نما ذخیره شد';
-$lang['img_backto'] = 'بازگشت به ';
+$lang['btn_img_backto'] = 'بازگشت به %s';
$lang['img_title'] = 'عنوان تصویر';
$lang['img_caption'] = 'عنوان';
$lang['img_date'] = 'تاریخ';
@@ -253,7 +253,7 @@ $lang['img_camera'] = 'دوربین';
$lang['img_keywords'] = 'واژه‌های کلیدی';
$lang['img_width'] = 'عرض';
$lang['img_height'] = 'ارتفاع';
-$lang['img_manager'] = 'دیدن در مدیریت محتوای چند رسانه ای';
+$lang['btn_mediaManager'] = 'دیدن در مدیریت محتوای چند رسانه ای';
$lang['subscr_subscribe_success'] = '%s به لیست آبونه %s افزوده شد';
$lang['subscr_subscribe_error'] = 'اشکال در افزودن %s به لیست آبونه %s';
$lang['subscr_subscribe_noaddress'] = 'هیچ آدرسی برای این عضویت اضافه نشده است، شما نمی‌توانید به لیست آبونه اضافه شوید';
diff --git a/inc/lang/fi/lang.php b/inc/lang/fi/lang.php
index feefc3da8..9b877013e 100644
--- a/inc/lang/fi/lang.php
+++ b/inc/lang/fi/lang.php
@@ -240,7 +240,7 @@ $lang['admin_register'] = 'Lisää uusi käyttäjä';
$lang['metaedit'] = 'Muokkaa metadataa';
$lang['metasaveerr'] = 'Metadatan kirjoittaminen epäonnistui';
$lang['metasaveok'] = 'Metadata tallennettu';
-$lang['img_backto'] = 'Takaisin';
+$lang['btn_img_backto'] = 'Takaisin %s';
$lang['img_title'] = 'Otsikko';
$lang['img_caption'] = 'Kuvateksti';
$lang['img_date'] = 'Päivämäärä';
@@ -253,7 +253,7 @@ $lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Avainsanat';
$lang['img_width'] = 'Leveys';
$lang['img_height'] = 'Korkeus';
-$lang['img_manager'] = 'Näytä mediamanagerissa';
+$lang['btn_mediaManager'] = 'Näytä mediamanagerissa';
$lang['subscr_subscribe_success'] = '%s lisätty %s tilauslistalle';
$lang['subscr_subscribe_error'] = 'Virhe lisättäessä %s tilauslistalle %s';
$lang['subscr_subscribe_noaddress'] = 'Login tiedoissasi ei ole sähköpostiosoitetta. Sinua ei voi lisätä tilaukseen';
diff --git a/inc/lang/fo/lang.php b/inc/lang/fo/lang.php
index 161e7321a..2613186eb 100644
--- a/inc/lang/fo/lang.php
+++ b/inc/lang/fo/lang.php
@@ -157,7 +157,7 @@ $lang['admin_register'] = 'Upprætta nýggjan brúkara';
$lang['metaedit'] = 'Rætta metadáta';
$lang['metasaveerr'] = 'Brek við skriving av metadáta';
$lang['metasaveok'] = 'Metadáta goymt';
-$lang['img_backto'] = 'Aftur til';
+$lang['btn_img_backto'] = 'Aftur til %s';
$lang['img_title'] = 'Heitið';
$lang['img_caption'] = 'Myndatekstur';
$lang['img_date'] = 'Dato';
diff --git a/inc/lang/fr/lang.php b/inc/lang/fr/lang.php
index 32e3055f7..1f11608e6 100644
--- a/inc/lang/fr/lang.php
+++ b/inc/lang/fr/lang.php
@@ -30,6 +30,8 @@
* @author Emmanuel <seedfloyd@gmail.com>
* @author Jérôme Brandt <jeromebrandt@gmail.com>
* @author Wild <wild.dagger@free.fr>
+ * @author ggallon <gwenael.gallon@mac.com>
+ * @author David VANTYGHEM <david.vantyghem@free.fr>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -62,7 +64,7 @@ $lang['btn_delete'] = 'Effacer';
$lang['btn_back'] = 'Retour';
$lang['btn_backlink'] = 'Liens vers cette page';
$lang['btn_backtomedia'] = 'Retour à la sélection du fichier média';
-$lang['btn_subscribe'] = 'S\'abonner à la page';
+$lang['btn_subscribe'] = 'S\'abonner à cette page';
$lang['btn_profile'] = 'Mettre à jour le profil';
$lang['btn_reset'] = 'Réinitialiser';
$lang['btn_resendpwd'] = 'Définir un nouveau mot de passe';
@@ -74,6 +76,8 @@ $lang['btn_register'] = 'Créer un compte';
$lang['btn_apply'] = 'Appliquer';
$lang['btn_media'] = 'Gestionnaire de médias';
$lang['btn_deleteuser'] = 'Supprimer mon compte';
+$lang['btn_img_backto'] = 'Retour à %s';
+$lang['btn_mediaManager'] = 'Voir dans le gestionnaire de médias';
$lang['loggedinas'] = 'Connecté en tant que ';
$lang['user'] = 'Utilisateur';
$lang['pass'] = 'Mot de passe';
@@ -93,7 +97,7 @@ $lang['regmissing'] = 'Désolé, vous devez remplir tous les champs.'
$lang['reguexists'] = 'Désolé, ce nom d\'utilisateur est déjà utilisé.';
$lang['regsuccess'] = 'L\'utilisateur a été créé. Le mot de passe a été expédié par courriel.';
$lang['regsuccess2'] = 'L\'utilisateur a été créé.';
-$lang['regmailfail'] = 'Il semble y avoir un problème à l\'envoi du courriel. Contactez l\'administrateur.';
+$lang['regmailfail'] = 'On dirait qu\'il y a eu une erreur lors de l\'envoi du mot de passe de messagerie. Veuillez contacter l\'administrateur !';
$lang['regbadmail'] = 'L\'adresse de courriel semble incorrecte. Si vous pensez que c\'est une erreur, contactez l\'administrateur.';
$lang['regbadpass'] = 'Les deux mots de passe fournis sont différents, veuillez recommencez.';
$lang['regpwmail'] = 'Votre mot de passe DokuWiki';
@@ -203,6 +207,9 @@ $lang['difflink'] = 'Lien vers cette vue comparative';
$lang['diff_type'] = 'Voir les différences :';
$lang['diff_inline'] = 'Sur une seule ligne';
$lang['diff_side'] = 'Côte à côte';
+$lang['diffprevrev'] = 'Révision précédente';
+$lang['diffnextrev'] = 'Prochaine révision';
+$lang['difflastrev'] = 'Dernière révision';
$lang['line'] = 'Ligne';
$lang['breadcrumb'] = 'Piste';
$lang['youarehere'] = 'Vous êtes ici';
@@ -259,7 +266,6 @@ $lang['admin_register'] = 'Ajouter un nouvel utilisateur';
$lang['metaedit'] = 'Modifier les métadonnées';
$lang['metasaveerr'] = 'Erreur lors de l\'enregistrement des métadonnées';
$lang['metasaveok'] = 'Métadonnées enregistrées';
-$lang['img_backto'] = 'Retour à';
$lang['img_title'] = 'Titre';
$lang['img_caption'] = 'Légende';
$lang['img_date'] = 'Date';
@@ -272,7 +278,6 @@ $lang['img_camera'] = 'Appareil photo';
$lang['img_keywords'] = 'Mots-clés';
$lang['img_width'] = 'Largeur';
$lang['img_height'] = 'Hauteur';
-$lang['img_manager'] = 'Voir dans le gestionnaire de médias';
$lang['subscr_subscribe_success'] = '%s a été ajouté à la liste de souscription de %s';
$lang['subscr_subscribe_error'] = 'Erreur à l\'ajout de %s à la liste de souscription de %s';
$lang['subscr_subscribe_noaddress'] = 'Il n\'y a pas d\'adresse associée à votre identifiant, vous ne pouvez pas être ajouté à la liste de souscription';
diff --git a/inc/lang/fr/subscr_form.txt b/inc/lang/fr/subscr_form.txt
index 49c0cf443..94e70afbd 100644
--- a/inc/lang/fr/subscr_form.txt
+++ b/inc/lang/fr/subscr_form.txt
@@ -1,3 +1,3 @@
====== Gestion de l'abonnement ======
-Cette page vous permet de gérer vos abonnements à la page et à la catégorie courantes \ No newline at end of file
+Cette page vous permet de gérer vos abonnements à la page et à la catégorie courantes. \ No newline at end of file
diff --git a/inc/lang/gl/lang.php b/inc/lang/gl/lang.php
index 65967a3b5..0c81f1fb2 100644
--- a/inc/lang/gl/lang.php
+++ b/inc/lang/gl/lang.php
@@ -230,7 +230,7 @@ $lang['admin_register'] = 'Engadir novo usuario';
$lang['metaedit'] = 'Editar Metadatos';
$lang['metasaveerr'] = 'Non se puideron escribir os metadatos';
$lang['metasaveok'] = 'Metadatos gardados';
-$lang['img_backto'] = 'Volver a';
+$lang['btn_img_backto'] = 'Volver a %s';
$lang['img_title'] = 'Título';
$lang['img_caption'] = 'Lenda';
$lang['img_date'] = 'Data';
@@ -243,7 +243,7 @@ $lang['img_camera'] = 'Cámara';
$lang['img_keywords'] = 'Verbas chave';
$lang['img_width'] = 'Ancho';
$lang['img_height'] = 'Alto';
-$lang['img_manager'] = 'Ver no xestor de arquivos-media';
+$lang['btn_mediaManager'] = 'Ver no xestor de arquivos-media';
$lang['subscr_subscribe_success'] = 'Engadido %s á lista de subscrición para %s';
$lang['subscr_subscribe_error'] = 'Erro ao tentar engadir %s á lista de subscrición para %s';
$lang['subscr_subscribe_noaddress'] = 'Non hai enderezos asociados co teu inicio de sesión, non é posíbel engadirte á lista de subscrición';
diff --git a/inc/lang/he/lang.php b/inc/lang/he/lang.php
index 8efe0da17..c9a01a193 100644
--- a/inc/lang/he/lang.php
+++ b/inc/lang/he/lang.php
@@ -243,7 +243,7 @@ $lang['admin_register'] = 'הוספת משתמש חדש';
$lang['metaedit'] = 'עריכת נתוני העל';
$lang['metasaveerr'] = 'אירע כשל בשמירת נתוני העל';
$lang['metasaveok'] = 'נתוני העל נשמרו';
-$lang['img_backto'] = 'חזרה אל';
+$lang['btn_img_backto'] = 'חזרה אל %s';
$lang['img_title'] = 'שם';
$lang['img_caption'] = 'כותרת';
$lang['img_date'] = 'תאריך';
@@ -256,7 +256,7 @@ $lang['img_camera'] = 'מצלמה';
$lang['img_keywords'] = 'מילות מפתח';
$lang['img_width'] = 'רוחב';
$lang['img_height'] = 'גובה';
-$lang['img_manager'] = 'צפה במנהל מדיה';
+$lang['btn_mediaManager'] = 'צפה במנהל מדיה';
$lang['subscr_subscribe_success'] = '%s נוסף לרשימת המינויים לדף %s';
$lang['subscr_subscribe_error'] = 'אירעה שגיאה בהוספת %s לרשימת המינויים לדף %s';
$lang['subscr_subscribe_noaddress'] = 'אין כתובת המשויכת עם הכניסה שלך, נא ניתן להוסיף אותך לרשימת המינויים';
@@ -285,7 +285,7 @@ $lang['i_modified'] = 'משיקולי אבטחה סקריפט זה י
עליך לחלץ שנית את הקבצים מהחבילה שהורדה או להיעזר בדף
<a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>';
$lang['i_funcna'] = 'פונקציית ה-PHP&rlm; <code>%s</code> אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?';
-$lang['i_phpver'] = 'גרסת PHP שלך <code>%s</code> נמוכה מ <code>%s</ code> הצורך. אתה צריך לשדרג PHP שלך להתקין.';
+$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>. נא לבדוק את הרשאות הקובץ/תיקייה וליצור את הקובץ ידנית.';
diff --git a/inc/lang/hi/lang.php b/inc/lang/hi/lang.php
index 184eeedbc..95c443ae9 100644
--- a/inc/lang/hi/lang.php
+++ b/inc/lang/hi/lang.php
@@ -103,7 +103,7 @@ $lang['qb_extlink'] = 'बाह्य कड़ी';
$lang['qb_hr'] = 'खड़ी रेखा';
$lang['qb_sig'] = 'हस्ताक्षर डालें';
$lang['admin_register'] = 'नया उपयोगकर्ता जोड़ें';
-$lang['img_backto'] = 'वापस जाना';
+$lang['btn_img_backto'] = 'वापस जाना %s';
$lang['img_title'] = 'शीर्षक';
$lang['img_caption'] = 'सहशीर्षक';
$lang['img_date'] = 'तिथि';
diff --git a/inc/lang/hr/lang.php b/inc/lang/hr/lang.php
index f19610827..544541ab2 100644
--- a/inc/lang/hr/lang.php
+++ b/inc/lang/hr/lang.php
@@ -204,7 +204,7 @@ $lang['admin_register'] = 'Dodaj novog korisnika';
$lang['metaedit'] = 'Uredi metapodatake';
$lang['metasaveerr'] = 'Neuspješno zapisivanje metapodataka';
$lang['metasaveok'] = 'Spremljeni metapdaci';
-$lang['img_backto'] = 'Povratak na';
+$lang['btn_img_backto'] = 'Povratak na %s';
$lang['img_title'] = 'Naziv';
$lang['img_caption'] = 'Naslov';
$lang['img_date'] = 'Datum';
diff --git a/inc/lang/hu/lang.php b/inc/lang/hu/lang.php
index a0aef9447..ad70438d9 100644
--- a/inc/lang/hu/lang.php
+++ b/inc/lang/hu/lang.php
@@ -243,7 +243,7 @@ $lang['admin_register'] = 'Új felhasználó';
$lang['metaedit'] = 'Metaadatok szerkesztése';
$lang['metasaveerr'] = 'A metaadatok írása nem sikerült';
$lang['metasaveok'] = 'Metaadatok elmentve';
-$lang['img_backto'] = 'Vissza';
+$lang['btn_img_backto'] = 'Vissza %s';
$lang['img_title'] = 'Cím';
$lang['img_caption'] = 'Képaláírás';
$lang['img_date'] = 'Dátum';
@@ -256,7 +256,7 @@ $lang['img_camera'] = 'Fényképezőgép típusa';
$lang['img_keywords'] = 'Kulcsszavak';
$lang['img_width'] = 'Szélesség';
$lang['img_height'] = 'Magasság';
-$lang['img_manager'] = 'Megtekintés a médiakezelőben';
+$lang['btn_mediaManager'] = 'Megtekintés a médiakezelőben';
$lang['subscr_subscribe_success'] = '%s hozzáadva az értesítési listához: %s';
$lang['subscr_subscribe_error'] = 'Hiba történt %s hozzáadásakor az értesítési listához: %s';
$lang['subscr_subscribe_noaddress'] = 'Nincs e-mail cím megadva az adataidnál, így a rendszer nem tudott hozzáadni az értesítési listához';
diff --git a/inc/lang/ia/lang.php b/inc/lang/ia/lang.php
index 144dfe33b..1cc9bd8b5 100644
--- a/inc/lang/ia/lang.php
+++ b/inc/lang/ia/lang.php
@@ -202,7 +202,7 @@ $lang['admin_register'] = 'Adder nove usator';
$lang['metaedit'] = 'Modificar metadatos';
$lang['metasaveerr'] = 'Scriptura de metadatos fallite';
$lang['metasaveok'] = 'Metadatos salveguardate';
-$lang['img_backto'] = 'Retornar a';
+$lang['btn_img_backto'] = 'Retornar a %s';
$lang['img_title'] = 'Titulo';
$lang['img_caption'] = 'Legenda';
$lang['img_date'] = 'Data';
diff --git a/inc/lang/id/lang.php b/inc/lang/id/lang.php
index 5cb5cb6ea..481ff2fbd 100644
--- a/inc/lang/id/lang.php
+++ b/inc/lang/id/lang.php
@@ -8,6 +8,7 @@
* @author Yustinus Waruwu <juswaruwu@gmail.com>
* @author zamroni <therons@ymail.com>
* @author umriya afini <bigdream.power@gmail.com>
+ * @author Arif Budiman <me@kangarif.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -50,7 +51,10 @@ $lang['btn_draftdel'] = 'Hapus draft';
$lang['btn_revert'] = 'Kembalikan';
$lang['btn_register'] = 'Daftar';
$lang['btn_apply'] = 'Terapkan';
+$lang['btn_media'] = 'Pengelola Media';
$lang['btn_deleteuser'] = 'Hapus Akun Saya';
+$lang['btn_img_backto'] = 'Kembali ke %s';
+$lang['btn_mediaManager'] = 'Tampilkan di pengelola media';
$lang['loggedinas'] = 'Login sebagai ';
$lang['user'] = 'Username';
$lang['pass'] = 'Password';
@@ -78,6 +82,7 @@ $lang['profna'] = 'Wiki ini tidak mengijinkan perubahan profil.';
$lang['profnochange'] = 'Tidak ada perubahan.';
$lang['profnoempty'] = 'Mohon mengisikan nama atau alamat email.';
$lang['profchanged'] = 'Profil User berhasil diubah.';
+$lang['profnodelete'] = 'Wiki ini tidak mendukung penghapusan pengguna';
$lang['profdeleteuser'] = 'Hapus Akun';
$lang['profdeleted'] = 'Akun anda telah dihapus dari wiki ini';
$lang['profconfdelete'] = 'Saya berharap menghapus akun saya dari wiki ini.
@@ -91,10 +96,14 @@ $lang['resendpwdnouser'] = 'Maaf, user ini tidak ditemukan.';
$lang['resendpwdbadauth'] = 'Maaf, kode autentikasi tidak valid. Pastikan Anda menggunakan keseluruhan link konfirmasi.';
$lang['resendpwdconfirm'] = 'Link konfirmasi telah dikirim melalui email.';
$lang['resendpwdsuccess'] = 'Password baru Anda telah dikirim melalui email.';
+$lang['license'] = 'Kecuali jika dinyatakan lain, konten pada wiki ini dilisensikan dibawah lisensi berikut:';
+$lang['licenseok'] = 'Catatan: Dengan menyunting halaman ini, Anda setuju untuk melisensikan konten Anda dibawah lisensi berikut:';
$lang['searchmedia'] = 'Cari nama file:';
+$lang['searchmedia_in'] = 'Cari di %s';
$lang['txt_upload'] = 'File yang akan diupload';
$lang['txt_filename'] = 'Masukkan nama wiki (opsional)';
$lang['txt_overwrt'] = 'File yang telah ada akan ditindih';
+$lang['maxuploadsize'] = 'Unggah maks. %s per berkas';
$lang['lockedby'] = 'Sedang dikunci oleh';
$lang['lockexpire'] = 'Penguncian artikel sampai dengan';
$lang['js']['willexpire'] = 'Halaman yang sedang Anda kunci akan berakhir dalam waktu kurang lebih satu menit.\nUntuk menghindari konflik, gunakan tombol Preview untuk me-reset timer pengunci.';
@@ -103,18 +112,41 @@ $lang['js']['searchmedia'] = 'Cari file';
$lang['js']['keepopen'] = 'Biarkan window terbuka dalam pemilihan';
$lang['js']['hidedetails'] = 'Sembunyikan detil';
$lang['js']['mediatitle'] = 'Pengaturan Link';
+$lang['js']['mediadisplay'] = 'Jenis tautan';
+$lang['js']['mediaalign'] = 'Perataan';
$lang['js']['mediasize'] = 'Ukuran gambar';
+$lang['js']['mediatarget'] = 'Tautan tujuan';
$lang['js']['mediaclose'] = 'Tutup';
+$lang['js']['mediainsert'] = 'Sisip';
$lang['js']['mediadisplayimg'] = 'Lihat gambar';
$lang['js']['mediadisplaylnk'] = 'Lihat hanya link';
+$lang['js']['mediasmall'] = 'Versi kecil';
+$lang['js']['mediamedium'] = 'Versi sedang';
+$lang['js']['medialarge'] = 'Versi besar';
+$lang['js']['mediaoriginal'] = 'Versi asli';
+$lang['js']['medialnk'] = 'Tautan ke halaman rincian';
+$lang['js']['mediadirect'] = 'Tautan langsung ke aslinya';
+$lang['js']['medianolnk'] = 'Tanpa tautan';
+$lang['js']['medianolink'] = 'Jangan tautkan gambar';
+$lang['js']['medialeft'] = 'Rata gambar sebelah kiri';
+$lang['js']['mediaright'] = 'Rata gambar sebelah kanan';
+$lang['js']['mediacenter'] = 'Rata gambar di tengah';
+$lang['js']['medianoalign'] = 'Jangan gunakan perataan';
$lang['js']['nosmblinks'] = 'Link ke share Windows hanya bekerja di Microsoft Internet Explorer.
Anda masih dapat mengcopy and paste linknya.';
+$lang['js']['linkwiz'] = 'Wizard Tautan';
+$lang['js']['linkto'] = 'Tautkan ke:';
$lang['js']['del_confirm'] = 'Hapus tulisan ini?';
+$lang['js']['restore_confirm'] = 'Benar-benar ingin mengembalikan versi ini?';
+$lang['js']['media_diff'] = 'Lihat perbedaan:';
+$lang['js']['media_diff_both'] = 'Berdampingan';
+$lang['js']['media_diff_opacity'] = 'Mencolok';
$lang['js']['media_select'] = 'Pilih file...';
$lang['js']['media_upload_btn'] = 'Unggah';
$lang['js']['media_done_btn'] = 'Selesai';
$lang['js']['media_drop'] = 'Tarik file disini untuk mengunggah';
$lang['js']['media_cancel'] = 'Buang';
+$lang['js']['media_overwrt'] = 'Timpa berkas yang ada';
$lang['rssfailed'] = 'Error terjadi saat mengambil feed: ';
$lang['nothingfound'] = 'Tidak menemukan samasekali.';
$lang['mediaselect'] = 'Pilihan Mediafile';
@@ -148,6 +180,13 @@ $lang['current'] = 'sekarang';
$lang['yours'] = 'Versi Anda';
$lang['diff'] = 'Tampilkan perbedaan dengan versi sekarang';
$lang['diff2'] = 'Tampilkan perbedaan diantara revisi terpilih';
+$lang['difflink'] = 'Tautan ke tampilan pembanding ini';
+$lang['diff_type'] = 'Tampilkan perbedaan:';
+$lang['diff_inline'] = 'Sebaris';
+$lang['diff_side'] = 'Berdampingan';
+$lang['diffprevrev'] = 'Revisi sebelumnya';
+$lang['diffnextrev'] = 'Revisi selanjutnya';
+$lang['difflastrev'] = 'Revisi terakhir';
$lang['line'] = 'Baris';
$lang['breadcrumb'] = 'Jejak';
$lang['youarehere'] = 'Anda disini';
@@ -158,11 +197,23 @@ $lang['created'] = 'dibuat';
$lang['restored'] = 'revisi lama ditampilkan kembali (%s)';
$lang['external_edit'] = 'Perubahan eksternal';
$lang['summary'] = 'Edit summary';
+$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> diperlukan untuk menampilkan konten ini.';
+$lang['download'] = 'Unduh Cuplikan';
+$lang['tools'] = 'Alat';
+$lang['user_tools'] = 'Alat Pengguna';
+$lang['site_tools'] = 'Alat Situs';
+$lang['page_tools'] = 'Alat Halaman';
+$lang['skip_to_content'] = 'lewati ke konten';
+$lang['sidebar'] = 'Bilah Sisi';
$lang['mail_newpage'] = 'Halaman ditambahkan:';
$lang['mail_changed'] = 'Halaman diubah:';
+$lang['mail_subscribe_list'] = 'halaman diubah dalam namespace:';
$lang['mail_new_user'] = 'User baru:';
$lang['mail_upload'] = 'Berkas di-upload:';
+$lang['changes_type'] = 'Tampilkan perubahan';
$lang['pages_changes'] = 'Halaman';
+$lang['media_changes'] = 'Berkas media';
+$lang['both_changes'] = 'Baik halaman dan berkas media';
$lang['qb_bold'] = 'Tebal';
$lang['qb_italic'] = 'Miring';
$lang['qb_underl'] = 'Garis Bawah';
@@ -173,6 +224,10 @@ $lang['qb_h2'] = 'Level 2 Headline';
$lang['qb_h3'] = 'Level 3 Headline';
$lang['qb_h4'] = 'Level 4 Headline';
$lang['qb_h5'] = 'Level 5 Headline';
+$lang['qb_hs'] = 'Pilih Judul';
+$lang['qb_hplus'] = 'Judul Lebih Atas';
+$lang['qb_hminus'] = 'Judul Lebih Bawah';
+$lang['qb_hequal'] = 'Tingkat Judul yang Sama';
$lang['qb_link'] = 'Link Internal';
$lang['qb_extlink'] = 'Link External';
$lang['qb_hr'] = 'Garis Horisontal';
@@ -182,11 +237,11 @@ $lang['qb_media'] = 'Tambahkan gambar atau file lain';
$lang['qb_sig'] = 'Sisipkan tanda tangan';
$lang['qb_smileys'] = 'Smileys';
$lang['qb_chars'] = 'Karakter Khusus';
+$lang['upperns'] = 'lompat ke namespace induk';
$lang['admin_register'] = 'Tambah user baru';
$lang['metaedit'] = 'Edit Metadata';
$lang['metasaveerr'] = 'Gagal menulis metadata';
$lang['metasaveok'] = 'Metadata tersimpan';
-$lang['img_backto'] = 'Kembali ke';
$lang['img_title'] = 'Judul';
$lang['img_caption'] = 'Label';
$lang['img_date'] = 'Tanggal';
@@ -197,6 +252,22 @@ $lang['img_copyr'] = 'Hakcipta';
$lang['img_format'] = 'Format';
$lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Katakunci';
+$lang['img_width'] = 'Lebar';
+$lang['img_height'] = 'Tinggi';
+$lang['subscr_subscribe_success'] = 'Menambah %s ke senarai langganan untuk %s';
+$lang['subscr_subscribe_error'] = 'Kesalahan menambahkan %s ke senarai langganan untuk %s';
+$lang['subscr_subscribe_noaddress'] = 'Tidak ada alamat yang terkait dengan login Anda, Anda tidak dapat ditambahkan ke senarai langganan';
+$lang['subscr_unsubscribe_success'] = 'Menghapus %s dari senarai langganan untuk %s';
+$lang['subscr_unsubscribe_error'] = 'Kesalahan menghapus %s dari senarai langganan untuk %s';
+$lang['subscr_already_subscribed'] = '%s sudah dilanggankan ke %s';
+$lang['subscr_not_subscribed'] = '%s tidak dilanggankan ke %s';
+$lang['subscr_m_not_subscribed'] = 'Saat ini Anda tidak berlangganan halaman dan namespace saat ini.';
+$lang['subscr_m_new_header'] = 'Tambahkan langganan';
+$lang['subscr_m_current_header'] = 'Langganan saat ini';
+$lang['subscr_m_unsubscribe'] = 'Berhenti berlangganan';
+$lang['subscr_m_subscribe'] = 'Berlangganan';
+$lang['subscr_m_receive'] = 'Menerima';
+$lang['subscr_style_every'] = 'email setiap diubah';
$lang['authtempfail'] = 'Autentikasi user saat ini sedang tidak dapat digunakan. Jika kejadian ini berlanjut, Harap informasikan admin Wiki Anda.';
$lang['i_chooselang'] = 'Pilih bahasa';
$lang['i_installer'] = 'Instalasi DokuWiki';
@@ -217,4 +288,41 @@ $lang['i_policy'] = 'Policy ACL awal';
$lang['i_pol0'] = 'Wiki Terbuka (baca, tulis, upload untuk semua orang)';
$lang['i_pol1'] = 'Wiki Publik (baca untuk semua orang, tulis dan upload untuk pengguna terdaftar)';
$lang['i_pol2'] = 'Wiki Privat (baca, tulis dan upload hanya untuk pengguna terdaftar)';
+$lang['i_allowreg'] = 'Ijinkan pengguna mendaftar sendiri';
$lang['i_retry'] = 'Coba Lagi';
+$lang['i_license'] = 'Silakan pilih lisensi untuk konten Anda:';
+$lang['i_license_none'] = 'Jangan tampilkan semua informasi lisensi';
+$lang['i_pop_field'] = 'Tolong, bantu kami meningkatkan pengalaman DokuWiki:';
+$lang['i_pop_label'] = 'Setiap bulan mengirimkan penggunaan data anonim ke pengembang DokuWiki';
+$lang['years'] = '%d tahun yang lalu';
+$lang['months'] = '%d bulan yang lalu';
+$lang['weeks'] = '%d minggu yang lalu';
+$lang['days'] = '%d hari yang lalu';
+$lang['hours'] = '%d jam yang lalu';
+$lang['minutes'] = '%d menit yang lalu';
+$lang['seconds'] = '%d detik yang lalu';
+$lang['wordblock'] = 'Pengubahan Anda tidak disimpan karena berisi teks yang diblokir (spam).';
+$lang['media_uploadtab'] = 'Unggah';
+$lang['media_searchtab'] = 'Cari';
+$lang['media_file'] = 'Berkas';
+$lang['media_viewtab'] = 'Lihat';
+$lang['media_edittab'] = 'Sunting';
+$lang['media_historytab'] = 'Riwayat';
+$lang['media_list_rows'] = 'Kolom';
+$lang['media_sort_name'] = 'Nama';
+$lang['media_sort_date'] = 'Tanggal';
+$lang['media_namespaces'] = 'Pilih namespace';
+$lang['media_upload'] = 'Unggah ke %s';
+$lang['media_search'] = 'Cari di %s';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s di %s';
+$lang['media_edit'] = 'Sunting %s';
+$lang['media_history'] = 'Riwayat %s';
+$lang['media_meta_edited'] = 'metadata disunting';
+$lang['media_perm_read'] = 'Maaf, Anda tidak memiliki izin untuk membaca berkas.';
+$lang['media_perm_upload'] = 'Maaf, Anda tidak memiliki izin untuk mengunggah berkas.';
+$lang['media_update'] = 'Unggah versi baru';
+$lang['media_restore'] = 'Kembalikan versi ini';
+$lang['currentns'] = 'Namespace saat ini';
+$lang['searchresult'] = 'Hasil Pencarian';
+$lang['wikimarkup'] = 'Markah Wiki';
diff --git a/inc/lang/id/resetpwd.txt b/inc/lang/id/resetpwd.txt
new file mode 100644
index 000000000..6ab26c866
--- /dev/null
+++ b/inc/lang/id/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Atur sandi baru ======
+
+Silakan masukkan sandi baru untuk akun Anda di wiki ini. \ No newline at end of file
diff --git a/inc/lang/id/subscr_digest.txt b/inc/lang/id/subscr_digest.txt
new file mode 100644
index 000000000..5e1041c04
--- /dev/null
+++ b/inc/lang/id/subscr_digest.txt
@@ -0,0 +1,17 @@
+Hei!
+
+Halaman @PAGE@ di wiki @TITLE@ telah disunting.
+Berikut perubahannya:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Revisi lama: @OLDPAGE@
+
+Revisi baru: @NEWPAGE@
+
+Untuk menonaktifkan pemberitahuan ini, masuk ke wiki di @DOKUWIKIURL@ kemudian kunjungi @SUBSCRIBE@ dan halaman batal berlangganan dan/atau namespace yang diubah.
+
+--
+Email ini dibuat oleh DokuWiki di @DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/is/lang.php b/inc/lang/is/lang.php
index fbc7e9049..219431a42 100644
--- a/inc/lang/is/lang.php
+++ b/inc/lang/is/lang.php
@@ -170,7 +170,7 @@ $lang['admin_register'] = 'Setja nýjan notenda inn';
$lang['metaedit'] = 'Breyta lýsigögnum';
$lang['metasaveerr'] = 'Vistun lýsigagna mistókst';
$lang['metasaveok'] = 'Lýsigögn vistuð';
-$lang['img_backto'] = 'Aftur til';
+$lang['btn_img_backto'] = 'Aftur til %s';
$lang['img_title'] = 'Heiti';
$lang['img_caption'] = 'Skýringartexti';
$lang['img_date'] = 'Dagsetning';
diff --git a/inc/lang/it/lang.php b/inc/lang/it/lang.php
index a2bde3b60..eefcec9db 100644
--- a/inc/lang/it/lang.php
+++ b/inc/lang/it/lang.php
@@ -245,7 +245,7 @@ $lang['admin_register'] = 'Aggiungi un nuovo utente';
$lang['metaedit'] = 'Modifica metadati';
$lang['metasaveerr'] = 'Scrittura metadati fallita';
$lang['metasaveok'] = 'Metadati salvati';
-$lang['img_backto'] = 'Torna a';
+$lang['btn_img_backto'] = 'Torna a %s';
$lang['img_title'] = 'Titolo';
$lang['img_caption'] = 'Descrizione';
$lang['img_date'] = 'Data';
@@ -258,7 +258,7 @@ $lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Parole chiave';
$lang['img_width'] = 'Larghezza';
$lang['img_height'] = 'Altezza';
-$lang['img_manager'] = 'Guarda nel gestore media';
+$lang['btn_mediaManager'] = 'Guarda nel gestore media';
$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';
diff --git a/inc/lang/ja/lang.php b/inc/lang/ja/lang.php
index 1f53b0a90..782689fa3 100644
--- a/inc/lang/ja/lang.php
+++ b/inc/lang/ja/lang.php
@@ -240,7 +240,7 @@ $lang['admin_register'] = '新規ユーザー作成';
$lang['metaedit'] = 'メタデータ編集';
$lang['metasaveerr'] = 'メタデータの書き込みに失敗しました';
$lang['metasaveok'] = 'メタデータは保存されました';
-$lang['img_backto'] = '戻る';
+$lang['btn_img_backto'] = '戻る %s';
$lang['img_title'] = 'タイトル';
$lang['img_caption'] = '見出し';
$lang['img_date'] = '日付';
@@ -253,7 +253,7 @@ $lang['img_camera'] = '使用カメラ';
$lang['img_keywords'] = 'キーワード';
$lang['img_width'] = '幅';
$lang['img_height'] = '高さ';
-$lang['img_manager'] = 'メディアマネージャーで閲覧';
+$lang['btn_mediaManager'] = 'メディアマネージャーで閲覧';
$lang['subscr_subscribe_success'] = '%sが%sの購読リストに登録されました。';
$lang['subscr_subscribe_error'] = '%sを%sの購読リストへの追加に失敗しました。';
$lang['subscr_subscribe_noaddress'] = 'あなたのログインに対応するアドレスがないため、購読リストへ追加することができません。';
diff --git a/inc/lang/ka/admin.txt b/inc/lang/ka/admin.txt
new file mode 100644
index 000000000..97072a449
--- /dev/null
+++ b/inc/lang/ka/admin.txt
@@ -0,0 +1,4 @@
+====== მართვა ======
+
+ქვემოთ თქვენ ხედავთ ადმინისტრაციული ოპერაციების სიას «დოკუვიკიში».
+
diff --git a/inc/lang/ka/adminplugins.txt b/inc/lang/ka/adminplugins.txt
new file mode 100644
index 000000000..011bfeb62
--- /dev/null
+++ b/inc/lang/ka/adminplugins.txt
@@ -0,0 +1 @@
+===== დამატებითი პლაგინები ===== \ No newline at end of file
diff --git a/inc/lang/ka/backlinks.txt b/inc/lang/ka/backlinks.txt
new file mode 100644
index 000000000..7b54797c7
--- /dev/null
+++ b/inc/lang/ka/backlinks.txt
@@ -0,0 +1,4 @@
+====== გადმომისამართება ======
+
+გვერდები რომლებიც ანიშნებენ ამ გვერდზე.
+
diff --git a/inc/lang/ka/conflict.txt b/inc/lang/ka/conflict.txt
new file mode 100644
index 000000000..1b1eb0482
--- /dev/null
+++ b/inc/lang/ka/conflict.txt
@@ -0,0 +1,5 @@
+====== გამოვიდა უფრო ახალი ვერსია ======
+
+არსებობს დოკუმენტის უფრო ახალი ვერსია, რომელიც თქვენ დაარედაქტირეთ. ეს ხდება მაშინ, როდესაც სხვა მომხმარებელი არედაქტირებს დოკუმენტს, სანამ თქვენ აკეთებდით იგივეს.
+
+ყურადღებით დააკვირდით ქვემოთ მოყვანილ განსხვავებებს, და გადაწყვიტეთ რომელი ვერსია სჯობს. თუ შენახვას დააჭერთ, თქვენი ვერსია შეინახება. \ No newline at end of file
diff --git a/inc/lang/ka/denied.txt b/inc/lang/ka/denied.txt
new file mode 100644
index 000000000..bb8910472
--- /dev/null
+++ b/inc/lang/ka/denied.txt
@@ -0,0 +1,3 @@
+====== მიუწვდომელია ======
+
+თქვენ არ გაქვთ საკმარისი უფლებები. იქნებ ავტორიზაცია დაგავიწყდათ?
diff --git a/inc/lang/ka/diff.txt b/inc/lang/ka/diff.txt
new file mode 100644
index 000000000..c635e45f4
--- /dev/null
+++ b/inc/lang/ka/diff.txt
@@ -0,0 +1,3 @@
+====== განსხვავებები ======
+ქვემოთ მოყვანილაი განსხვავებები მსგავს გვერდებს შორის.
+
diff --git a/inc/lang/ka/draft.txt b/inc/lang/ka/draft.txt
new file mode 100644
index 000000000..f3356ddb5
--- /dev/null
+++ b/inc/lang/ka/draft.txt
@@ -0,0 +1,3 @@
+====== ნაპოვნია ჩანაწერი ======
+
+გვერდის რედაქტირება არ იყო დამთავრებული. \ No newline at end of file
diff --git a/inc/lang/ka/edit.txt b/inc/lang/ka/edit.txt
new file mode 100644
index 000000000..3fffceb0c
--- /dev/null
+++ b/inc/lang/ka/edit.txt
@@ -0,0 +1,2 @@
+დაარედაქტირეთ გვერდი და დააჭირეთ «შენახვას». წაიკითხეთ [[wiki:syntax|FAQ]] ვიკის სინტაქსისთან გასაცნობად. დაარედაქტირეთ გვერდი მხოლოდ იმ შემთხვევაში თუ აპირებთ გვერდის გაუმჯობესებას. თუ თქვენ რამის დატესტვა გინდათ, გამოიყენეთ სპეციალური გვერდი.
+
diff --git a/inc/lang/ka/editrev.txt b/inc/lang/ka/editrev.txt
new file mode 100644
index 000000000..17ccff57f
--- /dev/null
+++ b/inc/lang/ka/editrev.txt
@@ -0,0 +1,2 @@
+**თქვენ ატვირთეთ დოკუმენტის ძველი ვერსია** მისი შენახვით თქვენ შექმნით ახალ ვერსიას იგივე შიგთავსით.
+----
diff --git a/inc/lang/ka/index.txt b/inc/lang/ka/index.txt
new file mode 100644
index 000000000..7daef7fb6
--- /dev/null
+++ b/inc/lang/ka/index.txt
@@ -0,0 +1 @@
+====== სტატიები ====== აქ ნაჩვენებია ყველა სტატია \ No newline at end of file
diff --git a/inc/lang/ka/lang.php b/inc/lang/ka/lang.php
new file mode 100644
index 000000000..bdf0f1997
--- /dev/null
+++ b/inc/lang/ka/lang.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Luka Lejava <luka.lejava@gmail.com>
+ */
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['doublequoteopening'] = '“';
+$lang['doublequoteclosing'] = '”';
+$lang['singlequoteopening'] = '‘';
+$lang['singlequoteclosing'] = '’';
+$lang['apostrophe'] = '’';
+$lang['btn_edit'] = 'დაარედაქტირეთ ეს გვერდი';
+$lang['btn_source'] = 'მაჩვენე გვერდის კოდი';
+$lang['btn_show'] = 'გვერდის ჩვენება';
+$lang['btn_create'] = 'გვერდის შექმნა';
+$lang['btn_search'] = 'ძიება';
+$lang['btn_save'] = 'შენახვა';
+$lang['btn_preview'] = 'ჩვენება';
+$lang['btn_top'] = 'მაღლა';
+$lang['btn_newer'] = '<< მეტი ';
+$lang['btn_older'] = 'ნაკლები >>';
+$lang['btn_revs'] = 'ძველი ვერსიები';
+$lang['btn_recent'] = 'ბოლო ცვლილებები';
+$lang['btn_upload'] = 'ატვირთვა';
+$lang['btn_cancel'] = 'შეწყვეტა';
+$lang['btn_index'] = 'სტატიები';
+$lang['btn_secedit'] = 'რედაქტირება';
+$lang['btn_login'] = 'შესვლა';
+$lang['btn_logout'] = 'გამოსვლა';
+$lang['btn_admin'] = 'ადმინი';
+$lang['btn_update'] = 'განახლება';
+$lang['btn_delete'] = 'წაშლა';
+$lang['btn_back'] = 'უკან';
+$lang['btn_backlink'] = 'გადმომისამართებული ბმულები';
+$lang['btn_backtomedia'] = 'მედიაფაილების არჩევა';
+$lang['btn_subscribe'] = 'Manage Subscriptions';
+$lang['btn_profile'] = 'პროფილის განახლება';
+$lang['btn_reset'] = 'წაშლა';
+$lang['btn_resendpwd'] = 'ახალი პაროლის დაყენება';
+$lang['btn_draft'] = 'ჩანაწერის წაშლა';
+$lang['btn_recover'] = 'ჩანაწერის აღდგენა';
+$lang['btn_draftdel'] = 'ჩანაწერის წაშლა';
+$lang['btn_revert'] = 'აღდგენა';
+$lang['btn_register'] = 'რეგისტრაცია';
+$lang['btn_apply'] = 'ცადე';
+$lang['btn_media'] = 'მედია ფაილების მართვა';
+$lang['btn_deleteuser'] = 'ჩემი ექაუნთის წაშლა';
+$lang['btn_img_backto'] = 'უკან %';
+$lang['btn_mediaManager'] = 'მედია ფაილების მმართველში გახსნა';
+$lang['loggedinas'] = 'შესული ხართ როგორც';
+$lang['user'] = 'ლოგინი';
+$lang['pass'] = 'პაროლი';
+$lang['newpass'] = 'ახალი პაროლი';
+$lang['oldpass'] = 'დაადასტურეთ პაროლი';
+$lang['passchk'] = 'კიდევ ერთხელ';
+$lang['remember'] = 'დამიმახსოვრე';
+$lang['fullname'] = 'ნამდვილი სახელი';
+$lang['email'] = 'ფოსტა';
+$lang['profile'] = 'მომხმარებლის პროფილი';
+$lang['badlogin'] = 'ლოგინი ან პაროლი არასწორია';
+$lang['badpassconfirm'] = 'პაროლი არასწორია';
+$lang['minoredit'] = 'ცვლილებები';
+$lang['draftdate'] = 'ჩანაწერების ავტომატური შენახვა ჩართულია';
+$lang['nosecedit'] = 'გვერდს ვადა გაუვიდა';
+$lang['regmissing'] = 'ყველა ველი შეავსეთ';
+$lang['reguexists'] = 'მსგავსი ლოგინი უკვე არსებობს';
+$lang['regsuccess'] = 'მომხმარებელი შექმნილია, პაროლი გამოგზავნილია';
+$lang['regsuccess2'] = 'მომხმარებელი შექმნილია';
+$lang['regmailfail'] = 'დაფიქსირდა შეცდომა';
+$lang['regbadmail'] = 'ფოსტა არასწორია';
+$lang['regbadpass'] = 'პაროლი განსხვავებულია';
+$lang['regpwmail'] = 'თვენი DokuWiki პაროლი';
+$lang['reghere'] = 'დარეგისტრირდი';
+$lang['profna'] = 'არ შეგიძლიათ პროფილის რედაქტირება';
+$lang['profnochange'] = 'ცვლილებები არ არის';
+$lang['profnoempty'] = 'ცარიელი სახელი ან ფოსტა დაუშვებელია';
+$lang['profchanged'] = 'პროფილი განახლდა';
+$lang['profnodelete'] = 'მომხმარებლის წაშლა შეუძლებელია';
+$lang['profdeleteuser'] = 'პროფილის წაშლა';
+$lang['profdeleted'] = 'პროფილი წაიშალა';
+$lang['profconfdelete'] = 'მე მსურს პროფილის წაშლა. <br/> თქვენ აღარ გექნებათ საშუალება აღადგინოთ პროფილი.';
+$lang['profconfdeletemissing'] = 'დადასტურების ველი ცარიელია';
+$lang['pwdforget'] = 'დაგავიწყდა პაროლი? აღადგინე';
+$lang['resendna'] = 'პაროლის აღდგენა შეუძლებელია';
+$lang['resendpwd'] = 'ახალი პაროლი';
+$lang['resendpwdmissing'] = 'უნდა შეავსოთ ყველა ველი';
+$lang['resendpwdnouser'] = 'მსგავსი ლოგინი დარეგისტრირებული არ არის';
+$lang['resendpwdbadauth'] = 'კოდი არასწორია';
+$lang['resendpwdconfirm'] = 'აღსადგენი ბმული გამოგზავნილია';
+$lang['resendpwdsuccess'] = 'ახალი პაროლი გამოგზავნილია';
+$lang['license'] = 'ვიკი ლიცენზირებულია: ';
+$lang['licenseok'] = 'ამ გვერდის რედაქტირებით თვენ ეთანხმებით ლიცენზიას:';
+$lang['searchmedia'] = 'საძებო სახელი:';
+$lang['searchmedia_in'] = 'ძებნა %-ში';
+$lang['txt_upload'] = 'აირჩიეთ ასატვირთი ფაილი';
+$lang['txt_filename'] = 'ატვირთვა როგორც (არჩევითი)';
+$lang['txt_overwrt'] = 'გადაწერა ზემოდან';
+$lang['maxuploadsize'] = 'მაქსიმალური ზომა %';
+$lang['lockedby'] = 'დაბლოკილია';
+$lang['lockexpire'] = 'განიბლოკება';
+$lang['js']['willexpire'] = 'გვერდი განიბლოკება 1 წუთში';
+$lang['js']['notsavedyet'] = 'შეუნახავი მონაცემები წაიშლება';
+$lang['js']['searchmedia'] = 'ძებნა';
+$lang['js']['keepopen'] = 'დატოვეთ ღია';
+$lang['js']['hidedetails'] = 'დეტალების დამალვა';
+$lang['js']['mediatitle'] = 'ინსტრუმენტები';
+$lang['js']['mediadisplay'] = 'ბმულის ტიპი';
+$lang['js']['mediaalign'] = 'Alignment';
+$lang['js']['mediasize'] = 'სურათის ზომა';
+$lang['js']['mediatarget'] = 'მიზნის ბმული';
+$lang['js']['mediaclose'] = 'დახურვა';
+$lang['js']['mediainsert'] = 'ჩასმა';
+$lang['js']['mediadisplayimg'] = 'სურათის ნახვა';
+$lang['js']['mediadisplaylnk'] = 'მაჩვენე მხოლოდ ბმული';
diff --git a/inc/lang/kk/lang.php b/inc/lang/kk/lang.php
index 37b0f462b..4b111b118 100644
--- a/inc/lang/kk/lang.php
+++ b/inc/lang/kk/lang.php
@@ -123,7 +123,7 @@ $lang['yours'] = 'Сендердің болжамыңыз';
$lang['created'] = 'ЖасалFан';
$lang['mail_new_user'] = 'Жаңа пайдаланушы';
$lang['qb_chars'] = 'Арнайы белгiлер';
-$lang['img_backto'] = 'Қайта оралу';
+$lang['btn_img_backto'] = 'Қайта оралу %s';
$lang['img_format'] = 'Формат';
$lang['img_camera'] = 'Камера';
$lang['i_chooselang'] = 'Тіл таңдау';
diff --git a/inc/lang/km/lang.php b/inc/lang/km/lang.php
index 4800b6c23..9f65ccd16 100644
--- a/inc/lang/km/lang.php
+++ b/inc/lang/km/lang.php
@@ -165,7 +165,7 @@ $lang['admin_register']= 'តែមអ្នកប្រើ';//'Add new user';
$lang['metaedit'] = 'កែទិន្នន័យអរូប';//'Edit Metadata';
$lang['metasaveerr'] = 'ពំអាចកត់រទិន្នន័យអរូប';//'Writing metadata failed';
$lang['metasaveok'] = 'ទិន្នន័យអរូប';
-$lang['img_backto'] = 'ថយក្រោយ';
+$lang['btn_img_backto'] = 'ថយក្រោយ%s';
$lang['img_title'] = 'អភិធេយ្យ';
$lang['img_caption'] = 'ចំណងជើង';
$lang['img_date'] = 'ថ្ងៃខែ';//'Date';
diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php
index 266ff01e5..592b953b9 100644
--- a/inc/lang/ko/lang.php
+++ b/inc/lang/ko/lang.php
@@ -12,6 +12,7 @@
* @author Myeongjin <aranet100@gmail.com>
* @author Gerrit Uitslag <klapinklapin@gmail.com>
* @author Garam <rowain8@gmail.com>
+ * @author Young gon Cha <garmede@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -45,7 +46,7 @@ $lang['btn_back'] = '뒤로';
$lang['btn_backlink'] = '백링크';
$lang['btn_backtomedia'] = '미디어 파일 선택으로 돌아가기';
$lang['btn_subscribe'] = '구독 관리';
-$lang['btn_profile'] = '개인 정보 바꾸기';
+$lang['btn_profile'] = '프로필 바꾸기';
$lang['btn_reset'] = '재설정';
$lang['btn_resendpwd'] = '새 비밀번호 설정';
$lang['btn_draft'] = '초안 편집';
@@ -54,18 +55,20 @@ $lang['btn_draftdel'] = '초안 삭제';
$lang['btn_revert'] = '되돌리기';
$lang['btn_register'] = '등록';
$lang['btn_apply'] = '적용';
-$lang['btn_media'] = '미디어 관리';
+$lang['btn_media'] = '미디어 관리자';
$lang['btn_deleteuser'] = '내 계정 제거';
+$lang['btn_img_backto'] = '%s(으)로 돌아가기';
+$lang['btn_mediaManager'] = '미디어 관리자에서 보기';
$lang['loggedinas'] = '로그인한 사용자';
$lang['user'] = '사용자 이름';
$lang['pass'] = '비밀번호';
$lang['newpass'] = '새 비밀번호';
$lang['oldpass'] = '현재 비밀번호 확인';
-$lang['passchk'] = '비밀번호 다시 확인';
+$lang['passchk'] = '다시 확인';
$lang['remember'] = '기억하기';
$lang['fullname'] = '실명';
$lang['email'] = '이메일';
-$lang['profile'] = '개인 정보';
+$lang['profile'] = '사용자 프로필';
$lang['badlogin'] = '죄송하지만 사용자 이름이나 비밀번호가 잘못되었습니다.';
$lang['badpassconfirm'] = '죄송하지만 비밀번호가 잘못되었습니다';
$lang['minoredit'] = '사소한 바뀜';
@@ -75,21 +78,21 @@ $lang['regmissing'] = '죄송하지만 모든 필드를 채워야 합
$lang['reguexists'] = '죄송하지만 같은 이름을 사용하는 사용자가 있습니다.';
$lang['regsuccess'] = '사용자를 만들었으며 비밀번호는 이메일로 보냈습니다.';
$lang['regsuccess2'] = '사용자를 만들었습니다.';
-$lang['regmailfail'] = '비밀번호를 이메일로 보내는 동안 오류가 발생했습니다. 관리자에게 문의하세요!';
-$lang['regbadmail'] = '주어진 이메일 주소가 잘못되었습니다 - 오류라고 생각하면 관리자에게 문의하세요';
-$lang['regbadpass'] = '새 비밀번호가 같지 않습니다. 다시 입력하세요.';
+$lang['regmailfail'] = '비밀번호를 이메일로 보내는 동안 오류가 발생했습니다. 관리자에게 문의해주세요!';
+$lang['regbadmail'] = '주어진 이메일 주소가 잘못되었습니다 - 오류라고 생각하면 관리자에게 문의해주세요';
+$lang['regbadpass'] = '두 주어진 비밀번호가 같지 않습니다. 다시 입력하세요.';
$lang['regpwmail'] = '도쿠위키 비밀번호';
-$lang['reghere'] = '계정이 없나요? 계정을 등록할 수 있습니다';
-$lang['profna'] = '이 위키는 개인 정보 수정을 할 수 없습니다';
+$lang['reghere'] = '계정이 없나요? 계정을 등록하세요';
+$lang['profna'] = '이 위키는 프로필 수정을 할 수 없습니다';
$lang['profnochange'] = '바뀐 내용이 없습니다.';
-$lang['profnoempty'] = '이름이나 이메일 주소가 비었습니다.';
-$lang['profchanged'] = '개인 정보가 성공적으로 바뀌었습니다.';
+$lang['profnoempty'] = '빈 이름이나 이메일 주소는 허용하지 않습니다.';
+$lang['profchanged'] = '프로필이 성공적으로 바뀌었습니다.';
$lang['profnodelete'] = '이 위키는 사용자 삭제를 지원하지 않습니다';
$lang['profdeleteuser'] = '계정 삭제';
$lang['profdeleted'] = '당신의 사용자 계정이 이 위키에서 삭제되었습니다';
$lang['profconfdelete'] = '이 위키에서 내 계정을 제거하고 싶습니다. <br/> 이 행동은 되돌릴 수 없습니다.';
$lang['profconfdeletemissing'] = '선택하지 않은 확인 상자를 확인';
-$lang['pwdforget'] = '비밀번호를 잊으셨나요? 비밀번호를 재설정할 수 있습니다';
+$lang['pwdforget'] = '비밀번호를 잊으셨나요? 비밀번호를 재설정하세요';
$lang['resendna'] = '이 위키는 비밀번호 재설정을 지원하지 않습니다.';
$lang['resendpwd'] = '다음으로 새 비밀번호 보내기';
$lang['resendpwdmissing'] = '죄송하지만 모든 필드를 채워야 합니다.';
@@ -110,10 +113,10 @@ $lang['lockexpire'] = '잠금 해제 시간';
$lang['js']['willexpire'] = '잠시 후 편집 잠금이 해제됩니다.\n편집 충돌을 피하려면 미리 보기를 눌러 잠금 시간을 다시 설정하세요.';
$lang['js']['notsavedyet'] = '저장하지 않은 바뀜이 사라집니다.';
$lang['js']['searchmedia'] = '파일 검색';
-$lang['js']['keepopen'] = '선택할 때 창을 열어 놓기';
+$lang['js']['keepopen'] = '선택할 때 열어 놓은 창을 유지하기';
$lang['js']['hidedetails'] = '자세한 정보 숨기기';
$lang['js']['mediatitle'] = '링크 설정';
-$lang['js']['mediadisplay'] = '링크 형태';
+$lang['js']['mediadisplay'] = '링크 유형';
$lang['js']['mediaalign'] = '배치';
$lang['js']['mediasize'] = '그림 크기';
$lang['js']['mediatarget'] = '링크 목표';
@@ -171,7 +174,7 @@ $lang['mediaview'] = '원본 파일 보기';
$lang['mediaroot'] = '루트';
$lang['mediaupload'] = '파일을 현재 이름공간으로 올립니다. 하위 이름공간으로 만들려면 선택한 파일 이름 앞에 쌍점(:)으로 구분되는 이름을 붙이면 됩니다. 파일을 드래그 앤 드롭해 선택할 수 있습니다.';
$lang['mediaextchange'] = '파일 확장자가 .%s에서 .%s(으)로 바뀌었습니다!';
-$lang['reference'] = '참고';
+$lang['reference'] = '다음을 참조';
$lang['ref_inuse'] = '다음 문서에서 아직 사용 중이므로 파일을 삭제할 수 없습니다:';
$lang['ref_hidden'] = '문서의 일부 참고는 읽을 수 있는 권한이 없습니다';
$lang['hits'] = '조회 수';
@@ -185,13 +188,18 @@ $lang['difflink'] = '차이 보기로 링크';
$lang['diff_type'] = '차이 보기:';
$lang['diff_inline'] = '직렬 방식';
$lang['diff_side'] = '다중 창 방식';
+$lang['diffprevrev'] = '이전 판';
+$lang['diffnextrev'] = '다음 판';
+$lang['difflastrev'] = '마지막 판';
+$lang['diffbothprevrev'] = '양쪽 이전 판';
+$lang['diffbothnextrev'] = '양쪽 다음 판';
$lang['line'] = '줄';
$lang['breadcrumb'] = '추적';
$lang['youarehere'] = '현재 위치';
$lang['lastmod'] = '마지막으로 수정됨';
$lang['by'] = '저자';
$lang['deleted'] = '제거됨';
-$lang['created'] = '새로 만듦';
+$lang['created'] = '만듦';
$lang['restored'] = '이전 판으로 되돌림 (%s)';
$lang['external_edit'] = '바깥 편집';
$lang['summary'] = '편집 요약';
@@ -232,7 +240,7 @@ $lang['qb_extlink'] = '바깥 링크';
$lang['qb_hr'] = '가로줄';
$lang['qb_ol'] = '순서 있는 목록';
$lang['qb_ul'] = '순서 없는 목록';
-$lang['qb_media'] = '그림과 기타 파일 추가 (새 창에서 열림)';
+$lang['qb_media'] = '그림과 다른 파일 추가 (새 창에서 열림)';
$lang['qb_sig'] = '서명 넣기';
$lang['qb_smileys'] = '이모티콘';
$lang['qb_chars'] = '특수 문자';
@@ -241,7 +249,6 @@ $lang['admin_register'] = '새 사용자 추가';
$lang['metaedit'] = '메타데이터 편집';
$lang['metasaveerr'] = '메타데이터 쓰기 실패';
$lang['metasaveok'] = '메타데이터 저장됨';
-$lang['img_backto'] = '뒤로';
$lang['img_title'] = '제목';
$lang['img_caption'] = '설명';
$lang['img_date'] = '날짜';
@@ -254,7 +261,6 @@ $lang['img_camera'] = '카메라';
$lang['img_keywords'] = '키워드';
$lang['img_width'] = '너비';
$lang['img_height'] = '높이';
-$lang['img_manager'] = '미디어 관리자에서 보기';
$lang['subscr_subscribe_success'] = '%s 사용자가 %s 구독 목록에 추가했습니다';
$lang['subscr_subscribe_error'] = '%s 사용자가 %s 구독 목록에 추가하는데 실패했습니다';
$lang['subscr_subscribe_noaddress'] = '로그인으로 연결된 주소가 없기 때문에 구독 목록에 추가할 수 없습니다';
@@ -302,7 +308,7 @@ $lang['i_pop_field'] = '도쿠위키 경험을 개선하는 데 도움
$lang['i_pop_label'] = '한 달에 한 번씩, 도쿠위키 개발자에게 익명의 사용 데이터를 보냅니다';
$lang['recent_global'] = '현재 <b>%s</b> 이름공간을 구독 중입니다. <a href="%s">전체 위키의 최근 바뀜도 볼 수</a> 있습니다.';
$lang['years'] = '%d년 전';
-$lang['months'] = '%d달 전';
+$lang['months'] = '%d개월 전';
$lang['weeks'] = '%d주 전';
$lang['days'] = '%d일 전';
$lang['hours'] = '%d시간 전';
diff --git a/inc/lang/ko/searchpage.txt b/inc/lang/ko/searchpage.txt
index 2313f0bb0..53faa04c6 100644
--- a/inc/lang/ko/searchpage.txt
+++ b/inc/lang/ko/searchpage.txt
@@ -1,5 +1,5 @@
====== 검색 ======
-아래에서 검색 결과를 찾을 수 있습니다. 만약 원하는 문서를 찾지 못했다면, "문서 만들기"나 "문서 편집"을 사용해 검색어와 같은 이름의 문서를 만들거나 편집할 수 있습니다.
+아래에서 검색 결과를 찾을 수 있습니다. 만약 원하는 문서를 찾지 못했다면, ''문서 만들기''나 ''문서 편집''을 사용해 검색어와 같은 이름의 문서를 만들거나 편집할 수 있습니다.
===== 결과 ===== \ No newline at end of file
diff --git a/inc/lang/ko/subscr_digest.txt b/inc/lang/ko/subscr_digest.txt
index 0f03e51a3..d1f2d4b99 100644
--- a/inc/lang/ko/subscr_digest.txt
+++ b/inc/lang/ko/subscr_digest.txt
@@ -11,7 +11,7 @@
새 판: @NEWPAGE@
-문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
+문서 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
@SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요.
--
diff --git a/inc/lang/ko/updateprofile.txt b/inc/lang/ko/updateprofile.txt
index 80545e9bf..055272e9d 100644
--- a/inc/lang/ko/updateprofile.txt
+++ b/inc/lang/ko/updateprofile.txt
@@ -1,3 +1,3 @@
-====== 개인 정보 바꾸기 ======
+====== 계정 프로필 바꾸기 ======
바꾸고 싶은 항목을 입력하세요. 사용자 이름은 바꿀 수 없습니다. \ No newline at end of file
diff --git a/inc/lang/ku/lang.php b/inc/lang/ku/lang.php
index b6287806d..14f568b8e 100644
--- a/inc/lang/ku/lang.php
+++ b/inc/lang/ku/lang.php
@@ -127,7 +127,7 @@ $lang['admin_register']= 'Add new user...';
$lang['metaedit'] = 'Edit Metadata';
$lang['metasaveerr'] = 'Writing metadata failed';
$lang['metasaveok'] = 'Metadata saved';
-$lang['img_backto'] = 'Back to';
+$lang['btn_img_backto'] = 'Back to %s';
$lang['img_title'] = 'Title';
$lang['img_caption'] = 'Caption';
$lang['img_date'] = 'Date';
diff --git a/inc/lang/la/lang.php b/inc/lang/la/lang.php
index c71a71bdd..691b303ed 100644
--- a/inc/lang/la/lang.php
+++ b/inc/lang/la/lang.php
@@ -202,7 +202,7 @@ $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['btn_img_backto'] = 'Redere ad %s';
$lang['img_title'] = 'Titulus';
$lang['img_caption'] = 'Descriptio';
$lang['img_date'] = 'Dies';
diff --git a/inc/lang/lb/lang.php b/inc/lang/lb/lang.php
index 55113745a..efb98f679 100644
--- a/inc/lang/lb/lang.php
+++ b/inc/lang/lb/lang.php
@@ -162,7 +162,7 @@ $lang['admin_register'] = 'Neie Benotzer bäisetzen';
$lang['metaedit'] = 'Metadaten änneren';
$lang['metasaveerr'] = 'Feeler beim Schreiwe vun de Metadaten';
$lang['metasaveok'] = 'Metadate gespäichert';
-$lang['img_backto'] = 'Zeréck op';
+$lang['btn_img_backto'] = 'Zeréck op %s';
$lang['img_title'] = 'Titel';
$lang['img_caption'] = 'Beschreiwung';
$lang['img_date'] = 'Datum';
diff --git a/inc/lang/lt/lang.php b/inc/lang/lt/lang.php
index c38ea8838..74c8c88e9 100644
--- a/inc/lang/lt/lang.php
+++ b/inc/lang/lt/lang.php
@@ -163,7 +163,7 @@ $lang['admin_register'] = 'Sukurti naują vartotoją';
$lang['metaedit'] = 'Redaguoti metaduomenis';
$lang['metasaveerr'] = 'Nepavyko išsaugoti metaduomenų';
$lang['metasaveok'] = 'Metaduomenys išsaugoti';
-$lang['img_backto'] = 'Atgal į';
+$lang['btn_img_backto'] = 'Atgal į %s';
$lang['img_title'] = 'Pavadinimas';
$lang['img_caption'] = 'Antraštė';
$lang['img_date'] = 'Data';
diff --git a/inc/lang/lv/lang.php b/inc/lang/lv/lang.php
index 898125d60..91fed262e 100644
--- a/inc/lang/lv/lang.php
+++ b/inc/lang/lv/lang.php
@@ -228,7 +228,7 @@ $lang['admin_register'] = 'Pievienot jaunu lietotāju';
$lang['metaedit'] = 'Labot metadatus';
$lang['metasaveerr'] = 'Metadati nav saglabāti';
$lang['metasaveok'] = 'Metadati saglabāti';
-$lang['img_backto'] = 'Atpakaļ uz';
+$lang['btn_img_backto'] = 'Atpakaļ uz %s';
$lang['img_title'] = 'Virsraksts';
$lang['img_caption'] = 'Apraksts';
$lang['img_date'] = 'Datums';
@@ -241,7 +241,7 @@ $lang['img_camera'] = 'Fotoaparāts';
$lang['img_keywords'] = 'Atslēgvārdi';
$lang['img_width'] = 'Platums';
$lang['img_height'] = 'Augstums';
-$lang['img_manager'] = 'Skatīt mēdiju pārvaldniekā';
+$lang['btn_mediaManager'] = 'Skatīt mēdiju pārvaldniekā';
$lang['subscr_subscribe_success'] = '%s pievienots %s abonēšanas sarakstam';
$lang['subscr_subscribe_error'] = 'Kļūme pievienojot %s %s abonēšanas sarakstam.';
$lang['subscr_subscribe_noaddress'] = 'Nav zināma jūsu e-pasta adrese, tāpēc nevarat abonēt.';
diff --git a/inc/lang/mk/lang.php b/inc/lang/mk/lang.php
index 2b2c9fb7f..6bf5fafc9 100644
--- a/inc/lang/mk/lang.php
+++ b/inc/lang/mk/lang.php
@@ -171,7 +171,7 @@ $lang['admin_register'] = 'Додај нов корисник';
$lang['metaedit'] = 'Уреди мета-податоци';
$lang['metasaveerr'] = 'Запишување на мета-податоците не успеа';
$lang['metasaveok'] = 'Мета-податоците се зачувани';
-$lang['img_backto'] = 'Назад до';
+$lang['btn_img_backto'] = 'Назад до %s';
$lang['img_title'] = 'Насловна линија';
$lang['img_caption'] = 'Наслов';
$lang['img_date'] = 'Датум';
diff --git a/inc/lang/mr/lang.php b/inc/lang/mr/lang.php
index 54b69974d..ab84e7353 100644
--- a/inc/lang/mr/lang.php
+++ b/inc/lang/mr/lang.php
@@ -227,7 +227,7 @@ $lang['admin_register'] = 'नवीन सदस्य';
$lang['metaedit'] = 'मेटाडेटा बदला';
$lang['metasaveerr'] = 'मेटाडेटा सुरक्षित झाला नाही';
$lang['metasaveok'] = 'मेटाडेटा सुरक्षित झाला';
-$lang['img_backto'] = 'परत जा';
+$lang['btn_img_backto'] = 'परत जा %s';
$lang['img_title'] = 'नाव';
$lang['img_caption'] = 'टीप';
$lang['img_date'] = 'तारीख';
@@ -240,7 +240,7 @@ $lang['img_camera'] = 'कॅमेरा';
$lang['img_keywords'] = 'मुख्य शब्द';
$lang['img_width'] = 'रुंदी';
$lang['img_height'] = 'उंची';
-$lang['img_manager'] = 'मिडिया व्यवस्थापकात बघू';
+$lang['btn_mediaManager'] = 'मिडिया व्यवस्थापकात बघू';
$lang['authtempfail'] = 'सदस्य अधिकृत करण्याची सुविधा सध्या चालू नाही. सतत हा मजकूर दिसल्यास कृपया तुमच्या विकीच्या व्यवस्थापकाशी सम्पर्क साधा.';
$lang['i_chooselang'] = 'तुमची भाषा निवडा';
$lang['i_installer'] = 'डॉक्युविकि इनस्टॉलर';
diff --git a/inc/lang/ne/lang.php b/inc/lang/ne/lang.php
index 7fd14d2c5..a7d694d5b 100644
--- a/inc/lang/ne/lang.php
+++ b/inc/lang/ne/lang.php
@@ -158,7 +158,7 @@ $lang['admin_register'] = 'नयाँ प्रयोगकर्ता
$lang['metaedit'] = 'मेटाडेटा सम्पादन गर्नुहोस्';
$lang['metasaveerr'] = 'मेटाडाटा लेखन असफल';
$lang['metasaveok'] = 'मेटाडाटा वचत भयो ';
-$lang['img_backto'] = 'फिर्ता';
+$lang['btn_img_backto'] = 'फिर्ता%s';
$lang['img_title'] = 'शिर्षक';
$lang['img_caption'] = 'निम्न लेख';
$lang['img_date'] = 'मिति';
diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php
index e22aa9fff..b6cf11968 100644
--- a/inc/lang/nl/lang.php
+++ b/inc/lang/nl/lang.php
@@ -67,6 +67,8 @@ $lang['btn_register'] = 'Registreren';
$lang['btn_apply'] = 'Toepassen';
$lang['btn_media'] = 'Mediabeheerder';
$lang['btn_deleteuser'] = 'Verwijder mijn account';
+$lang['btn_img_backto'] = 'Terug naar %s';
+$lang['btn_mediaManager'] = 'In mediabeheerder bekijken';
$lang['loggedinas'] = 'Ingelogd als';
$lang['user'] = 'Gebruikersnaam';
$lang['pass'] = 'Wachtwoord';
@@ -198,6 +200,11 @@ $lang['difflink'] = 'Link naar deze vergelijking';
$lang['diff_type'] = 'Bekijk verschillen:';
$lang['diff_inline'] = 'Inline';
$lang['diff_side'] = 'Zij aan zij';
+$lang['diffprevrev'] = 'Vorige revisie';
+$lang['diffnextrev'] = 'Volgende revisie';
+$lang['difflastrev'] = 'Laatste revisie';
+$lang['diffbothprevrev'] = 'Beide kanten vorige revisie';
+$lang['diffbothnextrev'] = 'Beide kanten volgende revisie';
$lang['line'] = 'Regel';
$lang['breadcrumb'] = 'Spoor';
$lang['youarehere'] = 'Je bent hier';
@@ -254,7 +261,6 @@ $lang['admin_register'] = 'Nieuwe gebruiker toevoegen';
$lang['metaedit'] = 'Metadata wijzigen';
$lang['metasaveerr'] = 'Schrijven van metadata mislukt';
$lang['metasaveok'] = 'Metadata bewaard';
-$lang['img_backto'] = 'Terug naar';
$lang['img_title'] = 'Titel';
$lang['img_caption'] = 'Bijschrift';
$lang['img_date'] = 'Datum';
@@ -267,7 +273,6 @@ $lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Trefwoorden';
$lang['img_width'] = 'Breedte';
$lang['img_height'] = 'Hoogte';
-$lang['img_manager'] = 'In mediabeheerder bekijken';
$lang['subscr_subscribe_success'] = '%s is ingeschreven voor %s';
$lang['subscr_subscribe_error'] = 'Fout bij inschrijven van %s voor %s';
$lang['subscr_subscribe_noaddress'] = 'Er is geen e-mailadres gekoppeld aan uw account, u kunt daardoor niet worden ingeschreven.';
diff --git a/inc/lang/no/lang.php b/inc/lang/no/lang.php
index 3f31f6c73..8b3c4937f 100644
--- a/inc/lang/no/lang.php
+++ b/inc/lang/no/lang.php
@@ -20,6 +20,7 @@
* @author Egil Hansen <egil@rosetta.no>
* @author Thomas Juberg <Thomas.Juberg@Gmail.com>
* @author Boris <boris@newton-media.no>
+ * @author Christopher Schive <chschive@frisurf.no>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -64,6 +65,8 @@ $lang['btn_register'] = 'Registrer deg';
$lang['btn_apply'] = 'Bruk';
$lang['btn_media'] = 'Mediefiler';
$lang['btn_deleteuser'] = 'Fjern min konto';
+$lang['btn_img_backto'] = 'Tilbake til %s';
+$lang['btn_mediaManager'] = 'Vis i mediefilbehandler';
$lang['loggedinas'] = 'Innlogget som';
$lang['user'] = 'Brukernavn';
$lang['pass'] = 'Passord';
@@ -195,6 +198,11 @@ $lang['difflink'] = 'Lenk til denne sammenligningen';
$lang['diff_type'] = 'Vis forskjeller:';
$lang['diff_inline'] = 'I teksten';
$lang['diff_side'] = 'Side ved side';
+$lang['diffprevrev'] = 'Forrige revisjon';
+$lang['diffnextrev'] = 'Neste revisjon';
+$lang['difflastrev'] = 'Siste revisjon';
+$lang['diffbothprevrev'] = 'Begge sider forrige revisjon';
+$lang['diffbothnextrev'] = 'Begge sider neste revisjon';
$lang['line'] = 'Linje';
$lang['breadcrumb'] = 'Spor';
$lang['youarehere'] = 'Du er her';
@@ -251,7 +259,6 @@ $lang['admin_register'] = 'Legg til ny bruker';
$lang['metaedit'] = 'Rediger metadata';
$lang['metasaveerr'] = 'Skriving av metadata feilet';
$lang['metasaveok'] = 'Metadata lagret';
-$lang['img_backto'] = 'Tilbake til';
$lang['img_title'] = 'Tittel';
$lang['img_caption'] = 'Bildetekst';
$lang['img_date'] = 'Dato';
@@ -264,7 +271,6 @@ $lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Nøkkelord';
$lang['img_width'] = 'Bredde';
$lang['img_height'] = 'Høyde';
-$lang['img_manager'] = 'Vis i mediefilbehandler';
$lang['subscr_subscribe_success'] = 'La til %s som abonnent på %s';
$lang['subscr_subscribe_error'] = 'Klarte ikke å legge til %s som abonnent på %s';
$lang['subscr_subscribe_noaddress'] = 'Brukeren din er ikke registrert med noen adresse. Du kan derfor ikke legges til som abonnent.';
@@ -348,3 +354,4 @@ $lang['media_restore'] = 'Gjenopprett denne versjonen';
$lang['currentns'] = 'gjeldende navnemellomrom';
$lang['searchresult'] = 'Søk i resultat';
$lang['plainhtml'] = 'Enkel HTML';
+$lang['wikimarkup'] = 'wiki-format';
diff --git a/inc/lang/no/resetpwd.txt b/inc/lang/no/resetpwd.txt
new file mode 100644
index 000000000..2da717021
--- /dev/null
+++ b/inc/lang/no/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Sett nytt passord ======
+
+Vennligst skriv inn et nytt passord for din konto i denne wikien. \ No newline at end of file
diff --git a/inc/lang/pl/lang.php b/inc/lang/pl/lang.php
index e5f2d8d40..e65866761 100644
--- a/inc/lang/pl/lang.php
+++ b/inc/lang/pl/lang.php
@@ -247,7 +247,7 @@ $lang['admin_register'] = 'Dodawanie użytkownika';
$lang['metaedit'] = 'Edytuj metadane';
$lang['metasaveerr'] = 'Zapis metadanych nie powiódł się';
$lang['metasaveok'] = 'Metadane zapisano';
-$lang['img_backto'] = 'Wróć do';
+$lang['btn_img_backto'] = 'Wróć do %s';
$lang['img_title'] = 'Tytuł';
$lang['img_caption'] = 'Nagłówek';
$lang['img_date'] = 'Data';
@@ -260,7 +260,7 @@ $lang['img_camera'] = 'Aparat';
$lang['img_keywords'] = 'Słowa kluczowe';
$lang['img_width'] = 'Szerokość';
$lang['img_height'] = 'Wysokość';
-$lang['img_manager'] = 'Zobacz w menadżerze multimediów';
+$lang['btn_mediaManager'] = 'Zobacz w menadżerze multimediów';
$lang['subscr_subscribe_success'] = 'Dodano %s do listy subskrypcji %s';
$lang['subscr_subscribe_error'] = 'Błąd podczas dodawania %s do listy subskrypcji %s';
$lang['subscr_subscribe_noaddress'] = 'Brak adresu skojarzonego z twoim loginem, nie możesz zostać dodany(a) do listy subskrypcji';
diff --git a/inc/lang/pt-br/lang.php b/inc/lang/pt-br/lang.php
index 6845e792d..d5539f921 100644
--- a/inc/lang/pt-br/lang.php
+++ b/inc/lang/pt-br/lang.php
@@ -254,7 +254,7 @@ $lang['admin_register'] = 'Adicionar novo usuário';
$lang['metaedit'] = 'Editar metadados';
$lang['metasaveerr'] = 'Não foi possível escrever os metadados';
$lang['metasaveok'] = 'Os metadados foram salvos';
-$lang['img_backto'] = 'Voltar para';
+$lang['btn_img_backto'] = 'Voltar para %s';
$lang['img_title'] = 'Título';
$lang['img_caption'] = 'Descrição';
$lang['img_date'] = 'Data';
@@ -267,7 +267,7 @@ $lang['img_camera'] = 'Câmera';
$lang['img_keywords'] = 'Palavras-chave';
$lang['img_width'] = 'Largura';
$lang['img_height'] = 'Altura';
-$lang['img_manager'] = 'Ver no gerenciador de mídias';
+$lang['btn_mediaManager'] = 'Ver no gerenciador de mídias';
$lang['subscr_subscribe_success'] = 'Adicionado %s à lista de monitoramentos de %s';
$lang['subscr_subscribe_error'] = 'Ocorreu um erro na adição de %s à lista de monitoramentos de %s';
$lang['subscr_subscribe_noaddress'] = 'Como não há nenhum endereço associado ao seu usuário, você não pode ser adicionado à lista de monitoramento';
diff --git a/inc/lang/pt/lang.php b/inc/lang/pt/lang.php
index 46405c444..b2bb2dc34 100644
--- a/inc/lang/pt/lang.php
+++ b/inc/lang/pt/lang.php
@@ -233,7 +233,7 @@ $lang['admin_register'] = 'Registar Novo Utilizador';
$lang['metaedit'] = 'Editar Metadata';
$lang['metasaveerr'] = 'Falhou a escrita de Metadata';
$lang['metasaveok'] = 'Metadata gravada';
-$lang['img_backto'] = 'De volta a';
+$lang['btn_img_backto'] = 'De volta a %s';
$lang['img_title'] = 'Título';
$lang['img_caption'] = 'Legenda';
$lang['img_date'] = 'Data';
@@ -246,7 +246,7 @@ $lang['img_camera'] = 'Câmara';
$lang['img_keywords'] = 'Palavras-Chave';
$lang['img_width'] = 'Largura';
$lang['img_height'] = 'Altura';
-$lang['img_manager'] = 'Ver em gestor de media';
+$lang['btn_mediaManager'] = 'Ver em gestor de media';
$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';
diff --git a/inc/lang/ro/lang.php b/inc/lang/ro/lang.php
index 491ab58e7..31b2d7eba 100644
--- a/inc/lang/ro/lang.php
+++ b/inc/lang/ro/lang.php
@@ -232,7 +232,7 @@ $lang['admin_register'] = 'Adaugă utilizator nou';
$lang['metaedit'] = 'Editează metadata';
$lang['metasaveerr'] = 'Scrierea metadatelor a eșuat';
$lang['metasaveok'] = 'Metadatele au fost salvate';
-$lang['img_backto'] = 'Înapoi la';
+$lang['btn_img_backto'] = 'Înapoi la %s';
$lang['img_title'] = 'Titlu';
$lang['img_caption'] = 'Legendă';
$lang['img_date'] = 'Dată';
@@ -245,7 +245,7 @@ $lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Cuvinte cheie';
$lang['img_width'] = 'Lățime';
$lang['img_height'] = 'Înălțime';
-$lang['img_manager'] = 'Vizualizează în administratorul media';
+$lang['btn_mediaManager'] = 'Vizualizează în administratorul media';
$lang['subscr_subscribe_success'] = 'Adăugat %s la lista de abonare pentru %s';
$lang['subscr_subscribe_error'] = 'Eroare la adăugarea %s la lista de abonare pentru %s';
$lang['subscr_subscribe_noaddress'] = 'Nu există adresă de e-mail asociată autentificării curente, nu poți fi adăugat la lista de abonare';
diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php
index bf8fa34c8..4cd3e5f0b 100644
--- a/inc/lang/ru/lang.php
+++ b/inc/lang/ru/lang.php
@@ -25,6 +25,7 @@
* @author Artur <ncuxxx@gmail.com>
* @author Erli Moen <evseev.jr@gmail.com>
* @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Владимир <id37736@yandex.ru>
*/
$lang['encoding'] = ' utf-8';
$lang['direction'] = 'ltr';
@@ -69,6 +70,8 @@ $lang['btn_register'] = 'Зарегистрироваться';
$lang['btn_apply'] = 'Применить';
$lang['btn_media'] = 'Управление медиафайлами';
$lang['btn_deleteuser'] = 'Удалить мой аккаунт';
+$lang['btn_img_backto'] = 'Вернуться к %s';
+$lang['btn_mediaManager'] = 'Просмотр в «управлении медиафайлами»';
$lang['loggedinas'] = 'Зашли как';
$lang['user'] = 'Логин';
$lang['pass'] = 'Пароль';
@@ -198,6 +201,9 @@ $lang['difflink'] = 'Ссылка на это сравнение';
$lang['diff_type'] = 'Посмотреть отличия';
$lang['diff_inline'] = 'встроенный';
$lang['diff_side'] = 'бок о бок';
+$lang['diffprevrev'] = 'Предыдущая версия';
+$lang['diffnextrev'] = 'Следущая версия';
+$lang['difflastrev'] = 'Последняя версия';
$lang['line'] = 'Строка';
$lang['breadcrumb'] = 'Вы посетили';
$lang['youarehere'] = 'Вы находитесь здесь';
@@ -254,7 +260,6 @@ $lang['admin_register'] = 'Добавить пользователя';
$lang['metaedit'] = 'Править метаданные';
$lang['metasaveerr'] = 'Ошибка записи метаданных';
$lang['metasaveok'] = 'Метаданные сохранены';
-$lang['img_backto'] = 'Вернуться к';
$lang['img_title'] = 'Название';
$lang['img_caption'] = 'Подпись';
$lang['img_date'] = 'Дата';
@@ -267,7 +272,6 @@ $lang['img_camera'] = 'Модель';
$lang['img_keywords'] = 'Ключевые слова';
$lang['img_width'] = 'Ширина';
$lang['img_height'] = 'Высота';
-$lang['img_manager'] = 'Просмотр в «управлении медиафайлами»';
$lang['subscr_subscribe_success'] = 'Добавлен %s в подписку на %s';
$lang['subscr_subscribe_error'] = 'Невозможно добавить %s в подписку на %s';
$lang['subscr_subscribe_noaddress'] = 'Нет адреса электронной почты, сопоставленного с вашей учётной записью. Вы не можете подписаться на рассылку';
diff --git a/inc/lang/sk/lang.php b/inc/lang/sk/lang.php
index aa823b074..3ba220a2d 100644
--- a/inc/lang/sk/lang.php
+++ b/inc/lang/sk/lang.php
@@ -238,7 +238,7 @@ $lang['admin_register'] = 'Pridaj nového užívateľa';
$lang['metaedit'] = 'Upraviť metainformácie';
$lang['metasaveerr'] = 'Zápis metainformácií zlyhal';
$lang['metasaveok'] = 'Metainformácie uložené';
-$lang['img_backto'] = 'Späť na';
+$lang['btn_img_backto'] = 'Späť na %s';
$lang['img_title'] = 'Titul';
$lang['img_caption'] = 'Popis';
$lang['img_date'] = 'Dátum';
@@ -251,7 +251,7 @@ $lang['img_camera'] = 'Fotoaparát';
$lang['img_keywords'] = 'Kľúčové slová';
$lang['img_width'] = 'Šírka';
$lang['img_height'] = 'Výška';
-$lang['img_manager'] = 'Prezrieť v správcovi médií';
+$lang['btn_mediaManager'] = 'Prezrieť v správcovi médií';
$lang['subscr_subscribe_success'] = 'Používateľ %s bol pridaný do zoznamu hlásení o zmenách %s';
$lang['subscr_subscribe_error'] = 'Chyba pri pridaní používateľa %s do zoznamu hlásení o zmenách %s';
$lang['subscr_subscribe_noaddress'] = 'Vaše prihlasovacie meno nemá priradenú žiadnu email adresu, nemôžete byť pridaný do zoznamu hlásení o zmenách';
diff --git a/inc/lang/sl/lang.php b/inc/lang/sl/lang.php
index c9a47927d..c834611dc 100644
--- a/inc/lang/sl/lang.php
+++ b/inc/lang/sl/lang.php
@@ -10,6 +10,7 @@
* @author Matej Urbančič (mateju@svn.gnome.org)
* @author Matej Urbančič <mateju@svn.gnome.org>
* @author matej <mateju@svn.gnome.org>
+ * @author Jernej Vidmar <jernej.vidmar@vidmarboehm.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -54,6 +55,8 @@ $lang['btn_register'] = 'Prijava';
$lang['btn_apply'] = 'Uveljavi';
$lang['btn_media'] = 'Urejevalnik predstavnih vsebin';
$lang['btn_deleteuser'] = 'Odstrani račun';
+$lang['btn_img_backto'] = 'Nazaj na %s';
+$lang['btn_mediaManager'] = 'Poglej v urejevalniku predstavnih vsebin';
$lang['loggedinas'] = 'Prijava kot';
$lang['user'] = 'Uporabniško ime';
$lang['pass'] = 'Geslo';
@@ -85,6 +88,7 @@ $lang['profchanged'] = 'Uporabniški profil je uspešno posodobljen.';
$lang['profnodelete'] = 'Ni omogočena podpora za brisanje uporabnikov.';
$lang['profdeleteuser'] = 'Izbriši račun';
$lang['profdeleted'] = 'Uporabniški račun je izbrisan.';
+$lang['profconfdeletemissing'] = 'Potrditveno okno ni označeno';
$lang['pwdforget'] = 'Ali ste pozabili geslo? Pridobite si novo geslo.';
$lang['resendna'] = 'DokuWiki ne podpira možnosti ponovnega pošiljanja gesel.';
$lang['resendpwd'] = 'Nastavi novo geslo za';
@@ -179,6 +183,9 @@ $lang['difflink'] = 'Poveži s tem pogledom primerjave.';
$lang['diff_type'] = 'Razlike:';
$lang['diff_inline'] = 'V besedilu';
$lang['diff_side'] = 'Eno ob drugem';
+$lang['diffprevrev'] = 'Prejšnja revizija';
+$lang['diffnextrev'] = 'Naslednja revizija';
+$lang['difflastrev'] = 'Zadnja revizija';
$lang['line'] = 'Vrstica';
$lang['breadcrumb'] = 'Sled';
$lang['youarehere'] = 'Trenutno dejavna stran';
@@ -235,7 +242,6 @@ $lang['admin_register'] = 'Dodaj novega uporabnika';
$lang['metaedit'] = 'Uredi metapodatke';
$lang['metasaveerr'] = 'Zapisovanje metapodatkov je spodletelo';
$lang['metasaveok'] = 'Metapodatki so shranjeni';
-$lang['img_backto'] = 'Nazaj na';
$lang['img_title'] = 'Naslov';
$lang['img_caption'] = 'Opis';
$lang['img_date'] = 'Datum';
@@ -248,7 +254,6 @@ $lang['img_camera'] = 'Fotoaparat';
$lang['img_keywords'] = 'Ključne besede';
$lang['img_width'] = 'Širina';
$lang['img_height'] = 'Višina';
-$lang['img_manager'] = 'Poglej v urejevalniku predstavnih vsebin';
$lang['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.';
@@ -291,6 +296,8 @@ $lang['i_allowreg'] = 'Dovoli uporabnikom vpis';
$lang['i_retry'] = 'Ponovni poskus';
$lang['i_license'] = 'Izbor dovoljenja objave vsebine:';
$lang['i_license_none'] = 'Ne pokaži podrobnosti dovoljenja.';
+$lang['i_pop_field'] = 'Prosimo pomagajte nam izboljšati DokuWiki izkušnjo:';
+$lang['i_pop_label'] = 'Enkrat na mesec pošlji anonimne uporabniške podatke DokuWiki razvijalcem';
$lang['recent_global'] = 'Trenutno so prikazane spremembe znotraj imenskega prostora <b>%s</b>. Mogoče si je ogledati tudi spremembe <a href="%s">celotnega sistema Wiki</a>.';
$lang['years'] = '%d let nazaj';
$lang['months'] = '%d mesecev nazaj';
diff --git a/inc/lang/sq/lang.php b/inc/lang/sq/lang.php
index 2ed62ed4e..c31cdd360 100644
--- a/inc/lang/sq/lang.php
+++ b/inc/lang/sq/lang.php
@@ -179,7 +179,7 @@ $lang['admin_register'] = 'Shto Përdorues të Ri';
$lang['metaedit'] = 'Redakto Metadata';
$lang['metasaveerr'] = 'Shkrimi i metadata-ve dështoi';
$lang['metasaveok'] = 'Metadata u ruajt';
-$lang['img_backto'] = 'Mbrapa te';
+$lang['btn_img_backto'] = 'Mbrapa te %s';
$lang['img_title'] = 'Titulli ';
$lang['img_caption'] = 'Titra';
$lang['img_date'] = 'Data';
diff --git a/inc/lang/sr/lang.php b/inc/lang/sr/lang.php
index 7c434cbc9..4b44704ad 100644
--- a/inc/lang/sr/lang.php
+++ b/inc/lang/sr/lang.php
@@ -201,7 +201,7 @@ $lang['admin_register'] = 'Додај новог корисника';
$lang['metaedit'] = 'Измени мета-податке';
$lang['metasaveerr'] = 'Записивање мета-података није било успешно';
$lang['metasaveok'] = 'Мета-подаци су сачувани';
-$lang['img_backto'] = 'Натраг на';
+$lang['btn_img_backto'] = 'Натраг на %s';
$lang['img_title'] = 'Наслов';
$lang['img_caption'] = 'Назив';
$lang['img_date'] = 'Датум';
diff --git a/inc/lang/sv/lang.php b/inc/lang/sv/lang.php
index 8c8858f61..c057d8705 100644
--- a/inc/lang/sv/lang.php
+++ b/inc/lang/sv/lang.php
@@ -249,7 +249,7 @@ $lang['admin_register'] = 'Lägg till ny användare';
$lang['metaedit'] = 'Redigera metadata';
$lang['metasaveerr'] = 'Skrivning av metadata misslyckades';
$lang['metasaveok'] = 'Metadata sparad';
-$lang['img_backto'] = 'Tillbaka till';
+$lang['btn_img_backto'] = 'Tillbaka till %s';
$lang['img_title'] = 'Rubrik';
$lang['img_caption'] = 'Bildtext';
$lang['img_date'] = 'Datum';
@@ -262,7 +262,7 @@ $lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Nyckelord';
$lang['img_width'] = 'Bredd';
$lang['img_height'] = 'Höjd';
-$lang['img_manager'] = 'Se mediahanteraren';
+$lang['btn_mediaManager'] = 'Se mediahanteraren';
$lang['subscr_subscribe_success'] = 'La till %s till prenumerationslista %s';
$lang['subscr_subscribe_noaddress'] = 'Det finns ingen adress associerad med din inloggning, du kan inte bli tillagd i prenumerationslistan';
$lang['subscr_unsubscribe_success'] = '%s borttagen från prenumerationslistan för %s';
diff --git a/inc/lang/th/lang.php b/inc/lang/th/lang.php
index 5d364166b..8aebfe1a5 100644
--- a/inc/lang/th/lang.php
+++ b/inc/lang/th/lang.php
@@ -181,7 +181,7 @@ $lang['admin_register'] = 'สร้างบัญชีผู้ใช
$lang['metaedit'] = 'แก้ไขข้อมูลเมต้า';
$lang['metasaveerr'] = 'มีข้อผิดพลาดในการเขียนข้อมูลเมต้า';
$lang['metasaveok'] = 'บันทึกเมต้าดาต้าแล้ว';
-$lang['img_backto'] = 'กลับไปยัง';
+$lang['btn_img_backto'] = 'กลับไปยัง %s';
$lang['img_title'] = 'ชื่อภาพ';
$lang['img_caption'] = 'คำบรรยายภาพ';
$lang['img_date'] = 'วันที่';
diff --git a/inc/lang/tr/lang.php b/inc/lang/tr/lang.php
index 210a82530..2af17fe27 100644
--- a/inc/lang/tr/lang.php
+++ b/inc/lang/tr/lang.php
@@ -233,7 +233,7 @@ $lang['admin_register'] = 'Yeni kullanıcı ekle...';
$lang['metaedit'] = 'Metaverileri Değiştir';
$lang['metasaveerr'] = 'Metaveri yazma başarısız ';
$lang['metasaveok'] = 'Metaveri kaydedildi';
-$lang['img_backto'] = 'Şuna dön:';
+$lang['btn_img_backto'] = 'Şuna dön: %s';
$lang['img_title'] = 'Başlık';
$lang['img_caption'] = 'Serlevha';
$lang['img_date'] = 'Tarih';
@@ -246,7 +246,7 @@ $lang['img_camera'] = 'Fotoğraf Makinası';
$lang['img_keywords'] = 'Anahtar Sözcükler';
$lang['img_width'] = 'Genişlik';
$lang['img_height'] = 'Yükseklik';
-$lang['img_manager'] = 'Ortam oynatıcısında göster';
+$lang['btn_mediaManager'] = 'Ortam oynatıcısında göster';
$lang['subscr_m_new_header'] = 'Üyelik ekle';
$lang['subscr_m_current_header'] = 'Üyeliğini onayla';
$lang['subscr_m_unsubscribe'] = 'Üyelik iptali';
diff --git a/inc/lang/uk/lang.php b/inc/lang/uk/lang.php
index 4e91e82a2..09b2b6d1d 100644
--- a/inc/lang/uk/lang.php
+++ b/inc/lang/uk/lang.php
@@ -223,7 +223,7 @@ $lang['admin_register'] = 'Додати нового користувач
$lang['metaedit'] = 'Редагувати метадані';
$lang['metasaveerr'] = 'Помилка запису метаданих';
$lang['metasaveok'] = 'Метадані збережено';
-$lang['img_backto'] = 'Повернутися до';
+$lang['btn_img_backto'] = 'Повернутися до %s';
$lang['img_title'] = 'Назва';
$lang['img_caption'] = 'Підпис';
$lang['img_date'] = 'Дата';
diff --git a/inc/lang/vi/lang.php b/inc/lang/vi/lang.php
index d8e40f875..ccc179eec 100644
--- a/inc/lang/vi/lang.php
+++ b/inc/lang/vi/lang.php
@@ -192,7 +192,7 @@ $lang['qb_sig'] = 'Đặt chữ ký';
$lang['metaedit'] = 'Sửa Metadata';
$lang['metasaveerr'] = 'Thất bại khi viết metadata';
$lang['metasaveok'] = 'Metadata đã được lưu';
-$lang['img_backto'] = 'Quay lại';
+$lang['btn_img_backto'] = 'Quay lại %s';
$lang['img_title'] = 'Tiêu đề';
$lang['img_caption'] = 'Ghi chú';
$lang['img_date'] = 'Ngày';
@@ -205,7 +205,7 @@ $lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Từ khóa';
$lang['img_width'] = 'Rộng';
$lang['img_height'] = 'Cao';
-$lang['img_manager'] = 'Xem trong trình quản lý tệp media';
+$lang['btn_mediaManager'] = 'Xem trong trình quản lý tệp media';
$lang['i_chooselang'] = 'Chọn ngôn ngữ';
$lang['i_retry'] = 'Thử lại';
$lang['years'] = 'cách đây %d năm';
diff --git a/inc/lang/zh-tw/lang.php b/inc/lang/zh-tw/lang.php
index 456377810..84afec97a 100644
--- a/inc/lang/zh-tw/lang.php
+++ b/inc/lang/zh-tw/lang.php
@@ -243,7 +243,7 @@ $lang['admin_register'] = '新增使用者';
$lang['metaedit'] = '編輯後設資料';
$lang['metasaveerr'] = '後設資料無法寫入';
$lang['metasaveok'] = '後設資料已儲存';
-$lang['img_backto'] = '回上一頁';
+$lang['btn_img_backto'] = '回上一頁 %s';
$lang['img_title'] = '標題';
$lang['img_caption'] = '照片說明';
$lang['img_date'] = '日期';
@@ -256,7 +256,7 @@ $lang['img_camera'] = '相機';
$lang['img_keywords'] = '關鍵字';
$lang['img_width'] = '寬度';
$lang['img_height'] = '高度';
-$lang['img_manager'] = '在多媒體管理器中檢視';
+$lang['btn_mediaManager'] = '在多媒體管理器中檢視';
$lang['subscr_subscribe_success'] = '已將 %s 加入至 %s 的訂閱列表';
$lang['subscr_subscribe_error'] = '將 %s 加入至 %s 的訂閱列表時發生錯誤';
$lang['subscr_subscribe_noaddress'] = '沒有與您登入相關的地址,無法將您加入訂閱列表';
diff --git a/inc/lang/zh/lang.php b/inc/lang/zh/lang.php
index 8777c65a5..e9e737251 100644
--- a/inc/lang/zh/lang.php
+++ b/inc/lang/zh/lang.php
@@ -22,6 +22,7 @@
* @author oott123 <ip.192.168.1.1@qq.com>
* @author Cupen <Cupenoruler@foxmail.com>
* @author xiqingongzi <Xiqingongzi@Gmail.com>
+ * @author qinghao <qingxianhao@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -66,6 +67,8 @@ $lang['btn_register'] = '注册';
$lang['btn_apply'] = '应用';
$lang['btn_media'] = '媒体管理器';
$lang['btn_deleteuser'] = '移除我的账户';
+$lang['btn_img_backto'] = '返回到 %s';
+$lang['btn_mediaManager'] = '在媒体管理器中查看';
$lang['loggedinas'] = '登录为';
$lang['user'] = '用户名';
$lang['pass'] = '密码';
@@ -197,6 +200,9 @@ $lang['difflink'] = '到此差别页面的链接';
$lang['diff_type'] = '查看差异:';
$lang['diff_inline'] = '行内显示';
$lang['diff_side'] = '并排显示';
+$lang['diffprevrev'] = '前一修订版';
+$lang['diffnextrev'] = '后一修订版';
+$lang['difflastrev'] = '上一修订版';
$lang['line'] = '行';
$lang['breadcrumb'] = '您的足迹';
$lang['youarehere'] = '您在这里';
@@ -253,7 +259,6 @@ $lang['admin_register'] = '添加新用户';
$lang['metaedit'] = '编辑元数据';
$lang['metasaveerr'] = '写入元数据失败';
$lang['metasaveok'] = '元数据已保存';
-$lang['img_backto'] = '返回到';
$lang['img_title'] = '标题';
$lang['img_caption'] = '说明';
$lang['img_date'] = '日期';
@@ -266,7 +271,6 @@ $lang['img_camera'] = '相机';
$lang['img_keywords'] = '关键字';
$lang['img_width'] = '宽度';
$lang['img_height'] = '高度';
-$lang['img_manager'] = '在媒体管理器中查看';
$lang['subscr_subscribe_success'] = '添加 %s 到 %s 的订阅列表';
$lang['subscr_subscribe_error'] = '添加 %s 到 %s 的订阅列表中出现错误';
$lang['subscr_subscribe_noaddress'] = '没有与您登录信息相关联的地址,您无法被添加到订阅列表';
diff --git a/inc/media.php b/inc/media.php
index 894333b11..b5347d145 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -501,7 +501,8 @@ function media_saveOldRevision($id){
$date = filemtime($oldf);
if (!$conf['mediarevisions']) return $date;
- if (!getRevisionInfo($id, $date, 8192, true)) {
+ $medialog = new MediaChangeLog($id);
+ if (!$medialog->getRevisionInfo($date)) {
// there was an external edit,
// there is no log entry for current version of file
if (!@file_exists(mediaMetaFN($id,'.changes'))) {
@@ -1093,7 +1094,8 @@ function media_diff($image, $ns, $auth, $fromajax = false) {
$l_rev = $rev1;
}else{ // no revision was given, compare previous to current
$r_rev = '';
- $revs = getRevisions($image, 0, 1, 8192, true);
+ $medialog = new MediaChangeLog($image);
+ $revs = $medialog->getRevisions(0, 1);
if (file_exists(mediaFN($image, $revs[0]))) {
$l_rev = $revs[0];
} else {
@@ -1446,17 +1448,23 @@ function media_printfile($item,$auth,$jump,$display_namespace=false){
echo '</div>'.NL;
}
-function media_printicon($filename){
+/**
+ * Display a media icon
+ *
+ * @param $filename
+ * @param string $size the size subfolder, if not specified 16x16 is used
+ * @return string
+ */
+function media_printicon($filename, $size=''){
list($ext) = mimetype(mediaFN($filename),false);
- if (@file_exists(DOKU_INC.'lib/images/fileicons/32x32/'.$ext.'.png')) {
- $icon = DOKU_BASE.'lib/images/fileicons/32x32/'.$ext.'.png';
+ if (@file_exists(DOKU_INC.'lib/images/fileicons/'.$size.'/'.$ext.'.png')) {
+ $icon = DOKU_BASE.'lib/images/fileicons/'.$size.'/'.$ext.'.png';
} else {
- $icon = DOKU_BASE.'lib/images/fileicons/32x32/file.png';
+ $icon = DOKU_BASE.'lib/images/fileicons/'.$size.'/file.png';
}
return '<img src="'.$icon.'" alt="'.$filename.'" class="icon" />';
-
}
/**
@@ -1480,7 +1488,7 @@ function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false
echo '<a id="d_:'.$item['id'].'" class="image" title="'.$item['id'].'" href="'.
media_managerURL(array('image' => hsc($item['id']), 'ns' => getNS($item['id']),
'tab_details' => 'view')).'">';
- echo media_printicon($item['id']);
+ echo media_printicon($item['id'], '32x32');
echo '</a>';
}
echo '</dt>'.NL;
diff --git a/inc/parser/handler.php b/inc/parser/handler.php
index 8ae991209..a1040d12e 100644
--- a/inc/parser/handler.php
+++ b/inc/parser/handler.php
@@ -12,6 +12,7 @@ class Doku_Handler {
var $status = array(
'section' => false,
+ 'doublequote' => 0,
);
var $rewriteBlocks = true;
@@ -401,11 +402,17 @@ class Doku_Handler {
function doublequoteopening($match, $state, $pos) {
$this->_addCall('doublequoteopening',array(), $pos);
+ $this->status['doublequote']++;
return true;
}
function doublequoteclosing($match, $state, $pos) {
- $this->_addCall('doublequoteclosing',array(), $pos);
+ if ($this->status['doublequote'] <= 0) {
+ $this->doublequoteopening($match, $state, $pos);
+ } else {
+ $this->_addCall('doublequoteclosing',array(), $pos);
+ $this->status['doublequote'] = max(0, --$this->status['doublequote']);
+ }
return true;
}
@@ -1149,6 +1156,9 @@ class Doku_Handler_Table {
var $currentCols = 0;
var $firstCell = false;
var $lastCellType = 'tablecell';
+ var $inTableHead = true;
+ var $currentRow = array('tableheader' => 0, 'tablecell' => 0);
+ var $countTableHeadRows = 0;
function Doku_Handler_Table(& $CallWriter) {
$this->CallWriter = & $CallWriter;
@@ -1216,15 +1226,24 @@ class Doku_Handler_Table {
$this->firstCell = true;
$this->lastCellType = 'tablecell';
$this->maxRows++;
+ if ($this->inTableHead) {
+ $this->currentRow = array('tablecell' => 0, 'tableheader' => 0);
+ }
}
function tableRowClose($call) {
+ if ($this->inTableHead && ($this->inTableHead = $this->isTableHeadRow())) {
+ $this->countTableHeadRows++;
+ }
// Strip off final cell opening and anything after it
while ( $discard = array_pop($this->tableCalls ) ) {
if ( $discard[0] == 'tablecell_open' || $discard[0] == 'tableheader_open') {
break;
}
+ if (!empty($this->currentRow[$discard[0]])) {
+ $this->currentRow[$discard[0]]--;
+ }
}
$this->tableCalls[] = array('tablerow_close', array(), $call[2]);
@@ -1233,7 +1252,20 @@ class Doku_Handler_Table {
}
}
+ function isTableHeadRow() {
+ $td = $this->currentRow['tablecell'];
+ $th = $this->currentRow['tableheader'];
+
+ if (!$th || $td > 2) return false;
+ if (2*$td > $th) return false;
+
+ return true;
+ }
+
function tableCell($call) {
+ if ($this->inTableHead) {
+ $this->currentRow[$call[0]]++;
+ }
if ( !$this->firstCell ) {
// Increase the span
@@ -1281,6 +1313,13 @@ class Doku_Handler_Table {
$cellKey = array();
$toDelete = array();
+ // if still in tableheader, then there can be no table header
+ // as all rows can't be within <THEAD>
+ if ($this->inTableHead) {
+ $this->inTableHead = false;
+ $this->countTableHeadRows = 0;
+ }
+
// Look for the colspan elements and increment the colspan on the
// previous non-empty opening cell. Once done, delete all the cells
// that contain colspans
@@ -1288,6 +1327,14 @@ class Doku_Handler_Table {
$call = $this->tableCalls[$key];
switch ($call[0]) {
+ case 'table_open' :
+ if($this->countTableHeadRows) {
+ array_splice($this->tableCalls, $key+1, 0, array(
+ array('tablethead_open', array(), $call[2]))
+ );
+ }
+ break;
+
case 'tablerow_open':
$lastRow++;
@@ -1357,15 +1404,19 @@ class Doku_Handler_Table {
} else {
$spanning_cell = null;
- for($i = $lastRow-1; $i > 0; $i--) {
- if ( $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tablecell_open' || $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tableheader_open' ) {
+ // can't cross thead/tbody boundary
+ if (!$this->countTableHeadRows || ($lastRow-1 != $this->countTableHeadRows)) {
+ for($i = $lastRow-1; $i > 0; $i--) {
- if ($this->tableCalls[$cellKey[$i][$lastCell]][1][2] >= $lastRow - $i) {
- $spanning_cell = $i;
- break;
- }
+ if ( $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tablecell_open' || $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tableheader_open' ) {
+
+ if ($this->tableCalls[$cellKey[$i][$lastCell]][1][2] >= $lastRow - $i) {
+ $spanning_cell = $i;
+ break;
+ }
+ }
}
}
if (is_null($spanning_cell)) {
@@ -1396,6 +1447,10 @@ class Doku_Handler_Table {
$key += 3;
}
+ if($this->countTableHeadRows == $lastRow) {
+ array_splice($this->tableCalls, $key+1, 0, array(
+ array('tablethead_close', array(), $call[2])));
+ }
break;
}
@@ -1438,7 +1493,7 @@ class Doku_Handler_Block {
var $blockOpen = array(
'header',
'listu_open','listo_open','listitem_open','listcontent_open',
- 'table_open','tablerow_open','tablecell_open','tableheader_open',
+ 'table_open','tablerow_open','tablecell_open','tableheader_open','tablethead_open',
'quote_open',
'code','file','hr','preformatted','rss',
'htmlblock','phpblock',
@@ -1448,7 +1503,7 @@ class Doku_Handler_Block {
var $blockClose = array(
'header',
'listu_close','listo_close','listitem_close','listcontent_close',
- 'table_close','tablerow_close','tablecell_close','tableheader_close',
+ 'table_close','tablerow_close','tablecell_close','tableheader_close','tablethead_close',
'quote_close',
'code','file','hr','preformatted','rss',
'htmlblock','phpblock',
diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php
index e748c36d8..e92b81bd7 100644
--- a/inc/parser/renderer.php
+++ b/inc/parser/renderer.php
@@ -249,6 +249,10 @@ class Doku_Renderer extends DokuWiki_Plugin {
function table_close($pos = null){}
+ function tablethead_open(){}
+
+ function tablethead_close(){}
+
function tablerow_open(){}
function tablerow_close(){}
@@ -271,17 +275,17 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _simpleTitle($name){
+ function _simpleTitle($name) {
global $conf;
- //if there is a hash we use the anchor name only
- @list($name,$hash) = explode('#',$name,2);
+ //if there is a hash we use the ancor name only
+ @list($name, $hash) = explode('#', $name, 2);
if($hash) return $hash;
- if($conf['useslash']){
- $name = strtr($name,';/',';:');
- }else{
- $name = strtr($name,';',':');
+ if($conf['useslash']) {
+ $name = strtr($name, ';/', ';:');
+ } else {
+ $name = strtr($name, ';', ':');
}
return noNSorNS($name);
@@ -290,9 +294,9 @@ class Doku_Renderer extends DokuWiki_Plugin {
/**
* Resolve an interwikilink
*/
- function _resolveInterWiki(&$shortcut,$reference){
+ function _resolveInterWiki(&$shortcut, $reference, &$exists=null) {
//get interwiki URL
- if ( isset($this->interwiki[$shortcut]) ) {
+ if(isset($this->interwiki[$shortcut])) {
$url = $this->interwiki[$shortcut];
} else {
// Default to Google I'm feeling lucky
@@ -301,25 +305,31 @@ class Doku_Renderer extends DokuWiki_Plugin {
}
//split into hash and url part
- @list($reference,$hash) = explode('#',$reference,2);
+ @list($reference, $hash) = explode('#', $reference, 2);
//replace placeholder
- if(preg_match('#\{(URL|NAME|SCHEME|HOST|PORT|PATH|QUERY)\}#',$url)){
+ if(preg_match('#\{(URL|NAME|SCHEME|HOST|PORT|PATH|QUERY)\}#', $url)) {
//use placeholders
- $url = str_replace('{URL}',rawurlencode($reference),$url);
- $url = str_replace('{NAME}',$reference,$url);
+ $url = str_replace('{URL}', rawurlencode($reference), $url);
+ $url = str_replace('{NAME}', $reference, $url);
$parsed = parse_url($reference);
if(!$parsed['port']) $parsed['port'] = 80;
- $url = str_replace('{SCHEME}',$parsed['scheme'],$url);
- $url = str_replace('{HOST}',$parsed['host'],$url);
- $url = str_replace('{PORT}',$parsed['port'],$url);
- $url = str_replace('{PATH}',$parsed['path'],$url);
- $url = str_replace('{QUERY}',$parsed['query'],$url);
- }else{
+ $url = str_replace('{SCHEME}', $parsed['scheme'], $url);
+ $url = str_replace('{HOST}', $parsed['host'], $url);
+ $url = str_replace('{PORT}', $parsed['port'], $url);
+ $url = str_replace('{PATH}', $parsed['path'], $url);
+ $url = str_replace('{QUERY}', $parsed['query'], $url);
+ } else {
//default
- $url = $url.rawurlencode($reference);
+ $url = $url . rawurlencode($reference);
+ }
+ //handle as wiki links
+ if($url{0} === ':') {
+ list($id, $urlparam) = explode('?', $url, 2);
+ $url = wl(cleanID($id), $urlparam);
+ $exists = page_exists($id);
}
- if($hash) $url .= '#'.rawurlencode($hash);
+ if($hash) $url .= '#' . rawurlencode($hash);
return $url;
}
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index 4966f103a..cf36a8175 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -688,7 +688,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
}
/**
- */
+ */
function interwikilink($match, $name = null, $wikiName, $wikiUri) {
global $conf;
@@ -700,19 +700,28 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$link['name'] = $this->_getLinkTitle($name, $wikiUri, $isImage);
//get interwiki URL
- $url = $this->_resolveInterWiki($wikiName,$wikiUri);
+ $exists = null;
+ $url = $this->_resolveInterWiki($wikiName, $wikiUri, $exists);
- if ( !$isImage ) {
- $class = preg_replace('/[^_\-a-z0-9]+/i','_',$wikiName);
+ if(!$isImage) {
+ $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $wikiName);
$link['class'] = "interwiki iw_$class";
} else {
$link['class'] = 'media';
}
//do we stay at the same server? Use local target
- if( strpos($url,DOKU_URL) === 0 ){
+ if(strpos($url, DOKU_URL) === 0 OR strpos($url, DOKU_BASE) === 0) {
$link['target'] = $conf['target']['wiki'];
}
+ if($exists !== null && !$isImage) {
+ if($exists) {
+ $link['class'] .= ' wikilink1';
+ } else {
+ $link['class'] .= ' wikilink2';
+ $link['rel'] = 'nofollow';
+ }
+ }
$link['url'] = $url;
$link['title'] = htmlspecialchars($link['url']);
@@ -954,6 +963,14 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
}
}
+ function tablethead_open(){
+ $this->doc .= DOKU_TAB . '<thead>' . DOKU_LF;
+ }
+
+ function tablethead_close(){
+ $this->doc .= DOKU_TAB . '</thead>' . DOKU_LF;
+ }
+
function tablerow_open(){
// initialize the cell counter used for classes
$this->_counter['cell_counter'] = 0;
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 281a93967..9c2a0b570 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -635,9 +635,9 @@ function p_get_renderer($mode) {
return $Renderer;
}
- // not bundled, see if its an enabled plugin for rendering $mode
+ // not bundled, see if its an enabled renderer plugin & when $mode is 'xhtml', the renderer can supply that format.
$Renderer = $plugin_controller->load('renderer',$rname);
- if ($Renderer && is_a($Renderer, 'Doku_Renderer') && ($mode == $Renderer->getFormat())) {
+ if ($Renderer && is_a($Renderer, 'Doku_Renderer') && ($mode != 'xhtml' || $mode == $Renderer->getFormat())) {
return $Renderer;
}
@@ -659,7 +659,6 @@ function p_get_renderer($mode) {
}
// fallback failed, alert the world
- trigger_error("Unable to resolve render class $rclass",E_USER_WARNING);
msg("No renderer '$rname' found for mode '$mode'",-1);
return null;
}
diff --git a/inc/plugin.php b/inc/plugin.php
index 95bdaee2b..7de4fbd74 100644
--- a/inc/plugin.php
+++ b/inc/plugin.php
@@ -255,7 +255,7 @@ class DokuWiki_Plugin {
if(!isset($arguments[1])) $arguments[1] = 'xhtml';
return $this->render_text($arguments[0], $arguments[1]);
}
- trigger_error("no such method $name", E_ERROR);
+ trigger_error("no such method $name", E_USER_ERROR);
return null;
}
diff --git a/inc/subscription.php b/inc/subscription.php
index adf1b821c..298e7c12b 100644
--- a/inc/subscription.php
+++ b/inc/subscription.php
@@ -340,7 +340,8 @@ class Subscription {
while(!is_null($rev) && $rev['date'] >= $lastupdate &&
($INPUT->server->str('REMOTE_USER') === $rev['user'] ||
$rev['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT)) {
- $rev = getRevisions($rev['id'], $n++, 1);
+ $pagelog = new PageChangeLog($rev['id']);
+ $rev = $pagelog->getRevisions($n++, 1);
$rev = (count($rev) > 0) ? $rev[0] : null;
}
@@ -519,9 +520,10 @@ class Subscription {
* @return bool
*/
protected function send_digest($subscriber_mail, $id, $lastupdate) {
+ $pagelog = new PageChangeLog($id);
$n = 0;
do {
- $rev = getRevisions($id, $n++, 1);
+ $rev = $pagelog->getRevisions($n++, 1);
$rev = (count($rev) > 0) ? $rev[0] : null;
} while(!is_null($rev) && $rev > $lastupdate);
diff --git a/inc/template.php b/inc/template.php
index 1bf6b45b2..35b54b4c3 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -318,15 +318,17 @@ function tpl_metaheaders($alt = true) {
}
if($alt) {
- $head['link'][] = array(
- 'rel' => 'alternate', 'type'=> 'application/rss+xml',
- 'title'=> $lang['btn_recent'], 'href'=> DOKU_BASE.'feed.php'
- );
- $head['link'][] = array(
- 'rel' => 'alternate', 'type'=> 'application/rss+xml',
- 'title'=> $lang['currentns'],
- 'href' => DOKU_BASE.'feed.php?mode=list&ns='.$INFO['namespace']
- );
+ if(actionOK('rss')) {
+ $head['link'][] = array(
+ 'rel' => 'alternate', 'type'=> 'application/rss+xml',
+ 'title'=> $lang['btn_recent'], 'href'=> DOKU_BASE.'feed.php'
+ );
+ $head['link'][] = array(
+ 'rel' => 'alternate', 'type'=> 'application/rss+xml',
+ 'title'=> $lang['currentns'],
+ 'href' => DOKU_BASE.'feed.php?mode=list&ns='.$INFO['namespace']
+ );
+ }
if(($ACT == 'show' || $ACT == 'search') && $INFO['writable']) {
$head['link'][] = array(
'rel' => 'edit',
@@ -335,7 +337,7 @@ function tpl_metaheaders($alt = true) {
);
}
- if($ACT == 'search') {
+ if(actionOK('rss') && $ACT == 'search') {
$head['link'][] = array(
'rel' => 'alternate', 'type'=> 'application/rss+xml',
'title'=> $lang['searchresult'],
@@ -550,6 +552,7 @@ function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = fals
* @var string $method
* @var bool $nofollow
* @var array $params
+ * @var string $replacement
*/
extract($data);
if(strpos($id, '#') === 0) {
@@ -558,6 +561,9 @@ function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = fals
$linktarget = wl($id, $params);
}
$caption = $lang['btn_'.$type];
+ if(strpos($caption, '%s')){
+ $caption = sprintf($caption, $replacement);
+ }
$akey = $addTitle = '';
if($accesskey) {
$akey = 'accesskey="'.$accesskey.'" ';
@@ -613,11 +619,12 @@ function tpl_get_action($type) {
if ($type == 'subscription') $type = 'subscribe';
if(!actionOK($type)) return false;
- $accesskey = null;
- $id = $ID;
- $method = 'get';
- $params = array('do' => $type);
- $nofollow = true;
+ $accesskey = null;
+ $id = $ID;
+ $method = 'get';
+ $params = array('do' => $type);
+ $nofollow = true;
+ $replacement = '';
switch($type) {
case 'edit':
// most complicated type - we need to decide on current action
@@ -674,6 +681,11 @@ function tpl_get_action($type) {
$params = array('do' => '');
$accesskey = 'b';
break;
+ case 'img_backto':
+ $params = array();
+ $accesskey = 'b';
+ $replacement = $ID;
+ break;
case 'login':
$params['sectok'] = getSecurityToken();
if($INPUT->server->has('REMOTE_USER')) {
@@ -721,11 +733,26 @@ function tpl_get_action($type) {
case 'media':
$params['ns'] = getNS($ID);
break;
+ case 'mediaManager':
+ // View image in media manager
+ global $IMG;
+ $imgNS = getNS($IMG);
+ $authNS = auth_quickaclcheck("$imgNS:*");
+ if ($authNS < AUTH_UPLOAD) {
+ return false;
+ }
+ $params = array(
+ 'ns' => $imgNS,
+ 'image' => $IMG,
+ 'do' => 'media'
+ );
+ //$type = 'media';
+ break;
default:
return '[unknown %s type]';
break;
}
- return compact('accesskey', 'type', 'id', 'method', 'params', 'nofollow');
+ return compact('accesskey', 'type', 'id', 'method', 'params', 'nofollow', 'replacement');
}
/**
@@ -889,12 +916,11 @@ function tpl_youarehere($sep = ' » ') {
*/
function tpl_userinfo() {
global $lang;
- global $INFO;
/** @var Input $INPUT */
global $INPUT;
if($INPUT->server->str('REMOTE_USER')) {
- print $lang['loggedinas'].': <bdi>'.hsc($INFO['userinfo']['name']).'</bdi> (<bdi>'.hsc($INPUT->server->str('REMOTE_USER')).'</bdi>)';
+ print $lang['loggedinas'].': '.userlink();
return true;
}
return false;
@@ -1018,12 +1044,73 @@ function tpl_img_getTag($tags, $alt = '', $src = null) {
static $meta = null;
if(is_null($meta)) $meta = new JpegMeta($src);
if($meta === false) return $alt;
- $info = $meta->getField($tags);
+ $info = cleanText($meta->getField($tags));
if($info == false) return $alt;
return $info;
}
/**
+ * Returns a description list of the metatags of the current image
+ *
+ * @return string html of description list
+ */
+function tpl_img_meta() {
+ global $lang;
+
+ $tags = tpl_get_img_meta();
+
+ echo '<dl>';
+ foreach($tags as $tag) {
+ $label = $lang[$tag['langkey']];
+ if(!$label) $label = $tag['langkey'];
+
+ echo '<dt>'.$label.':</dt><dd>';
+ if ($tag['type'] == 'date') {
+ echo dformat($tag['value']);
+ } else {
+ echo hsc($tag['value']);
+ }
+ echo '</dd>';
+ }
+ echo '</dl>';
+}
+
+/**
+ * Returns metadata as configured in mediameta config file, ready for creating html
+ *
+ * @return array with arrays containing the entries:
+ * - string langkey key to lookup in the $lang var, if not found printed as is
+ * - string type type of value
+ * - string value tag value (unescaped)
+ */
+function tpl_get_img_meta() {
+
+ $config_files = getConfigFiles('mediameta');
+ foreach ($config_files as $config_file) {
+ if(@file_exists($config_file)) {
+ include($config_file);
+ }
+ }
+ /** @var array $fields the included array with metadata */
+
+ $tags = array();
+ foreach($fields as $tag){
+ $t = array();
+ if (!empty($tag[0])) {
+ $t = array($tag[0]);
+ }
+ if(is_array($tag[3])) {
+ $t = array_merge($t,$tag[3]);
+ }
+ $value = tpl_img_getTag($t);
+ if ($value) {
+ $tags[] = array('langkey' => $tag[1], 'type' => $tag[2], 'value' => $value);
+ }
+ }
+ return $tags;
+}
+
+/**
* Prints the image with a link to the full sized version
*
* Only allowed in: detail.php