summaryrefslogtreecommitdiff
path: root/inc
diff options
context:
space:
mode:
Diffstat (limited to 'inc')
-rw-r--r--inc/EmailAddressValidator.php20
-rw-r--r--inc/HTTPClient.php33
-rw-r--r--inc/Input.class.php38
-rw-r--r--inc/JpegMeta.php3
-rw-r--r--inc/Mailer.class.php29
-rw-r--r--inc/RemoteAPICore.php28
-rw-r--r--inc/Sitemapper.php4
-rw-r--r--inc/Tar.class.php2
-rw-r--r--inc/actions.php31
-rw-r--r--inc/auth.php106
-rw-r--r--inc/cache.php126
-rw-r--r--inc/changelog.php833
-rw-r--r--inc/cliopts.php23
-rw-r--r--inc/common.php294
-rw-r--r--inc/confutils.php3
-rw-r--r--inc/events.php99
-rw-r--r--inc/feedcreator.class.php99
-rw-r--r--inc/fetch.functions.php15
-rw-r--r--inc/form.php40
-rw-r--r--inc/fulltext.php30
-rw-r--r--inc/html.php499
-rw-r--r--inc/httputils.php16
-rw-r--r--inc/indexer.php35
-rw-r--r--inc/infoutils.php23
-rw-r--r--inc/init.php38
-rw-r--r--inc/io.php52
-rw-r--r--inc/lang/af/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/af/lang.php2
-rw-r--r--inc/lang/ar/denied.txt2
-rw-r--r--inc/lang/ar/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/ar/lang.php18
-rw-r--r--inc/lang/az/denied.txt2
-rw-r--r--inc/lang/az/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/az/lang.php2
-rw-r--r--inc/lang/bg/denied.txt2
-rw-r--r--inc/lang/bg/jquery.ui.datepicker.js24
-rw-r--r--inc/lang/bg/lang.php78
-rw-r--r--inc/lang/bg/register.txt2
-rw-r--r--inc/lang/bg/resendpwd.txt2
-rw-r--r--inc/lang/bn/denied.txt2
-rw-r--r--inc/lang/bn/lang.php133
-rw-r--r--inc/lang/ca-valencia/denied.txt2
-rw-r--r--inc/lang/ca-valencia/lang.php2
-rw-r--r--inc/lang/ca/denied.txt2
-rw-r--r--inc/lang/ca/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/ca/lang.php2
-rw-r--r--inc/lang/cs/denied.txt2
-rw-r--r--inc/lang/cs/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/cs/lang.php10
-rw-r--r--inc/lang/da/denied.txt2
-rw-r--r--inc/lang/da/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/da/lang.php4
-rw-r--r--inc/lang/de-informal/denied.txt2
-rw-r--r--inc/lang/de-informal/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/de-informal/lang.php4
-rw-r--r--inc/lang/de/denied.txt2
-rw-r--r--inc/lang/de/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/de/lang.php8
-rw-r--r--inc/lang/el/denied.txt1
-rw-r--r--inc/lang/el/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/el/lang.php5
-rw-r--r--inc/lang/en/denied.txt2
-rw-r--r--inc/lang/en/lang.php11
-rw-r--r--inc/lang/eo/admin.txt2
-rw-r--r--inc/lang/eo/adminplugins.txt2
-rw-r--r--inc/lang/eo/denied.txt2
-rw-r--r--inc/lang/eo/diff.txt2
-rw-r--r--inc/lang/eo/draft.txt2
-rw-r--r--inc/lang/eo/edit.txt2
-rw-r--r--inc/lang/eo/editrev.txt2
-rw-r--r--inc/lang/eo/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/eo/lang.php20
-rw-r--r--inc/lang/es/denied.txt3
-rw-r--r--inc/lang/es/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/es/lang.php26
-rw-r--r--inc/lang/et/adminplugins.txt1
-rw-r--r--inc/lang/et/denied.txt3
-rw-r--r--inc/lang/et/index.txt2
-rw-r--r--inc/lang/et/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/et/lang.php117
-rw-r--r--inc/lang/et/resetpwd.txt3
-rw-r--r--inc/lang/et/subscr_digest.txt21
-rw-r--r--inc/lang/et/subscr_form.txt3
-rw-r--r--inc/lang/et/subscr_list.txt19
-rw-r--r--inc/lang/et/subscr_single.txt23
-rw-r--r--inc/lang/et/uploadmail.txt16
-rw-r--r--inc/lang/eu/denied.txt3
-rw-r--r--inc/lang/eu/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/eu/lang.php4
-rw-r--r--inc/lang/fa/denied.txt3
-rw-r--r--inc/lang/fa/jquery.ui.datepicker.js59
-rw-r--r--inc/lang/fa/lang.php6
-rw-r--r--inc/lang/fi/denied.txt3
-rw-r--r--inc/lang/fi/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/fi/lang.php4
-rw-r--r--inc/lang/fo/denied.txt3
-rw-r--r--inc/lang/fo/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/fo/lang.php2
-rw-r--r--inc/lang/fr/denied.txt3
-rw-r--r--inc/lang/fr/jquery.ui.datepicker.js25
-rw-r--r--inc/lang/fr/lang.php22
-rw-r--r--inc/lang/fr/subscr_form.txt2
-rw-r--r--inc/lang/gl/denied.txt2
-rw-r--r--inc/lang/gl/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/gl/lang.php4
-rw-r--r--inc/lang/he/denied.txt3
-rw-r--r--inc/lang/he/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/he/lang.php27
-rw-r--r--inc/lang/hi/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/hi/lang.php2
-rw-r--r--inc/lang/hr/denied.txt1
-rw-r--r--inc/lang/hr/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/hr/lang.php2
-rw-r--r--inc/lang/hu-formal/admin.txt3
-rw-r--r--inc/lang/hu-formal/adminplugins.txt1
-rw-r--r--inc/lang/hu-formal/backlinks.txt3
-rw-r--r--inc/lang/hu-formal/conflict.txt5
-rw-r--r--inc/lang/hu-formal/denied.txt4
-rw-r--r--inc/lang/hu-formal/diff.txt3
-rw-r--r--inc/lang/hu-formal/draft.txt5
-rw-r--r--inc/lang/hu-formal/edit.txt1
-rw-r--r--inc/lang/hu-formal/editrev.txt2
-rw-r--r--inc/lang/hu-formal/index.txt3
-rw-r--r--inc/lang/hu-formal/lang.php27
-rw-r--r--inc/lang/hu/denied.txt2
-rw-r--r--inc/lang/hu/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/hu/lang.php10
-rw-r--r--inc/lang/ia/denied.txt3
-rw-r--r--inc/lang/ia/lang.php2
-rw-r--r--inc/lang/id/adminplugins.txt1
-rw-r--r--inc/lang/id/denied.txt2
-rw-r--r--inc/lang/id/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/id/lang.php138
-rw-r--r--inc/lang/id/resetpwd.txt3
-rw-r--r--inc/lang/id/subscr_digest.txt17
-rw-r--r--inc/lang/is/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/is/lang.php2
-rw-r--r--inc/lang/it/denied.txt3
-rw-r--r--inc/lang/it/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/it/lang.php4
-rw-r--r--inc/lang/ja/denied.txt2
-rw-r--r--inc/lang/ja/jquery.ui.datepicker.js23
-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/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/kk/lang.php2
-rw-r--r--inc/lang/km/denied.txt1
-rw-r--r--inc/lang/km/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/km/lang.php2
-rw-r--r--inc/lang/ko/denied.txt3
-rw-r--r--inc/lang/ko/install.html26
-rw-r--r--inc/lang/ko/jquery.ui.datepicker.js23
-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/denied.txt2
-rw-r--r--inc/lang/ku/lang.php2
-rw-r--r--inc/lang/la/denied.txt3
-rw-r--r--inc/lang/la/lang.php2
-rw-r--r--inc/lang/lb/denied.txt3
-rw-r--r--inc/lang/lb/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/lb/lang.php2
-rw-r--r--inc/lang/lt/denied.txt2
-rw-r--r--inc/lang/lt/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/lt/lang.php2
-rw-r--r--inc/lang/lv/denied.txt4
-rw-r--r--inc/lang/lv/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/lv/lang.php4
-rw-r--r--inc/lang/mg/denied.txt2
-rw-r--r--inc/lang/mk/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/mk/lang.php2
-rw-r--r--inc/lang/mr/denied.txt3
-rw-r--r--inc/lang/mr/lang.php4
-rw-r--r--inc/lang/ms/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/ne/denied.txt3
-rw-r--r--inc/lang/ne/lang.php2
-rw-r--r--inc/lang/nl/denied.txt3
-rw-r--r--inc/lang/nl/edit.txt2
-rw-r--r--inc/lang/nl/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/nl/lang.php11
-rw-r--r--inc/lang/no/denied.txt3
-rw-r--r--inc/lang/no/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/no/lang.php11
-rw-r--r--inc/lang/no/resetpwd.txt3
-rw-r--r--inc/lang/pl/denied.txt2
-rw-r--r--inc/lang/pl/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/pl/lang.php10
-rw-r--r--inc/lang/pt-br/denied.txt3
-rw-r--r--inc/lang/pt-br/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/pt-br/lang.php4
-rw-r--r--inc/lang/pt/denied.txt3
-rw-r--r--inc/lang/pt/jquery.ui.datepicker.js22
-rw-r--r--inc/lang/pt/lang.php4
-rw-r--r--inc/lang/ro/admin.txt2
-rw-r--r--inc/lang/ro/adminplugins.txt2
-rw-r--r--inc/lang/ro/backlinks.txt1
-rw-r--r--inc/lang/ro/conflict.txt7
-rw-r--r--inc/lang/ro/denied.txt4
-rw-r--r--inc/lang/ro/diff.txt3
-rw-r--r--inc/lang/ro/draft.txt7
-rw-r--r--inc/lang/ro/edit.txt3
-rw-r--r--inc/lang/ro/editrev.txt3
-rw-r--r--inc/lang/ro/index.txt4
-rw-r--r--inc/lang/ro/install.html12
-rw-r--r--inc/lang/ro/jquery.ui.datepicker.js26
-rw-r--r--inc/lang/ro/lang.php28
-rw-r--r--inc/lang/ro/locked.txt3
-rw-r--r--inc/lang/ro/login.txt6
-rw-r--r--inc/lang/ro/mailtext.txt23
-rw-r--r--inc/lang/ro/newpage.txt4
-rw-r--r--inc/lang/ro/norev.txt6
-rw-r--r--inc/lang/ro/password.txt8
-rw-r--r--inc/lang/ro/preview.txt3
-rw-r--r--inc/lang/ro/pwconfirm.txt13
-rw-r--r--inc/lang/ro/read.txt4
-rw-r--r--inc/lang/ro/recent.txt6
-rw-r--r--inc/lang/ro/register.txt3
-rw-r--r--inc/lang/ro/registermail.txt13
-rw-r--r--inc/lang/ro/resendpwd.txt4
-rw-r--r--inc/lang/ro/resetpwd.txt4
-rw-r--r--inc/lang/ro/revisions.txt7
-rw-r--r--inc/lang/ro/searchpage.txt2
-rw-r--r--inc/lang/ro/showrev.txt2
-rw-r--r--inc/lang/ro/stopwords.txt6
-rw-r--r--inc/lang/ro/subscr_digest.txt18
-rw-r--r--inc/lang/ro/subscr_form.txt3
-rw-r--r--inc/lang/ro/subscr_list.txt16
-rw-r--r--inc/lang/ro/subscr_single.txt22
-rw-r--r--inc/lang/ro/updateprofile.txt3
-rw-r--r--inc/lang/ro/uploadmail.txt8
-rw-r--r--inc/lang/ru/admin.txt2
-rw-r--r--inc/lang/ru/denied.txt3
-rw-r--r--inc/lang/ru/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/ru/lang.php41
-rw-r--r--inc/lang/ru/mailtext.txt2
-rw-r--r--inc/lang/ru/norev.txt1
-rw-r--r--inc/lang/ru/password.txt2
-rw-r--r--inc/lang/ru/pwconfirm.txt2
-rw-r--r--inc/lang/ru/registermail.txt2
-rw-r--r--inc/lang/ru/subscr_digest.txt4
-rw-r--r--inc/lang/ru/subscr_list.txt4
-rw-r--r--inc/lang/ru/subscr_single.txt4
-rw-r--r--inc/lang/ru/uploadmail.txt2
-rw-r--r--inc/lang/sk/denied.txt3
-rw-r--r--inc/lang/sk/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/sk/lang.php5
-rw-r--r--inc/lang/sl/denied.txt3
-rw-r--r--inc/lang/sl/jquery.ui.datepicker.js24
-rw-r--r--inc/lang/sl/lang.php14
-rw-r--r--inc/lang/sl/resetpwd.txt1
-rw-r--r--inc/lang/sq/denied.txt3
-rw-r--r--inc/lang/sq/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/sq/lang.php2
-rw-r--r--inc/lang/sr/denied.txt2
-rw-r--r--inc/lang/sr/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/sr/lang.php2
-rw-r--r--inc/lang/sv/denied.txt2
-rw-r--r--inc/lang/sv/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/sv/lang.php14
-rw-r--r--inc/lang/sv/subscr_digest.txt19
-rw-r--r--inc/lang/th/denied.txt3
-rw-r--r--inc/lang/th/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/th/lang.php2
-rw-r--r--inc/lang/tr/denied.txt2
-rw-r--r--inc/lang/tr/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/tr/lang.php17
-rw-r--r--inc/lang/uk/denied.txt2
-rw-r--r--inc/lang/uk/jquery.ui.datepicker.js24
-rw-r--r--inc/lang/uk/lang.php2
-rw-r--r--inc/lang/vi/denied.txt3
-rw-r--r--inc/lang/vi/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/vi/lang.php225
-rw-r--r--inc/lang/zh-tw/denied.txt2
-rw-r--r--inc/lang/zh-tw/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/zh-tw/lang.php4
-rw-r--r--inc/lang/zh/denied.txt3
-rw-r--r--inc/lang/zh/jquery.ui.datepicker.js23
-rw-r--r--inc/lang/zh/lang.php13
-rw-r--r--inc/lessc.inc.php2
-rw-r--r--inc/load.php7
-rw-r--r--inc/mail.php9
-rw-r--r--inc/media.php186
-rw-r--r--inc/pageutils.php29
-rw-r--r--inc/parser/code.php1
-rw-r--r--inc/parser/handler.php73
-rw-r--r--inc/parser/metadata.php4
-rw-r--r--inc/parser/parser.php80
-rw-r--r--inc/parser/renderer.php64
-rw-r--r--inc/parser/xhtml.php168
-rw-r--r--inc/parser/xhtmlsummary.php1
-rw-r--r--inc/parserutils.php58
-rw-r--r--inc/plugin.php27
-rw-r--r--inc/pluginutils.php2
-rw-r--r--inc/remote.php5
-rw-r--r--inc/search.php65
-rw-r--r--inc/subscription.php28
-rw-r--r--inc/template.php185
-rw-r--r--inc/toolbar.php6
309 files changed, 5329 insertions, 1387 deletions
diff --git a/inc/EmailAddressValidator.php b/inc/EmailAddressValidator.php
index bb4ef0ca9..fd6f3275b 100644
--- a/inc/EmailAddressValidator.php
+++ b/inc/EmailAddressValidator.php
@@ -15,8 +15,8 @@ class EmailAddressValidator {
/**
* Check email address validity
- * @param strEmailAddress Email address to be checked
- * @return True if email is valid, false if not
+ * @param string $strEmailAddress Email address to be checked
+ * @return bool True if email is valid, false if not
*/
public function check_email_address($strEmailAddress) {
@@ -82,8 +82,8 @@ class EmailAddressValidator {
/**
* Checks email section before "@" symbol for validity
- * @param strLocalPortion Text to be checked
- * @return True if local portion is valid, false if not
+ * @param string $strLocalPortion Text to be checked
+ * @return bool True if local portion is valid, false if not
*/
protected function check_local_portion($strLocalPortion) {
// Local portion can only be from 1 to 64 characters, inclusive.
@@ -113,8 +113,8 @@ class EmailAddressValidator {
/**
* Checks email section after "@" symbol for validity
- * @param strDomainPortion Text to be checked
- * @return True if domain portion is valid, false if not
+ * @param string $strDomainPortion Text to be checked
+ * @return bool True if domain portion is valid, false if not
*/
protected function check_domain_portion($strDomainPortion) {
// Total domain can only be from 1 to 255 characters, inclusive
@@ -172,10 +172,10 @@ class EmailAddressValidator {
/**
* Check given text length is between defined bounds
- * @param strText Text to be checked
- * @param intMinimum Minimum acceptable length
- * @param intMaximum Maximum acceptable length
- * @return True if string is within bounds (inclusive), false if not
+ * @param string $strText Text to be checked
+ * @param int $intMinimum Minimum acceptable length
+ * @param int $intMaximum Maximum acceptable length
+ * @return bool True if string is within bounds (inclusive), false if not
*/
protected function check_text_length($strText, $intMinimum, $intMaximum) {
// Minimum and maximum are both inclusive
diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php
index 96954fb47..f8b836753 100644
--- a/inc/HTTPClient.php
+++ b/inc/HTTPClient.php
@@ -254,7 +254,13 @@ class HTTPClient {
}
// add SSL stream prefix if needed - needs SSL support in PHP
- if($port == 443 || $this->proxy_ssl) $server = 'ssl://'.$server;
+ if($port == 443 || $this->proxy_ssl) {
+ if(!in_array('ssl', stream_get_transports())) {
+ $this->status = -200;
+ $this->error = 'This PHP version does not support SSL - cannot connect to server';
+ }
+ $server = 'ssl://'.$server;
+ }
// prepare headers
$headers = $this->headers;
@@ -304,11 +310,18 @@ class HTTPClient {
}
// try establish a CONNECT tunnel for SSL
- if($this->_ssltunnel($socket, $request_url)){
- // no keep alive for tunnels
- $this->keep_alive = false;
- // tunnel is authed already
- if(isset($headers['Proxy-Authentication'])) unset($headers['Proxy-Authentication']);
+ try {
+ if($this->_ssltunnel($socket, $request_url)){
+ // no keep alive for tunnels
+ $this->keep_alive = false;
+ // tunnel is authed already
+ if(isset($headers['Proxy-Authentication'])) unset($headers['Proxy-Authentication']);
+ }
+ } catch (HTTPClientException $e) {
+ $this->status = $e->getCode();
+ $this->error = $e->getMessage();
+ fclose($socket);
+ return false;
}
// keep alive?
@@ -363,7 +376,7 @@ class HTTPClient {
// get Status
if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m))
- throw new HTTPClientException('Server returned bad answer');
+ throw new HTTPClientException('Server returned bad answer '.$r_headers);
$this->status = $m[2];
@@ -526,6 +539,7 @@ class HTTPClient {
*
* @param resource &$socket
* @param string &$requesturl
+ * @throws HTTPClientException when a tunnel is needed but could not be established
* @return bool true if a tunnel was established
*/
function _ssltunnel(&$socket, &$requesturl){
@@ -538,7 +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) {
- '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;
@@ -559,7 +573,8 @@ class HTTPClient {
return true;
}
}
- return false;
+
+ throw new HTTPClientException('Failed to establish secure proxy connection', -150);
}
/**
diff --git a/inc/Input.class.php b/inc/Input.class.php
index 7434d2b2c..e7eef1c29 100644
--- a/inc/Input.class.php
+++ b/inc/Input.class.php
@@ -15,6 +15,8 @@ class Input {
public $post;
/** @var GetInput Access $_GET parameters */
public $get;
+ /** @var ServerInput Access $_SERVER parameters */
+ public $server;
protected $access;
@@ -25,6 +27,7 @@ class Input {
$this->access = &$_REQUEST;
$this->post = new PostInput();
$this->get = new GetInput();
+ $this->server = new ServerInput();
}
/**
@@ -141,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
@@ -260,3 +283,18 @@ class GetInput extends Input {
$_REQUEST[$name] = $value;
}
}
+
+/**
+ * Internal class used for $_SERVER access in Input class
+ */
+class ServerInput extends Input {
+ protected $access;
+
+ /**
+ * Initialize the $access array, remove subclass members
+ */
+ function __construct() {
+ $this->access = &$_SERVER;
+ }
+
+}
diff --git a/inc/JpegMeta.php b/inc/JpegMeta.php
index cb1772736..a35ec3ed0 100644
--- a/inc/JpegMeta.php
+++ b/inc/JpegMeta.php
@@ -2929,7 +2929,8 @@ class JpegMeta {
$length = strlen($data) - $pos;
}
- return substr($data, $pos, $length);
+ $rv = substr($data, $pos, $length);
+ return $rv;
}
/*************************************************************/
diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php
index 2ac2c1d60..e90b45f99 100644
--- a/inc/Mailer.class.php
+++ b/inc/Mailer.class.php
@@ -39,6 +39,8 @@ class Mailer {
*/
public function __construct() {
global $conf;
+ /* @var Input $INPUT */
+ global $INPUT;
$server = parse_url(DOKU_URL, PHP_URL_HOST);
if(strpos($server,'.') === false) $server = $server.'.localhost';
@@ -53,7 +55,7 @@ class Mailer {
// add some default headers for mailfiltering FS#2247
$this->setHeader('X-Mailer', 'DokuWiki');
- $this->setHeader('X-DokuWiki-User', $_SERVER['REMOTE_USER']);
+ $this->setHeader('X-DokuWiki-User', $INPUT->server->str('REMOTE_USER'));
$this->setHeader('X-DokuWiki-Title', $conf['title']);
$this->setHeader('X-DokuWiki-Server', $server);
$this->setHeader('X-Auto-Response-Suppress', 'OOF');
@@ -181,6 +183,9 @@ class Mailer {
public function setBody($text, $textrep = null, $htmlrep = null, $html = null, $wrap = true) {
global $INFO;
global $conf;
+ /* @var Input $INPUT */
+ global $INPUT;
+
$htmlrep = (array)$htmlrep;
$textrep = (array)$textrep;
@@ -218,24 +223,24 @@ class Mailer {
$cip = gethostsbyaddrs($ip);
$trep = array(
'DATE' => dformat(),
- 'BROWSER' => $_SERVER['HTTP_USER_AGENT'],
+ 'BROWSER' => $INPUT->server->str('HTTP_USER_AGENT'),
'IPADDRESS' => $ip,
'HOSTNAME' => $cip,
'TITLE' => $conf['title'],
'DOKUWIKIURL' => DOKU_URL,
- 'USER' => $_SERVER['REMOTE_USER'],
+ 'USER' => $INPUT->server->str('REMOTE_USER'),
'NAME' => $INFO['userinfo']['name'],
'MAIL' => $INFO['userinfo']['mail'],
);
$trep = array_merge($trep, (array)$textrep);
$hrep = array(
'DATE' => '<i>'.hsc(dformat()).'</i>',
- 'BROWSER' => hsc($_SERVER['HTTP_USER_AGENT']),
+ 'BROWSER' => hsc($INPUT->server->str('HTTP_USER_AGENT')),
'IPADDRESS' => '<code>'.hsc($ip).'</code>',
'HOSTNAME' => '<code>'.hsc($cip).'</code>',
'TITLE' => hsc($conf['title']),
'DOKUWIKIURL' => '<a href="'.DOKU_URL.'">'.DOKU_URL.'</a>',
- 'USER' => hsc($_SERVER['REMOTE_USER']),
+ 'USER' => hsc($INPUT->server->str('REMOTE_USER')),
'NAME' => hsc($INFO['userinfo']['name']),
'MAIL' => '<a href="mailto:"'.hsc($INFO['userinfo']['mail']).'">'.
hsc($INFO['userinfo']['mail']).'</a>',
@@ -277,7 +282,7 @@ class Mailer {
/**
* Add the To: recipients
*
- * @see setAddress
+ * @see cleanAddress
* @param string|array $address Multiple adresses separated by commas or as array
*/
public function to($address) {
@@ -287,7 +292,7 @@ class Mailer {
/**
* Add the Cc: recipients
*
- * @see setAddress
+ * @see cleanAddress
* @param string|array $address Multiple adresses separated by commas or as array
*/
public function cc($address) {
@@ -297,7 +302,7 @@ class Mailer {
/**
* Add the Bcc: recipients
*
- * @see setAddress
+ * @see cleanAddress
* @param string|array $address Multiple adresses separated by commas or as array
*/
public function bcc($address) {
@@ -310,7 +315,7 @@ class Mailer {
* This is set to $conf['mailfrom'] when not specified so you shouldn't need
* to call this function
*
- * @see setAddress
+ * @see cleanAddress
* @param string $address from address
*/
public function from($address) {
@@ -333,9 +338,9 @@ class Mailer {
* for headers. Addresses may not contain Non-ASCII data!
*
* Example:
- * setAddress("föö <foo@bar.com>, me@somewhere.com","TBcc");
+ * cc("föö <foo@bar.com>, me@somewhere.com","TBcc");
*
- * @param string|array $address Multiple adresses separated by commas or as array
+ * @param string|array $addresses Multiple adresses separated by commas or as array
* @return bool|string the prepared header (can contain multiple lines)
*/
public function cleanAddress($addresses) {
@@ -522,7 +527,7 @@ class Mailer {
// clean up addresses
if(empty($this->headers['From'])) $this->from($conf['mailfrom']);
- $addrs = array('To', 'From', 'Cc', 'Bcc');
+ $addrs = array('To', 'From', 'Cc', 'Bcc', 'Reply-To', 'Sender');
foreach($addrs as $addr) {
if(isset($this->headers[$addr])) {
$this->headers[$addr] = $this->cleanAddress($this->headers[$addr]);
diff --git a/inc/RemoteAPICore.php b/inc/RemoteAPICore.php
index 2eb8ea403..ffa03ee93 100644
--- a/inc/RemoteAPICore.php
+++ b/inc/RemoteAPICore.php
@@ -3,7 +3,7 @@
/**
* Increased whenever the API is changed
*/
-define('DOKU_API_VERSION', 8);
+define('DOKU_API_VERSION', 9);
class RemoteAPICore {
@@ -24,6 +24,10 @@ class RemoteAPICore {
'return' => 'int',
'doc' => 'Tries to login with the given credentials and sets auth cookies.',
'public' => '1'
+ ), 'dokuwiki.logoff' => array(
+ 'args' => array(),
+ 'return' => 'int',
+ 'doc' => 'Tries to logoff by expiring auth cookies and the associated PHP session.'
), 'dokuwiki.getPagelist' => array(
'args' => array('string', 'array'),
'return' => 'array',
@@ -374,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,
@@ -646,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) {
@@ -672,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'];
@@ -767,6 +774,17 @@ class RemoteAPICore {
return $ok;
}
+ function logoff(){
+ global $conf;
+ global $auth;
+ if(!$conf['useacl']) return 0;
+ if(!$auth) return 0;
+
+ auth_logoff();
+
+ return 1;
+ }
+
private function resolvePageId($id) {
$id = cleanID($id);
if(empty($id)) {
diff --git a/inc/Sitemapper.php b/inc/Sitemapper.php
index bf89a311c..6332746a6 100644
--- a/inc/Sitemapper.php
+++ b/inc/Sitemapper.php
@@ -131,9 +131,9 @@ class Sitemapper {
$encoded_sitemap_url = urlencode(wl('', array('do' => 'sitemap'), true, '&'));
$ping_urls = array(
- 'google' => 'http://www.google.com/webmasters/sitemaps/ping?sitemap='.$encoded_sitemap_url,
- 'yahoo' => 'http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=dokuwiki&url='.$encoded_sitemap_url,
+ 'google' => 'http://www.google.com/webmasters/sitemaps/ping?sitemap='.$encoded_sitemap_url,
'microsoft' => 'http://www.bing.com/webmaster/ping.aspx?siteMap='.$encoded_sitemap_url,
+ 'yandex' => 'http://blogs.yandex.ru/pings/?status=success&url='.$encoded_sitemap_url
);
$data = array('ping_urls' => $ping_urls,
diff --git a/inc/Tar.class.php b/inc/Tar.class.php
index bc87d7d29..903f7f35c 100644
--- a/inc/Tar.class.php
+++ b/inc/Tar.class.php
@@ -114,7 +114,7 @@ class Tar {
$header = $this->parseHeader($read);
if(!is_array($header)) continue;
- $this->skipbytes(ceil($header['size'] / 512) * 512, 1);
+ $this->skipbytes(ceil($header['size'] / 512) * 512);
$result[] = $header;
}
diff --git a/inc/actions.php b/inc/actions.php
index 50cbe369f..ef09a0dc7 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -20,6 +20,7 @@ function act_dispatch(){
global $ID;
global $INFO;
global $QUERY;
+ /* @var Input $INPUT */
global $INPUT;
global $lang;
global $conf;
@@ -94,7 +95,7 @@ function act_dispatch(){
// user profile changes
if (in_array($ACT, array('profile','profile_delete'))) {
- if(!$_SERVER['REMOTE_USER']) {
+ if(!$INPUT->server->str('REMOTE_USER')) {
$ACT = 'login';
} else {
switch ($ACT) {
@@ -190,7 +191,7 @@ function act_dispatch(){
unset($evt);
// when action 'show', the intial not 'show' and POST, do a redirect
- if($ACT == 'show' && $preact != 'show' && strtolower($_SERVER['REQUEST_METHOD']) == 'post'){
+ if($ACT == 'show' && $preact != 'show' && strtolower($INPUT->server->str('REQUEST_METHOD')) == 'post'){
act_redirect($ID,$preact);
}
@@ -414,6 +415,8 @@ function act_revert($act){
global $ID;
global $REV;
global $lang;
+ /* @var Input $INPUT */
+ global $INPUT;
// FIXME $INFO['writable'] currently refers to the attic version
// global $INFO;
// if (!$INFO['writable']) {
@@ -445,7 +448,7 @@ function act_revert($act){
session_write_close();
// when done, show current page
- $_SERVER['REQUEST_METHOD'] = 'post'; //should force a redirect
+ $INPUT->server->set('REQUEST_METHOD','post'); //should force a redirect
$REV = '';
return 'show';
}
@@ -493,17 +496,20 @@ function act_redirect_execute($opts){
function act_auth($act){
global $ID;
global $INFO;
+ /* @var Input $INPUT */
+ global $INPUT;
//already logged in?
- if(isset($_SERVER['REMOTE_USER']) && $act=='login'){
+ if($INPUT->server->has('REMOTE_USER') && $act=='login'){
return 'show';
}
//handle logout
if($act=='logout'){
$lockedby = checklock($ID); //page still locked?
- if($lockedby == $_SERVER['REMOTE_USER'])
+ if($lockedby == $INPUT->server->str('REMOTE_USER')){
unlock($ID); //try to unlock
+ }
// do the logout stuff
auth_logoff();
@@ -697,7 +703,7 @@ function act_sitemap($act) {
// Send file
//use x-sendfile header to pass the delivery to compatible webservers
- if (http_sendfile($sitemap)) exit;
+ http_sendfile($sitemap);
readfile($sitemap);
exit;
@@ -719,10 +725,11 @@ function act_subscription($act){
global $lang;
global $INFO;
global $ID;
+ /* @var Input $INPUT */
global $INPUT;
// subcriptions work for logged in users only
- if(!$_SERVER['REMOTE_USER']) return 'show';
+ if(!$INPUT->server->str('REMOTE_USER')) return 'show';
// get and preprocess data.
$params = array();
@@ -733,7 +740,7 @@ function act_subscription($act){
}
// any action given? if not just return and show the subscription page
- if(!$params['action'] || !checkSecurityToken()) return $act;
+ if(empty($params['action']) || !checkSecurityToken()) return $act;
// Handle POST data, may throw exception.
trigger_event('ACTION_HANDLE_SUBSCRIBE', $params, 'subscription_handle_post');
@@ -745,9 +752,9 @@ function act_subscription($act){
// Perform action.
$sub = new Subscription();
if($action == 'unsubscribe'){
- $ok = $sub->remove($target, $_SERVER['REMOTE_USER'], $style);
+ $ok = $sub->remove($target, $INPUT->server->str('REMOTE_USER'), $style);
}else{
- $ok = $sub->add($target, $_SERVER['REMOTE_USER'], $style);
+ $ok = $sub->add($target, $INPUT->server->str('REMOTE_USER'), $style);
}
if($ok) {
@@ -776,6 +783,8 @@ function act_subscription($act){
function subscription_handle_post(&$params) {
global $INFO;
global $lang;
+ /* @var Input $INPUT */
+ global $INPUT;
// Get and validate parameters.
if (!isset($params['target'])) {
@@ -806,7 +815,7 @@ function subscription_handle_post(&$params) {
}
if ($is === false) {
throw new Exception(sprintf($lang['subscr_not_subscribed'],
- $_SERVER['REMOTE_USER'],
+ $INPUT->server->str('REMOTE_USER'),
prettyprint_id($target)));
}
// subscription_set deletes a subscription if style = null.
diff --git a/inc/auth.php b/inc/auth.php
index b793f5d12..2bdc3eb00 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -131,6 +131,8 @@ function auth_setup() {
function auth_loadACL() {
global $config_cascade;
global $USERINFO;
+ /* @var Input $INPUT */
+ global $INPUT;
if(!is_readable($config_cascade['acl']['default'])) return array();
@@ -145,10 +147,10 @@ function auth_loadACL() {
// substitute user wildcard first (its 1:1)
if(strstr($line, '%USER%')){
// if user is not logged in, this ACL line is meaningless - skip it
- if (!isset($_SERVER['REMOTE_USER'])) continue;
+ if (!$INPUT->server->has('REMOTE_USER')) continue;
- $id = str_replace('%USER%',cleanID($_SERVER['REMOTE_USER']),$id);
- $rest = str_replace('%USER%',auth_nameencode($_SERVER['REMOTE_USER']),$rest);
+ $id = str_replace('%USER%',cleanID($INPUT->server->str('REMOTE_USER')),$id);
+ $rest = str_replace('%USER%',auth_nameencode($INPUT->server->str('REMOTE_USER')),$rest);
}
// substitute group wildcard (its 1:m)
@@ -217,6 +219,8 @@ function auth_login($user, $pass, $sticky = false, $silent = false) {
global $lang;
/* @var DokuWiki_Auth_Plugin $auth */
global $auth;
+ /* @var Input $INPUT */
+ global $INPUT;
$sticky ? $sticky = true : $sticky = false; //sanity check
@@ -226,7 +230,7 @@ function auth_login($user, $pass, $sticky = false, $silent = false) {
//usual login
if($auth->checkPass($user, $pass)) {
// make logininfo globally available
- $_SERVER['REMOTE_USER'] = $user;
+ $INPUT->server->set('REMOTE_USER', $user);
$secret = auth_cookiesalt(!$sticky, true); //bind non-sticky to session
auth_setCookie($user, auth_encrypt($pass, $secret), $sticky);
return true;
@@ -253,7 +257,7 @@ function auth_login($user, $pass, $sticky = false, $silent = false) {
) {
// he has session, cookie and browser right - let him in
- $_SERVER['REMOTE_USER'] = $user;
+ $INPUT->server->set('REMOTE_USER', $user);
$USERINFO = $session['info']; //FIXME move all references to session
return true;
}
@@ -288,7 +292,10 @@ function auth_validateToken($token) {
}
// still here? trust the session data
global $USERINFO;
- $_SERVER['REMOTE_USER'] = $_SESSION[DOKU_COOKIE]['auth']['user'];
+ /* @var Input $INPUT */
+ global $INPUT;
+
+ $INPUT->server->set('REMOTE_USER',$_SESSION[DOKU_COOKIE]['auth']['user']);
$USERINFO = $_SESSION[DOKU_COOKIE]['auth']['info'];
return true;
}
@@ -321,11 +328,14 @@ function auth_createToken() {
* @return string a MD5 sum of various browser headers
*/
function auth_browseruid() {
+ /* @var Input $INPUT */
+ global $INPUT;
+
$ip = clientIP(true);
$uid = '';
- $uid .= $_SERVER['HTTP_USER_AGENT'];
- $uid .= $_SERVER['HTTP_ACCEPT_ENCODING'];
- $uid .= $_SERVER['HTTP_ACCEPT_CHARSET'];
+ $uid .= $INPUT->server->str('HTTP_USER_AGENT');
+ $uid .= $INPUT->server->str('HTTP_ACCEPT_ENCODING');
+ $uid .= $INPUT->server->str('HTTP_ACCEPT_CHARSET');
$uid .= substr($ip, 0, strpos($ip, '.'));
$uid = strtolower($uid);
return md5($uid);
@@ -511,6 +521,8 @@ function auth_logoff($keepbc = false) {
global $USERINFO;
/* @var DokuWiki_Auth_Plugin $auth */
global $auth;
+ /* @var Input $INPUT */
+ global $INPUT;
// make sure the session is writable (it usually is)
@session_start();
@@ -523,16 +535,11 @@ function auth_logoff($keepbc = false) {
unset($_SESSION[DOKU_COOKIE]['auth']['info']);
if(!$keepbc && isset($_SESSION[DOKU_COOKIE]['bc']))
unset($_SESSION[DOKU_COOKIE]['bc']);
- if(isset($_SERVER['REMOTE_USER']))
- unset($_SERVER['REMOTE_USER']);
+ $INPUT->server->remove('REMOTE_USER');
$USERINFO = null; //FIXME
$cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
- if(version_compare(PHP_VERSION, '5.2.0', '>')) {
- setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
- } else {
- setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()));
- }
+ setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
if($auth) $auth->logOff();
}
@@ -557,13 +564,16 @@ function auth_ismanager($user = null, $groups = null, $adminonly = false) {
global $USERINFO;
/* @var DokuWiki_Auth_Plugin $auth */
global $auth;
+ /* @var Input $INPUT */
+ global $INPUT;
+
if(!$auth) return false;
if(is_null($user)) {
- if(!isset($_SERVER['REMOTE_USER'])) {
+ if(!$INPUT->server->has('REMOTE_USER')) {
return false;
} else {
- $user = $_SERVER['REMOTE_USER'];
+ $user = $INPUT->server->str('REMOTE_USER');
}
}
if(is_null($groups)) {
@@ -655,23 +665,47 @@ function auth_isMember($memberlist, $user, array $groups) {
function auth_quickaclcheck($id) {
global $conf;
global $USERINFO;
+ /* @var Input $INPUT */
+ global $INPUT;
# if no ACL is used always return upload rights
if(!$conf['useacl']) return AUTH_UPLOAD;
- return auth_aclcheck($id, $_SERVER['REMOTE_USER'], $USERINFO['grps']);
+ return auth_aclcheck($id, $INPUT->server->str('REMOTE_USER'), $USERINFO['grps']);
}
/**
- * Returns the maximum rights a user has for
- * the given ID or its namespace
+ * Returns the maximum rights a user has for the given ID or its namespace
*
* @author Andreas Gohr <andi@splitbrain.org>
- *
+ * @triggers AUTH_ACL_CHECK
* @param string $id page ID (needs to be resolved and cleaned)
* @param string $user Username
* @param array|null $groups Array of groups the user is in
* @return int permission level
*/
function auth_aclcheck($id, $user, $groups) {
+ $data = array(
+ 'id' => $id,
+ 'user' => $user,
+ 'groups' => $groups
+ );
+
+ return trigger_event('AUTH_ACL_CHECK', $data, 'auth_aclcheck_cb');
+}
+
+/**
+ * default ACL check method
+ *
+ * DO NOT CALL DIRECTLY, use auth_aclcheck() instead
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param array $data event data
+ * @return int permission level
+ */
+function auth_aclcheck_cb($data) {
+ $id =& $data['id'];
+ $user =& $data['user'];
+ $groups =& $data['groups'];
+
global $conf;
global $AUTH_ACL;
/* @var DokuWiki_Auth_Plugin $auth */
@@ -823,6 +857,12 @@ function auth_nameencode($name, $skip_group = false) {
return $cache[$name][$skip_group];
}
+/**
+ * callback encodes the matches
+ *
+ * @param array $matches first complete match, next matching subpatterms
+ * @return string
+ */
function auth_nameencode_callback($matches) {
return '%'.dechex(ord(substr($matches[1],-1)));
}
@@ -1034,18 +1074,18 @@ function updateprofile() {
}
if($conf['profileconfirm']) {
- if(!$auth->checkPass($_SERVER['REMOTE_USER'], $INPUT->post->str('oldpass'))) {
+ if(!$auth->checkPass($INPUT->server->str('REMOTE_USER'), $INPUT->post->str('oldpass'))) {
msg($lang['badpassconfirm'], -1);
return false;
}
}
- if($result = $auth->triggerUserMod('modify', array($_SERVER['REMOTE_USER'], $changes))) {
+ if($result = $auth->triggerUserMod('modify', array($INPUT->server->str('REMOTE_USER'), $changes))) {
// update cookie and session with the changed data
if($changes['pass']) {
list( /*user*/, $sticky, /*pass*/) = auth_getCookie();
$pass = auth_encrypt($changes['pass'], auth_cookiesalt(!$sticky, true));
- auth_setCookie($_SERVER['REMOTE_USER'], $pass, (bool) $sticky);
+ auth_setCookie($INPUT->server->str('REMOTE_USER'), $pass, (bool) $sticky);
}
return true;
}
@@ -1053,6 +1093,11 @@ function updateprofile() {
return false;
}
+/**
+ * Delete the current logged-in user
+ *
+ * @return bool true on success, false on any error
+ */
function auth_deleteprofile(){
global $conf;
global $lang;
@@ -1076,13 +1121,13 @@ function auth_deleteprofile(){
}
if($conf['profileconfirm']) {
- if(!$auth->checkPass($_SERVER['REMOTE_USER'], $INPUT->post->str('oldpass'))) {
+ if(!$auth->checkPass($INPUT->server->str('REMOTE_USER'), $INPUT->post->str('oldpass'))) {
msg($lang['badpassconfirm'], -1);
return false;
}
}
- $deleted[] = $_SERVER['REMOTE_USER'];
+ $deleted[] = $INPUT->server->str('REMOTE_USER');
if($auth->triggerUserMod('delete', array($deleted))) {
// force and immediate logout including removing the sticky cookie
auth_logoff();
@@ -1286,11 +1331,8 @@ function auth_setCookie($user, $pass, $sticky) {
$cookie = base64_encode($user).'|'.((int) $sticky).'|'.base64_encode($pass);
$cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
$time = $sticky ? (time() + 60 * 60 * 24 * 365) : 0; //one year
- if(version_compare(PHP_VERSION, '5.2.0', '>')) {
- setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
- } else {
- setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()));
- }
+ setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
+
// set session
$_SESSION[DOKU_COOKIE]['auth']['user'] = $user;
$_SESSION[DOKU_COOKIE]['auth']['pass'] = sha1($pass);
diff --git a/inc/cache.php b/inc/cache.php
index 5eac94934..7a66049f4 100644
--- a/inc/cache.php
+++ b/inc/cache.php
@@ -8,16 +8,25 @@
if(!defined('DOKU_INC')) die('meh.');
+/**
+ * Generic handling of caching
+ */
class cache {
- var $key = ''; // primary identifier for this item
- var $ext = ''; // file ext for cache data, secondary identifier for this item
- var $cache = ''; // cache file name
- var $depends = array(); // array containing cache dependency information,
- // used by _useCache to determine cache validity
+ public $key = ''; // primary identifier for this item
+ public $ext = ''; // file ext for cache data, secondary identifier for this item
+ public $cache = ''; // cache file name
+ public $depends = array(); // array containing cache dependency information,
+ // used by _useCache to determine cache validity
var $_event = ''; // event to be triggered during useCache
+ var $_time;
+ var $_nocache = false; // if set to true, cache will not be used or stored
- function cache($key,$ext) {
+ /**
+ * @param string $key primary identifier
+ * @param string $ext file extension
+ */
+ public function cache($key,$ext) {
$this->key = $key;
$this->ext = $ext;
$this->cache = getCacheName($key,$ext);
@@ -26,7 +35,7 @@ class cache {
/**
* public method to determine whether the cache can be used
*
- * to assist in cetralisation of event triggering and calculation of cache statistics,
+ * to assist in centralisation of event triggering and calculation of cache statistics,
* don't override this function override _useCache()
*
* @param array $depends array of cache dependencies, support dependecies:
@@ -36,7 +45,7 @@ class cache {
*
* @return bool true if cache can be used, false otherwise
*/
- function useCache($depends=array()) {
+ public function useCache($depends=array()) {
$this->depends = $depends;
$this->_addDependencies();
@@ -55,12 +64,15 @@ class cache {
* age - expire cache if older than age (seconds)
* files - expire cache if any file in this array was updated more recently than the cache
*
+ * Note that this function needs to be public as it is used as callback for the event handler
+ *
* can be overridden
*
* @return bool see useCache()
*/
- function _useCache() {
+ public function _useCache() {
+ if ($this->_nocache) return false; // caching turned off
if (!empty($this->depends['purge'])) return false; // purge requested?
if (!($this->_time = @filemtime($this->cache))) return false; // cache exists?
@@ -83,7 +95,7 @@ class cache {
* it should not remove any existing dependencies and
* it should only overwrite a dependency when the new value is more stringent than the old
*/
- function _addDependencies() {
+ protected function _addDependencies() {
global $INPUT;
if ($INPUT->has('purge')) $this->depends['purge'] = true; // purge requested
}
@@ -94,7 +106,7 @@ class cache {
* @param bool $clean true to clean line endings, false to leave line endings alone
* @return string cache contents
*/
- function retrieveCache($clean=true) {
+ public function retrieveCache($clean=true) {
return io_readFile($this->cache, $clean);
}
@@ -104,14 +116,16 @@ class cache {
* @param string $data the data to be cached
* @return bool true on success, false otherwise
*/
- function storeCache($data) {
+ public function storeCache($data) {
+ if ($this->_nocache) return false;
+
return io_savefile($this->cache, $data);
}
/**
* remove any cached data associated with this cache instance
*/
- function removeCache() {
+ public function removeCache() {
@unlink($this->cache);
}
@@ -122,7 +136,7 @@ class cache {
* @param bool $success result of this cache use attempt
* @return bool pass-thru $success value
*/
- function _stats($success) {
+ protected function _stats($success) {
global $conf;
static $stats = null;
static $file;
@@ -157,14 +171,23 @@ class cache {
}
}
+/**
+ * Parser caching
+ */
class cache_parser extends cache {
- var $file = ''; // source file for cache
- var $mode = ''; // input mode (represents the processing the input file will undergo)
+ public $file = ''; // source file for cache
+ public $mode = ''; // input mode (represents the processing the input file will undergo)
var $_event = 'PARSER_CACHE_USE';
- function cache_parser($id, $file, $mode) {
+ /**
+ *
+ * @param string $id page id
+ * @param string $file source file for cache
+ * @param string $mode input mode
+ */
+ public function cache_parser($id, $file, $mode) {
if ($id) $this->page = $id;
$this->file = $file;
$this->mode = $mode;
@@ -172,24 +195,25 @@ class cache_parser extends cache {
parent::cache($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.$mode);
}
- function _useCache() {
+ /**
+ * method contains cache use decision logic
+ *
+ * @return bool see useCache()
+ */
+ public function _useCache() {
if (!@file_exists($this->file)) return false; // source exists?
return parent::_useCache();
}
- function _addDependencies() {
- global $conf, $config_cascade;
-
- $this->depends['age'] = isset($this->depends['age']) ?
- min($this->depends['age'],$conf['cachetime']) : $conf['cachetime'];
+ protected function _addDependencies() {
// parser cache file dependencies ...
- $files = array($this->file, // ... source
+ $files = array($this->file, // ... source
DOKU_INC.'inc/parser/parser.php', // ... parser
DOKU_INC.'inc/parser/handler.php', // ... handler
);
- $files = array_merge($files, getConfigFiles('main')); // ... wiki settings
+ $files = array_merge($files, getConfigFiles('main')); // ... wiki settings
$this->depends['files'] = !empty($this->depends['files']) ? array_merge($files, $this->depends['files']) : $files;
parent::_addDependencies();
@@ -197,8 +221,17 @@ class cache_parser extends cache {
}
+/**
+ * Caching of data of renderer
+ */
class cache_renderer extends cache_parser {
- function _useCache() {
+
+ /**
+ * method contains cache use decision logic
+ *
+ * @return bool see useCache()
+ */
+ public function _useCache() {
global $conf;
if (!parent::_useCache()) return false;
@@ -231,7 +264,19 @@ class cache_renderer extends cache_parser {
return true;
}
- function _addDependencies() {
+ protected function _addDependencies() {
+ global $conf;
+
+ // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values:
+ // -1 : do not cache (should not be overridden)
+ // 0 : cache never expires (can be overridden) - no need to set depends['age']
+ if ($conf['cachetime'] == -1) {
+ $this->_nocache = true;
+ return;
+ } elseif ($conf['cachetime'] > 0) {
+ $this->depends['age'] = isset($this->depends['age']) ?
+ min($this->depends['age'],$conf['cachetime']) : $conf['cachetime'];
+ }
// renderer cache file dependencies ...
$files = array(
@@ -253,18 +298,39 @@ class cache_renderer extends cache_parser {
}
}
+/**
+ * Caching of parser instructions
+ */
class cache_instructions extends cache_parser {
- function cache_instructions($id, $file) {
+ /**
+ * @param string $id page id
+ * @param string $file source file for cache
+ */
+ public function cache_instructions($id, $file) {
parent::cache_parser($id, $file, 'i');
}
- function retrieveCache($clean=true) {
+ /**
+ * retrieve the cached data
+ *
+ * @param bool $clean true to clean line endings, false to leave line endings alone
+ * @return string cache contents
+ */
+ public function retrieveCache($clean=true) {
$contents = io_readFile($this->cache, false);
return !empty($contents) ? unserialize($contents) : array();
}
- function storeCache($instructions) {
+ /**
+ * cache $instructions
+ *
+ * @param string $instructions the instruction to be cached
+ * @return bool true on success, false otherwise
+ */
+ public function storeCache($instructions) {
+ if ($this->_nocache) return false;
+
return io_savefile($this->cache,serialize($instructions));
}
}
diff --git a/inc/changelog.php b/inc/changelog.php
index 6ff1e0eca..de06c9683 100644
--- a/inc/changelog.php
+++ b/inc/changelog.php
@@ -52,6 +52,8 @@ function parseChangelogLine($line) {
*/
function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null){
global $conf, $INFO;
+ /** @var Input $INPUT */
+ global $INPUT;
// check for special flags as keys
if (!is_array($flags)) { $flags = array(); }
@@ -65,7 +67,7 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr
if(!$date) $date = time(); //use current time if none supplied
$remote = (!$flagExternalEdit)?clientIP(true):'127.0.0.1';
- $user = (!$flagExternalEdit)?$_SERVER['REMOTE_USER']:'';
+ $user = (!$flagExternalEdit)?$INPUT->server->str('REMOTE_USER'):'';
$strip = array("\t", "\n");
$logline = array(
@@ -117,12 +119,14 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr
*/
function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null){
global $conf;
+ /** @var Input $INPUT */
+ global $INPUT;
$id = cleanid($id);
if(!$date) $date = time(); //use current time if none supplied
$remote = clientIP(true);
- $user = $_SERVER['REMOTE_USER'];
+ $user = $INPUT->server->str('REMOTE_USER');
$strip = array("\t", "\n");
$logline = array(
@@ -334,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);
}
/**
@@ -443,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/cliopts.php b/inc/cliopts.php
index 9cea686a2..3eac72e5b 100644
--- a/inc/cliopts.php
+++ b/inc/cliopts.php
@@ -74,9 +74,9 @@ class Doku_Cli_Opts {
/**
* <?php ?>
* @see http://www.sitepoint.com/article/php-command-line-1/3
- * @param string executing file name - this MUST be passed the __FILE__ constant
- * @param string short options
- * @param array (optional) long options
+ * @param string $bin_file executing file name - this MUST be passed the __FILE__ constant
+ * @param string $short_options short options
+ * @param array $long_options (optional) long options
* @return Doku_Cli_Opts_Container or Doku_Cli_Opts_Error
*/
function & getOptions($bin_file, $short_options, $long_options = null) {
@@ -233,12 +233,12 @@ class Doku_Cli_Opts {
* Parse short option
*
* @param string $arg Argument
- * @param string[] $short_options Available short options
+ * @param string $short_options Available short options
* @param string[][] &$opts
* @param string[] &$args
*
* @access private
- * @return void
+ * @return void|Doku_Cli_Opts_Error
*/
function _parseShortOption($arg, $short_options, &$opts, &$args) {
$len = strlen($arg);
@@ -324,7 +324,7 @@ class Doku_Cli_Opts {
* @param string[] &$args
*
* @access private
- * @return void|PEAR_Error
+ * @return void|Doku_Cli_Opts_Error
*/
function _parseLongOption($arg, $long_options, &$opts, &$args) {
@list($opt, $opt_arg) = explode('=', $arg, 2);
@@ -402,7 +402,7 @@ class Doku_Cli_Opts {
* Will take care on register_globals and register_argc_argv ini directives
*
* @access public
- * @return mixed the $argv PHP array or PEAR error if not registered
+ * @return array|Doku_Cli_Opts_Error the $argv PHP array or PEAR error if not registered
*/
function readPHPArgv() {
global $argv;
@@ -421,10 +421,19 @@ class Doku_Cli_Opts {
return $argv;
}
+ /**
+ * @param $code
+ * @param $msg
+ * @return Doku_Cli_Opts_Error
+ */
function raiseError($code, $msg) {
return new Doku_Cli_Opts_Error($code, $msg);
}
+ /**
+ * @param $obj
+ * @return bool
+ */
function isError($obj) {
return is_a($obj, 'Doku_Cli_Opts_Error');
}
diff --git a/inc/common.php b/inc/common.php
index 32771285b..110b91417 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -56,15 +56,18 @@ function stripctl($string) {
* @return string
*/
function getSecurityToken() {
- return PassHash::hmac('md5', session_id().$_SERVER['REMOTE_USER'], auth_cookiesalt());
+ /** @var Input $INPUT */
+ global $INPUT;
+ return PassHash::hmac('md5', session_id().$INPUT->server->str('REMOTE_USER'), auth_cookiesalt());
}
/**
* Check the secret CSRF token
*/
function checkSecurityToken($token = null) {
+ /** @var Input $INPUT */
global $INPUT;
- if(empty($_SERVER['REMOTE_USER'])) return true; // no logged in user, no need for a check
+ if(!$INPUT->server->str('REMOTE_USER')) return true; // no logged in user, no need for a check
if(is_null($token)) $token = $INPUT->str('sectok');
if(getSecurityToken() != $token) {
@@ -93,14 +96,16 @@ function formSecurityToken($print = true) {
*/
function basicinfo($id, $htmlClient=true){
global $USERINFO;
+ /* @var Input $INPUT */
+ global $INPUT;
// set info about manager/admin status.
$info['isadmin'] = false;
$info['ismanager'] = false;
- if(isset($_SERVER['REMOTE_USER'])) {
+ if($INPUT->server->has('REMOTE_USER')) {
$info['userinfo'] = $USERINFO;
$info['perm'] = auth_quickaclcheck($id);
- $info['client'] = $_SERVER['REMOTE_USER'];
+ $info['client'] = $INPUT->server->str('REMOTE_USER');
if($info['perm'] == AUTH_ADMIN) {
$info['isadmin'] = true;
@@ -111,7 +116,7 @@ function basicinfo($id, $htmlClient=true){
// if some outside auth were used only REMOTE_USER is set
if(!$info['userinfo']['name']) {
- $info['userinfo']['name'] = $_SERVER['REMOTE_USER'];
+ $info['userinfo']['name'] = $INPUT->server->str('REMOTE_USER');
}
} else {
@@ -140,6 +145,8 @@ function pageinfo() {
global $REV;
global $RANGE;
global $lang;
+ /* @var Input $INPUT */
+ global $INPUT;
$info = basicinfo($ID);
@@ -148,19 +155,20 @@ function pageinfo() {
$info['id'] = $ID;
$info['rev'] = $REV;
- if(isset($_SERVER['REMOTE_USER'])) {
+ if($INPUT->server->has('REMOTE_USER')) {
$sub = new Subscription();
$info['subscribed'] = $sub->user_subscription();
} else {
$info['subscribed'] = false;
}
- $info['locked'] = checklock($ID);
- $info['filepath'] = fullpath(wikiFN($ID));
- $info['exists'] = @file_exists($info['filepath']);
+ $info['locked'] = checklock($ID);
+ $info['filepath'] = fullpath(wikiFN($ID));
+ $info['exists'] = @file_exists($info['filepath']);
+ $info['currentrev'] = @filemtime($info['filepath']);
if($REV) {
//check if current revision was meant
- if($info['exists'] && (@filemtime($info['filepath']) == $REV)) {
+ if($info['exists'] && ($info['currentrev'] == $REV)) {
$REV = '';
} elseif($RANGE) {
//section editing does not work with old revisions!
@@ -187,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(is_array($info['meta']['last_change'])) {
+ if(!empty($info['meta']['last_change']) && is_array($info['meta']['last_change'])) {
$revinfo = $info['meta']['last_change'];
} else {
- $revinfo = getRevisionInfo($ID, $info['lastmod'], 1024);
+ $revinfo = $pagelog->getRevisionInfo($info['lastmod']);
// cache most recent changelog line in metadata if missing and still valid
if($revinfo !== false) {
$info['meta']['last_change'] = $revinfo;
@@ -355,11 +364,14 @@ function breadcrumbs() {
*/
function idfilter($id, $ue = true) {
global $conf;
+ /* @var Input $INPUT */
+ global $INPUT;
+
if($conf['useslash'] && $conf['userewrite']) {
$id = strtr($id, ':', '/');
} elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' &&
$conf['userewrite'] &&
- strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') === false
+ strpos($INPUT->server->str('SERVER_SOFTWARE'), 'Microsoft-IIS') === false
) {
$id = strtr($id, ':', ';');
}
@@ -587,6 +599,8 @@ function checkwordblock($text = '') {
global $SUM;
global $conf;
global $INFO;
+ /* @var Input $INPUT */
+ global $INPUT;
if(!$conf['usewordblock']) return false;
@@ -619,9 +633,9 @@ function checkwordblock($text = '') {
if(count($re) && preg_match('#('.join('|', $re).')#si', $text, $matches)) {
// prepare event data
$data['matches'] = $matches;
- $data['userinfo']['ip'] = $_SERVER['REMOTE_ADDR'];
- if($_SERVER['REMOTE_USER']) {
- $data['userinfo']['user'] = $_SERVER['REMOTE_USER'];
+ $data['userinfo']['ip'] = $INPUT->server->str('REMOTE_ADDR');
+ if($INPUT->server->str('REMOTE_USER')) {
+ $data['userinfo']['user'] = $INPUT->server->str('REMOTE_USER');
$data['userinfo']['name'] = $INFO['userinfo']['name'];
$data['userinfo']['mail'] = $INFO['userinfo']['mail'];
}
@@ -647,12 +661,17 @@ function checkwordblock($text = '') {
* @return string
*/
function clientIP($single = false) {
+ /* @var Input $INPUT */
+ global $INPUT;
+
$ip = array();
- $ip[] = $_SERVER['REMOTE_ADDR'];
- if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
- $ip = array_merge($ip, explode(',', str_replace(' ', '', $_SERVER['HTTP_X_FORWARDED_FOR'])));
- if(!empty($_SERVER['HTTP_X_REAL_IP']))
- $ip = array_merge($ip, explode(',', str_replace(' ', '', $_SERVER['HTTP_X_REAL_IP'])));
+ $ip[] = $INPUT->server->str('REMOTE_ADDR');
+ if($INPUT->server->str('HTTP_X_FORWARDED_FOR')) {
+ $ip = array_merge($ip, explode(',', str_replace(' ', '', $INPUT->server->str('HTTP_X_FORWARDED_FOR'))));
+ }
+ if($INPUT->server->str('HTTP_X_REAL_IP')) {
+ $ip = array_merge($ip, explode(',', str_replace(' ', '', $INPUT->server->str('HTTP_X_REAL_IP'))));
+ }
// some IPv4/v6 regexps borrowed from Feyd
// see: http://forums.devnetwork.net/viewtopic.php?f=38&t=53479
@@ -711,16 +730,18 @@ function clientIP($single = false) {
* @link http://www.brainhandles.com/2007/10/15/detecting-mobile-browsers/#code
*/
function clientismobile() {
+ /* @var Input $INPUT */
+ global $INPUT;
- if(isset($_SERVER['HTTP_X_WAP_PROFILE'])) return true;
+ if($INPUT->server->has('HTTP_X_WAP_PROFILE')) return true;
- if(preg_match('/wap\.|\.wap/i', $_SERVER['HTTP_ACCEPT'])) return true;
+ if(preg_match('/wap\.|\.wap/i', $INPUT->server->str('HTTP_ACCEPT'))) return true;
- if(!isset($_SERVER['HTTP_USER_AGENT'])) return false;
+ if(!$INPUT->server->has('HTTP_USER_AGENT')) return false;
$uamatches = 'midp|j2me|avantg|docomo|novarra|palmos|palmsource|240x320|opwv|chtml|pda|windows ce|mmp\/|blackberry|mib\/|symbian|wireless|nokia|hand|mobi|phone|cdm|up\.b|audio|SIE\-|SEC\-|samsung|HTC|mot\-|mitsu|sagem|sony|alcatel|lg|erics|vx|NEC|philips|mmm|xx|panasonic|sharp|wap|sch|rover|pocket|benq|java|pt|pg|vox|amoi|bird|compal|kg|voda|sany|kdd|dbt|sendo|sgh|gradi|jb|\d\d\di|moto';
- if(preg_match("/$uamatches/i", $_SERVER['HTTP_USER_AGENT'])) return true;
+ if(preg_match("/$uamatches/i", $INPUT->server->str('HTTP_USER_AGENT'))) return true;
return false;
}
@@ -760,6 +781,9 @@ function gethostsbyaddrs($ips) {
*/
function checklock($id) {
global $conf;
+ /* @var Input $INPUT */
+ global $INPUT;
+
$lock = wikiLockFN($id);
//no lockfile
@@ -772,8 +796,8 @@ function checklock($id) {
}
//my own lock
- list($ip, $session) = explode("\n", io_readFile($lock));
- if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()) {
+ @list($ip, $session) = explode("\n", io_readFile($lock));
+ if($ip == $INPUT->server->str('REMOTE_USER') || $ip == clientIP() || $session == session_id()) {
return false;
}
@@ -787,14 +811,16 @@ function checklock($id) {
*/
function lock($id) {
global $conf;
+ /* @var Input $INPUT */
+ global $INPUT;
if($conf['locktime'] == 0) {
return;
}
$lock = wikiLockFN($id);
- if($_SERVER['REMOTE_USER']) {
- io_saveFile($lock, $_SERVER['REMOTE_USER']);
+ if($INPUT->server->str('REMOTE_USER')) {
+ io_saveFile($lock, $INPUT->server->str('REMOTE_USER'));
} else {
io_saveFile($lock, clientIP()."\n".session_id());
}
@@ -808,10 +834,13 @@ function lock($id) {
* @return bool true if a lock was removed
*/
function unlock($id) {
+ /* @var Input $INPUT */
+ global $INPUT;
+
$lock = wikiLockFN($id);
if(@file_exists($lock)) {
- list($ip, $session) = explode("\n", io_readFile($lock));
- if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()) {
+ @list($ip, $session) = explode("\n", io_readFile($lock));
+ if($ip == $INPUT->server->str('REMOTE_USER') || $ip == clientIP() || $session == session_id()) {
@unlink($lock);
return true;
}
@@ -937,6 +966,8 @@ function parsePageTemplate(&$data) {
global $USERINFO;
global $conf;
+ /* @var Input $INPUT */
+ global $INPUT;
// replace placeholders
$file = noNS($id);
@@ -968,7 +999,7 @@ function parsePageTemplate(&$data) {
utf8_ucfirst($page),
utf8_ucwords($page),
utf8_strtoupper($page),
- $_SERVER['REMOTE_USER'],
+ $INPUT->server->str('REMOTE_USER'),
$USERINFO['name'],
$USERINFO['mail'],
$conf['dformat'],
@@ -1049,6 +1080,9 @@ function saveWikiText($id, $text, $summary, $minor = false) {
global $conf;
global $lang;
global $REV;
+ /* @var Input $INPUT */
+ global $INPUT;
+
// ignore if no changes were made
if($text == rawWiki($id, '')) {
return;
@@ -1059,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
@@ -1111,7 +1146,7 @@ function saveWikiText($id, $text, $summary, $minor = false) {
$type = DOKU_CHANGE_TYPE_CREATE;
} else if($wasRemoved) {
$type = DOKU_CHANGE_TYPE_DELETE;
- } else if($minor && $conf['useacl'] && $_SERVER['REMOTE_USER']) {
+ } else if($minor && $conf['useacl'] && $INPUT->server->str('REMOTE_USER')) {
$type = DOKU_CHANGE_TYPE_MINOR_EDIT;
} //minor edits only for logged in users
@@ -1140,7 +1175,6 @@ function saveWikiText($id, $text, $summary, $minor = false) {
* @author Andreas Gohr <andi@splitbrain.org>
*/
function saveOldRevision($id) {
- global $conf;
$oldf = wikiFN($id);
if(!@file_exists($oldf)) return '';
$date = filemtime($oldf);
@@ -1164,6 +1198,8 @@ function saveOldRevision($id) {
*/
function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = array()) {
global $conf;
+ /* @var Input $INPUT */
+ global $INPUT;
// decide if there is something to do, eg. whom to mail
if($who == 'admin') {
@@ -1172,7 +1208,7 @@ function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace =
$to = $conf['notify'];
} elseif($who == 'subscribers') {
if(!actionOK('subscribe')) return false; //subscribers enabled?
- if($conf['useacl'] && $_SERVER['REMOTE_USER'] && $minor) return false; //skip minors
+ if($conf['useacl'] && $INPUT->server->str('REMOTE_USER') && $minor) return false; //skip minors
$data = array('id' => $id, 'addresslist' => '', 'self' => false);
trigger_event(
'COMMON_NOTIFY_ADDRESSLIST', $data,
@@ -1197,10 +1233,13 @@ function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace =
* @author Todd Augsburger <todd@rollerorgans.com>
*/
function getGoogleQuery() {
- if(!isset($_SERVER['HTTP_REFERER'])) {
+ /* @var Input $INPUT */
+ global $INPUT;
+
+ if(!$INPUT->server->has('HTTP_REFERER')) {
return '';
}
- $url = parse_url($_SERVER['HTTP_REFERER']);
+ $url = parse_url($INPUT->server->str('HTTP_REFERER'));
// only handle common SEs
if(!preg_match('/(google|bing|yahoo|ask|duckduckgo|babylon|aol|yandex)/',$url['host'])) return '';
@@ -1230,8 +1269,9 @@ function getGoogleQuery() {
/**
* Return the human readable size of a file
*
- * @param int $size A file size
- * @param int $dec A number of decimal places
+ * @param int $size A file size
+ * @param int $dec A number of decimal places
+ * @return string human readable size
* @author Martin Benjamin <b.martin@cybernet.ch>
* @author Aidan Lister <aidan@php.net>
* @version 1.0.0
@@ -1362,12 +1402,16 @@ function php_to_byte($v) {
$l = substr($v, -1);
$ret = substr($v, 0, -1);
switch(strtoupper($l)) {
+ /** @noinspection PhpMissingBreakStatementInspection */
case 'P':
$ret *= 1024;
+ /** @noinspection PhpMissingBreakStatementInspection */
case 'T':
$ret *= 1024;
+ /** @noinspection PhpMissingBreakStatementInspection */
case 'G':
$ret *= 1024;
+ /** @noinspection PhpMissingBreakStatementInspection */
case 'M':
$ret *= 1024;
case 'K':
@@ -1415,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>)';
}
- } else {
- return hsc($username);
}
+
+ $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']);
+ }
+ }
+ $evt->advise_after();
+ unset($evt);
+
+ return $data['userlink'];
}
/**
@@ -1518,6 +1660,9 @@ function is_mem_available($mem, $bytes = 1048576) {
* @author Andreas Gohr <andi@splitbrain.org>
*/
function send_redirect($url) {
+ /* @var Input $INPUT */
+ global $INPUT;
+
//are there any undisplayed messages? keep them in session for display
global $MSG;
if(isset($MSG) && count($MSG) && !defined('NOSESSION')) {
@@ -1531,7 +1676,7 @@ function send_redirect($url) {
// work around IE bug
// http://www.ianhoar.com/2008/11/16/internet-explorer-6-and-redirected-anchor-links/
- list($url, $hash) = explode('#', $url);
+ @list($url, $hash) = explode('#', $url);
if($hash) {
if(strpos($url, '?')) {
$url = $url.'&#'.$hash;
@@ -1541,9 +1686,9 @@ function send_redirect($url) {
}
// check if running on IIS < 6 with CGI-PHP
- if(isset($_SERVER['SERVER_SOFTWARE']) && isset($_SERVER['GATEWAY_INTERFACE']) &&
- (strpos($_SERVER['GATEWAY_INTERFACE'], 'CGI') !== false) &&
- (preg_match('|^Microsoft-IIS/(\d)\.\d$|', trim($_SERVER['SERVER_SOFTWARE']), $matches)) &&
+ if($INPUT->server->has('SERVER_SOFTWARE') && $INPUT->server->has('GATEWAY_INTERFACE') &&
+ (strpos($INPUT->server->str('GATEWAY_INTERFACE'), 'CGI') !== false) &&
+ (preg_match('|^Microsoft-IIS/(\d)\.\d$|', trim($INPUT->server->str('SERVER_SOFTWARE')), $matches)) &&
$matches[1] < 6
) {
header('Refresh: 0;url='.$url);
@@ -1630,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/confutils.php b/inc/confutils.php
index 0ac003b72..31371d41f 100644
--- a/inc/confutils.php
+++ b/inc/confutils.php
@@ -237,13 +237,14 @@ function getConfigFiles($type) {
* check if the given action was disabled in config
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $action
* @returns boolean true if enabled, false if disabled
*/
function actionOK($action){
static $disabled = null;
if(is_null($disabled) || defined('SIMPLE_TEST')){
global $conf;
- /** @var auth_basic $auth */
+ /** @var DokuWiki_Auth_Plugin $auth */
global $auth;
// prepare disabled actions array and handle legacy options
diff --git a/inc/events.php b/inc/events.php
index f7b1a7a16..318a7617e 100644
--- a/inc/events.php
+++ b/inc/events.php
@@ -8,15 +8,18 @@
if(!defined('DOKU_INC')) die('meh.');
+/**
+ * The event
+ */
class Doku_Event {
// public properties
- var $name = ''; // READONLY event name, objects must register against this name to see the event
- var $data = null; // READWRITE data relevant to the event, no standardised format (YET!)
- var $result = null; // READWRITE the results of the event action, only relevant in "_AFTER" advise
+ public $name = ''; // READONLY event name, objects must register against this name to see the event
+ public $data = null; // READWRITE data relevant to the event, no standardised format (YET!)
+ public $result = null; // READWRITE the results of the event action, only relevant in "_AFTER" advise
// event handlers may modify this if they are preventing the default action
// to provide the after event handlers with event results
- var $canPreventDefault = true; // READONLY if true, event handlers can prevent the events default action
+ public $canPreventDefault = true; // READONLY if true, event handlers can prevent the events default action
// private properties, event handlers can effect these through the provided methods
var $_default = true; // whether or not to carry out the default action associated with the event
@@ -33,6 +36,13 @@ class Doku_Event {
}
/**
+ * @return string
+ */
+ function __toString() {
+ return $this->name;
+ }
+
+ /**
* advise functions
*
* advise all registered handlers of this event
@@ -47,7 +57,8 @@ class Doku_Event {
* $evt->advise_after();
* unset($evt);
*
- * @return results of processing the event, usually $this->_default
+ * @param bool $enablePreventDefault
+ * @return bool results of processing the event, usually $this->_default
*/
function advise_before($enablePreventDefault=true) {
global $EVENT_HANDLER;
@@ -73,14 +84,21 @@ class Doku_Event {
* $this->_default, all of which may have been modified by the event handlers.
* - advise all registered (<event>_AFTER) handlers that the event has taken place
*
- * @return $event->results
+ * @param null|callable $action
+ * @param bool $enablePrevent
+ * @return mixed $event->results
* the value set by any <event>_before or <event> handlers if the default action is prevented
* or the results of the default action (as modified by <event>_after handlers)
* or NULL no action took place and no handler modified the value
*/
function trigger($action=null, $enablePrevent=true) {
- if (!is_callable($action)) $enablePrevent = false;
+ if (!is_callable($action)) {
+ $enablePrevent = false;
+ if (!is_null($action)) {
+ trigger_error('The default action of '.$this.' is not null but also not callable. Maybe the method is not public?', E_USER_WARNING);
+ }
+ }
if ($this->advise_before($enablePrevent) && is_callable($action)) {
if (is_array($action)) {
@@ -112,12 +130,15 @@ class Doku_Event {
function preventDefault() { $this->_default = false; }
}
+/**
+ * Controls the registration and execution of all events,
+ */
class Doku_Event_Handler {
// public properties: none
// private properties
- var $_hooks = array(); // array of events and their registered handlers
+ protected $_hooks = array(); // array of events and their registered handlers
/**
* event_handler
@@ -128,6 +149,7 @@ class Doku_Event_Handler {
function Doku_Event_Handler() {
// load action plugins
+ /** @var DokuWiki_Action_Plugin $plugin */
$plugin = null;
$pluginlist = plugin_list('action');
@@ -143,34 +165,47 @@ class Doku_Event_Handler {
*
* register a hook for an event
*
- * @param $event (string) name used by the event, (incl '_before' or '_after' for triggers)
- * @param $obj (obj) object in whose scope method is to be executed,
+ * @param $event string name used by the event, (incl '_before' or '_after' for triggers)
+ * @param $advise string
+ * @param $obj object object in whose scope method is to be executed,
* if NULL, method is assumed to be a globally available function
- * @param $method (function) event handler function
- * @param $param (mixed) data passed to the event handler
+ * @param $method string event handler function
+ * @param $param mixed data passed to the event handler
+ * @param $seq int sequence number for ordering hook execution (ascending)
*/
- function register_hook($event, $advise, $obj, $method, $param=null) {
- $this->_hooks[$event.'_'.$advise][] = array($obj, $method, $param);
+ function register_hook($event, $advise, $obj, $method, $param=null, $seq=0) {
+ $seq = (int)$seq;
+ $doSort = !isset($this->_hooks[$event.'_'.$advise][$seq]);
+ $this->_hooks[$event.'_'.$advise][$seq][] = array($obj, $method, $param);
+
+ if ($doSort) {
+ ksort($this->_hooks[$event.'_'.$advise]);
+ }
}
- function process_event(&$event,$advise='') {
+ /**
+ * process the before/after event
+ *
+ * @param Doku_Event $event
+ * @param string $advise BEFORE or AFTER
+ */
+ function process_event($event,$advise='') {
$evt_name = $event->name . ($advise ? '_'.$advise : '_BEFORE');
if (!empty($this->_hooks[$evt_name])) {
- foreach ($this->_hooks[$evt_name] as $hook) {
- // list($obj, $method, $param) = $hook;
- $obj =& $hook[0];
- $method = $hook[1];
- $param = $hook[2];
-
- if (is_null($obj)) {
- $method($event, $param);
- } else {
- $obj->$method($event, $param);
- }
+ foreach ($this->_hooks[$evt_name] as $sequenced_hooks) {
+ foreach ($sequenced_hooks as $hook) {
+ list($obj, $method, $param) = $hook;
- if (!$event->_continue) break;
+ if (is_null($obj)) {
+ $method($event, $param);
+ } else {
+ $obj->$method($event, $param);
+ }
+
+ if (!$event->_continue) return;
+ }
}
}
}
@@ -181,12 +216,12 @@ class Doku_Event_Handler {
*
* function wrapper to process (create, trigger and destroy) an event
*
- * @param $name (string) name for the event
- * @param $data (mixed) event data
- * @param $action (callback) (optional, default=NULL) default action, a php callback function
- * @param $canPreventDefault (bool) (optional, default=true) can hooks prevent the default action
+ * @param $name string name for the event
+ * @param $data mixed event data
+ * @param $action callback (optional, default=NULL) default action, a php callback function
+ * @param $canPreventDefault bool (optional, default=true) can hooks prevent the default action
*
- * @return (mixed) the event results value after all event processing is complete
+ * @return mixed the event results value after all event processing is complete
* by default this is the return value of the default action however
* it can be set or modified by event handler hooks
*/
diff --git a/inc/feedcreator.class.php b/inc/feedcreator.class.php
index 670a1bc29..b90da5724 100644
--- a/inc/feedcreator.class.php
+++ b/inc/feedcreator.class.php
@@ -185,6 +185,8 @@ class HtmlDescribable {
*/
var $descriptionTruncSize;
+ var $description;
+
/**
* Returns a formatted description field, depending on descriptionHtmlSyndicated and
* $descriptionTruncSize properties
@@ -222,7 +224,7 @@ class FeedHtmlField {
/**
* Creates a new instance of FeedHtmlField.
- * @param $string: if given, sets the rawFieldContent property
+ * @param string $parFieldContent: if given, sets the rawFieldContent property
*/
function FeedHtmlField($parFieldContent) {
if ($parFieldContent) {
@@ -267,8 +269,14 @@ class FeedHtmlField {
* @author Kai Blankenhorn <kaib@bitfolge.de>
*/
class UniversalFeedCreator extends FeedCreator {
+ /** @var FeedCreator */
var $_feed;
+ /**
+ * Sets format
+ *
+ * @param string $format
+ */
function _setFormat($format) {
switch (strtoupper($format)) {
@@ -344,7 +352,7 @@ class UniversalFeedCreator extends FeedCreator {
* Creates a syndication feed based on the items previously added.
*
* @see FeedCreator::addItem()
- * @param string format format the feed should comply to. Valid values are:
+ * @param string $format format the feed should comply to. Valid values are:
* "PIE0.1", "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3", "HTML", "JS"
* @return string the contents of the feed.
*/
@@ -358,10 +366,10 @@ class UniversalFeedCreator extends FeedCreator {
* header may be sent to redirect the use to the newly created file.
* @since 1.4
*
- * @param string format format the feed should comply to. Valid values are:
+ * @param string $format format the feed should comply to. Valid values are:
* "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM", "ATOM0.3", "HTML", "JS"
- * @param string filename optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
- * @param boolean displayContents optional send the content of the file or not. If true, the file will be sent in the body of the response.
+ * @param string $filename optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+ * @param boolean $displayContents optional send the content of the file or not. If true, the file will be sent in the body of the response.
*/
function saveFeed($format="RSS0.91", $filename="", $displayContents=true) {
$this->_setFormat($format);
@@ -376,10 +384,10 @@ class UniversalFeedCreator extends FeedCreator {
* before anything else, especially before you do the time consuming task to build the feed
* (web fetching, for example).
*
- * @param string format format the feed should comply to. Valid values are:
+ * @param string $format format the feed should comply to. Valid values are:
* "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3".
- * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
- * @param timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
+ * @param string $filename optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+ * @param int $timeout optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
*/
function useCached($format="RSS0.91", $filename="", $timeout=3600) {
$this->_setFormat($format);
@@ -390,7 +398,7 @@ class UniversalFeedCreator extends FeedCreator {
/**
* Outputs feed to the browser - needed for on-the-fly feed generation (like it is done in WordPress, etc.)
*
- * @param format string format the feed should comply to. Valid values are:
+ * @param $format string format the feed should comply to. Valid values are:
* "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3".
*/
function outputFeed($format='RSS0.91') {
@@ -422,7 +430,13 @@ class FeedCreator extends HtmlDescribable {
/**
* Optional attributes of a feed.
*/
- var $syndicationURL, $image, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays;
+ var $syndicationURL, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays;
+ /**
+ * Optional attribute of a feed
+ *
+ * @var FeedImage
+ */
+ var $image = null;
/**
* The url of the external xsl stylesheet used to format the naked rss feed.
@@ -430,13 +444,18 @@ class FeedCreator extends HtmlDescribable {
*/
var $xslStyleSheet = "";
+ /**
+ * Style sheet for rss feed
+ */
+ var $cssStyleSheet = "";
+
/**
* @access private
+ * @var FeedItem[]
*/
var $items = Array();
-
/**
* This feed's MIME content type.
* @since 1.4
@@ -466,7 +485,7 @@ class FeedCreator extends HtmlDescribable {
/**
* Adds an FeedItem to the feed.
*
- * @param object FeedItem $item The FeedItem to add to the feed.
+ * @param FeedItem $item The FeedItem to add to the feed.
* @access public
*/
function addItem($item) {
@@ -482,8 +501,8 @@ class FeedCreator extends HtmlDescribable {
* If the string is already shorter than $length, it is returned unchanged.
*
* @static
- * @param string string A string to be truncated.
- * @param int length the maximum length the string should be truncated to
+ * @param string $string A string to be truncated.
+ * @param int $length the maximum length the string should be truncated to
* @return string the truncated string
*/
function iTrunc($string, $length) {
@@ -527,8 +546,8 @@ class FeedCreator extends HtmlDescribable {
/**
* Creates a string containing all additional elements specified in
* $additionalElements.
- * @param elements array an associative array containing key => value pairs
- * @param indentString string a string that will be inserted before every generated line
+ * @param $elements array an associative array containing key => value pairs
+ * @param $indentString string a string that will be inserted before every generated line
* @return string the XML tags corresponding to $additionalElements
*/
function _createAdditionalElements($elements, $indentString="") {
@@ -541,6 +560,9 @@ class FeedCreator extends HtmlDescribable {
return $ae;
}
+ /**
+ * Create elements for stylesheets
+ */
function _createStylesheetReferences() {
$xml = "";
if ($this->cssStyleSheet) $xml .= "<?xml-stylesheet href=\"".$this->cssStyleSheet."\" type=\"text/css\"?>\n";
@@ -610,8 +632,8 @@ class FeedCreator extends HtmlDescribable {
* before anything else, especially before you do the time consuming task to build the feed
* (web fetching, for example).
* @since 1.4
- * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
- * @param timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
+ * @param $filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+ * @param $timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
*/
function useCached($filename="", $timeout=3600) {
$this->_timeout = $timeout;
@@ -629,8 +651,8 @@ class FeedCreator extends HtmlDescribable {
* header may be sent to redirect the user to the newly created file.
* @since 1.4
*
- * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
- * @param redirect boolean optional send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file.
+ * @param $filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+ * @param $displayContents boolean optional send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file.
*/
function saveFeed($filename="", $displayContents=true) {
if ($filename=="") {
@@ -667,6 +689,7 @@ class FeedCreator extends HtmlDescribable {
* Usually, you won't need to use this.
*/
class FeedDate {
+ /** @var int */
var $unix;
/**
@@ -726,7 +749,7 @@ class FeedDate {
/**
* Gets the date stored in this FeedDate as an RFC 822 date.
*
- * @return a date in RFC 822 format
+ * @return string a date in RFC 822 format
*/
function rfc822() {
//return gmdate("r",$this->unix);
@@ -738,7 +761,7 @@ class FeedDate {
/**
* Gets the date stored in this FeedDate as an ISO 8601 date.
*
- * @return a date in ISO 8601 (RFC 3339) format
+ * @return string a date in ISO 8601 (RFC 3339) format
*/
function iso8601() {
$date = gmdate("Y-m-d\TH:i:sO",$this->unix);
@@ -751,7 +774,7 @@ class FeedDate {
/**
* Gets the date stored in this FeedDate as unix time stamp.
*
- * @return a date as a unix time stamp
+ * @return int a date as a unix time stamp
*/
function unix() {
return $this->unix;
@@ -777,7 +800,7 @@ class RSSCreator10 extends FeedCreator {
$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
$feed.= $this->_createGeneratorComment();
if ($this->cssStyleSheet=="") {
- $cssStyleSheet = "http://www.w3.org/2000/08/w3c-synd/style.css";
+ $this->cssStyleSheet = "http://www.w3.org/2000/08/w3c-synd/style.css";
}
$feed.= $this->_createStylesheetReferences();
$feed.= "<rdf:RDF\n";
@@ -1032,12 +1055,16 @@ class PIECreator01 extends FeedCreator {
$this->encoding = "utf-8";
}
+ /**
+ * Build content
+ * @return string
+ */
function createFeed() {
$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
$feed.= $this->_createStylesheetReferences();
$feed.= "<feed version=\"0.1\" xmlns=\"http://example.com/newformat#\">\n";
$feed.= " <title>".FeedCreator::iTrunc(htmlspecialchars($this->title),100)."</title>\n";
- $this->truncSize = 500;
+ $this->descriptionTruncSize = 500;
$feed.= " <subtitle>".$this->getDescription()."</subtitle>\n";
$feed.= " <link>".$this->link."</link>\n";
$icnt = count($this->items);
@@ -1091,6 +1118,10 @@ class AtomCreator10 extends FeedCreator {
$this->encoding = "utf-8";
}
+ /**
+ * Build content
+ * @return string
+ */
function createFeed() {
$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
$feed.= $this->_createGeneratorComment();
@@ -1174,6 +1205,10 @@ class AtomCreator03 extends FeedCreator {
$this->encoding = "utf-8";
}
+ /**
+ * Build content
+ * @return string
+ */
function createFeed() {
$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
$feed.= $this->_createGeneratorComment();
@@ -1281,6 +1316,7 @@ class MBOXCreator extends FeedCreator {
*/
function createFeed() {
$icnt = count($this->items);
+ $feed = "";
for ($i=0; $i<$icnt; $i++) {
if ($this->items[$i]->author!="") {
$from = $this->items[$i]->author;
@@ -1331,6 +1367,10 @@ class OPMLCreator extends FeedCreator {
$this->encoding = "utf-8";
}
+ /**
+ * Build content
+ * @return string
+ */
function createFeed() {
$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
$feed.= $this->_createGeneratorComment();
@@ -1441,6 +1481,7 @@ class HTMLCreator extends FeedCreator {
}
//set an openInNewWindow_token_to be inserted or not
+ $targetInsert = "";
if ($this->openInNewWindow) {
$targetInsert = " target='_blank'";
}
@@ -1568,6 +1609,14 @@ class JSCreator extends HTMLCreator {
* @author Andreas Gohr <andi@splitbrain.org>
*/
class DokuWikiFeedCreator extends UniversalFeedCreator{
+
+ /**
+ * Build content
+ *
+ * @param string $format
+ * @param string $encoding
+ * @return string
+ */
function createFeed($format = "RSS0.91",$encoding='iso-8859-15') {
$this->_setFormat($format);
$this->_feed->encoding = $encoding;
diff --git a/inc/fetch.functions.php b/inc/fetch.functions.php
index 207ad9e5f..c61c54503 100644
--- a/inc/fetch.functions.php
+++ b/inc/fetch.functions.php
@@ -15,13 +15,15 @@
*
* @author Andreas Gohr <andi@splitbrain.org>
* @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Gerry Weissbach <dokuwiki@gammaproduction.de>
* @param string $file local file to send
* @param string $mime mime type of the file
* @param bool $dl set to true to force a browser download
* @param int $cache remaining cache time in seconds (-1 for $conf['cache'], 0 for no-cache)
* @param bool $public is this a public ressource or a private one?
+ * @param string $orig original file to send - the file name will be used for the Content-Disposition
*/
-function sendFile($file, $mime, $dl, $cache, $public = false) {
+function sendFile($file, $mime, $dl, $cache, $public = false, $orig = null) {
global $conf;
// send mime headers
header("Content-Type: $mime");
@@ -62,15 +64,20 @@ function sendFile($file, $mime, $dl, $cache, $public = false) {
$fmtime = @filemtime($file);
http_conditionalRequest($fmtime);
+ // Use the current $file if is $orig is not set.
+ if ( $orig == null ) {
+ $orig = $file;
+ }
+
//download or display?
if($dl) {
- header('Content-Disposition: attachment; filename="'.utf8_basename($file).'";');
+ header('Content-Disposition: attachment; filename="'.utf8_basename($orig).'";');
} else {
- header('Content-Disposition: inline; filename="'.utf8_basename($file).'";');
+ header('Content-Disposition: inline; filename="'.utf8_basename($orig).'";');
}
//use x-sendfile header to pass the delivery to compatible webservers
- if(http_sendfile($file)) exit;
+ http_sendfile($file);
// send file contents
$fp = @fopen($file, "rb");
diff --git a/inc/form.php b/inc/form.php
index a4cd2e682..9cd0491e0 100644
--- a/inc/form.php
+++ b/inc/form.php
@@ -47,15 +47,11 @@ class Doku_Form {
* with up to four parameters is deprecated, instead the first parameter
* should be an array with parameters.
*
- * @param mixed $params Parameters for the HTML form element; Using the
- * deprecated calling convention this is the ID
- * attribute of the form
- * @param string $action (optional, deprecated) submit URL, defaults to
- * current page
- * @param string $method (optional, deprecated) 'POST' or 'GET', default
- * is POST
- * @param string $enctype (optional, deprecated) Encoding type of the
- * data
+ * @param mixed $params Parameters for the HTML form element; Using the deprecated
+ * calling convention this is the ID attribute of the form
+ * @param bool|string $action (optional, deprecated) submit URL, defaults to current page
+ * @param bool|string $method (optional, deprecated) 'POST' or 'GET', default is POST
+ * @param bool|string $enctype (optional, deprecated) Encoding type of the data
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function Doku_Form($params, $action=false, $method=false, $enctype=false) {
@@ -176,7 +172,7 @@ class Doku_Form {
* Gets the position of the first of a type of element.
*
* @param string $type Element type to look for.
- * @return array pseudo-element if found, false otherwise
+ * @return int position of element if found, otherwise false
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function findElementByType($type) {
@@ -193,7 +189,7 @@ class Doku_Form {
* Gets the position of the element with an ID attribute.
*
* @param string $id ID of the element to find.
- * @return array pseudo-element if found, false otherwise
+ * @return int position of element if found, otherwise false
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function findElementById($id) {
@@ -211,7 +207,7 @@ class Doku_Form {
*
* @param string $name Attribute name.
* @param string $value Attribute value.
- * @return array pseudo-element if found, false otherwise
+ * @return int position of element if found, otherwise false
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function findElementByAttribute($name, $value) {
@@ -230,7 +226,7 @@ class Doku_Form {
* first (underflow) or last (overflow) element.
*
* @param int $pos 0-based index
- * @return arrayreference pseudo-element
+ * @return array reference pseudo-element
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function &getElementAt($pos) {
@@ -565,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) {
@@ -576,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,
@@ -934,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/fulltext.php b/inc/fulltext.php
index bd8e6b866..dd918f214 100644
--- a/inc/fulltext.php
+++ b/inc/fulltext.php
@@ -72,8 +72,20 @@ function _ft_pageSearch(&$data) {
$pages = end($stack);
$pages_matched = array();
foreach(array_keys($pages) as $id){
- $text = utf8_strtolower(rawWiki($id));
- if (strpos($text, $phrase) !== false) {
+ $evdata = array(
+ 'id' => $id,
+ 'phrase' => $phrase,
+ 'text' => rawWiki($id)
+ );
+ $evt = new Doku_Event('FULLTEXT_PHRASE_MATCH',$evdata);
+ if ($evt->advise_before() && $evt->result !== true) {
+ $text = utf8_strtolower($evdata['text']);
+ if (strpos($text, $phrase) !== false) {
+ $evt->result = true;
+ }
+ }
+ $evt->advise_after();
+ if ($evt->result === true) {
$pages_matched[$id] = 0; // phrase: always 0 hit
}
}
@@ -333,7 +345,7 @@ function ft_snippet($id,$highlight){
$pre = min($pre,100-$post);
} else if ($post>50) {
$post = min($post, 100-$pre);
- } else {
+ } else if ($offset == 0) {
// both are less than 50, means the context is the whole string
// make it so and break out of this loop - there is no need for the
// complex snippet calculations
@@ -354,12 +366,12 @@ function ft_snippet($id,$highlight){
}
// set $offset for next match attempt
- // substract strlen to avoid splitting a potential search success,
- // this is an approximation as the search pattern may match strings
- // of varying length and it will fail if the context snippet
- // boundary breaks a matching string longer than the current match
- $utf8_offset = $utf8_idx + $post;
- $offset = $idx + strlen(utf8_substr($text,$utf8_idx,$post));
+ // continue matching after the current match
+ // if the current match is not the longest possible match starting at the current offset
+ // this prevents further matching of this snippet but for possible matches of length
+ // smaller than match length + context (at least 50 characters) this match is part of the context
+ $utf8_offset = $utf8_idx + $utf8_len;
+ $offset = $idx + strlen(utf8_substr($text,$utf8_idx,$utf8_len));
$offset = utf8_correctIdx($text,$offset);
}
diff --git a/inc/html.php b/inc/html.php
index 7f473cdb6..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');
@@ -64,6 +65,20 @@ function html_login(){
print '</div>'.NL;
}
+
+/**
+ * Denied page content
+ *
+ * @return string html
+ */
+function html_denied() {
+ print p_locale_xhtml('denied');
+
+ if(!$_SERVER['REMOTE_USER']){
+ html_login();
+ }
+}
+
/**
* inserts section edit buttons if wanted or removes the markers
*
@@ -414,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']) {
@@ -486,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'));
@@ -509,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)
@@ -691,7 +711,7 @@ function html_recent($first=0, $show_changes='both'){
$form->addElement(form_makeOpenTag('div', array('class' => 'li')));
- if ($recent['media']) {
+ if (!empty($recent['media'])) {
$form->addElement(media_printicon($recent['id']));
} else {
$icon = DOKU_BASE.'lib/images/fileicons/file.png';
@@ -705,7 +725,7 @@ function html_recent($first=0, $show_changes='both'){
$diff = false;
$href = '';
- if ($recent['media']) {
+ if (!empty($recent['media'])) {
$diff = (count(getRevisions($recent['id'], 0, 1, 8192, true)) && @file_exists(mediaFN($recent['id'])));
if ($diff) {
$href = media_managerURL(array('tab_details' => 'history',
@@ -715,7 +735,7 @@ function html_recent($first=0, $show_changes='both'){
$href = wl($recent['id'],"do=diff", false, '&');
}
- if ($recent['media'] && !$diff) {
+ if (!empty($recent['media']) && !$diff) {
$form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />');
} else {
$form->addElement(form_makeOpenTag('a', array('class' => 'diff_link', 'href' => $href)));
@@ -729,7 +749,7 @@ function html_recent($first=0, $show_changes='both'){
$form->addElement(form_makeCloseTag('a'));
}
- if ($recent['media']) {
+ if (!empty($recent['media'])) {
$href = media_managerURL(array('tab_details' => 'history',
'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&');
} else {
@@ -745,7 +765,7 @@ function html_recent($first=0, $show_changes='both'){
)));
$form->addElement(form_makeCloseTag('a'));
- if ($recent['media']) {
+ if (!empty($recent['media'])) {
$href = media_managerURL(array('tab_details' => 'view', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&');
$class = (file_exists(mediaFN($recent['id']))) ? 'wikilink1' : $class = 'wikilink2';
$form->addElement(form_makeOpenTag('a', array('class' => $class, 'href' => $href)));
@@ -1008,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>';
@@ -1029,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>';
@@ -1045,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>';
@@ -1069,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,
- '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
@@ -1232,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];
@@ -1343,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');
@@ -1517,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;
@@ -1559,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;
@@ -1634,6 +1890,17 @@ function html_debug(){
print_r($inis);
print '</pre>';
+ if (function_exists('apache_get_version')) {
+ $apache['version'] = apache_get_version();
+
+ if (function_exists('apache_get_modules')) {
+ $apache['modules'] = apache_get_modules();
+ }
+ print '<b>Apache</b><pre>';
+ print_r($apache);
+ print '</pre>';
+ }
+
print '</body></html>';
}
@@ -1698,12 +1965,12 @@ function html_admin(){
}
unset($menu['acl']);
- if($menu['plugin']){
+ if($menu['extension']){
ptln(' <li class="admin_plugin"><div class="li">'.
- '<a href="'.wl($ID, array('do' => 'admin','page' => 'plugin')).'">'.
- $menu['plugin']['prompt'].'</a></div></li>');
+ '<a href="'.wl($ID, array('do' => 'admin','page' => 'extension')).'">'.
+ $menu['extension']['prompt'].'</a></div></li>');
}
- unset($menu['plugin']);
+ unset($menu['extension']);
if($menu['config']){
ptln(' <li class="admin_config"><div class="li">'.
diff --git a/inc/httputils.php b/inc/httputils.php
index ca60ed509..efeb2a56c 100644
--- a/inc/httputils.php
+++ b/inc/httputils.php
@@ -64,12 +64,13 @@ function http_conditionalRequest($timestamp){
* Let the webserver send the given file via x-sendfile method
*
* @author Chris Smith <chris@jalakai.co.uk>
- * @returns void or exits with previously header() commands executed
+ * @param string $file absolute path of file to send
+ * @returns void or exits with previous header() commands executed
*/
function http_sendfile($file) {
global $conf;
- //use x-sendfile header to pass the delivery to compatible webservers
+ //use x-sendfile header to pass the delivery to compatible web servers
if($conf['xsendfile'] == 1){
header("X-LIGHTTPD-send-file: $file");
ob_end_clean();
@@ -79,12 +80,12 @@ function http_sendfile($file) {
ob_end_clean();
exit;
}elseif($conf['xsendfile'] == 3){
+ // FS#2388 nginx just needs the relative path.
+ $file = DOKU_REL.substr($file, strlen(fullpath(DOKU_INC)) + 1);
header("X-Accel-Redirect: $file");
ob_end_clean();
exit;
}
-
- return false;
}
/**
@@ -92,7 +93,7 @@ function http_sendfile($file) {
*
* This function exits the running script
*
- * @param ressource $fh - file handle for an already open file
+ * @param resource $fh - file handle for an already open file
* @param int $size - size of the whole file
* @param int $mime - MIME type of the file
*
@@ -204,7 +205,7 @@ function http_gzip_valid($uncompressed_file) {
*
* This function handles output of cacheable resource files. It ses the needed
* HTTP headers. If a useable cache is present, it is passed to the web server
- * and the scrpt is terminated.
+ * and the script is terminated.
*/
function http_cached($cache, $cache_ok) {
global $conf;
@@ -223,7 +224,8 @@ function http_cached($cache, $cache_ok) {
header('Content-Encoding: gzip');
readfile($cache.".gz");
} else {
- if (!http_sendfile($cache)) readfile($cache);
+ http_sendfile($cache);
+ readfile($cache);
}
exit;
}
diff --git a/inc/indexer.php b/inc/indexer.php
index 658fb966b..5ca2f0bb1 100644
--- a/inc/indexer.php
+++ b/inc/indexer.php
@@ -10,7 +10,7 @@
if(!defined('DOKU_INC')) die('meh.');
// Version tag used to force rebuild on upgrade
-define('INDEXER_VERSION', 7);
+define('INDEXER_VERSION', 8);
// set the minimum token length to use in the index (note, this doesn't apply to numeric tokens)
if (!defined('IDX_MINWORDLENGTH')) define('IDX_MINWORDLENGTH',2);
@@ -215,6 +215,7 @@ class Doku_Indexer {
foreach (array_keys($words) as $wlen) {
$word_idx = $this->getIndex('w', $wlen);
foreach ($words[$wlen] as $word => $freq) {
+ $word = (string)$word;
$wid = array_search($word, $word_idx, true);
if ($wid === false) {
$wid = count($word_idx);
@@ -269,8 +270,9 @@ class Doku_Indexer {
// Special handling for titles so the index file is simpler
if (array_key_exists('title', $key)) {
$value = $key['title'];
- if (is_array($value))
+ if (is_array($value)) {
$value = $value[0];
+ }
$this->saveIndexKey('title', '', $pid, $value);
unset($key['title']);
}
@@ -298,20 +300,24 @@ class Doku_Indexer {
if ($val !== "") {
$id = array_search($val, $metawords, true);
if ($id === false) {
+ // didn't find $val, so we'll add it to the end of metawords and create a placeholder in metaidx
$id = count($metawords);
$metawords[$id] = $val;
+ $metaidx[$id] = '';
$addwords = true;
}
// test if value is already in the index
- if (isset($val_idx[$id]) && $val_idx[$id] <= 0)
+ if (isset($val_idx[$id]) && $val_idx[$id] <= 0){
$val_idx[$id] = 0;
- else // else add it
+ } else { // else add it
$val_idx[$id] = 1;
+ }
}
}
- if ($addwords)
+ if ($addwords) {
$this->saveIndex($metaname.'_w', '', $metawords);
+ }
$vals_changed = false;
foreach ($val_idx as $id => $action) {
if ($action == -1) {
@@ -1212,17 +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);
- $newLine = trim($newLine, ':');
+ if ($line != ''){
+ $line = preg_replace('/(^|:)'.preg_quote($id,'/').'\*\d*/', '', $line);
+ }
+ $line = trim($line, ':');
if ($count) {
- if (strlen($newLine) > 0)
- return "$id*$count:".$newLine;
- else
- return "$id*$count".$newLine;
+ if ($line) {
+ return "$id*$count:".$line;
+ } else {
+ return "$id*$count";
+ }
}
- return $newLine;
+ return $line;
}
/**
diff --git a/inc/infoutils.php b/inc/infoutils.php
index 7358955a0..0992040d9 100644
--- a/inc/infoutils.php
+++ b/inc/infoutils.php
@@ -102,15 +102,21 @@ function getVersion(){
function check(){
global $conf;
global $INFO;
+ /* @var Input $INPUT */
+ global $INPUT;
if ($INFO['isadmin'] || $INFO['ismanager']){
msg('DokuWiki version: '.getVersion(),1);
- }
- if(version_compare(phpversion(),'5.2.0','<')){
- msg('Your PHP version is too old ('.phpversion().' vs. 5.2.0+ needed)',-1);
- }else{
- msg('PHP version '.phpversion(),1);
+ if(version_compare(phpversion(),'5.2.0','<')){
+ msg('Your PHP version is too old ('.phpversion().' vs. 5.2.0+ needed)',-1);
+ }else{
+ msg('PHP version '.phpversion(),1);
+ }
+ } else {
+ if(version_compare(phpversion(),'5.2.0','<')){
+ msg('Your PHP version is too old',-1);
+ }
}
$mem = (int) php_to_byte(ini_get('memory_limit'));
@@ -200,7 +206,7 @@ function check(){
}
if($INFO['userinfo']['name']){
- msg('You are currently logged in as '.$_SERVER['REMOTE_USER'].' ('.$INFO['userinfo']['name'].')',0);
+ msg('You are currently logged in as '.$INPUT->server->str('REMOTE_USER').' ('.$INFO['userinfo']['name'].')',0);
msg('You are part of the groups '.join($INFO['userinfo']['grps'],', '),0);
}else{
msg('You are currently not logged in',0);
@@ -357,6 +363,9 @@ function dbg($msg,$hidden=false){
*/
function dbglog($msg,$header=''){
global $conf;
+ /* @var Input $INPUT */
+ global $INPUT;
+
// The debug log isn't automatically cleaned thus only write it when
// debugging has been enabled by the user.
if($conf['allowdebug'] !== 1) return;
@@ -369,7 +378,7 @@ function dbglog($msg,$header=''){
$file = $conf['cachedir'].'/debug.log';
$fh = fopen($file,'a');
if($fh){
- fwrite($fh,date('H:i:s ').$_SERVER['REMOTE_ADDR'].': '.$msg."\n");
+ fwrite($fh,date('H:i:s ').$INPUT->server->str('REMOTE_ADDR').': '.$msg."\n");
fclose($fh);
}
}
diff --git a/inc/init.php b/inc/init.php
index a937b934d..4ff239787 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -140,18 +140,21 @@ if ($conf['gzip_output'] &&
}
// init session
-if (!headers_sent() && !defined('NOSESSION')){
- session_name("DokuWiki");
- $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
- if (version_compare(PHP_VERSION, '5.2.0', '>')) {
- session_set_cookie_params(0,$cookieDir,'',($conf['securecookie'] && is_ssl()),true);
- }else{
- session_set_cookie_params(0,$cookieDir,'',($conf['securecookie'] && is_ssl()));
+if(!headers_sent() && !defined('NOSESSION')) {
+ if(!defined('DOKU_SESSION_NAME')) define ('DOKU_SESSION_NAME', "DokuWiki");
+ if(!defined('DOKU_SESSION_LIFETIME')) define ('DOKU_SESSION_LIFETIME', 0);
+ if(!defined('DOKU_SESSION_PATH')) {
+ $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
+ define ('DOKU_SESSION_PATH', $cookieDir);
}
+ if(!defined('DOKU_SESSION_DOMAIN')) define ('DOKU_SESSION_DOMAIN', '');
+
+ session_name(DOKU_SESSION_NAME);
+ session_set_cookie_params(DOKU_SESSION_LIFETIME, DOKU_SESSION_PATH, DOKU_SESSION_DOMAIN, ($conf['securecookie'] && is_ssl()), true);
session_start();
// load left over messages
- if(isset($_SESSION[DOKU_COOKIE]['msg'])){
+ if(isset($_SESSION[DOKU_COOKIE]['msg'])) {
$MSG = $_SESSION[DOKU_COOKIE]['msg'];
unset($_SESSION[DOKU_COOKIE]['msg']);
}
@@ -173,7 +176,7 @@ if(function_exists('set_magic_quotes_runtime')) @set_magic_quotes_runtime(0);
$_REQUEST = array_merge($_GET,$_POST);
// we don't want a purge URL to be digged
-if(isset($_REQUEST['purge']) && $_SERVER['HTTP_REFERER']) unset($_REQUEST['purge']);
+if(isset($_REQUEST['purge']) && !empty($_SERVER['HTTP_REFERER'])) unset($_REQUEST['purge']);
// disable gzip if not available
if($conf['compression'] == 'bz2' && !function_exists('bzopen')){
@@ -183,11 +186,6 @@ if($conf['compression'] == 'gz' && !function_exists('gzopen')){
$conf['compression'] = 0;
}
-// fix dateformat for upgraders
-if(strpos($conf['dformat'],'%') === false){
- $conf['dformat'] = '%Y/%m/%d %H:%M';
-}
-
// precalculate file creation modes
init_creationmodes();
@@ -404,6 +402,10 @@ function remove_magic_quotes(&$array) {
* Returns the full absolute URL to the directory where
* DokuWiki is installed in (includes a trailing slash)
*
+ * !! Can not access $_SERVER values through $INPUT
+ * !! here as this function is called before $INPUT is
+ * !! initialized.
+ *
* @author Andreas Gohr <andi@splitbrain.org>
*/
function getBaseURL($abs=null){
@@ -443,12 +445,12 @@ function getBaseURL($abs=null){
//split hostheader into host and port
if(isset($_SERVER['HTTP_HOST'])){
$parsed_host = parse_url('http://'.$_SERVER['HTTP_HOST']);
- $host = $parsed_host['host'];
- $port = $parsed_host['port'];
+ $host = isset($parsed_host['host']) ? $parsed_host['host'] : null;
+ $port = isset($parsed_host['port']) ? $parsed_host['port'] : null;
}elseif(isset($_SERVER['SERVER_NAME'])){
$parsed_host = parse_url('http://'.$_SERVER['SERVER_NAME']);
- $host = $parsed_host['host'];
- $port = $parsed_host['port'];
+ $host = isset($parsed_host['host']) ? $parsed_host['host'] : null;
+ $port = isset($parsed_host['port']) ? $parsed_host['port'] : null;
}else{
$host = php_uname('n');
$port = '';
diff --git a/inc/io.php b/inc/io.php
index eff0279ac..27a34b045 100644
--- a/inc/io.php
+++ b/inc/io.php
@@ -367,8 +367,6 @@ function io_createNamespace($id, $ns_type='pages') {
* @author Andreas Gohr <andi@splitbrain.org>
*/
function io_makeFileDir($file){
- global $conf;
-
$dir = dirname($file);
if(!@is_dir($dir)){
io_mkdir_p($dir) || msg("Creating directory $dir failed",-1);
@@ -401,6 +399,56 @@ function io_mkdir_p($target){
}
/**
+ * Recursively delete a directory
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $path
+ * @param bool $removefiles defaults to false which will delete empty directories only
+ * @return bool
+ */
+function io_rmdir($path, $removefiles = false) {
+ if(!is_string($path) || $path == "") return false;
+ if(!file_exists($path)) return true; // it's already gone or was never there, count as success
+
+ if(is_dir($path) && !is_link($path)) {
+ $dirs = array();
+ $files = array();
+
+ if(!$dh = @opendir($path)) return false;
+ while(false !== ($f = readdir($dh))) {
+ if($f == '..' || $f == '.') continue;
+
+ // collect dirs and files first
+ if(is_dir("$path/$f") && !is_link("$path/$f")) {
+ $dirs[] = "$path/$f";
+ } else if($removefiles) {
+ $files[] = "$path/$f";
+ } else {
+ return false; // abort when non empty
+ }
+
+ }
+ closedir($dh);
+
+ // now traverse into directories first
+ foreach($dirs as $dir) {
+ if(!io_rmdir($dir, $removefiles)) return false; // abort on any error
+ }
+
+ // now delete files
+ foreach($files as $file) {
+ if(!@unlink($file)) return false; //abort on any error
+ }
+
+ // remove self
+ return @rmdir($path);
+ } else if($removefiles) {
+ return @unlink($path);
+ }
+ return false;
+}
+
+/**
* Creates a directory using FTP
*
* This is used when the safemode workaround is enabled
diff --git a/inc/lang/af/jquery.ui.datepicker.js b/inc/lang/af/jquery.ui.datepicker.js
new file mode 100644
index 000000000..0922ef7a1
--- /dev/null
+++ b/inc/lang/af/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+jQuery(function($){
+ $.datepicker.regional['af'] = {
+ closeText: 'Selekteer',
+ prevText: 'Vorige',
+ nextText: 'Volgende',
+ currentText: 'Vandag',
+ monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
+ 'Julie','Augustus','September','Oktober','November','Desember'],
+ monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
+ dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
+ dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
+ dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['af']);
+});
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/denied.txt b/inc/lang/ar/denied.txt
index 11405233c..b369f7f23 100644
--- a/inc/lang/ar/denied.txt
+++ b/inc/lang/ar/denied.txt
@@ -1,3 +1,3 @@
====== لا صلاحيات ======
-عذرا، ليس مصرح لك الاستمرار، لعلك نسيت تسجيل الدخول؟ \ No newline at end of file
+عذرا، ليس مصرح لك الاستمرار \ No newline at end of file
diff --git a/inc/lang/ar/jquery.ui.datepicker.js b/inc/lang/ar/jquery.ui.datepicker.js
new file mode 100644
index 000000000..cef0f08fd
--- /dev/null
+++ b/inc/lang/ar/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Alhourani -- me@khaledalhourani.com */
+/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
+jQuery(function($){
+ $.datepicker.regional['ar'] = {
+ closeText: 'إغلاق',
+ prevText: '&#x3C;السابق',
+ nextText: 'التالي&#x3E;',
+ currentText: 'اليوم',
+ monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
+ 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
+ monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
+ weekHeader: 'أسبوع',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 6,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ar']);
+});
diff --git a/inc/lang/ar/lang.php b/inc/lang/ar/lang.php
index fdb407da0..b0a2edc88 100644
--- a/inc/lang/ar/lang.php
+++ b/inc/lang/ar/lang.php
@@ -8,6 +8,7 @@
* @author Usama Akkad <uahello@gmail.com>
* @author uahello@gmail.com
* @author Ahmad Abd-Elghany <tolpa1@gmail.com>
+ * @author alhajr <alhajr300@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'rtl';
@@ -32,8 +33,8 @@ $lang['btn_upload'] = 'ارفع';
$lang['btn_cancel'] = 'ألغ';
$lang['btn_index'] = 'خريطة موقع';
$lang['btn_secedit'] = 'حرر';
-$lang['btn_login'] = 'لج';
-$lang['btn_logout'] = 'اخرج';
+$lang['btn_login'] = 'تسجيل الدخول';
+$lang['btn_logout'] = 'خروج';
$lang['btn_admin'] = 'المدير';
$lang['btn_update'] = 'حدّث';
$lang['btn_delete'] = 'احذف';
@@ -238,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'] = 'التاريخ';
@@ -251,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'] = 'ليس هناك عنوان مرتبط بولوجك، لا يمكن اضافتك لقائمة الاشتراك';
@@ -266,6 +267,8 @@ $lang['subscr_m_unsubscribe'] = 'ألغ الاشتراك';
$lang['subscr_m_subscribe'] = 'اشترك';
$lang['subscr_m_receive'] = 'استقبال';
$lang['subscr_style_every'] = 'بريدا على كل تغيير';
+$lang['subscr_style_digest'] = 'البريد الإلكتروني, ملخص للتغييرات لكل صفحة (كل يوم %.2f)';
+$lang['subscr_style_list'] = 'قائمة بالصفحات التي تم تغييرها منذ آخر بريد الإلكتروني (كل يوم %.2f)';
$lang['authtempfail'] = 'تصريح المشترك غير متوفر مؤقتاً، إن استمرت هذه الحالة يرجى مراسلة المدير';
$lang['authpwdexpire'] = 'ستنتهي صلاحية كلمة السر في %d . عليك بتغييرها سريعا.';
$lang['i_chooselang'] = 'اختر لغتك';
@@ -297,8 +300,12 @@ $lang['i_policy'] = 'تصريح ACL مبدئي';
$lang['i_pol0'] = 'ويكي مفتوحة؛ أي القراءة والكتابة والتحميل مسموحة للجميع';
$lang['i_pol1'] = 'ويكي عامة؛ أي القراءة للجميع ولكن الكتابة والتحميل للمشتركين المسجلين فقط';
$lang['i_pol2'] = 'ويكي مغلقة؛ أي القراءة والكتابة والتحميل للمشتركين المسجلين فقط';
+$lang['i_allowreg'] = 'السماح للمستخدمين بتسجيل أنفسهم';
$lang['i_retry'] = 'إعادة المحاولة';
$lang['i_license'] = 'اختر الرخصة التي تريد وضع المحتوى تحتها:';
+$lang['i_license_none'] = 'لا تظهر أية معلومات للترخيص';
+$lang['i_pop_field'] = 'من فضلك، ساعدنا على تحسين تجربة دوكي ويكي:';
+$lang['i_pop_label'] = 'مرة واحدة في شهر، إرسال بيانات استخدام المجهول للمطورين دوكي ويكي';
$lang['recent_global'] = 'انت تراقب حاليا التغييرات داخل نطاق <b>%s</b>. يمكنك أيضا <a href="%s">عرض أحدث تغييرات الويكي كلها</a>.';
$lang['years'] = '%d سنة مضت';
$lang['months'] = '%d شهرا مضى';
@@ -331,3 +338,6 @@ $lang['media_perm_read'] = 'عفوا، لست مخولا بقراءة ال
$lang['media_perm_upload'] = 'عفوا، لست مخولا برفع الملفات.';
$lang['media_update'] = 'ارفع إصدارا أحدث';
$lang['media_restore'] = 'استرجع هذه النسخة';
+$lang['currentns'] = 'مساحة الاسم الحالية';
+$lang['searchresult'] = 'نتيجة البحث';
+$lang['wikimarkup'] = 'علامات الوكي';
diff --git a/inc/lang/az/denied.txt b/inc/lang/az/denied.txt
index a68b08c8c..c6fddb63a 100644
--- a/inc/lang/az/denied.txt
+++ b/inc/lang/az/denied.txt
@@ -1,3 +1,3 @@
====== Müraciət qadağan edilmişdir ======
-Sizin bu əməliyyat üçün kifayət qədər haqqınız yoxdur. Bəlkə, Siz sistemə oz istifadəçi adınız ilə girməyi unutmusunuz?
+Sizin bu əməliyyat üçün kifayət qədər haqqınız yoxdur.
diff --git a/inc/lang/az/jquery.ui.datepicker.js b/inc/lang/az/jquery.ui.datepicker.js
new file mode 100644
index 000000000..a133a9eb2
--- /dev/null
+++ b/inc/lang/az/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+jQuery(function($) {
+ $.datepicker.regional['az'] = {
+ closeText: 'Bağla',
+ prevText: '&#x3C;Geri',
+ nextText: 'İrəli&#x3E;',
+ currentText: 'Bugün',
+ monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
+ 'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
+ monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
+ 'İyul','Avq','Sen','Okt','Noy','Dek'],
+ dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
+ dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
+ dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
+ weekHeader: 'Hf',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['az']);
+});
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/denied.txt b/inc/lang/bg/denied.txt
index 45ce63769..bd695d46d 100644
--- a/inc/lang/bg/denied.txt
+++ b/inc/lang/bg/denied.txt
@@ -1,4 +1,4 @@
====== Отказан достъп ======
-Нямате достатъчно права, за да продължите. Може би сте забравили да се впишете?
+Нямате достатъчно права, за да продължите.
diff --git a/inc/lang/bg/jquery.ui.datepicker.js b/inc/lang/bg/jquery.ui.datepicker.js
new file mode 100644
index 000000000..86ab88582
--- /dev/null
+++ b/inc/lang/bg/jquery.ui.datepicker.js
@@ -0,0 +1,24 @@
+/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+jQuery(function($){
+ $.datepicker.regional['bg'] = {
+ closeText: 'затвори',
+ prevText: '&#x3C;назад',
+ nextText: 'напред&#x3E;',
+ nextBigText: '&#x3E;&#x3E;',
+ currentText: 'днес',
+ monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
+ 'Юли','Август','Септември','Октомври','Ноември','Декември'],
+ monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
+ 'Юли','Авг','Сеп','Окт','Нов','Дек'],
+ dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
+ dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
+ dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['bg']);
+});
diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php
index e909980db..77117154f 100644
--- a/inc/lang/bg/lang.php
+++ b/inc/lang/bg/lang.php
@@ -1,20 +1,20 @@
<?php
+
/**
- * Bulgarian language file
- *
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
* @author Kiril <neohidra@gmail.com>
+ * @author Ivan Peltekov <ivan.peltekov@abv.bg>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
-$lang['doublequoteopening'] = '"'; //&ldquo;
-$lang['doublequoteclosing'] = '"'; //&rdquo;
-$lang['singlequoteopening'] = '‘'; //&lsquo;
-$lang['singlequoteclosing'] = '’'; //&rsquo;
-$lang['apostrophe'] = '’'; //&rsquo;
-
+$lang['doublequoteopening'] = '"';
+$lang['doublequoteclosing'] = '"';
+$lang['singlequoteopening'] = '‘';
+$lang['singlequoteclosing'] = '’';
+$lang['apostrophe'] = '’';
$lang['btn_edit'] = 'Редактиране';
$lang['btn_source'] = 'Преглед на кода';
$lang['btn_show'] = 'Преглед на страницата';
@@ -50,7 +50,7 @@ $lang['btn_revert'] = 'Възстановяване';
$lang['btn_register'] = 'Регистриране';
$lang['btn_apply'] = 'Прилагане';
$lang['btn_media'] = 'Диспечер на файлове';
-
+$lang['btn_deleteuser'] = 'Изтриване на профила';
$lang['loggedinas'] = 'Вписани сте като';
$lang['user'] = 'Потребител';
$lang['pass'] = 'Парола';
@@ -62,10 +62,10 @@ $lang['fullname'] = 'Истинско име';
$lang['email'] = 'Електронна поща';
$lang['profile'] = 'Потребителски профил';
$lang['badlogin'] = 'Грешно потребителско име или парола.';
+$lang['badpassconfirm'] = 'За съжаление паролата е грешна';
$lang['minoredit'] = 'Промените са незначителни';
-$lang['draftdate'] = 'Черновата е автоматично записана на'; // full dformat date will be added
+$lang['draftdate'] = 'Черновата е автоматично записана на';
$lang['nosecedit'] = 'Страницата бе междувременно променена, презареждане на страницата поради неактуална информация.';
-
$lang['regmissing'] = 'Моля, попълнете всички полета.';
$lang['reguexists'] = 'Вече съществува потребител с избраното име.';
$lang['regsuccess'] = 'Потребителят е създаден, а паролата е пратена по електронната поща.';
@@ -75,12 +75,15 @@ $lang['regbadmail'] = 'Въведеният адрес изглежд
$lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново.';
$lang['regpwmail'] = 'Паролата ви за DokuWiki';
$lang['reghere'] = 'Все още нямате профил? Направете си';
-
$lang['profna'] = 'Wiki-то не поддържа промяна на профила';
$lang['profnochange'] = 'Няма промени.';
-$lang['profnoempty'] = 'Въвеждането на име и ел. поща е задължително';
+$lang['profnoempty'] = 'Въвеждането на име и имейл е задължително';
$lang['profchanged'] = 'Потребителският профил е обновен успешно.';
-
+$lang['profnodelete'] = 'Изтриването на потребители в това wiki не е възможно';
+$lang['profdeleteuser'] = 'Изтриване на профила';
+$lang['profdeleted'] = 'Вашият профил е премахнат от това wiki ';
+$lang['profconfdelete'] = 'Искам да изтрия профила си от това wiki. <br/> Веднъж изтрит, профилът не може да бъде възстановен!';
+$lang['profconfdeletemissing'] = 'Не сте поставили отметка в кутията потвърждение';
$lang['pwdforget'] = 'Забравили сте паролата си? Получете нова';
$lang['resendna'] = 'Wiki-то не поддържа повторно пращане на паролата.';
$lang['resendpwd'] = 'Задаване на нова парола за';
@@ -89,10 +92,8 @@ $lang['resendpwdnouser'] = 'Потребителят не е намере
$lang['resendpwdbadauth'] = 'Кодът за потвърждение е невалиден. Проверете дали сте използвали целия линк за потвърждение.';
$lang['resendpwdconfirm'] = 'Линк за потвърждение е пратен по електронната поща.';
$lang['resendpwdsuccess'] = 'Новата ви паролата е пратена по електронната поща.';
-
$lang['license'] = 'Ако не е посочено друго, съдържанието на Wiki-то е лицензирано под следния лиценз:';
$lang['licenseok'] = 'Бележка: Редактирайки страницата, Вие се съгласявате да лицензирате промените (които сте направили) под следния лиценз:';
-
$lang['searchmedia'] = 'Търсене на файл: ';
$lang['searchmedia_in'] = 'Търсене в %s';
$lang['txt_upload'] = 'Изберете файл за качване';
@@ -101,7 +102,6 @@ $lang['txt_overwrt'] = 'Презапиши съществуващит
$lang['maxuploadsize'] = 'Макс. размер за отделните файлове е %s.';
$lang['lockedby'] = 'В момента е заключена от';
$lang['lockexpire'] = 'Ще бъде отключена на';
-
$lang['js']['willexpire'] = 'Страницата ще бъде отключена за редактиране след минута.\nЗа предотвратяване на конфликти, ползвайте бутона "Преглед", за рестартиране на брояча за заключване.';
$lang['js']['notsavedyet'] = 'Незаписаните промени ще бъдат загубени. Желаете ли да продължите?';
$lang['js']['searchmedia'] = 'Търсене на файлове';
@@ -140,13 +140,11 @@ $lang['js']['media_diff_portions'] = 'По половинка';
$lang['js']['media_select'] = 'Изберете файлове...';
$lang['js']['media_upload_btn'] = 'Качване';
$lang['js']['media_done_btn'] = 'Готово';
-$lang['js']['media_drop'] = 'Влачете и пуснете файливе тук, за да бъдат качени';
+$lang['js']['media_drop'] = 'Влачете и пуснете файлове тук, за да бъдат качени';
$lang['js']['media_cancel'] = 'премахване';
$lang['js']['media_overwrt'] = 'Презапиши съществуващите файлове';
-
$lang['rssfailed'] = 'Възникна грешка при получаването на емисията: ';
$lang['nothingfound'] = 'Нищо не е открито.';
-
$lang['mediaselect'] = 'Файлове';
$lang['fileupload'] = 'Качване на файлове';
$lang['uploadsucc'] = 'Качването е успешно';
@@ -166,12 +164,11 @@ $lang['accessdenied'] = 'Нямате необходимите прав
$lang['mediausage'] = 'Ползвайте следния синтаксис, за да упоменете файла:';
$lang['mediaview'] = 'Преглед на оригиналния файл';
$lang['mediaroot'] = 'root';
-$lang['mediaupload'] = 'Качете файл в текущото именно пространство. За създаване на подимено пространство, добавете име преди това на файла като ги разделите с двоеточие в полето "Качи като"';
+$lang['mediaupload'] = 'Качете файл в текущото именно пространство. За създаване на подименно пространство, добавете име преди това на файла като ги разделите с двоеточие в полето "Качи като"';
$lang['mediaextchange'] = 'Разширението на файла е сменено от .%s на .%s!';
$lang['reference'] = 'Връзки за';
$lang['ref_inuse'] = 'Файлът не може да бъде изтрит, защото все още се ползва от следните страници:';
$lang['ref_hidden'] = 'Някои връзки са към страници, които нямате права да четете';
-
$lang['hits'] = 'Съвпадения';
$lang['quickhits'] = 'Съвпадащи имена на страници';
$lang['toc'] = 'Съдържание';
@@ -201,18 +198,15 @@ $lang['site_tools'] = 'Инструменти за сайта';
$lang['page_tools'] = 'Инструменти за страници';
$lang['skip_to_content'] = 'към съдържанието';
$lang['sidebar'] = 'Странична лента';
-
$lang['mail_newpage'] = 'добавена страница: ';
$lang['mail_changed'] = 'променена страница: ';
$lang['mail_subscribe_list'] = 'променени страници в именно пространство: ';
$lang['mail_new_user'] = 'нов потребител: ';
$lang['mail_upload'] = 'качен файл: ';
-
$lang['changes_type'] = 'Преглед на променените';
$lang['pages_changes'] = 'Страници';
$lang['media_changes'] = 'Файлове';
$lang['both_changes'] = 'Страници и файлове';
-
$lang['qb_bold'] = 'Удебелен текст';
$lang['qb_italic'] = 'Курсив текст';
$lang['qb_underl'] = 'Подчертан текст';
@@ -237,15 +231,12 @@ $lang['qb_media'] = 'Добавяне на изображения
$lang['qb_sig'] = 'Вмъкване на подпис';
$lang['qb_smileys'] = 'Усмивчици';
$lang['qb_chars'] = 'Специални знаци';
-
$lang['upperns'] = 'към майчиното именно пространство';
-
$lang['admin_register'] = 'Добавяне на нов потребител';
-
$lang['metaedit'] = 'Редактиране на метаданни';
$lang['metasaveerr'] = 'Записването на метаданните се провали';
$lang['metasaveok'] = 'Метаданните са запазени успешно';
-$lang['img_backto'] = 'Назад към';
+$lang['btn_img_backto'] = 'Назад към %s';
$lang['img_title'] = 'Заглавие';
$lang['img_caption'] = 'Надпис';
$lang['img_date'] = 'Дата';
@@ -258,32 +249,26 @@ $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';
$lang['subscr_not_subscribed'] = '%s не е абониран за %s';
-// Manage page for subscriptions
$lang['subscr_m_not_subscribed'] = 'Не сте абониран за текущата страницата или именно пространство.';
$lang['subscr_m_new_header'] = 'Добави абонамент';
$lang['subscr_m_current_header'] = 'Текущи абонаменти';
$lang['subscr_m_unsubscribe'] = 'Прекратяване на абонамента';
$lang['subscr_m_subscribe'] = 'Абониране';
$lang['subscr_m_receive'] = 'Получаване';
-$lang['subscr_style_every'] = 'на ел. писмо при всяка промяна';
-$lang['subscr_style_digest'] = 'на ел. писмо с обобщение на промените във всяка страница (всеки %.2f дни)';
-$lang['subscr_style_list'] = 'на списък с променените страници от последното ел. писмо (всеки %.2f дни)';
-
-/* auth.class language support */
+$lang['subscr_style_every'] = 'на имейл при всяка промяна';
+$lang['subscr_style_digest'] = 'на имейл с обобщение на промените във всяка страница (всеки %.2f дни)';
+$lang['subscr_style_list'] = 'на списък с променените страници от последния имейл (всеки %.2f дни)';
$lang['authtempfail'] = 'Удостоверяването на потребители не е възможно за момента. Ако продължи дълго, моля уведомете администратора на Wiki страницата.';
-$lang['authpwdexpire'] = 'Срока на паролата ви ще изтече след %d дни. Препорачително е да я смените по-скоро.';
-
-/* installer strings */
-$lang['i_chooselang'] = 'Изберете вашия изик';
+$lang['authpwdexpire'] = 'Срока на паролата ви ще изтече след %d дни. Препоръчително е да я смените по-скоро.';
+$lang['i_chooselang'] = 'Изберете вашия език';
$lang['i_installer'] = 'Инсталатор на DokuWiki';
$lang['i_wikiname'] = 'Име на Wiki-то';
$lang['i_enableacl'] = 'Ползване на списък за достъп (ACL) [препоръчително]';
@@ -299,19 +284,18 @@ $lang['i_writeerr'] = '<code>%s</code> не можа да бъде с
$lang['i_badhash'] = 'Файлът dokuwiki.php не може да бъде разпознат или е променен (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - непозволена или празна стойност';
$lang['i_success'] = 'Настройването приключи успешно. Вече можете да изтриете файла install.php. Продължете към <a href="doku.php?id=wiki:welcome">Вашето ново DokuWiki</a>.';
-
$lang['i_failure'] = 'Възникнаха грешки при записването на файловете с настройки. Вероятно ще се наложи да ги поправите ръчно,
за да можете да ползвате <a href="doku.php?id=wiki:welcome">Вашето ново DokuWiki</a>.';
$lang['i_policy'] = 'Първоначална политика за достъп';
$lang['i_pol0'] = 'Отворено Wiki (всеки може да чете, пише и качва)';
$lang['i_pol1'] = 'Публично Wiki (всеки може да чете, само регистрирани пишат и качват)';
$lang['i_pol2'] = 'Затворено Wiki (само регистрирани четат, пишат и качват)';
+$lang['i_allowreg'] = 'Разрешете на потребителите за се регистрират сами';
$lang['i_retry'] = 'Повторен опит';
$lang['i_license'] = 'Моля, изберете лиценз под който желаете да публикувате съдържанието:';
$lang['i_license_none'] = 'Без показване на информация относно лиценза';
$lang['i_pop_field'] = 'Моля, помогнете за усъвършенстването на DokuWiki:';
$lang['i_pop_label'] = 'Изпращане на анонимна информация до разработчиците на DokuWiki, веднъж седмично';
-
$lang['recent_global'] = 'В момента преглеждате промените в именно пространство <b>%s</b>. Може да прегледате и <a href="%s">промените в цялото Wiki</a>.';
$lang['years'] = 'преди %d години';
$lang['months'] = 'преди %d месеца';
@@ -320,9 +304,7 @@ $lang['days'] = 'преди %d дни';
$lang['hours'] = 'преди %d часа';
$lang['minutes'] = 'преди %d минути';
$lang['seconds'] = 'преди %d секунди';
-
$lang['wordblock'] = 'Направените от Вас промени не са съхранени, защото съдържат забранен текст (SPAM).';
-
$lang['media_uploadtab'] = 'Качване';
$lang['media_searchtab'] = 'Търсене';
$lang['media_file'] = 'Файл';
@@ -346,5 +328,5 @@ $lang['media_perm_read'] = 'За съжаление нямате дост
$lang['media_perm_upload'] = 'За съжаление нямате достатъчно права, за да можете да качите файла.';
$lang['media_update'] = 'Качване на нова версия';
$lang['media_restore'] = 'Възстановяване на тази версия';
-
-//Setup VIM: ex: et ts=2 :
+$lang['searchresult'] = 'Резултати от търсенето';
+$lang['plainhtml'] = 'Обикновен HTML';
diff --git a/inc/lang/bg/register.txt b/inc/lang/bg/register.txt
index 51fbb83fe..333428005 100644
--- a/inc/lang/bg/register.txt
+++ b/inc/lang/bg/register.txt
@@ -1,4 +1,4 @@
====== Регистриране като нов потребител ======
-Моля, попълнете всичките полета отдолу, за да бъде създаден нов профил. Уверете се, че въведеният **адрес на ел. поща е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]].
+Моля, попълнете всичките полета отдолу, за да бъде създаден нов профил. Уверете се, че въведеният **имейл адрес е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]].
diff --git a/inc/lang/bg/resendpwd.txt b/inc/lang/bg/resendpwd.txt
index 38e2d1fe4..19dffc070 100644
--- a/inc/lang/bg/resendpwd.txt
+++ b/inc/lang/bg/resendpwd.txt
@@ -1,3 +1,3 @@
====== Пращане на нова парола ======
-Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. По ел. поща ще получите линк, с който да потвърдите.
+Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. Чрез имейл ще получите линк, с който да потвърдите.
diff --git a/inc/lang/bn/denied.txt b/inc/lang/bn/denied.txt
index 711275bad..5ba0fcf4f 100644
--- a/inc/lang/bn/denied.txt
+++ b/inc/lang/bn/denied.txt
@@ -1,3 +1,3 @@
====== অনুমতি অস্বীকার =====
-দুঃখিত, আপনি কি এগিয়ে যেতে যথেষ্ট অধিকার নেই. সম্ভবত আপনি লগইন ভুলে গেছেন? \ No newline at end of file
+দুঃখিত, আপনি কি এগিয়ে যেতে যথেষ্ট অধিকার নেই. \ No newline at end of file
diff --git a/inc/lang/bn/lang.php b/inc/lang/bn/lang.php
index eb8d09e64..230f3ef80 100644
--- a/inc/lang/bn/lang.php
+++ b/inc/lang/bn/lang.php
@@ -4,6 +4,8 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Foysol <ragebot1125@gmail.com>
+ * @author ninetailz <ninetailz1125@gmail.com>
+ * @author Khan M. B. Asad <muhammad2017@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'itr';
@@ -25,3 +27,134 @@ $lang['btn_older'] = 'কম সাম্প্রতিক >>';
$lang['btn_revs'] = 'প্রাচীন সংশোধন';
$lang['btn_recent'] = 'সাধিত পরিবর্তনসমূহ';
$lang['btn_upload'] = 'আপলোড করুন';
+$lang['btn_cancel'] = 'বাতিল করা';
+$lang['btn_index'] = 'সাইট ম্যাপ';
+$lang['btn_secedit'] = 'সম্পাদন করা';
+$lang['btn_login'] = 'লগইন';
+$lang['btn_logout'] = 'লগ আউট';
+$lang['btn_admin'] = 'অ্যাডমিন';
+$lang['btn_update'] = 'আধুনিক করা';
+$lang['btn_delete'] = 'মুছে ফেলা';
+$lang['btn_back'] = 'পিছনে';
+$lang['btn_backlink'] = 'ব্যাকলিঙ্কগুলি';
+$lang['btn_backtomedia'] = 'পিছনে Mediafile নির্বাচনে যান';
+$lang['btn_subscribe'] = 'সাবস্ক্রিপশন পরিচালনা করুন';
+$lang['btn_profile'] = 'প্রোফাইল আপডেট করুন';
+$lang['btn_reset'] = 'রিসেট করুন';
+$lang['btn_resendpwd'] = 'সেট করুন নতুন পাসওয়ার্ড';
+$lang['btn_draft'] = 'সম্পাদনা খসড়া';
+$lang['btn_recover'] = 'খসড়া উদ্ধার';
+$lang['btn_draftdel'] = 'খসড়া মুছে দিন';
+$lang['btn_revert'] = 'পুনরূদ্ধার করা';
+$lang['btn_register'] = 'খাতা';
+$lang['btn_apply'] = 'প্রয়োগ করা';
+$lang['btn_media'] = 'মিডিয়া ম্যানেজার';
+$lang['btn_deleteuser'] = 'আমার অ্যাকাউন্ট অপসারণ করুন';
+$lang['loggedinas'] = 'লগ ইন';
+$lang['user'] = 'ইউজারনেম';
+$lang['pass'] = 'পাসওয়ার্ড';
+$lang['newpass'] = 'নতুন পাসওয়ার্ড';
+$lang['oldpass'] = 'বর্তমান পাসওয়ার্ড নিশ্চিত করুন';
+$lang['passchk'] = 'আরো একবার';
+$lang['remember'] = 'আমাকে মনে রেখো';
+$lang['fullname'] = 'আমাকে মনে রেখো';
+$lang['email'] = 'ই মেইল';
+$lang['profile'] = 'ব্যবহারকারী প্রোফাইল';
+$lang['badlogin'] = 'দুঃখিত, ব্যবহারকারীর নাম বা পাসওয়ার্ড ভুল ছিল.';
+$lang['badpassconfirm'] = 'দুঃখিত, পাসওয়ার্ড ভুল ছিল';
+$lang['minoredit'] = 'ক্ষুদ্র পরিবর্তনসমূহ';
+$lang['draftdate'] = 'খসড়া উপর স্বতঃসংরক্ষণ';
+$lang['nosecedit'] = 'পাতা ইতিমধ্যে পরিবর্তিত হয়েছিল, অধ্যায় তথ্যের পরিবর্তে পুরো পাতা লোড তারিখ সীমার বাইরে ছিল.
+';
+$lang['regmissing'] = 'দুঃখিত, আপনি সমস্ত ক্ষেত্রগুলি পূরণ করা আবশ্যক.';
+$lang['reguexists'] = 'দুঃখিত, এই লগইন সঙ্গে একটি ব্যবহারকারী ইতিমধ্যেই বিদ্যমান.';
+$lang['regsuccess'] = 'ব্যবহারকারী তৈরি করা হয়েছে এবং পাসওয়ার্ড ইমেইল করে পাঠানো হয়েছিল.';
+$lang['regsuccess2'] = 'ব্যবহারকারী তৈরি করা হয়েছে.';
+$lang['regmailfail'] = 'একটি ত্রুটি পাসওয়ার্ড মেইল পাঠানোর নেভিগেশন ছিল মনে হচ্ছে. অ্যাডমিন যোগাযোগ করুন!';
+$lang['regbadmail'] = 'প্রদত্ত ইমেইল ঠিকানা সঠিক মনে হচ্ছে - আপনি এই একটি ত্রুটি মনে হলে, অ্যাডমিন যোগাযোগ';
+$lang['regbadpass'] = 'দুটি প্রদত্ত পাসওয়ার্ড অভিন্ন নয়, আবার চেষ্টা করুন.';
+$lang['regpwmail'] = 'আপনার DokuWiki পাসওয়ার্ড';
+$lang['reghere'] = 'যদিও তোমার কোনো একাউন্ট নেই? শুধু একটি পেতে';
+$lang['profna'] = 'এই উইকি প্রোফাইল পরিবর্তন সমর্থন করে না';
+$lang['profnochange'] = 'এমন কোন পরিবর্তন, না কিছুই.';
+$lang['profnoempty'] = 'একটি খালি নাম অথবা ইমেইল ঠিকানা অনুমোদিত নয়.';
+$lang['profchanged'] = 'ইউজার প্রোফাইল সফলভাবে আপডেট.';
+$lang['profnodelete'] = 'এই উইকি ব্যবহারকারী মুছে ফেলার সমর্থন করে না';
+$lang['profdeleteuser'] = 'একাউন্ট মুছে দিন';
+$lang['profdeleted'] = 'আপনার অ্যাকাউন্টটি এই উইকি থেকে মুছে ফেলা হয়েছে';
+$lang['profconfdelete'] = 'আমি এই উইকি থেকে আমার অ্যাকাউন্ট অপসারণ করতে ইচ্ছুক. <br/> এই ক্রিয়াটি পূর্বাবস্থায় ফেরানো যায় না.';
+$lang['profconfdeletemissing'] = 'নিশ্চিতকরণ চেক বক্স ticked না';
+$lang['pwdforget'] = 'আপনার পাসওয়ার্ড ভুলে গেছেন? একটি নতুন পান';
+$lang['resendna'] = 'এই উইকি পাসওয়ার্ড পুনরায় প্রেরণ সমর্থন করে না.';
+$lang['resendpwd'] = 'জন্য সেট করুন নতুন পাসওয়ার্ড';
+$lang['resendpwdmissing'] = 'দুঃখিত, আপনি সমস্ত ক্ষেত্রগুলি পূরণ করা আবশ্যক.';
+$lang['resendpwdnouser'] = 'দুঃখিত, আমরা আমাদের ডাটাবেসের মধ্যে ব্যবহারকারীর খুঁজে পাচ্ছি না.';
+$lang['resendpwdbadauth'] = 'দুঃখিত, এই auth কোড বৈধ নয়. আপনি সম্পূর্ণ কনফার্মেশন লিঙ্ক ব্যবহার নিশ্চিত করুন.';
+$lang['resendpwdconfirm'] = 'একটি নিশ্চায়ন লিঙ্ক ইমেলের মাধ্যমে পাঠানো হয়েছে.';
+$lang['resendpwdsuccess'] = 'আপনার নতুন পাসওয়ার্ড ইমেইলের মাধ্যমে পাঠানো হয়েছে.';
+$lang['license'] = 'অন্যথায় নোট যেখানে ছাড়া, এই উইকি নেভিগেশন কন্টেন্ট নিম্নলিখিত লাইসেন্সের আওতায় লাইসেন্সকৃত:';
+$lang['licenseok'] = 'দ্রষ্টব্য: আপনি নিম্নলিখিত লাইসেন্সের অধীনে আপনার বিষয়বস্তু লাইসেন্স সম্মত হন এই পৃষ্ঠার সম্পাদনার দ্বারা:';
+$lang['searchmedia'] = 'অনুসন্ধান ফাইলের নাম:';
+$lang['searchmedia_in'] = 'অনুসন্ধান %s -এ';
+$lang['txt_upload'] = 'আপলোড করার জন্য নির্বাচন করুন ফাইল';
+$lang['txt_filename'] = 'হিসাবে আপলোড করুন (ঐচ্ছিক)';
+$lang['txt_overwrt'] = 'বিদ্যমান ফাইল মুছে যাবে';
+$lang['maxuploadsize'] = 'সর্বোচ্চ আপলোড করুন. %s-ফাইলের প্রতি.';
+$lang['lockedby'] = 'বর্তমানে দ্বারা লক';
+$lang['lockexpire'] = 'তালা এ মেয়াদ শেষ';
+$lang['js']['willexpire'] = 'এই পৃষ্ঠার সম্পাদনার জন্য আপনার লক এক মিনিটের মধ্যে মেয়াদ শেষ সম্পর্কে. \ দ্বন্দ্ব লক টাইমার রিসেট প্রিভিউ বাটন ব্যবহার এড়াতে.';
+$lang['js']['notsavedyet'] = 'অসংরক্ষিত পরিবর্তন হারিয়ে যাবে.';
+$lang['js']['searchmedia'] = 'ফাইলের জন্য অনুসন্ধান';
+$lang['js']['keepopen'] = 'নির্বাচনের উপর উইন্ডো খোলা রাখুন';
+$lang['js']['hidedetails'] = 'বিশদ আড়াল করুন';
+$lang['js']['mediatitle'] = 'লিংক সেটিংস';
+$lang['js']['mediadisplay'] = 'লিংক টাইপ';
+$lang['js']['mediaalign'] = 'শ্রেণীবিন্যাস';
+$lang['js']['mediasize'] = 'চিত্র আকার';
+$lang['js']['mediatarget'] = 'লিংক টার্গেট';
+$lang['js']['mediaclose'] = 'বন্ধ করা';
+$lang['js']['mediainsert'] = 'ঢোকান';
+$lang['js']['mediadisplayimg'] = 'ছবিটি দেখান';
+$lang['js']['mediadisplaylnk'] = 'শুধুমাত্র লিঙ্ক দেখান';
+$lang['js']['mediasmall'] = 'ক্ষুদ্র সংস্করণ';
+$lang['js']['mediamedium'] = 'মাধ্যম সংস্করণ';
+$lang['js']['medialarge'] = 'বড় সংস্করণ';
+$lang['js']['mediaoriginal'] = 'আসল সংস্করণ';
+$lang['js']['medialnk'] = 'বিস্তারিত পৃষ্ঠায় লিংক';
+$lang['js']['mediadirect'] = 'মূল সরাসরি লিঙ্ক';
+$lang['js']['medianolnk'] = 'কোনো লিঙ্ক নাই';
+$lang['js']['medianolink'] = 'ইমেজ লিঙ্ক কোরো না';
+$lang['js']['medialeft'] = 'বাম দিকে ইমেজ সারিবদ্ধ কর';
+$lang['js']['mediaright'] = 'ডান দিকে ইমেজ সারিবদ্ধ কর';
+$lang['js']['mediacenter'] = 'মাঝখানে ইমেজ সারিবদ্ধ কর';
+$lang['js']['medianoalign'] = 'কোনো সারিবদ্ধ করা প্রয়োজন নেই';
+$lang['js']['nosmblinks'] = 'উইন্ডোস শেয়ার এর সাথে সংযোগ সাধন কেবল মাইক্রোসফ্ট ইন্টারনেট এক্সপ্লোরারেই সম্ভব।\nতবে আপনি লিংকটি কপি পেস্ট করতেই পারেন।';
+$lang['js']['linkwiz'] = 'লিংক উইজার্ড';
+$lang['js']['linkto'] = 'সংযোগের লক্ষ্য:';
+$lang['js']['del_confirm'] = 'নির্বাচিত আইটেম(গুলো) আসলেই মুছে ফেলতে চান?';
+$lang['js']['restore_confirm'] = 'এই সংস্করণ সত্যিই পূর্বাবস্থায় ফিরিয়ে আনতে চান?';
+$lang['js']['media_diff'] = 'পার্থক্যগুলো দেখুন:';
+$lang['js']['media_diff_both'] = 'পাশাপাশি';
+$lang['js']['media_diff_opacity'] = 'শাইন-থ্রু';
+$lang['js']['media_diff_portions'] = 'ঝেঁটিয়ে বিদায়';
+$lang['js']['media_select'] = 'ফাইল নির্বাচন...';
+$lang['js']['media_upload_btn'] = 'আপলোড';
+$lang['js']['media_done_btn'] = 'সাধিত';
+$lang['js']['media_drop'] = 'আপলোডের জন্য এখানে ফাইল ফেলুন';
+$lang['js']['media_cancel'] = 'অপসারণ';
+$lang['js']['media_overwrt'] = 'বর্তমান ফাইল ওভাররাইট করুন';
+$lang['rssfailed'] = 'ফিডটি জোগাড় করতে গিয়ে একটি ত্রুটি ঘটেছে:';
+$lang['nothingfound'] = 'কিছু পাওয়া যায়নি।';
+$lang['mediaselect'] = 'মিডিয়া ফাইল';
+$lang['fileupload'] = 'মিডিয়া ফাইল আপলোড';
+$lang['uploadsucc'] = 'আপলোড সফল';
+$lang['uploadfail'] = 'আপলোড ব্যর্থ। অনুমতি জনিত ত্রুটি কী?';
+$lang['uploadwrong'] = 'আপলোড প্রত্যাখ্যাত। এই ফাইল এক্সটেনশন অননুমোদিত।';
+$lang['uploadexist'] = 'ফাইল ইতিমধ্যেই বিরাজমান। কিছু করা হয়নি।';
+$lang['uploadbadcontent'] = 'আপলোডকৃত সামগ্রী %s ফাইল এক্সটেনশন এর সাথে মিলেনি।';
+$lang['uploadspam'] = 'স্প্যাম ব্ল্যাকলিস্ট আপলোড আটকে দিয়েছে।';
+$lang['uploadxss'] = 'সামগ্রীটি ক্ষতিকর ভেবে আপলোড আটকে দেয়া হয়েছে।';
+$lang['uploadsize'] = 'আপলোডকৃত ফাইলটি বেশি বড়ো। (সর্বোচ্চ %s)';
+$lang['deletesucc'] = '"%s" ফাইলটি মুছে ফেলা হয়েছে।';
+$lang['deletefail'] = '"%s" ডিলিট করা যায়নি - অনুমতি আছে কি না দেখুন।';
+$lang['mediainuse'] = '"%s" ফাইলটি মোছা হয়নি - এটি এখনো ব্যবহৃত হচ্ছে।';
diff --git a/inc/lang/ca-valencia/denied.txt b/inc/lang/ca-valencia/denied.txt
index 39c45d946..6640e07f5 100644
--- a/inc/lang/ca-valencia/denied.txt
+++ b/inc/lang/ca-valencia/denied.txt
@@ -1,4 +1,4 @@
====== Permís denegat ======
-Disculpe, pero no té permís per a continuar. ¿Haurà oblidat iniciar sessió?
+Disculpe, pero no té permís per a continuar.
diff --git a/inc/lang/ca-valencia/lang.php b/inc/lang/ca-valencia/lang.php
index 9ab423783..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/denied.txt b/inc/lang/ca/denied.txt
index e6125e83b..3f66d6bb6 100644
--- a/inc/lang/ca/denied.txt
+++ b/inc/lang/ca/denied.txt
@@ -1,4 +1,4 @@
====== Permís denegat ======
-No teniu prou drets per continuar. Potser us heu descuidat d'entrar?
+No teniu prou drets per continuar.
diff --git a/inc/lang/ca/jquery.ui.datepicker.js b/inc/lang/ca/jquery.ui.datepicker.js
new file mode 100644
index 000000000..a10b549c2
--- /dev/null
+++ b/inc/lang/ca/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Inicialització en català per a l'extensió 'UI date picker' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ca'] = {
+ closeText: 'Tanca',
+ prevText: 'Anterior',
+ nextText: 'Següent',
+ currentText: 'Avui',
+ monthNames: ['gener','febrer','març','abril','maig','juny',
+ 'juliol','agost','setembre','octubre','novembre','desembre'],
+ monthNamesShort: ['gen','feb','març','abr','maig','juny',
+ 'jul','ag','set','oct','nov','des'],
+ dayNames: ['diumenge','dilluns','dimarts','dimecres','dijous','divendres','dissabte'],
+ dayNamesShort: ['dg','dl','dt','dc','dj','dv','ds'],
+ dayNamesMin: ['dg','dl','dt','dc','dj','dv','ds'],
+ weekHeader: 'Set',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ca']);
+});
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/denied.txt b/inc/lang/cs/denied.txt
index 00a8811de..29524e5db 100644
--- a/inc/lang/cs/denied.txt
+++ b/inc/lang/cs/denied.txt
@@ -1,3 +1,3 @@
====== Nepovolená akce ======
-Promiňte, ale nemáte dostatečná oprávnění k této činnosti. Možná jste se zapomněli přihlásit?
+Promiňte, ale nemáte dostatečná oprávnění k této činnosti.
diff --git a/inc/lang/cs/jquery.ui.datepicker.js b/inc/lang/cs/jquery.ui.datepicker.js
new file mode 100644
index 000000000..b96b1a51c
--- /dev/null
+++ b/inc/lang/cs/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+jQuery(function($){
+ $.datepicker.regional['cs'] = {
+ closeText: 'Zavřít',
+ prevText: '&#x3C;Dříve',
+ nextText: 'Později&#x3E;',
+ currentText: 'Nyní',
+ monthNames: ['leden','únor','březen','duben','květen','červen',
+ 'červenec','srpen','září','říjen','listopad','prosinec'],
+ monthNamesShort: ['led','úno','bře','dub','kvě','čer',
+ 'čvc','srp','zář','říj','lis','pro'],
+ dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
+ dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
+ dayNamesMin: ['ne','po','út','st','čt','pá','so'],
+ weekHeader: 'Týd',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['cs']);
+});
diff --git a/inc/lang/cs/lang.php b/inc/lang/cs/lang.php
index 56ffd91de..a491c1533 100644
--- a/inc/lang/cs/lang.php
+++ b/inc/lang/cs/lang.php
@@ -16,6 +16,7 @@
* @author mkucera66@seznam.cz
* @author Zbyněk Křivka <krivka@fit.vutbr.cz>
* @author Gerrit Uitslag <klapinklapin@gmail.com>
+ * @author Petr Klíma <qaxi@seznam.cz>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -247,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';
@@ -260,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ů.';
@@ -299,6 +300,7 @@ $lang['i_policy'] = 'Úvodní politika ACL';
$lang['i_pol0'] = 'Otevřená wiki (čtení, zápis a upload pro všechny)';
$lang['i_pol1'] = 'Veřejná wiki (čtení pro všechny, zápis a upload pro registrované uživatele)';
$lang['i_pol2'] = 'Uzavřená wiki (čtení, zápis a upload pouze pro registrované uživatele)';
+$lang['i_allowreg'] = 'Povol uživatelům registraci';
$lang['i_retry'] = 'Zkusit znovu';
$lang['i_license'] = 'Vyberte prosím licenci obsahu:';
$lang['i_license_none'] = 'Nezobrazovat žádné licenční informace';
@@ -336,3 +338,7 @@ $lang['media_perm_read'] = 'Bohužel, nemáte práva číst soubory.';
$lang['media_perm_upload'] = 'Bohužel, nemáte práva nahrávat soubory.';
$lang['media_update'] = 'Nahrát novou verzi';
$lang['media_restore'] = 'Obnovit tuto verzi';
+$lang['currentns'] = 'Aktuální jmenný prostor';
+$lang['searchresult'] = 'Výsledek hledání';
+$lang['plainhtml'] = 'Čisté HTML';
+$lang['wikimarkup'] = 'Wiki jazyk';
diff --git a/inc/lang/da/denied.txt b/inc/lang/da/denied.txt
index a4fa8b88f..7bf3b8b9b 100644
--- a/inc/lang/da/denied.txt
+++ b/inc/lang/da/denied.txt
@@ -1,3 +1,3 @@
====== Adgang nægtet! ======
-Du har ikke rettigheder til at fortsætte. Måske er du ikke logget ind.
+Du har ikke rettigheder til at fortsætte.
diff --git a/inc/lang/da/jquery.ui.datepicker.js b/inc/lang/da/jquery.ui.datepicker.js
new file mode 100644
index 000000000..7e42948b3
--- /dev/null
+++ b/inc/lang/da/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['da'] = {
+ closeText: 'Luk',
+ prevText: '&#x3C;Forrige',
+ nextText: 'Næste&#x3E;',
+ currentText: 'Idag',
+ monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+ 'Juli','August','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
+ dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
+ dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
+ weekHeader: 'Uge',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['da']);
+});
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/denied.txt b/inc/lang/de-informal/denied.txt
index 0bc0e59a8..99004f6e1 100644
--- a/inc/lang/de-informal/denied.txt
+++ b/inc/lang/de-informal/denied.txt
@@ -1,4 +1,4 @@
====== Zugang verweigert ======
-Du hast nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. Eventuell bist du nicht am Wiki angemeldet?
+Du hast nicht die erforderliche Berechtigung, um diese Aktion durchzuführen.
diff --git a/inc/lang/de-informal/jquery.ui.datepicker.js b/inc/lang/de-informal/jquery.ui.datepicker.js
new file mode 100644
index 000000000..abe75c4e4
--- /dev/null
+++ b/inc/lang/de-informal/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+ $.datepicker.regional['de'] = {
+ closeText: 'Schließen',
+ prevText: '&#x3C;Zurück',
+ nextText: 'Vor&#x3E;',
+ currentText: 'Heute',
+ monthNames: ['Januar','Februar','März','April','Mai','Juni',
+ 'Juli','August','September','Oktober','November','Dezember'],
+ monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dez'],
+ dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+ dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+ dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+ weekHeader: 'KW',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['de']);
+});
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/denied.txt b/inc/lang/de/denied.txt
index 8efa81f1b..db3343876 100644
--- a/inc/lang/de/denied.txt
+++ b/inc/lang/de/denied.txt
@@ -1,4 +1,4 @@
====== Zugang verweigert ======
-Sie haben nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. Eventuell sind Sie nicht am Wiki angemeldet?
+Sie haben nicht die erforderliche Berechtigung, um diese Aktion durchzuführen.
diff --git a/inc/lang/de/jquery.ui.datepicker.js b/inc/lang/de/jquery.ui.datepicker.js
new file mode 100644
index 000000000..abe75c4e4
--- /dev/null
+++ b/inc/lang/de/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+ $.datepicker.regional['de'] = {
+ closeText: 'Schließen',
+ prevText: '&#x3C;Zurück',
+ nextText: 'Vor&#x3E;',
+ currentText: 'Heute',
+ monthNames: ['Januar','Februar','März','April','Mai','Juni',
+ 'Juli','August','September','Oktober','November','Dezember'],
+ monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dez'],
+ dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+ dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+ dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+ weekHeader: 'KW',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['de']);
+});
diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php
index 9df1035f7..c6f11abc9 100644
--- a/inc/lang/de/lang.php
+++ b/inc/lang/de/lang.php
@@ -23,6 +23,8 @@
* @author Pierre Corell <info@joomla-praxis.de>
* @author Mateng Schimmerlos <mateng@firemail.de>
* @author Benedikt Fey <spam@lifeisgoooood.de>
+ * @author Joerg <scooter22@gmx.de>
+ * @author Simon <st103267@stud.uni-stuttgart.de>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -67,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';
@@ -91,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.';
@@ -252,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';
@@ -265,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';
@@ -345,3 +348,4 @@ $lang['media_restore'] = 'Diese Version wiederherstellen';
$lang['currentns'] = 'Aktueller Namensraum';
$lang['searchresult'] = 'Suchergebnisse';
$lang['plainhtml'] = 'HTML Klartext';
+$lang['wikimarkup'] = 'Wiki Markup';
diff --git a/inc/lang/el/denied.txt b/inc/lang/el/denied.txt
index 36d7ae103..25fcbe8ca 100644
--- a/inc/lang/el/denied.txt
+++ b/inc/lang/el/denied.txt
@@ -2,4 +2,3 @@
Συγγνώμη, αλλά δεν έχετε επαρκή δικαιώματα για την συγκεκριμένη ενέργεια.
-Μήπως παραλείψατε να συνδεθείτε;
diff --git a/inc/lang/el/jquery.ui.datepicker.js b/inc/lang/el/jquery.ui.datepicker.js
new file mode 100644
index 000000000..1ac47561a
--- /dev/null
+++ b/inc/lang/el/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+jQuery(function($){
+ $.datepicker.regional['el'] = {
+ closeText: 'Κλείσιμο',
+ prevText: 'Προηγούμενος',
+ nextText: 'Επόμενος',
+ currentText: 'Τρέχων Μήνας',
+ monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
+ 'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
+ monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
+ 'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
+ dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
+ dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
+ dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
+ weekHeader: 'Εβδ',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['el']);
+});
diff --git a/inc/lang/el/lang.php b/inc/lang/el/lang.php
index 8007f2b23..d97721cdb 100644
--- a/inc/lang/el/lang.php
+++ b/inc/lang/el/lang.php
@@ -11,6 +11,7 @@
* @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
* @author Constantinos Xanthopoulos <conx@xanthopoulos.info>
* @author chris taklis <ctaklis@gmail.com>
+ * @author cross <cross1962@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -240,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'] = 'Ημερομηνία';
@@ -253,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/denied.txt b/inc/lang/en/denied.txt
index 3ac72820c..34cb8456a 100644
--- a/inc/lang/en/denied.txt
+++ b/inc/lang/en/denied.txt
@@ -1,4 +1,4 @@
====== Permission Denied ======
-Sorry, you don't have enough rights to continue. Perhaps you forgot to login?
+Sorry, you don't have enough rights to continue.
diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php
index 17a75803f..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';
@@ -191,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';
@@ -224,7 +231,7 @@ $lang['both_changes'] = 'Both pages and media files';
$lang['qb_bold'] = 'Bold Text';
$lang['qb_italic'] = 'Italic Text';
$lang['qb_underl'] = 'Underlined Text';
-$lang['qb_code'] = 'Code Text';
+$lang['qb_code'] = 'Monospaced Text';
$lang['qb_strike'] = 'Strike-through Text';
$lang['qb_h1'] = 'Level 1 Headline';
$lang['qb_h2'] = 'Level 2 Headline';
@@ -253,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';
@@ -266,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/admin.txt b/inc/lang/eo/admin.txt
index 4b0cf7909..4b3cf0c2a 100644
--- a/inc/lang/eo/admin.txt
+++ b/inc/lang/eo/admin.txt
@@ -1,3 +1,3 @@
====== Administrado ======
-Sube vi povas trovi liston de administraj taskoj disponeblaj en DokuWiki.
+Sube vi trovas liston de administraj taskoj haveblaj en DokuWiki.
diff --git a/inc/lang/eo/adminplugins.txt b/inc/lang/eo/adminplugins.txt
index 769a8c538..bb7e7829b 100644
--- a/inc/lang/eo/adminplugins.txt
+++ b/inc/lang/eo/adminplugins.txt
@@ -1 +1 @@
-===== Eksteraj kromaĵoj ===== \ No newline at end of file
+===== Aldonaj kromaĵoj ===== \ No newline at end of file
diff --git a/inc/lang/eo/denied.txt b/inc/lang/eo/denied.txt
index 3cd6c76bf..e0abba12c 100644
--- a/inc/lang/eo/denied.txt
+++ b/inc/lang/eo/denied.txt
@@ -1,4 +1,4 @@
====== Aliro malpermesita ======
-Vi ne havas sufiĉajn rajtojn rigardi ĉi tiujn paĝojn. Eble vi forgesis identiĝi.
+Vi ne havas sufiĉajn rajtojn daŭrigi.
diff --git a/inc/lang/eo/diff.txt b/inc/lang/eo/diff.txt
index 5829a7db1..3c9db61c8 100644
--- a/inc/lang/eo/diff.txt
+++ b/inc/lang/eo/diff.txt
@@ -1,4 +1,4 @@
====== Diferencoj ======
-Ĉi tie vi povas vidi diferencojn inter la aktuala versio kaj la elektita revizio de la paĝo.
+Tio montras diferencojn inter du versioj de la paĝo.
diff --git a/inc/lang/eo/draft.txt b/inc/lang/eo/draft.txt
index 32ddc83f6..57526f3b5 100644
--- a/inc/lang/eo/draft.txt
+++ b/inc/lang/eo/draft.txt
@@ -1,5 +1,5 @@
====== Skiza dosiero troviĝis ======
-Via lasta sekcio de redakto en tiu ĉi paĝo ne korekte kompletiĝis. DokuWiki aŭtomate konservis skizon dum vi laboris, kiun vi nun povas uzi por daŭrigi vian redaktadon. Sube vi povas vidi la datumaron, kiu konserviĝis el via lasta sekcio.
+Via lasta redaktosesio en tiu ĉi paĝo ne ĝuste kompletiĝis. DokuWiki aŭtomate konservis skizon dum vi laboris, kiun vi nun povas uzi por daŭrigi vian redaktadon. Sube vi povas vidi la datumaron, kiu konserviĝis el via lasta sesio.
Bonvolu decidi ĉu vi volas //restarigi// vian perditan redakton, //forigi// la aŭtomate konservitan skizon aŭ //rezigni// pri la redakta procezo.
diff --git a/inc/lang/eo/edit.txt b/inc/lang/eo/edit.txt
index 29b3382c5..ccc8a613d 100644
--- a/inc/lang/eo/edit.txt
+++ b/inc/lang/eo/edit.txt
@@ -1 +1 @@
-Redaktu paĝon kaj poste premu butonon titolitan '"Konservi'". Bonvolu tralegi la [[wiki:syntax|vikian sintakson]] por kompreni kiel vi povas krei paĝojn. Bonvolu redakti nur se vi planas **plibonigi** la enhavon de la paĝo. Se vi volas nur testi ion, bonvolu uzi specialan paĝon: [[wiki:playground|ludejo]].
+Redaktu paĝon kaj poste premu butonon titolitan '"Konservi'". Bonvolu tralegi la [[wiki:syntax|vikian sintakson]] pri la formatigo. Bonvolu redakti **nur**, se vi povas **plibonigi** la enhavon de la paĝo. Se vi volas nur testi ion, bonvolu uzi specialan paĝon: [[playground:playground|sablokesto]].
diff --git a/inc/lang/eo/editrev.txt b/inc/lang/eo/editrev.txt
index 1640baa91..2e1406b0f 100644
--- a/inc/lang/eo/editrev.txt
+++ b/inc/lang/eo/editrev.txt
@@ -1,2 +1,2 @@
-**Vi laboras kun malnova revizio de la dokumento!** Se vi konservos ĝin, kreiĝos nova kuranta versio kun la sama enhavo.
+**Vi laboras kun malnova revizio de la dokumento!** Se vi konservos ĝin, kreiĝos nova kuranta versio kun tiu enhavo.
----
diff --git a/inc/lang/eo/jquery.ui.datepicker.js b/inc/lang/eo/jquery.ui.datepicker.js
new file mode 100644
index 000000000..39e44fc57
--- /dev/null
+++ b/inc/lang/eo/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+jQuery(function($){
+ $.datepicker.regional['eo'] = {
+ closeText: 'Fermi',
+ prevText: '&#x3C;Anta',
+ nextText: 'Sekv&#x3E;',
+ currentText: 'Nuna',
+ monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
+ 'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aŭg','Sep','Okt','Nov','Dec'],
+ dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
+ dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
+ dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
+ weekHeader: 'Sb',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['eo']);
+});
diff --git a/inc/lang/eo/lang.php b/inc/lang/eo/lang.php
index a543b2571..4a4a52cac 100644
--- a/inc/lang/eo/lang.php
+++ b/inc/lang/eo/lang.php
@@ -37,13 +37,13 @@ $lang['btn_secedit'] = 'Redakti';
$lang['btn_login'] = 'Ensaluti';
$lang['btn_logout'] = 'Elsaluti';
$lang['btn_admin'] = 'Administri';
-$lang['btn_update'] = 'Ĝisdatigi';
+$lang['btn_update'] = 'Aktualigi';
$lang['btn_delete'] = 'Forigi';
$lang['btn_back'] = 'Retroiri';
$lang['btn_backlink'] = 'Retroligoj';
$lang['btn_backtomedia'] = 'Retroiri al elekto de dosiero';
$lang['btn_subscribe'] = 'Aliĝi al paĝaj modifoj';
-$lang['btn_profile'] = 'Ĝisdatigi profilon';
+$lang['btn_profile'] = 'Aktualigi profilon';
$lang['btn_reset'] = 'Rekomenci';
$lang['btn_resendpwd'] = 'Sendi novan pasvorton';
$lang['btn_draft'] = 'Redakti skizon';
@@ -53,7 +53,9 @@ $lang['btn_revert'] = 'Restarigi';
$lang['btn_register'] = 'Registriĝi';
$lang['btn_apply'] = 'Apliki';
$lang['btn_media'] = 'Medio-administrilo';
-$lang['btn_deleteuser'] = 'Forigi mian aliĝon';
+$lang['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';
@@ -81,7 +83,7 @@ $lang['reghere'] = 'Se vi ne havas konton, vi povas akiri ĝin';
$lang['profna'] = 'Tiu ĉi vikio ne ebligas modifon en la profiloj.';
$lang['profnochange'] = 'Neniu ŝanĝo, nenio farinda.';
$lang['profnoempty'] = 'Malplena nomo aŭ retadreso ne estas permesata.';
-$lang['profchanged'] = 'La profilo de la uzanto sukcese ĝisdatiĝis.';
+$lang['profchanged'] = 'La profilo de la uzanto sukcese aktualiĝis.';
$lang['profnodelete'] = 'Tiu ĉi vikio ne subtenas forigo de uzantoj';
$lang['profdeleteuser'] = 'Forigi aliĝon';
$lang['profdeleted'] = 'Via uzant-aliĝo estis forigata de tiu ĉi vikio';
@@ -104,7 +106,7 @@ $lang['txt_filename'] = 'Alŝuti kiel (laŭvole)';
$lang['txt_overwrt'] = 'Anstataŭigi ekzistantan dosieron';
$lang['maxuploadsize'] = 'Alŝuto maks. %s po dosiero.';
$lang['lockedby'] = 'Nune ŝlosita de';
-$lang['lockexpire'] = 'Ŝlosado ĉesos en';
+$lang['lockexpire'] = 'Ŝlosado ĉesos je';
$lang['js']['willexpire'] = 'Vi povos redakti ĉi tiun paĝon post unu minuto.\nSe vi volas nuligi tempokontrolon de la ŝlosado, premu la butonon "Antaŭrigardi".';
$lang['js']['notsavedyet'] = 'Ne konservitaj modifoj perdiĝos.
Ĉu vi certe volas daŭrigi la procezon?';
@@ -184,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';
@@ -293,6 +298,7 @@ $lang['i_policy'] = 'Komenca ACL-a agordo';
$lang['i_pol0'] = 'Malferma Vikio (legi, skribi, alŝuti povas ĉiuj)';
$lang['i_pol1'] = 'Publika Vikio (legi povas ĉiuj, skribi kaj alŝuti povas registritaj uzantoj)';
$lang['i_pol2'] = 'Ferma Vikio (legi, skribi, alŝuti nur povas registritaj uzantoj)';
+$lang['i_allowreg'] = 'Permesi al uzantoj registri sin mem';
$lang['i_retry'] = 'Reprovi';
$lang['i_license'] = 'Bonvolu elekti la permesilon, sub kiun vi volas meti vian enhavon:';
$lang['i_license_none'] = 'Ne montri licencinformojn';
diff --git a/inc/lang/es/denied.txt b/inc/lang/es/denied.txt
index d7b37404b..02a76a8cf 100644
--- a/inc/lang/es/denied.txt
+++ b/inc/lang/es/denied.txt
@@ -1,3 +1,4 @@
====== Permiso Denegado ======
-Lo siento, no tienes suficientes permisos para continuar. ¿Quizás has olvidado identificarte? \ No newline at end of file
+Lo siento, no tienes suficientes permisos para continuar.
+
diff --git a/inc/lang/es/jquery.ui.datepicker.js b/inc/lang/es/jquery.ui.datepicker.js
new file mode 100644
index 000000000..763d4cedd
--- /dev/null
+++ b/inc/lang/es/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['es'] = {
+ closeText: 'Cerrar',
+ prevText: '&#x3C;Ant',
+ nextText: 'Sig&#x3E;',
+ currentText: 'Hoy',
+ monthNames: ['enero','febrero','marzo','abril','mayo','junio',
+ 'julio','agosto','septiembre','octubre','noviembre','diciembre'],
+ monthNamesShort: ['ene','feb','mar','abr','may','jun',
+ 'jul','ogo','sep','oct','nov','dic'],
+ dayNames: ['domingo','lunes','martes','miércoles','jueves','viernes','sábado'],
+ dayNamesShort: ['dom','lun','mar','mié','juv','vie','sáb'],
+ dayNamesMin: ['D','L','M','X','J','V','S'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['es']);
+});
diff --git a/inc/lang/es/lang.php b/inc/lang/es/lang.php
index 216093f6c..9525a4c08 100644
--- a/inc/lang/es/lang.php
+++ b/inc/lang/es/lang.php
@@ -31,6 +31,9 @@
* @author r0sk <r0sk10@gmail.com>
* @author monica <may.dorado@gmail.com>
* @author Antonio Bueno <atnbueno@gmail.com>
+ * @author Juan De La Cruz <juann.dlc@gmail.com>
+ * @author Fernando <fdiezala@gmail.com>
+ * @author Eloy <ej.perezgomez@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -75,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';
@@ -206,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í';
@@ -262,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';
@@ -275,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';
@@ -321,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/adminplugins.txt b/inc/lang/et/adminplugins.txt
new file mode 100644
index 000000000..ee3ffb0a7
--- /dev/null
+++ b/inc/lang/et/adminplugins.txt
@@ -0,0 +1 @@
+===== Täiendavad laiendused ===== \ No newline at end of file
diff --git a/inc/lang/et/denied.txt b/inc/lang/et/denied.txt
index bb564ac57..093ccf4a8 100644
--- a/inc/lang/et/denied.txt
+++ b/inc/lang/et/denied.txt
@@ -1,3 +1,4 @@
====== Sul pole ligipääsuluba ======
-Kahju küll, aga sinu tublidusest ei piisa, et edasi liikuda, selleks on vastavaid õigusi vaja.
+Kahju küll, aga sinu tublidusest ei piisa, et edasi liikuda.
+
diff --git a/inc/lang/et/index.txt b/inc/lang/et/index.txt
index 8d2e25a68..fec211d9b 100644
--- a/inc/lang/et/index.txt
+++ b/inc/lang/et/index.txt
@@ -1,3 +1,3 @@
====== Sisukord ======
-See siin on nimekiri kõigist saadaval olevatest lehtedest järjestatud [[doku>namespaces|alajaotuste]] järgi.
+Alloleavs on loetletud kõik saada olevaist leheküljed, mis on järjestatud [[doku>namespaces|nimeruumi]]de alusel.
diff --git a/inc/lang/et/jquery.ui.datepicker.js b/inc/lang/et/jquery.ui.datepicker.js
new file mode 100644
index 000000000..62cbea8fa
--- /dev/null
+++ b/inc/lang/et/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
+jQuery(function($){
+ $.datepicker.regional['et'] = {
+ closeText: 'Sulge',
+ prevText: 'Eelnev',
+ nextText: 'Järgnev',
+ currentText: 'Täna',
+ monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
+ 'Juuli','August','September','Oktoober','November','Detsember'],
+ monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
+ 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
+ dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
+ dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
+ dayNamesMin: ['P','E','T','K','N','R','L'],
+ weekHeader: 'näd',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['et']);
+});
diff --git a/inc/lang/et/lang.php b/inc/lang/et/lang.php
index cc736db4d..49fc33e17 100644
--- a/inc/lang/et/lang.php
+++ b/inc/lang/et/lang.php
@@ -1,13 +1,15 @@
<?php
+
/**
- * Estonian language file
- *
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
* @author Oliver S6ro <seem.iges@mail.ee>
* @author Aari Juhanson <aari@vmg.vil.ee>
* @author Kaiko Kaur <kaiko@kultuur.edu.ee>
* @author kristian.kankainen@kuu.la
* @author Rivo Zängov <eraser@eraser.ee>
+ * @author Janar Leas <janarleas@gmail.com>
+ * @author Janar Leas <janar.leas@eesti.ee>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -43,11 +45,15 @@ $lang['btn_backtomedia'] = 'Tagasi faili valikusse';
$lang['btn_subscribe'] = 'Jälgi seda lehte (teated meilile)';
$lang['btn_profile'] = 'Minu info';
$lang['btn_reset'] = 'Taasta';
+$lang['btn_resendpwd'] = 'Sea uus salasõna';
$lang['btn_draft'] = 'Toimeta mustandit';
$lang['btn_recover'] = 'Taata mustand';
$lang['btn_draftdel'] = 'Kustuta mustand';
$lang['btn_revert'] = 'Taasta';
$lang['btn_register'] = 'Registreeri uus kasutaja';
+$lang['btn_apply'] = 'Kinnita';
+$lang['btn_media'] = 'Meedia haldur';
+$lang['btn_deleteuser'] = 'Eemalda minu konto';
$lang['loggedinas'] = 'Logis sisse kui';
$lang['user'] = 'Kasutaja';
$lang['pass'] = 'Parool';
@@ -59,8 +65,10 @@ $lang['fullname'] = 'Täielik nimi';
$lang['email'] = 'E-post';
$lang['profile'] = 'Kasutaja info';
$lang['badlogin'] = 'Oops, Sinu kasutajanimi või parool oli vale.';
+$lang['badpassconfirm'] = 'Väär salasõna';
$lang['minoredit'] = 'Ebaolulised muudatused';
$lang['draftdate'] = 'Mustand automaatselt salvestatud';
+$lang['nosecedit'] = 'Leht on vahepeal muutunud, jaotiste teave osutus aegunuks sestap laeti tervelehekülg.';
$lang['regmissing'] = 'Kõik väljad tuleb ära täita.';
$lang['reguexists'] = 'Tegelikult on sellise nimega kasutaja juba olemas.';
$lang['regsuccess'] = 'Kasutaja sai tehtud. Parool saadeti Sulle e-posti aadressil.';
@@ -76,21 +84,30 @@ $lang['profna'] = 'Viki ei toeta profiili muudatusi';
$lang['profnochange'] = 'Muutused puuduvad.';
$lang['profnoempty'] = 'Tühi nimi ega meiliaadress pole lubatud.';
$lang['profchanged'] = 'Kasutaja info edukalt muudetud';
+$lang['profnodelete'] = 'See wiki ei toeta kasutajate kustutamist';
+$lang['profdeleteuser'] = 'Kustuta konto';
+$lang['profdeleted'] = 'Sinu kasutajakonto on sellest wikist kustutatud';
+$lang['profconfdelete'] = 'Soovin sellest wikist oma konnto eemaldada. <br/> See tegevus on taastamatu.';
+$lang['profconfdeletemissing'] = 'Kinnituse valikkast märkimata.';
$lang['pwdforget'] = 'Unustasid parooli? Tee uus';
$lang['resendna'] = 'See wiki ei toeta parooli taassaatmist.';
+$lang['resendpwd'] = 'Sea uus salasõna';
$lang['resendpwdmissing'] = 'Khmm... Sa pead täitma kõik väljad.';
$lang['resendpwdnouser'] = 'Aga sellist kasutajat ei ole.';
$lang['resendpwdbadauth'] = 'See autentimiskood ei ole õige. Kontrolli, et kopeerisid terve lingi.';
$lang['resendpwdconfirm'] = 'Kinnituslink saadeti meilile.';
$lang['resendpwdsuccess'] = 'Uus parool saadeti Sinu meilile.';
+$lang['license'] = 'Kus pole öeldud teisiti, kehtib selle wiki sisule järgmine leping:';
+$lang['licenseok'] = 'Teadmiseks: Toimetades seda lehte, nõustud avaldama oma sisu järgmise lepingu alusel:';
$lang['searchmedia'] = 'Otsi failinime:';
$lang['searchmedia_in'] = 'Otsi %s';
$lang['txt_upload'] = 'Vali fail, mida üles laadida';
$lang['txt_filename'] = 'Siseta oma Wikinimi (soovituslik)';
$lang['txt_overwrt'] = 'Kirjutan olemasoleva faili üle';
+$lang['maxuploadsize'] = 'Üleslaadimiseks lubatu enim %s faili kohta.';
$lang['lockedby'] = 'Praegu on selle lukustanud';
$lang['lockexpire'] = 'Lukustus aegub';
-$lang['js']['willexpire'] = 'Teie lukustus selle lehe toimetamisele aegub umbes minuti pärast.\nIgasugu probleemide vältimiseks kasuta eelvaate nuppu, et lukustusarvesti taas tööle panna.';
+$lang['js']['willexpire'] = 'Teie lukustus selle lehe toimetamisele aegub umbes minuti pärast.\nIgasugu probleemide vältimiseks kasuta eelvaate nuppu, et lukustusarvesti taas tööle panna.';
$lang['js']['notsavedyet'] = 'Sul on seal salvestamata muudatusi, mis kohe kõige kaduva teed lähevad.
Kas Sa ikka tahad edasi liikuda?';
$lang['js']['searchmedia'] = 'Otsi faile';
@@ -122,6 +139,17 @@ Siiski võid kopeerida ja asetada lingi.';
$lang['js']['linkwiz'] = 'Lingi nõustaja';
$lang['js']['linkto'] = 'Lingi:';
$lang['js']['del_confirm'] = 'Kas kustutame selle kirje?';
+$lang['js']['restore_confirm'] = 'Tõesti taastad selle järgu?';
+$lang['js']['media_diff'] = 'Vaatle erisusi:';
+$lang['js']['media_diff_both'] = 'Kõrvuti';
+$lang['js']['media_diff_opacity'] = 'Kuma läbi';
+$lang['js']['media_diff_portions'] = 'Puhasta';
+$lang['js']['media_select'] = 'Vali failid…';
+$lang['js']['media_upload_btn'] = 'Lae üles';
+$lang['js']['media_done_btn'] = 'Valmis';
+$lang['js']['media_drop'] = 'Üleslaadimiseks viska failid siia';
+$lang['js']['media_cancel'] = 'eemalda';
+$lang['js']['media_overwrt'] = 'Asenda olemasolevad failid';
$lang['rssfailed'] = 'Sinu soovitud info ammutamisel tekkis viga: ';
$lang['nothingfound'] = 'Oops, aga mitte muhvigi ei leitud.';
$lang['mediaselect'] = 'Hunnik faile';
@@ -131,6 +159,8 @@ $lang['uploadfail'] = 'Üleslaadimine läks nässu. Äkki pole Sa sel
$lang['uploadwrong'] = 'Ei saa Sa midagi üles laadida. Oops, aga seda tüüpi faili sul lihtsalt ei lubata üles laadida';
$lang['uploadexist'] = 'Fail on juba olemas. Midagi ei muudetud.';
$lang['uploadbadcontent'] = 'Üles laaditu ei sobinud %s faililaiendiga.';
+$lang['uploadspam'] = 'Üleslaadimine tõrjuti rämpssisu vältija poolt.';
+$lang['uploadxss'] = 'Üleslaadimine tõrjuti kahtlase sisu võimaluse tõttu';
$lang['uploadsize'] = 'Üles laaditud fail on liiga suur (maksimaalne suurus on %s).';
$lang['deletesucc'] = 'Fail nimega "%s" sai kustutatud.';
$lang['deletefail'] = 'Faili nimega "%s" ei kustutatud (kontrolli õigusi).';
@@ -141,7 +171,7 @@ $lang['accessdenied'] = 'Ligipääs keelatud.';
$lang['mediausage'] = 'Kasuta järgmist kirjapilti sellele failile viitamaks:';
$lang['mediaview'] = 'Vaata faili algsel kujul.';
$lang['mediaroot'] = 'juur';
-$lang['mediaupload'] = 'Lae fail sellesse nimeruumi (kataloogi). Et tekitada veel alam nimeruum kasuta koolonit Wiki nimes.';
+$lang['mediaupload'] = 'Lae fail sellesse nimeruumi (kataloogi). Loomaks täiendavaid alam-nimeruume, kasuta wiki-nime ja nimeruumide eraldamiseks koolonit.';
$lang['mediaextchange'] = 'Faili laiend .%s-st %s-ks!';
$lang['reference'] = 'Viited';
$lang['ref_inuse'] = 'Seda faili ei saa kustutada, sest teda kasutavad järgmised lehed:';
@@ -155,6 +185,7 @@ $lang['diff'] = 'Näita erinevusi hetkel kehtiva versiooniga';
$lang['diff2'] = 'Näita valitud versioonide erinevusi';
$lang['difflink'] = 'Lõlita võrdlemise vaatele';
$lang['diff_type'] = 'Vaata erinevusi:';
+$lang['diff_inline'] = 'Jooksvalt';
$lang['diff_side'] = 'Kõrvuti';
$lang['line'] = 'Rida';
$lang['breadcrumb'] = 'Käidud rada';
@@ -166,9 +197,22 @@ $lang['created'] = 'tekitatud';
$lang['restored'] = 'vana versioon taastatud (%s)';
$lang['external_edit'] = 'väline muutmine';
$lang['summary'] = 'kokkuvõte muudatustest';
+$lang['noflash'] = 'Sele sisu vaatamisesks on vajalik <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Laiendus</a>.';
+$lang['tools'] = 'Tööriistad';
+$lang['user_tools'] = 'Kasutaja tarvikud';
+$lang['site_tools'] = 'Lehe tööriistad';
+$lang['page_tools'] = 'Lehekülje tarvikud';
+$lang['skip_to_content'] = 'mine sisule';
+$lang['sidebar'] = 'Külgriba';
$lang['mail_newpage'] = 'leht lisatud:';
$lang['mail_changed'] = 'leht muudetud';
+$lang['mail_subscribe_list'] = 'muutunud leheküljed nimeruumis:';
$lang['mail_new_user'] = 'Uus kasutaja:';
+$lang['mail_upload'] = 'üles laetud fail:';
+$lang['changes_type'] = 'Näita mmutuseid';
+$lang['pages_changes'] = 'Leheküljed';
+$lang['media_changes'] = 'Meedia failid';
+$lang['both_changes'] = 'Mõlemid, leheküljed ja meedia failid';
$lang['qb_bold'] = 'Rasvane kiri';
$lang['qb_italic'] = 'Kaldkiri';
$lang['qb_underl'] = 'Alajoonega kiri';
@@ -193,11 +237,12 @@ $lang['qb_media'] = 'Lisa pilte ja muid faile';
$lang['qb_sig'] = 'Lisa allkiri!';
$lang['qb_smileys'] = 'Emotikonid';
$lang['qb_chars'] = 'Erisümbolid';
+$lang['upperns'] = 'mine ülemisse nimeruumi';
$lang['admin_register'] = 'Lisa kasutaja';
$lang['metaedit'] = 'Muuda lisainfot';
$lang['metasaveerr'] = 'Lisainfo salvestamine läks untsu.';
$lang['metasaveok'] = 'Lisainfo salvestatud';
-$lang['img_backto'] = 'Tagasi';
+$lang['btn_img_backto'] = 'Tagasi %s';
$lang['img_title'] = 'Tiitel';
$lang['img_caption'] = 'Kirjeldus';
$lang['img_date'] = 'Kuupäev';
@@ -208,7 +253,26 @@ $lang['img_copyr'] = 'Autoriõigused';
$lang['img_format'] = 'Formaat';
$lang['img_camera'] = 'Kaamera';
$lang['img_keywords'] = 'Võtmesõnad';
+$lang['img_width'] = 'Laius';
+$lang['img_height'] = 'Kõrgus';
+$lang['img_manager'] = 'Näita meediahalduris';
+$lang['subscr_subscribe_success'] = '%s lisati %s tellijaks';
+$lang['subscr_subscribe_error'] = 'Viga %s lisamisel %s tellijaks';
+$lang['subscr_subscribe_noaddress'] = 'Sinu kasutajaga pole seotud ühtegi aadressi, seega ei saa sind tellijaks lisada';
+$lang['subscr_unsubscribe_success'] = '%s eemaldati %s tellijatest';
+$lang['subscr_unsubscribe_error'] = 'Viga %s eemaldamisel %s tellijatest';
+$lang['subscr_already_subscribed'] = '%s on juba %s tellija';
+$lang['subscr_not_subscribed'] = '%s pole %s tellija';
+$lang['subscr_m_not_subscribed'] = 'Sina pole hetkel selle lehekülje ega nimeruumi tellija.';
+$lang['subscr_m_new_header'] = 'Lisa tellimus';
+$lang['subscr_m_current_header'] = 'Hetkel tellitud';
+$lang['subscr_m_unsubscribe'] = 'Eemalda tellimus';
+$lang['subscr_m_subscribe'] = 'Telli';
+$lang['subscr_style_every'] = 'igast toimetamisest teavitab ekiri';
+$lang['subscr_style_digest'] = 'kokkuvõte ekirjaga toimetamistest igal leheküljel (iga %.2f päeva järel)';
+$lang['subscr_style_list'] = 'Peale viimast ekirja (iga %.2f päeva järel) toimetaud lehekülgede loend.';
$lang['authtempfail'] = 'Kasutajate autentimine on ajutiselt rivist väljas. Kui see olukord mõne aja jooksul ei parane, siis teavita sellest serveri haldajat.';
+$lang['authpwdexpire'] = 'Sinu salasõna aegub %päeva pärast, võiksid seda peatselt muuta.';
$lang['i_chooselang'] = 'Vali keel';
$lang['i_installer'] = 'DokuWiki paigaldaja';
$lang['i_wikiname'] = 'Wiki nimi';
@@ -218,9 +282,11 @@ $lang['i_problems'] = 'Paigaldaja leidis mõned vead, mis on allpool
$lang['i_modified'] = 'Õnnetuste vältimiseks läheb see skript käima ainult värskelt paigaldatud ja muutmata Dokuwiki peal.
Sa peaksid ilmselt kogu koodi uuesti lahti pakkima. Vaata ka <a href="http://dokuwiki.org/install">Dokuwiki installeerimis juhendit</a>';
$lang['i_funcna'] = 'PHP funktsiooni <code>%s</code> ei ole olemas.võibolla sinu serveri hooldaja on selle mingil põhjusel keelanud?';
+$lang['i_phpver'] = 'Sinu PHP versioon <code>%s</code> on vanem nõutavast <code>%s</code>. Pead oma paigaldatud PHP-d uuendama.';
$lang['i_permfail'] = 'Dokuwiki ei saa kirjutada faili <code>%s</code>. Kontrolli serveris failide õigused üle.';
$lang['i_confexists'] = '<code>%s</code> on juba olemas';
$lang['i_writeerr'] = 'Faili <code>%s</code> ei lubata tekitada. Kontrolli kataloogi ja faili õigusi.';
+$lang['i_badhash'] = 'Tundmatu või muutunud dokuwiki.php (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - lubamatu või tühi väärtus';
$lang['i_success'] = 'Seadistamine on õnnelikult lõpule viidud. Sa võid nüüd kustutada faili install.php. Alusta oma <a href="doku.php?id=wiki:welcome">uue DokuWiki</a> täitmist.';
$lang['i_failure'] = 'Konfiguratsiooni faili kirjutamisel esines vigu. Võimalik, et pead need käsitsi parandama enne <a href="doku.php?id=wiki:welcome">uue DokuWiki</a> täitma asumist.';
@@ -228,4 +294,45 @@ $lang['i_policy'] = 'Wiki õiguste algne poliitika';
$lang['i_pol0'] = 'Avatud (lugemine, kirjutamine ja üleslaadimine kõigile lubatud)';
$lang['i_pol1'] = 'Avalikuks lugemiseks (lugeda saavad kõik, kirjutada ja üles laadida vaid registreeritud kasutajad)';
$lang['i_pol2'] = 'Suletud (kõik õigused, kaasaarvatud lugemine on lubatud vaid registreeritud kasutajatele)';
+$lang['i_allowreg'] = 'Luba kasutajail endid ise arvele võtta';
$lang['i_retry'] = 'Proovi uuesti';
+$lang['i_license'] = 'Vali leping, mille alusel wiki sisu avaldatakse:';
+$lang['i_license_none'] = 'Ära näita mingit lepingu teavet';
+$lang['i_pop_field'] = 'Aitake meil täiendada DokuWiki kasutuskogemsut:';
+$lang['i_pop_label'] = 'Kord kuus, saada DokuWiki arendajatele anonüümseid kasutus andmeid.';
+$lang['recent_global'] = 'Uurid hetkel nimeruumi <b>%s</b> muudatusi. Võid uurida ka <a href="%s">kogu selle wiki</a> muudatusi.';
+$lang['years'] = '%d aasta eest';
+$lang['months'] = '%d kuu eest';
+$lang['weeks'] = '%d nädala eest';
+$lang['days'] = '%d päeva eest';
+$lang['hours'] = '%d tunni eest';
+$lang['minutes'] = '%d minuti eest';
+$lang['seconds'] = '%d sekundi eest';
+$lang['wordblock'] = 'Sinu toimetus jäeti muutmata tõrjutud teksti tõttu (rämpspost?).';
+$lang['media_uploadtab'] = 'Lae-↑ ';
+$lang['media_searchtab'] = 'Otsi';
+$lang['media_file'] = 'Fail';
+$lang['media_viewtab'] = 'Vaata';
+$lang['media_edittab'] = 'Toimeta';
+$lang['media_historytab'] = 'Ajalugu';
+$lang['media_list_thumbs'] = 'Pisipildid';
+$lang['media_list_rows'] = 'Ridu';
+$lang['media_sort_name'] = 'Nimi';
+$lang['media_sort_date'] = 'Kuupäev';
+$lang['media_namespaces'] = 'Vali nimeruum';
+$lang['media_files'] = 'Failid %s-is';
+$lang['media_upload'] = 'Lae %s-ssi';
+$lang['media_search'] = 'Leia %s-st';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s asub %s-s';
+$lang['media_edit'] = 'Muuda %s-i';
+$lang['media_history'] = '%s ajalugu';
+$lang['media_meta_edited'] = 'toimetati päiseteavet';
+$lang['media_perm_read'] = 'Sul pole piisavaid õigusi failide vaatamiseks';
+$lang['media_perm_upload'] = 'Sul pole piisavaid õigusi failide üleslaadimiseks';
+$lang['media_update'] = 'Lea üles uus järk';
+$lang['media_restore'] = 'Ennista sellele järgule';
+$lang['currentns'] = 'Hetke nimeruum';
+$lang['searchresult'] = 'Otsingu tulemus';
+$lang['plainhtml'] = 'Liht-HTML';
+$lang['wikimarkup'] = 'Wiki märgistus';
diff --git a/inc/lang/et/resetpwd.txt b/inc/lang/et/resetpwd.txt
new file mode 100644
index 000000000..3a802986f
--- /dev/null
+++ b/inc/lang/et/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Sea uus salasõna ======
+
+Sisesta oma selle wiki kasutajale uus salasõna \ No newline at end of file
diff --git a/inc/lang/et/subscr_digest.txt b/inc/lang/et/subscr_digest.txt
new file mode 100644
index 000000000..7446fd9f4
--- /dev/null
+++ b/inc/lang/et/subscr_digest.txt
@@ -0,0 +1,21 @@
+Tere!
+
+Wiki-s @TITLE@ toimetati lehekülge @PAGE@.
+
+Muudatustest lähemalt:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Endine: @OLDPAGE@
+Uus: @NEWPAGE@
+
+Lehekülje teavituste katkestamiseks, sisene wiki-sse aadressil @DOKUWIKIURL@
+ja mine:
+@SUBSCRIBE@
+ning loobu lehekülje ja/või nimeruumi muudatuste teavitustest.
+
+--
+Selle e-kirja lõi DokuWiki aadressilt
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/et/subscr_form.txt b/inc/lang/et/subscr_form.txt
new file mode 100644
index 000000000..61a005b47
--- /dev/null
+++ b/inc/lang/et/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Tellimuste haldus ======
+
+See lehekülg lubab sul hallata oma tellimusi antud leheküljele ja nimeruumile. \ No newline at end of file
diff --git a/inc/lang/et/subscr_list.txt b/inc/lang/et/subscr_list.txt
new file mode 100644
index 000000000..0629651b7
--- /dev/null
+++ b/inc/lang/et/subscr_list.txt
@@ -0,0 +1,19 @@
+Tere!
+
+Wiki-s @TITLE@ toimetati nimeruumi @PAGE@.
+Muudatustest lähemalt:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+Endine: @OLDPAGE@
+Uus: @NEWPAGE@
+
+Lehekülje teavituste katkestamiseks, sisene wiki-sse aadressil @DOKUWIKIURL@
+ja mine:
+@SUBSCRIBE@
+ning loobu lehekülje ja/või nimeruumi muudatuste teavitustest.
+
+--
+Selle e-kirja lõi DokuWiki aadressilt
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/et/subscr_single.txt b/inc/lang/et/subscr_single.txt
new file mode 100644
index 000000000..fff069f65
--- /dev/null
+++ b/inc/lang/et/subscr_single.txt
@@ -0,0 +1,23 @@
+Tere!
+
+Wiki-s @TITLE@ toimetati lehekülge @PAGE@.
+Muudatustest lähemalt:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Kuupäev : @DATE@
+Kasutaja : @USER@
+Kokkuvõte: @SUMMARY@
+Endine: @OLDPAGE@
+Uus: @NEWPAGE@
+
+Lehekülje teavituste katkestamiseks, sisene wiki-sse aadressil @DOKUWIKIURL@
+ja mine:
+@SUBSCRIBE@
+ning loobu lehekülje ja/või nimeruumi muudatuste teavitustest.
+
+--
+Selle e-kirja lõi DokuWiki aadressilt
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/et/uploadmail.txt b/inc/lang/et/uploadmail.txt
new file mode 100644
index 000000000..2d3a6aa7e
--- /dev/null
+++ b/inc/lang/et/uploadmail.txt
@@ -0,0 +1,16 @@
+Sinu DokuWiki-sse lisati fail.
+Lähemalt:
+
+ Fail : @MEDIA@
+ Endine : @OLD@
+ Kuupäev : @DATE@
+ Veebilehitseja : @BROWSER@
+ IP-aadress : @IPADDRESS@
+ Hostinimi : @HOSTNAME@
+ Suurus : @SIZE@
+ MIME liik : @MIME@
+ Kasutaja : @ USER@
+
+--
+Selle e-kirja lõi DokuWiki aadressilt
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/eu/denied.txt b/inc/lang/eu/denied.txt
index 257076a3d..869c4c7d8 100644
--- a/inc/lang/eu/denied.txt
+++ b/inc/lang/eu/denied.txt
@@ -1,3 +1,4 @@
====== Ez duzu baimenik ======
-Barkatu, ez duzu baimenik orri hau ikusteko. Agian sesioa hastea ahaztu zaizu? \ No newline at end of file
+Barkatu, ez duzu baimenik orri hau ikusteko.
+
diff --git a/inc/lang/eu/jquery.ui.datepicker.js b/inc/lang/eu/jquery.ui.datepicker.js
new file mode 100644
index 000000000..a71db2c72
--- /dev/null
+++ b/inc/lang/eu/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+jQuery(function($){
+ $.datepicker.regional['eu'] = {
+ closeText: 'Egina',
+ prevText: '&#x3C;Aur',
+ nextText: 'Hur&#x3E;',
+ currentText: 'Gaur',
+ monthNames: ['urtarrila','otsaila','martxoa','apirila','maiatza','ekaina',
+ 'uztaila','abuztua','iraila','urria','azaroa','abendua'],
+ monthNamesShort: ['urt.','ots.','mar.','api.','mai.','eka.',
+ 'uzt.','abu.','ira.','urr.','aza.','abe.'],
+ dayNames: ['igandea','astelehena','asteartea','asteazkena','osteguna','ostirala','larunbata'],
+ dayNamesShort: ['ig.','al.','ar.','az.','og.','ol.','lr.'],
+ dayNamesMin: ['ig','al','ar','az','og','ol','lr'],
+ weekHeader: 'As',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['eu']);
+});
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/denied.txt b/inc/lang/fa/denied.txt
index 827f73e2b..4bffa0f3c 100644
--- a/inc/lang/fa/denied.txt
+++ b/inc/lang/fa/denied.txt
@@ -1,3 +1,4 @@
====== دسترسی ممکن نیست ======
-شرمنده، شما اجازه‌ی دسترسی ب این صفحه را ندارید. ممکن است فراموش کرده باشید که وارد سایت شوید! \ No newline at end of file
+شرمنده، شما اجازه‌ی دسترسی ب این صفحه را ندارید.
+
diff --git a/inc/lang/fa/jquery.ui.datepicker.js b/inc/lang/fa/jquery.ui.datepicker.js
new file mode 100644
index 000000000..bb957f6d8
--- /dev/null
+++ b/inc/lang/fa/jquery.ui.datepicker.js
@@ -0,0 +1,59 @@
+/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+jQuery(function($) {
+ $.datepicker.regional['fa'] = {
+ closeText: 'بستن',
+ prevText: '&#x3C;قبلی',
+ nextText: 'بعدی&#x3E;',
+ currentText: 'امروز',
+ monthNames: [
+ 'فروردين',
+ 'ارديبهشت',
+ 'خرداد',
+ 'تير',
+ 'مرداد',
+ 'شهريور',
+ 'مهر',
+ 'آبان',
+ 'آذر',
+ 'دی',
+ 'بهمن',
+ 'اسفند'
+ ],
+ monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+ dayNames: [
+ 'يکشنبه',
+ 'دوشنبه',
+ 'سه‌شنبه',
+ 'چهارشنبه',
+ 'پنجشنبه',
+ 'جمعه',
+ 'شنبه'
+ ],
+ dayNamesShort: [
+ 'ی',
+ 'د',
+ 'س',
+ 'چ',
+ 'پ',
+ 'ج',
+ 'ش'
+ ],
+ dayNamesMin: [
+ 'ی',
+ 'د',
+ 'س',
+ 'چ',
+ 'پ',
+ 'ج',
+ 'ش'
+ ],
+ weekHeader: 'هف',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 6,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fa']);
+});
diff --git a/inc/lang/fa/lang.php b/inc/lang/fa/lang.php
index 6cb5164d8..1e819419f 100644
--- a/inc/lang/fa/lang.php
+++ b/inc/lang/fa/lang.php
@@ -10,6 +10,7 @@
* @author Milad DZand <M.DastanZand@gmail.com>
* @author AmirH Hassaneini <mytechmix@gmail.com>
* @author mehrdad <mehrdad.jafari.bojd@gmail.com>
+ * @author reza_khn <reza_khn@yahoo.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'rtl';
@@ -84,6 +85,7 @@ $lang['profnoempty'] = 'نام و آدرس ایمیل باید پر ش
$lang['profchanged'] = 'پروفایل کاربر با موفقیت به روز شد';
$lang['profnodelete'] = 'ویکی توانایی پشتیبانی از حذف کاربران را ندارد';
$lang['profdeleteuser'] = 'حذف حساب کاربری';
+$lang['profdeleted'] = 'حساب کاربری شما حذف گردیده است.';
$lang['pwdforget'] = 'گذرواژه‌ی خود را فراموش کرده‌اید؟ جدید دریافت کنید';
$lang['resendna'] = 'این ویکی ارسال مجدد گذرواژه را پشتیبانی نمی‌کند';
$lang['resendpwd'] = 'تعیین کلمه عبور جدید برای ';
@@ -238,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'] = 'تاریخ';
@@ -251,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/denied.txt b/inc/lang/fi/denied.txt
index cd31da06b..89ebd4830 100644
--- a/inc/lang/fi/denied.txt
+++ b/inc/lang/fi/denied.txt
@@ -1,3 +1,4 @@
====== Lupa evätty ======
-Sinulla ei ole tarpeeksi valtuuksia jatkaa. Ehkä unohdit kirjautua sisään?
+Sinulla ei ole tarpeeksi valtuuksia jatkaa.
+
diff --git a/inc/lang/fi/jquery.ui.datepicker.js b/inc/lang/fi/jquery.ui.datepicker.js
new file mode 100644
index 000000000..e5c554aba
--- /dev/null
+++ b/inc/lang/fi/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri Kilpiö (harrikilpio@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['fi'] = {
+ closeText: 'Sulje',
+ prevText: '&#xAB;Edellinen',
+ nextText: 'Seuraava&#xBB;',
+ currentText: 'Tänään',
+ monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu',
+ 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+ monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä',
+ 'Heinä','Elo','Syys','Loka','Marras','Joulu'],
+ dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'],
+ dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
+ dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
+ weekHeader: 'Vk',
+ dateFormat: 'd.m.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fi']);
+});
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/denied.txt b/inc/lang/fo/denied.txt
index 505b249b4..ecebba88c 100644
--- a/inc/lang/fo/denied.txt
+++ b/inc/lang/fo/denied.txt
@@ -1,3 +1,4 @@
====== Atgongd nokta! ======
-Tú hevur ikki rættindi til at halda áfram. Møguliga hevur tú ikki rita inn.
+Tú hevur ikki rættindi til at halda áfram.
+
diff --git a/inc/lang/fo/jquery.ui.datepicker.js b/inc/lang/fo/jquery.ui.datepicker.js
new file mode 100644
index 000000000..cb0e3def7
--- /dev/null
+++ b/inc/lang/fo/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+jQuery(function($){
+ $.datepicker.regional['fo'] = {
+ closeText: 'Lat aftur',
+ prevText: '&#x3C;Fyrra',
+ nextText: 'Næsta&#x3E;',
+ currentText: 'Í dag',
+ monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
+ 'Juli','August','September','Oktober','November','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Des'],
+ dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
+ dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
+ dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
+ weekHeader: 'Vk',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fo']);
+});
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/denied.txt b/inc/lang/fr/denied.txt
index 20d4d6755..da01a4086 100644
--- a/inc/lang/fr/denied.txt
+++ b/inc/lang/fr/denied.txt
@@ -1,3 +1,4 @@
====== Autorisation refusée ======
-Désolé, vous n'avez pas les droits pour continuer. Peut-être avez-vous oublié de vous identifier ?
+Désolé, vous n'avez pas suffisement d'autorisations pour poursuivre votre demande.
+
diff --git a/inc/lang/fr/jquery.ui.datepicker.js b/inc/lang/fr/jquery.ui.datepicker.js
new file mode 100644
index 000000000..2d06743a6
--- /dev/null
+++ b/inc/lang/fr/jquery.ui.datepicker.js
@@ -0,0 +1,25 @@
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au),
+ Stéphane Nahmani (sholby@sholby.net),
+ Stéphane Raimbault <stephane.raimbault@gmail.com> */
+jQuery(function($){
+ $.datepicker.regional['fr'] = {
+ closeText: 'Fermer',
+ prevText: 'Précédent',
+ nextText: 'Suivant',
+ currentText: 'Aujourd\'hui',
+ monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
+ 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
+ monthNamesShort: ['janv.', 'févr.', 'mars', 'avril', 'mai', 'juin',
+ 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
+ dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
+ dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
+ dayNamesMin: ['D','L','M','M','J','V','S'],
+ weekHeader: 'Sem.',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fr']);
+});
diff --git a/inc/lang/fr/lang.php b/inc/lang/fr/lang.php
index 49f617323..1f11608e6 100644
--- a/inc/lang/fr/lang.php
+++ b/inc/lang/fr/lang.php
@@ -29,6 +29,9 @@
* @author Bruno Veilleux <bruno.vey@gmail.com>
* @author Emmanuel <seedfloyd@gmail.com>
* @author Jérôme Brandt <jeromebrandt@gmail.com>
+ * @author Wild <wild.dagger@free.fr>
+ * @author ggallon <gwenael.gallon@mac.com>
+ * @author David VANTYGHEM <david.vantyghem@free.fr>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -51,17 +54,17 @@ $lang['btn_revs'] = 'Anciennes révisions';
$lang['btn_recent'] = 'Derniers changements';
$lang['btn_upload'] = 'Envoyer';
$lang['btn_cancel'] = 'Annuler';
-$lang['btn_index'] = 'Index';
+$lang['btn_index'] = 'Plan du site';
$lang['btn_secedit'] = 'Modifier';
-$lang['btn_login'] = 'Connexion';
-$lang['btn_logout'] = 'Déconnexion';
+$lang['btn_login'] = 'S\'identifier';
+$lang['btn_logout'] = 'Se déconnecter';
$lang['btn_admin'] = 'Administrer';
$lang['btn_update'] = 'Mettre à jour';
$lang['btn_delete'] = 'Effacer';
$lang['btn_back'] = 'Retour';
$lang['btn_backlink'] = 'Liens vers cette page';
$lang['btn_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';
@@ -69,10 +72,12 @@ $lang['btn_draft'] = 'Modifier le brouillon';
$lang['btn_recover'] = 'Récupérer le brouillon';
$lang['btn_draftdel'] = 'Effacer le brouillon';
$lang['btn_revert'] = 'Restaurer';
-$lang['btn_register'] = 'S\'enregistrer';
+$lang['btn_register'] = 'Créer un compte';
$lang['btn_apply'] = 'Appliquer';
$lang['btn_media'] = 'Gestionnaire de médias';
$lang['btn_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';
@@ -92,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';
@@ -202,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';
@@ -258,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';
@@ -271,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/denied.txt b/inc/lang/gl/denied.txt
index 69408a4f3..ef37a06f0 100644
--- a/inc/lang/gl/denied.txt
+++ b/inc/lang/gl/denied.txt
@@ -1,4 +1,4 @@
====== Permiso Denegado ======
-Sentímolo, mais non tes permisos de abondo para continuares. Pode que esqueceses iniciar a sesión?
+Sentímolo, mais non tes permisos de abondo para continuares.
diff --git a/inc/lang/gl/jquery.ui.datepicker.js b/inc/lang/gl/jquery.ui.datepicker.js
new file mode 100644
index 000000000..59b989a6d
--- /dev/null
+++ b/inc/lang/gl/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+jQuery(function($){
+ $.datepicker.regional['gl'] = {
+ closeText: 'Pechar',
+ prevText: '&#x3C;Ant',
+ nextText: 'Seg&#x3E;',
+ currentText: 'Hoxe',
+ monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
+ 'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
+ monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
+ 'Xul','Ago','Set','Out','Nov','Dec'],
+ dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'],
+ dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'],
+ dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['gl']);
+});
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/denied.txt b/inc/lang/he/denied.txt
index a366fc198..a2e19f3c5 100644
--- a/inc/lang/he/denied.txt
+++ b/inc/lang/he/denied.txt
@@ -1,3 +1,4 @@
====== הרשאה נדחתה ======
-אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך. אולי שכחת להיכנס למערכת? \ No newline at end of file
+אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך.
+
diff --git a/inc/lang/he/jquery.ui.datepicker.js b/inc/lang/he/jquery.ui.datepicker.js
new file mode 100644
index 000000000..b9e8deec5
--- /dev/null
+++ b/inc/lang/he/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+jQuery(function($){
+ $.datepicker.regional['he'] = {
+ closeText: 'סגור',
+ prevText: '&#x3C;הקודם',
+ nextText: 'הבא&#x3E;',
+ currentText: 'היום',
+ monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
+ 'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
+ monthNamesShort: ['ינו','פבר','מרץ','אפר','מאי','יוני',
+ 'יולי','אוג','ספט','אוק','נוב','דצמ'],
+ dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
+ dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+ dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['he']);
+});
diff --git a/inc/lang/he/lang.php b/inc/lang/he/lang.php
index 2c4d758ff..c9a01a193 100644
--- a/inc/lang/he/lang.php
+++ b/inc/lang/he/lang.php
@@ -11,6 +11,8 @@
* @author Yaron Shahrabani <sh.yaron@gmail.com>
* @author Roy Zahor <roy.zahor@gmail.com>
* @author alex <ralexay@gmail.com>
+ * @author matt carroll <matt.carroll@gmail.com>
+ * @author tomer <tomercarolldergicz@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'rtl';
@@ -52,7 +54,9 @@ $lang['btn_recover'] = 'שחזור טיוטה';
$lang['btn_draftdel'] = 'מחיקת טיוטה';
$lang['btn_revert'] = 'שחזור';
$lang['btn_register'] = 'הרשמה';
+$lang['btn_apply'] = 'ליישם';
$lang['btn_media'] = 'מנהל המדיה';
+$lang['btn_deleteuser'] = 'להסיר את החשבון שלי';
$lang['loggedinas'] = 'נכנסת בשם';
$lang['user'] = 'שם משתמש';
$lang['pass'] = 'ססמה';
@@ -81,7 +85,11 @@ $lang['profna'] = 'בוויקי הזה לא ניתן לשנות
$lang['profnochange'] = 'אין שינויים, הפרופיל לא עודכן';
$lang['profnoempty'] = 'השם וכתובת הדוא״ל לא יכולים להיות ריקים';
$lang['profchanged'] = 'הפרופיל עודכן בהצלחה';
+$lang['profnodelete'] = 'ויקי אינה תומכת במחיקת משתמשים';
$lang['profdeleteuser'] = 'הסר חשבון';
+$lang['profdeleted'] = 'חשבון המשתמש שלך נמחק מויקי זה';
+$lang['profconfdelete'] = 'ברצוני להסיר את החשבון שלי מוויקי זה. <br/> לא ניתן לבטל פעולה זו.';
+$lang['profconfdeletemissing'] = 'תיבת אישור אינו מסומן';
$lang['pwdforget'] = 'שכחת את הססמה שלך? ניתן לקבל חדשה';
$lang['resendna'] = 'הוויקי הזה אינו תומך בחידוש ססמה';
$lang['resendpwd'] = 'הגדר סיסמא חדשה בעבור';
@@ -97,6 +105,7 @@ $lang['searchmedia_in'] = 'חיפוש תחת %s';
$lang['txt_upload'] = 'בחירת קובץ להעלות';
$lang['txt_filename'] = 'העלאה בשם (נתון לבחירה)';
$lang['txt_overwrt'] = 'שכתוב על קובץ קיים';
+$lang['maxuploadsize'] = 'העלה מקסימום. s% לכל קובץ.';
$lang['lockedby'] = 'נעול על ידי';
$lang['lockexpire'] = 'הנעילה פגה';
$lang['js']['willexpire'] = 'הנעילה תחלוף עוד זמן קצר. \nלמניעת התנגשויות יש להשתמש בכפתור הרענון מטה כדי לאפס את מד משך הנעילה.';
@@ -133,6 +142,8 @@ $lang['js']['del_confirm'] = 'באמת למחוק?';
$lang['js']['restore_confirm'] = 'באמת לשחזר את הגירסא הזאת?';
$lang['js']['media_diff'] = 'הצגת הבדלים:';
$lang['js']['media_diff_both'] = 'זה לצד זה';
+$lang['js']['media_diff_opacity'] = 'ניקוי דרך';
+$lang['js']['media_diff_portions'] = 'לחבוט';
$lang['js']['media_select'] = 'בחר קבצים...';
$lang['js']['media_upload_btn'] = 'העלאה';
$lang['js']['media_done_btn'] = 'בוצע';
@@ -193,13 +204,16 @@ $lang['user_tools'] = 'כלים של משתמש';
$lang['site_tools'] = 'כלים של אתר';
$lang['page_tools'] = 'כלים של דף';
$lang['skip_to_content'] = 'עבור לתוכן';
+$lang['sidebar'] = 'הסרגל הצידי';
$lang['mail_newpage'] = 'דף נוסף:';
$lang['mail_changed'] = 'דף שונה:';
$lang['mail_subscribe_list'] = 'דפים שהשתנו במרחב השם:';
$lang['mail_new_user'] = 'משתמש חדש:';
$lang['mail_upload'] = 'קובץ הועלה:';
+$lang['changes_type'] = 'צפו בשינויים של';
$lang['pages_changes'] = 'דפים';
$lang['media_changes'] = 'קבצי מדיה';
+$lang['both_changes'] = 'קבצי מדיה ודפים ';
$lang['qb_bold'] = 'טקסט מודגש';
$lang['qb_italic'] = 'טקסט נטוי';
$lang['qb_underl'] = 'טקסט עם קו תחתון';
@@ -229,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'] = 'תאריך';
@@ -242,6 +256,7 @@ $lang['img_camera'] = 'מצלמה';
$lang['img_keywords'] = 'מילות מפתח';
$lang['img_width'] = 'רוחב';
$lang['img_height'] = 'גובה';
+$lang['btn_mediaManager'] = 'צפה במנהל מדיה';
$lang['subscr_subscribe_success'] = '%s נוסף לרשימת המינויים לדף %s';
$lang['subscr_subscribe_error'] = 'אירעה שגיאה בהוספת %s לרשימת המינויים לדף %s';
$lang['subscr_subscribe_noaddress'] = 'אין כתובת המשויכת עם הכניסה שלך, נא ניתן להוסיף אותך לרשימת המינויים';
@@ -259,6 +274,7 @@ $lang['subscr_style_every'] = 'דוא״ל עם כל שינוי';
$lang['subscr_style_digest'] = 'הודעת דוא״ל המציגה את כל השינויים בכל עמוד (בכל %.2f ימים)';
$lang['subscr_style_list'] = 'רשימת השינויים בדפים מאז הודעת הדוא״ל האחרונה (בכל %.2f ימים)';
$lang['authtempfail'] = 'אימות משתמשים אינו זמין כרגע. אם מצב זה נמשך נא ליידע את מנהל הוויקי.';
+$lang['authpwdexpire'] = 'הסיסמה שלך תפוג ב% d ימים, אתה צריך לשנות את זה בקרוב.';
$lang['i_chooselang'] = 'נא לבחור שפה';
$lang['i_installer'] = 'תכנית ההתקנה של DokuWiki';
$lang['i_wikiname'] = 'שם הוויקי';
@@ -269,6 +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_permfail'] = '<code>%s</code> אינה ניתנת לכתיבה על ידי DokuWiki. עליך לשנות הרשאות תיקייה זו!';
$lang['i_confexists'] = '<code>%s</code> כבר קיים';
$lang['i_writeerr'] = 'אין אפשרות ליצור את <code>%s</code>. נא לבדוק את הרשאות הקובץ/תיקייה וליצור את הקובץ ידנית.';
@@ -280,8 +297,12 @@ $lang['i_policy'] = 'מדיניות ACL התחלתית';
$lang['i_pol0'] = 'ויקי פתוח (קריאה, כתיבה והעלאה לכולם)';
$lang['i_pol1'] = ' ויקי ציבורי (קריאה לכולם, כתיבה והעלאה למשתמשים רשומים)';
$lang['i_pol2'] = 'ויקי סגור (קריאה, כתיבה והעלאה למשתמשים רשומים בלבד)';
+$lang['i_allowreg'] = 'אפשר למשתמשים לרשום את עצמם';
$lang['i_retry'] = 'ניסיון נוסף';
$lang['i_license'] = 'נא לבחור את הרישיון שיחול על התוכן שבוויקי שלך:';
+$lang['i_license_none'] = 'אל תציג כל מידע רישיון';
+$lang['i_pop_field'] = 'אנא, עזרו לנו לשפר את חווית ה DokuWiki:';
+$lang['i_pop_label'] = 'פעם בחודש, לשלוח את נתוני שימוש אנונימיים למפתחי DokuWiki';
$lang['recent_global'] = 'נכון לעכשיו מתנהל על ידיך מעקב אחר מרחב השם <b>%s</b>. כמו כן, באפשרותך <a href="%s">לצפות בשינויים האחרונים בוויקי כולו</a>.';
$lang['years'] = 'לפני %d שנים';
$lang['months'] = 'לפני %d חודשים';
@@ -291,12 +312,16 @@ $lang['hours'] = 'לפני %d שעות';
$lang['minutes'] = 'לפני %d דקות';
$lang['seconds'] = 'לפני %d שניות';
$lang['wordblock'] = 'השינויים שלך לא נשמרו כיוון שהם מכילים טקסט חסום (ספאם).';
+$lang['media_uploadtab'] = 'להעלות';
$lang['media_searchtab'] = 'חיפוש';
$lang['media_file'] = 'קובץ';
$lang['media_viewtab'] = 'תצוגה';
$lang['media_edittab'] = 'עריכה';
$lang['media_historytab'] = 'היסטוריה';
+$lang['media_list_thumbs'] = 'תמונות ממוזערות';
$lang['media_list_rows'] = 'שורות';
$lang['media_sort_name'] = 'שם';
$lang['media_sort_date'] = 'תאריך';
$lang['media_namespaces'] = 'בחר מרחב שמות';
+$lang['media_files'] = 'קבצים ב s%';
+$lang['media_upload'] = 'להעלות s%';
diff --git a/inc/lang/hi/jquery.ui.datepicker.js b/inc/lang/hi/jquery.ui.datepicker.js
new file mode 100644
index 000000000..6c563b997
--- /dev/null
+++ b/inc/lang/hi/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Hindi initialisation for the jQuery UI date picker plugin. */
+/* Written by Michael Dawart. */
+jQuery(function($){
+ $.datepicker.regional['hi'] = {
+ closeText: 'बंद',
+ prevText: 'पिछला',
+ nextText: 'अगला',
+ currentText: 'आज',
+ monthNames: ['जनवरी ','फरवरी','मार्च','अप्रेल','मई','जून',
+ 'जूलाई','अगस्त ','सितम्बर','अक्टूबर','नवम्बर','दिसम्बर'],
+ monthNamesShort: ['जन', 'फर', 'मार्च', 'अप्रेल', 'मई', 'जून',
+ 'जूलाई', 'अग', 'सित', 'अक्ट', 'नव', 'दि'],
+ dayNames: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],
+ dayNamesShort: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
+ dayNamesMin: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
+ weekHeader: 'हफ्ता',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hi']);
+});
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/denied.txt b/inc/lang/hr/denied.txt
index 216eea582..172b0fc92 100644
--- a/inc/lang/hr/denied.txt
+++ b/inc/lang/hr/denied.txt
@@ -2,4 +2,3 @@
Nemate autorizaciju.
-Niste li se možda zaboravili prijaviti u aplikaciju?
diff --git a/inc/lang/hr/jquery.ui.datepicker.js b/inc/lang/hr/jquery.ui.datepicker.js
new file mode 100644
index 000000000..2fe37b64b
--- /dev/null
+++ b/inc/lang/hr/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+jQuery(function($){
+ $.datepicker.regional['hr'] = {
+ closeText: 'Zatvori',
+ prevText: '&#x3C;',
+ nextText: '&#x3E;',
+ currentText: 'Danas',
+ monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
+ 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
+ monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
+ 'Srp','Kol','Ruj','Lis','Stu','Pro'],
+ dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+ dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+ dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+ weekHeader: 'Tje',
+ dateFormat: 'dd.mm.yy.',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hr']);
+});
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-formal/admin.txt b/inc/lang/hu-formal/admin.txt
new file mode 100644
index 000000000..b661bfb17
--- /dev/null
+++ b/inc/lang/hu-formal/admin.txt
@@ -0,0 +1,3 @@
+===== Beállítások =====
+
+Alább találja a DokuWiki-ben elérhető beállítási lehetőségek listáját. \ No newline at end of file
diff --git a/inc/lang/hu-formal/adminplugins.txt b/inc/lang/hu-formal/adminplugins.txt
new file mode 100644
index 000000000..b077521fb
--- /dev/null
+++ b/inc/lang/hu-formal/adminplugins.txt
@@ -0,0 +1 @@
+===== További bővítmények ===== \ No newline at end of file
diff --git a/inc/lang/hu-formal/backlinks.txt b/inc/lang/hu-formal/backlinks.txt
new file mode 100644
index 000000000..437eb2e25
--- /dev/null
+++ b/inc/lang/hu-formal/backlinks.txt
@@ -0,0 +1,3 @@
+====== Hivatkozások ======
+
+Mindazon oldalak listája, amelyek az aktuális oldalra hivatkoznak. \ No newline at end of file
diff --git a/inc/lang/hu-formal/conflict.txt b/inc/lang/hu-formal/conflict.txt
new file mode 100644
index 000000000..6718d67e6
--- /dev/null
+++ b/inc/lang/hu-formal/conflict.txt
@@ -0,0 +1,5 @@
+====== Újabb változat érhető el ======
+
+Az Ön által szerkesztett oldalnak már egy újabb változata érhető el. Ez akkor fordulhat elő, ha egy másik felhasználó módosította a dokumtemot, mialatt Ön is szerkesztette azt.
+
+Vizsgálja meg az alább látható eltéréseket, majd döntse el, melyik változatot tartja meg. Ha a "Mentés" gombot választja, az Ön verziója mentődik el. Kattintson a "Mégsem" gombra a jelenlegi változat megtartásához. \ No newline at end of file
diff --git a/inc/lang/hu-formal/denied.txt b/inc/lang/hu-formal/denied.txt
new file mode 100644
index 000000000..d56a18117
--- /dev/null
+++ b/inc/lang/hu-formal/denied.txt
@@ -0,0 +1,4 @@
+====== Hozzáférés megtadadva ======
+
+Sajnáljuk, de nincs joga a folytatáshoz.
+
diff --git a/inc/lang/hu-formal/diff.txt b/inc/lang/hu-formal/diff.txt
new file mode 100644
index 000000000..f922a504a
--- /dev/null
+++ b/inc/lang/hu-formal/diff.txt
@@ -0,0 +1,3 @@
+====== Eltérések ======
+
+Az oldal két változata közötti különbségek az alábbiak. \ No newline at end of file
diff --git a/inc/lang/hu-formal/draft.txt b/inc/lang/hu-formal/draft.txt
new file mode 100644
index 000000000..9233eacad
--- /dev/null
+++ b/inc/lang/hu-formal/draft.txt
@@ -0,0 +1,5 @@
+===== Piszkozatot találtam =====
+
+Az Ön ezen az oldalon végzett utolsó szerkesztési művelete helytelenül fejeződött be. A DokuWiki automatikusan elmentett egy piszkozatot az Ön munkája során. Alább láthatók az utolsó munkafázis mentett adatai.
+
+Kérjük, döntse el, hogy //helyreállítja-e// a befejezetlen módosításokat, vagy //törli// az automatikusan mentett piszkozatot, vagy //megszakítja// a szerkesztési folyamatot. \ No newline at end of file
diff --git a/inc/lang/hu-formal/edit.txt b/inc/lang/hu-formal/edit.txt
new file mode 100644
index 000000000..08f648ba6
--- /dev/null
+++ b/inc/lang/hu-formal/edit.txt
@@ -0,0 +1 @@
+Módosítsa az oldalt, majd kattintson a "Mentés" gombra. A wiki-szintaxishoz nézze meg a [[wiki:syntax|szintaxis]] oldalt. Kérjük, csak akkor módosítsa az oldalt, ha **tökéletesíteni**, **javítani** tudja. Amennyiben szeretne kipróbálni ezt-azt, a [[playground:playground|játszótéren]] megtanulhatja az első lépéseket. \ No newline at end of file
diff --git a/inc/lang/hu-formal/editrev.txt b/inc/lang/hu-formal/editrev.txt
new file mode 100644
index 000000000..2eca33c7a
--- /dev/null
+++ b/inc/lang/hu-formal/editrev.txt
@@ -0,0 +1,2 @@
+**A dokumentum egy korábbi változatát töltötte be!** Ha az oldalt elmenti, akkor egy új változat jön létre belőle.
+---- \ No newline at end of file
diff --git a/inc/lang/hu-formal/index.txt b/inc/lang/hu-formal/index.txt
new file mode 100644
index 000000000..0f2b18fd2
--- /dev/null
+++ b/inc/lang/hu-formal/index.txt
@@ -0,0 +1,3 @@
+====== Oldaltérkép (tartalom) ======
+
+Az összes elérhető oldal [[doku>namespaces|névterek]] szerint rendezett oldaltérképe. \ No newline at end of file
diff --git a/inc/lang/hu-formal/lang.php b/inc/lang/hu-formal/lang.php
new file mode 100644
index 000000000..a98bdc0d3
--- /dev/null
+++ b/inc/lang/hu-formal/lang.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Marina Vladi <deldadam@gmail.com>
+ */
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['doublequoteopening'] = '„';
+$lang['doublequoteclosing'] = '”';
+$lang['singlequoteopening'] = '‚';
+$lang['singlequoteclosing'] = '’';
+$lang['apostrophe'] = '’';
+$lang['btn_edit'] = 'Oldal módosítása';
+$lang['btn_source'] = 'Forrás megtekintése';
+$lang['btn_show'] = 'Oldal megtekintése';
+$lang['btn_create'] = 'Oldal létrehozása';
+$lang['btn_search'] = 'Keresés';
+$lang['btn_save'] = 'Mentés';
+$lang['btn_preview'] = 'Előnézet';
+$lang['btn_top'] = 'Oldal tetejére';
+$lang['btn_newer'] = '<< újabb';
+$lang['btn_older'] = 'régebbi >>';
+$lang['btn_revs'] = 'Korábbi változatok';
+$lang['btn_recent'] = 'Legújabb változások';
+$lang['btn_upload'] = 'Feltöltés';
diff --git a/inc/lang/hu/denied.txt b/inc/lang/hu/denied.txt
index 0b06724df..922cbb895 100644
--- a/inc/lang/hu/denied.txt
+++ b/inc/lang/hu/denied.txt
@@ -1,4 +1,4 @@
====== Hozzáférés megtagadva ======
-Sajnáljuk, nincs jogod a folytatáshoz. Esetleg elfelejtettél bejelentkezni?
+Sajnáljuk, nincs jogod a folytatáshoz.
diff --git a/inc/lang/hu/jquery.ui.datepicker.js b/inc/lang/hu/jquery.ui.datepicker.js
new file mode 100644
index 000000000..b28c268c1
--- /dev/null
+++ b/inc/lang/hu/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Hungarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
+jQuery(function($){
+ $.datepicker.regional['hu'] = {
+ closeText: 'bezár',
+ prevText: 'vissza',
+ nextText: 'előre',
+ currentText: 'ma',
+ monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június',
+ 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
+ monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
+ 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+ dayNames: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+ dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
+ dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+ weekHeader: 'Hét',
+ dateFormat: 'yy.mm.dd.',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hu']);
+});
diff --git a/inc/lang/hu/lang.php b/inc/lang/hu/lang.php
index 2622934c2..ad70438d9 100644
--- a/inc/lang/hu/lang.php
+++ b/inc/lang/hu/lang.php
@@ -12,6 +12,7 @@
* @author David Szabo <szabo.david@gyumolcstarhely.hu>
* @author Marton Sebok <sebokmarton@gmail.com>
* @author Serenity87HUN <anikototh87@gmail.com>
+ * @author Marina Vladi <deldadam@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -242,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';
@@ -255,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';
@@ -295,6 +296,7 @@ $lang['i_policy'] = 'Kezdeti hozzáférési lista házirend';
$lang['i_pol0'] = 'Nyitott wiki (mindenki olvashatja, írhatja és fájlokat tölthet fel)';
$lang['i_pol1'] = 'Publikus wiki (mindenki olvashatja, de csak regisztrált felhasználók írhatják és tölthetnek fel fájlokat)';
$lang['i_pol2'] = 'Zárt wiki (csak regisztrált felhasználók olvashatják, írhatják és tölthetnek fel fájlokat)';
+$lang['i_allowreg'] = 'A felhasználók saját maguk is regisztrálhatnak';
$lang['i_retry'] = 'Újra';
$lang['i_license'] = 'Kérlek, válassz licencet a feltöltött tartalomhoz:';
$lang['i_license_none'] = 'Ne jelenítsen meg licenc információt';
@@ -332,3 +334,7 @@ $lang['media_perm_read'] = 'Sajnáljuk, nincs jogod a fájlok olvasásáho
$lang['media_perm_upload'] = 'Sajnáljuk, nincs jogod a feltöltéshez.';
$lang['media_update'] = 'Új verzió feltöltése';
$lang['media_restore'] = 'Ezen verzió visszaállítása';
+$lang['currentns'] = 'Aktuális névtér';
+$lang['searchresult'] = 'Keresés eredménye';
+$lang['plainhtml'] = 'Sima HTML';
+$lang['wikimarkup'] = 'Wiki-jelölőnyelv';
diff --git a/inc/lang/ia/denied.txt b/inc/lang/ia/denied.txt
index 044e1532d..82f2fc668 100644
--- a/inc/lang/ia/denied.txt
+++ b/inc/lang/ia/denied.txt
@@ -1,3 +1,4 @@
====== Permission refusate ======
-Pardono, tu non ha le derectos requisite pro continuar. Pote esser que tu ha oblidate de aperir un session. \ No newline at end of file
+Pardono, tu non ha le derectos requisite pro continuar.
+
diff --git a/inc/lang/ia/lang.php b/inc/lang/ia/lang.php
index 144dfe33b..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/adminplugins.txt b/inc/lang/id/adminplugins.txt
new file mode 100644
index 000000000..2a91b3d1a
--- /dev/null
+++ b/inc/lang/id/adminplugins.txt
@@ -0,0 +1 @@
+=====Plugin Tambahan===== \ No newline at end of file
diff --git a/inc/lang/id/denied.txt b/inc/lang/id/denied.txt
index bad8f24a6..ff09c13c4 100644
--- a/inc/lang/id/denied.txt
+++ b/inc/lang/id/denied.txt
@@ -1,4 +1,4 @@
====== Akses Ditolak ======
-Maaf, Anda tidak mempunyai hak akses untuk melanjutkan. Apakah Anda belum login?
+Maaf, Anda tidak mempunyai hak akses untuk melanjutkan.
diff --git a/inc/lang/id/jquery.ui.datepicker.js b/inc/lang/id/jquery.ui.datepicker.js
new file mode 100644
index 000000000..6327fa60c
--- /dev/null
+++ b/inc/lang/id/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['id'] = {
+ closeText: 'Tutup',
+ prevText: '&#x3C;mundur',
+ nextText: 'maju&#x3E;',
+ currentText: 'hari ini',
+ monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
+ 'Juli','Agustus','September','Oktober','Nopember','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+ 'Jul','Agus','Sep','Okt','Nop','Des'],
+ dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
+ dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
+ dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
+ weekHeader: 'Mg',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['id']);
+});
diff --git a/inc/lang/id/lang.php b/inc/lang/id/lang.php
index 3d99c9a22..481ff2fbd 100644
--- a/inc/lang/id/lang.php
+++ b/inc/lang/id/lang.php
@@ -7,6 +7,8 @@
* @author Irwan Butar Butar <irwansah.putra@gmail.com>
* @author Yustinus Waruwu <juswaruwu@gmail.com>
* @author zamroni <therons@ymail.com>
+ * @author umriya afini <bigdream.power@gmail.com>
+ * @author Arif Budiman <me@kangarif.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -42,9 +44,17 @@ $lang['btn_backtomedia'] = 'Kembali ke Pilihan Mediafile';
$lang['btn_subscribe'] = 'Ikuti Perubahan';
$lang['btn_profile'] = 'Ubah Profil';
$lang['btn_reset'] = 'Reset';
+$lang['btn_resendpwd'] = 'Atur password baru';
$lang['btn_draft'] = 'Edit draft';
+$lang['btn_recover'] = 'Cadangkan draf';
$lang['btn_draftdel'] = 'Hapus draft';
+$lang['btn_revert'] = 'Kembalikan';
$lang['btn_register'] = 'Daftar';
+$lang['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';
@@ -56,6 +66,7 @@ $lang['fullname'] = 'Nama lengkap';
$lang['email'] = 'E-Mail';
$lang['profile'] = 'Profil User';
$lang['badlogin'] = 'Maaf, username atau password salah.';
+$lang['badpassconfirm'] = 'Maaf, password salah';
$lang['minoredit'] = 'Perubahan Minor';
$lang['draftdate'] = 'Simpan draft secara otomatis';
$lang['regmissing'] = 'Maaf, Anda harus mengisi semua field.';
@@ -71,25 +82,71 @@ $lang['profna'] = 'Wiki ini tidak mengijinkan perubahan profil.';
$lang['profnochange'] = 'Tidak ada perubahan.';
$lang['profnoempty'] = 'Mohon mengisikan nama atau alamat email.';
$lang['profchanged'] = 'Profil User berhasil diubah.';
+$lang['profnodelete'] = 'Wiki ini tidak mendukung penghapusan pengguna';
+$lang['profdeleteuser'] = 'Hapus Akun';
+$lang['profdeleted'] = 'Akun anda telah dihapus dari wiki ini';
+$lang['profconfdelete'] = 'Saya berharap menghapus akun saya dari wiki ini.
+Aksi ini tidak bisa diselesaikan.';
+$lang['profconfdeletemissing'] = 'Knfirmasi check box tidak tercentang';
$lang['pwdforget'] = 'Lupa Password? Dapatkan yang baru';
$lang['resendna'] = 'Wiki ini tidak mendukung pengiriman ulang password.';
+$lang['resendpwd'] = 'Atur password baru';
$lang['resendpwdmissing'] = 'Maaf, Anda harus mengisikan semua field.';
$lang['resendpwdnouser'] = 'Maaf, user ini tidak ditemukan.';
$lang['resendpwdbadauth'] = 'Maaf, kode autentikasi tidak valid. Pastikan Anda menggunakan keseluruhan link konfirmasi.';
$lang['resendpwdconfirm'] = 'Link konfirmasi telah dikirim melalui email.';
$lang['resendpwdsuccess'] = 'Password baru Anda telah dikirim melalui email.';
+$lang['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.';
$lang['js']['notsavedyet'] = 'Perubahan yang belum disimpan akan hilang.\nYakin akan dilanjutkan?';
+$lang['js']['searchmedia'] = 'Cari file';
$lang['js']['keepopen'] = 'Biarkan window terbuka dalam pemilihan';
$lang['js']['hidedetails'] = 'Sembunyikan detil';
+$lang['js']['mediatitle'] = 'Pengaturan Link';
+$lang['js']['mediadisplay'] = 'Jenis tautan';
+$lang['js']['mediaalign'] = 'Perataan';
+$lang['js']['mediasize'] = 'Ukuran gambar';
+$lang['js']['mediatarget'] = 'Tautan tujuan';
+$lang['js']['mediaclose'] = 'Tutup';
+$lang['js']['mediainsert'] = 'Sisip';
+$lang['js']['mediadisplayimg'] = 'Lihat gambar';
+$lang['js']['mediadisplaylnk'] = 'Lihat hanya link';
+$lang['js']['mediasmall'] = 'Versi kecil';
+$lang['js']['mediamedium'] = 'Versi sedang';
+$lang['js']['medialarge'] = 'Versi besar';
+$lang['js']['mediaoriginal'] = 'Versi asli';
+$lang['js']['medialnk'] = 'Tautan ke halaman rincian';
+$lang['js']['mediadirect'] = 'Tautan langsung ke aslinya';
+$lang['js']['medianolnk'] = 'Tanpa tautan';
+$lang['js']['medianolink'] = 'Jangan tautkan gambar';
+$lang['js']['medialeft'] = 'Rata gambar sebelah kiri';
+$lang['js']['mediaright'] = 'Rata gambar sebelah kanan';
+$lang['js']['mediacenter'] = 'Rata gambar di tengah';
+$lang['js']['medianoalign'] = 'Jangan gunakan perataan';
$lang['js']['nosmblinks'] = 'Link ke share Windows hanya bekerja di Microsoft Internet Explorer.
Anda masih dapat mengcopy and paste linknya.';
+$lang['js']['linkwiz'] = 'Wizard Tautan';
+$lang['js']['linkto'] = 'Tautkan ke:';
$lang['js']['del_confirm'] = 'Hapus tulisan ini?';
+$lang['js']['restore_confirm'] = 'Benar-benar ingin mengembalikan versi ini?';
+$lang['js']['media_diff'] = 'Lihat perbedaan:';
+$lang['js']['media_diff_both'] = 'Berdampingan';
+$lang['js']['media_diff_opacity'] = 'Mencolok';
+$lang['js']['media_select'] = 'Pilih file...';
+$lang['js']['media_upload_btn'] = 'Unggah';
+$lang['js']['media_done_btn'] = 'Selesai';
+$lang['js']['media_drop'] = 'Tarik file disini untuk mengunggah';
+$lang['js']['media_cancel'] = 'Buang';
+$lang['js']['media_overwrt'] = 'Timpa berkas yang ada';
$lang['rssfailed'] = 'Error terjadi saat mengambil feed: ';
$lang['nothingfound'] = 'Tidak menemukan samasekali.';
$lang['mediaselect'] = 'Pilihan Mediafile';
@@ -101,11 +158,13 @@ $lang['uploadexist'] = 'File telah ada. Tidak mengerjakan apa-apa.';
$lang['uploadbadcontent'] = 'Isi file yang diupload tidak cocok dengan ekstensi file %s.';
$lang['uploadspam'] = 'File yang diupload diblok oleh spam blacklist.';
$lang['uploadxss'] = 'File yang diupload diblok karena kemungkinan isi yang berbahaya.';
+$lang['uploadsize'] = 'File yang diupload terlalu besar. (max.%)';
$lang['deletesucc'] = 'File "%s" telah dihapus.';
$lang['deletefail'] = '"%s" tidak dapat dihapus - cek hak aksesnya.';
$lang['mediainuse'] = 'File "%s" belum dihapus - file ini sedang digunakan.';
$lang['namespaces'] = 'Namespaces';
$lang['mediafiles'] = 'File tersedia didalam';
+$lang['accessdenied'] = 'Anda tidak diperbolehkan melihat halaman ini';
$lang['mediausage'] = 'Gunakan sintaks berikut untuk me-refer ke file ini';
$lang['mediaview'] = 'Tampilkan file asli';
$lang['mediaroot'] = 'root';
@@ -121,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';
@@ -131,10 +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';
@@ -145,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';
@@ -154,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';
@@ -169,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';
@@ -189,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/jquery.ui.datepicker.js b/inc/lang/is/jquery.ui.datepicker.js
new file mode 100644
index 000000000..4fc429888
--- /dev/null
+++ b/inc/lang/is/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+jQuery(function($){
+ $.datepicker.regional['is'] = {
+ closeText: 'Loka',
+ prevText: '&#x3C; Fyrri',
+ nextText: 'Næsti &#x3E;',
+ currentText: 'Í dag',
+ monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní',
+ 'Júlí','Ágúst','September','Október','Nóvember','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún',
+ 'Júl','Ágú','Sep','Okt','Nóv','Des'],
+ dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'],
+ dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'],
+ dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'],
+ weekHeader: 'Vika',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['is']);
+});
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/denied.txt b/inc/lang/it/denied.txt
index d21956a5b..577d081ce 100644
--- a/inc/lang/it/denied.txt
+++ b/inc/lang/it/denied.txt
@@ -1,5 +1,4 @@
====== Accesso negato ======
-Non hai i diritti per continuare. Forse hai dimenticato di effettuare l'accesso?
-
+Non hai i diritti per continuare.
diff --git a/inc/lang/it/jquery.ui.datepicker.js b/inc/lang/it/jquery.ui.datepicker.js
new file mode 100644
index 000000000..a01f043f8
--- /dev/null
+++ b/inc/lang/it/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['it'] = {
+ closeText: 'Chiudi',
+ prevText: '&#x3C;Prec',
+ nextText: 'Succ&#x3E;',
+ currentText: 'Oggi',
+ monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
+ 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
+ monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
+ 'Lug','Ago','Set','Ott','Nov','Dic'],
+ dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'],
+ dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
+ dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['it']);
+});
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/denied.txt b/inc/lang/ja/denied.txt
index d170aebe4..98ccb2f5a 100644
--- a/inc/lang/ja/denied.txt
+++ b/inc/lang/ja/denied.txt
@@ -1,4 +1,4 @@
====== アクセスが拒否されました ======
-実行する権限がありません。ログインされているか確認してください。
+実行する権限がありません。
diff --git a/inc/lang/ja/jquery.ui.datepicker.js b/inc/lang/ja/jquery.ui.datepicker.js
new file mode 100644
index 000000000..4d0b63c77
--- /dev/null
+++ b/inc/lang/ja/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+jQuery(function($){
+ $.datepicker.regional['ja'] = {
+ closeText: '閉じる',
+ prevText: '&#x3C;前',
+ nextText: '次&#x3E;',
+ currentText: '今日',
+ monthNames: ['1月','2月','3月','4月','5月','6月',
+ '7月','8月','9月','10月','11月','12月'],
+ monthNamesShort: ['1月','2月','3月','4月','5月','6月',
+ '7月','8月','9月','10月','11月','12月'],
+ dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
+ dayNamesShort: ['日','月','火','水','木','金','土'],
+ dayNamesMin: ['日','月','火','水','木','金','土'],
+ weekHeader: '週',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['ja']);
+});
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/jquery.ui.datepicker.js b/inc/lang/kk/jquery.ui.datepicker.js
new file mode 100644
index 000000000..dcd6a65df
--- /dev/null
+++ b/inc/lang/kk/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['kk'] = {
+ closeText: 'Жабу',
+ prevText: '&#x3C;Алдыңғы',
+ nextText: 'Келесі&#x3E;',
+ currentText: 'Бүгін',
+ monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
+ 'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
+ monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау',
+ 'Шіл','Там','Қыр','Қаз','Қар','Жел'],
+ dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'],
+ dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'],
+ dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'],
+ weekHeader: 'Не',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['kk']);
+});
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/denied.txt b/inc/lang/km/denied.txt
index 58b10ee86..be0371498 100644
--- a/inc/lang/km/denied.txt
+++ b/inc/lang/km/denied.txt
@@ -1,3 +1,4 @@
====== បដិសេធអនុញ្ញាត ======
+
សូមទុស អ្នកគ្មានអនុញ្ញាតទៅបណ្តទេ។
diff --git a/inc/lang/km/jquery.ui.datepicker.js b/inc/lang/km/jquery.ui.datepicker.js
new file mode 100644
index 000000000..f9c4e3a02
--- /dev/null
+++ b/inc/lang/km/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Khmer initialisation for the jQuery calendar extension. */
+/* Written by Chandara Om (chandara.teacher@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['km'] = {
+ closeText: 'ធ្វើ​រួច',
+ prevText: 'មុន',
+ nextText: 'បន្ទាប់',
+ currentText: 'ថ្ងៃ​នេះ',
+ monthNames: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា',
+ 'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'],
+ monthNamesShort: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា',
+ 'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'],
+ dayNames: ['អាទិត្យ', 'ចន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'],
+ dayNamesShort: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'],
+ dayNamesMin: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'],
+ weekHeader: 'សប្ដាហ៍',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['km']);
+});
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/denied.txt b/inc/lang/ko/denied.txt
index cf0b294a4..a4b94be65 100644
--- a/inc/lang/ko/denied.txt
+++ b/inc/lang/ko/denied.txt
@@ -1,3 +1,4 @@
====== 권한 거절 ======
-죄송하지만 계속할 수 있는 권한이 없습니다. 로그인을 잊으셨나요? \ No newline at end of file
+죄송하지만 계속할 수 있는 권한이 없습니다.
+
diff --git a/inc/lang/ko/install.html b/inc/lang/ko/install.html
index 886ed2d30..ecc0d3caa 100644
--- a/inc/lang/ko/install.html
+++ b/inc/lang/ko/install.html
@@ -1,10 +1,22 @@
-<p>이 페이지는 <a href="http://dokuwiki.org">Dokuwiki</a> 설치와 환경 설정을 도와줍니다.
-설치 과정에 대한 더 자세한 정보는 <a href="http://dokuwiki.org/ko:installer">관련 문서</a>를 참고하시기 바랍니다.</p>
+<p>이 페이지는 <a href="http://dokuwiki.org">도쿠위키</a>의 첫
+설치와 환경 설정을 도와줍니다. 이 설치 프로그램에 대한 자세한 정보는
+<a href="http://dokuwiki.org/ko:installer">설명문 페이지</a>에서
+볼 수 있습니다.</p>
-<p>DokuWiki는 위키 문서와 문서와 관련된 정보(예를 들어 그림, 검색 색인, 이전 판 문서)를 저장하기 위해 일반적인 텍스트 파일을 사용합니다. 정상적으로 DokuWiki를 사용하려면 이 파일을 담고 있는 디렉토리에 대한 쓰기 권한을 가지고 있어야 합니다.
-현재 설치 과정 중에는 디렉토리 권한 설정이 불가능합니다. 보통 직접 셸 명령어를 사용하거나, 호스팅을 사용한다면 FTP나 호스팅 제어판(예를 들어 CPanel)을 사용해서 설정해야 합니다.</p>
+<p>도쿠위키는 위키 문서와 해당 문서와 관련된 정보(예를 들어 그림,
+검색 색인, 이전 판 문서 등)를 저장하기 위해 일반적인 텍스트 파일을
+사용합니다. 성공적으로 작동하려면 도쿠위키는 이 파일을 담고
+있는 디렉토리에 대한 쓰기 권한이 <strong>있어야</strong> 합니다.
+이 설치 프로그램은 디렉토리 권한을 설정할 수 없습니다. 보통
+직접 명령 셸에 수행하거나 호스팅을 사용한다면, FTP나 호스팅
+제어판(예를 들어 CPanel)을 통해 수행해야 합니다.</p>
-<p>현재 설치 과정중에 관리자로 로그인 후 DokuWiki의 관리 메뉴(플러그인 설치, 사용자 관리, 위키 문서 접근 권한 관리, 옵션 설정)를 가능하게 <acronym title="접근 제어 목록">ACL</acronym>에 대한 환경 설정을 수행합니다.
-DokuWiki가 동작하는데 필요한 사항은 아니지만, 어쨌든 더 쉽게 관리자가 관리할 수 있도록 해줍니다.</p>
+<p>이 설치 프로그램은 관리자로 로그인하고 나서 플러그인 설치, 사용자 관리,
+위키 문서로의 접근 관리와 환경 설정을 바꾸기 위한 도쿠위키의 관리 메뉴에
+접근할 수 있는, <acronym title="access control list; 접근 제어 목록">ACL</acronym>에
+대한 도쿠위키 환경을 설정합니다. 도쿠위키가 작동하는데 필요하지 않지만,
+도쿠위키를 쉽게 관리할 수 있도록 해줍니다.</p>
-<p>숙련된 사용자나 특별한 설치 과정이 필요한 경우에는 <a href="http://dokuwiki.org/ko:install">설치 과정</a>과 <a href="http://dokuwiki.org/ko:config">환경 설정</a> 링크를 참고하시기 바랍니다.</p> \ No newline at end of file
+<p>숙련된 사용자나 특수한 설치가 필요한 사용자에게 자세한 내용은
+<a href="http://dokuwiki.org/ko:install">설치 지침</a>과
+<a href="http://dokuwiki.org/ko:config">환경 설정</a> 링크를 사용해야 합니다.</p>
diff --git a/inc/lang/ko/jquery.ui.datepicker.js b/inc/lang/ko/jquery.ui.datepicker.js
new file mode 100644
index 000000000..af36f3d6b
--- /dev/null
+++ b/inc/lang/ko/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com), Edited by Genie. */
+jQuery(function($){
+ $.datepicker.regional['ko'] = {
+ closeText: '닫기',
+ prevText: '이전달',
+ nextText: '다음달',
+ currentText: '오늘',
+ monthNames: ['1월','2월','3월','4월','5월','6월',
+ '7월','8월','9월','10월','11월','12월'],
+ monthNamesShort: ['1월','2월','3월','4월','5월','6월',
+ '7월','8월','9월','10월','11월','12월'],
+ dayNames: ['일요일','월요일','화요일','수요일','목요일','금요일','토요일'],
+ dayNamesShort: ['일','월','화','수','목','금','토'],
+ dayNamesMin: ['일','월','화','수','목','금','토'],
+ weekHeader: 'Wk',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '년'};
+ $.datepicker.setDefaults($.datepicker.regional['ko']);
+});
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/denied.txt b/inc/lang/ku/denied.txt
index 3ac72820c..34cb8456a 100644
--- a/inc/lang/ku/denied.txt
+++ b/inc/lang/ku/denied.txt
@@ -1,4 +1,4 @@
====== Permission Denied ======
-Sorry, you don't have enough rights to continue. Perhaps you forgot to login?
+Sorry, you don't have enough rights to continue.
diff --git a/inc/lang/ku/lang.php b/inc/lang/ku/lang.php
index b6287806d..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/denied.txt b/inc/lang/la/denied.txt
index fdb62f53e..1cdaf05c9 100644
--- a/inc/lang/la/denied.txt
+++ b/inc/lang/la/denied.txt
@@ -1,3 +1,4 @@
====== Ad hanc paginam accedere non potes ======
-Ad hanc paginam accedere non potes: antea in conuentum ineas, deinde rursum temptas \ No newline at end of file
+Ad hanc paginam accedere non potes: antea in conuentum ineas.
+
diff --git a/inc/lang/la/lang.php b/inc/lang/la/lang.php
index c71a71bdd..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/denied.txt b/inc/lang/lb/denied.txt
index 487bf2198..1a7fd8f52 100644
--- a/inc/lang/lb/denied.txt
+++ b/inc/lang/lb/denied.txt
@@ -1,3 +1,4 @@
======Erlaabnis verweigert======
-Et deet mer leed, du hues net genuch Rechter fir weiderzefueren. Hues de vläicht vergiess dech anzeloggen?
+Et deet mer leed, du hues net genuch Rechter fir weiderzefueren.
+
diff --git a/inc/lang/lb/jquery.ui.datepicker.js b/inc/lang/lb/jquery.ui.datepicker.js
new file mode 100644
index 000000000..87c79d594
--- /dev/null
+++ b/inc/lang/lb/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Luxembourgish initialisation for the jQuery UI date picker plugin. */
+/* Written by Michel Weimerskirch <michel@weimerskirch.net> */
+jQuery(function($){
+ $.datepicker.regional['lb'] = {
+ closeText: 'Fäerdeg',
+ prevText: 'Zréck',
+ nextText: 'Weider',
+ currentText: 'Haut',
+ monthNames: ['Januar','Februar','Mäerz','Abrëll','Mee','Juni',
+ 'Juli','August','September','Oktober','November','Dezember'],
+ monthNamesShort: ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
+ dayNames: ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'],
+ dayNamesShort: ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'],
+ dayNamesMin: ['So','Mé','Dë','Më','Do','Fr','Sa'],
+ weekHeader: 'W',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['lb']);
+});
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/denied.txt b/inc/lang/lt/denied.txt
index c25fb5f0c..9a8544694 100644
--- a/inc/lang/lt/denied.txt
+++ b/inc/lang/lt/denied.txt
@@ -1,4 +1,4 @@
====== Priėjimas uždraustas ======
-Jūs neturite reikiamų teisių, kad galėtumėte tęsti. Turbūt pamiršote prisijungti :-).
+Jūs neturite reikiamų teisių, kad galėtumėte tęsti.
diff --git a/inc/lang/lt/jquery.ui.datepicker.js b/inc/lang/lt/jquery.ui.datepicker.js
new file mode 100644
index 000000000..54eb523b3
--- /dev/null
+++ b/inc/lang/lt/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+jQuery(function($){
+ $.datepicker.regional['lt'] = {
+ closeText: 'Uždaryti',
+ prevText: '&#x3C;Atgal',
+ nextText: 'Pirmyn&#x3E;',
+ currentText: 'Šiandien',
+ monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
+ 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
+ monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
+ 'Lie','Rugp','Rugs','Spa','Lap','Gru'],
+ dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'],
+ dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
+ dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'],
+ weekHeader: 'SAV',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['lt']);
+});
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/denied.txt b/inc/lang/lv/denied.txt
index c7df462c8..6733fb2e9 100644
--- a/inc/lang/lv/denied.txt
+++ b/inc/lang/lv/denied.txt
@@ -1,6 +1,4 @@
====== Piekļuve aizliegta ======
-Atvaino, tev nav tiesību turpināt. Varbūt aizmirsi ielogoties?
-
-
+Atvaino, tev nav tiesību turpināt.
diff --git a/inc/lang/lv/jquery.ui.datepicker.js b/inc/lang/lv/jquery.ui.datepicker.js
new file mode 100644
index 000000000..3fdf8565b
--- /dev/null
+++ b/inc/lang/lv/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+jQuery(function($){
+ $.datepicker.regional['lv'] = {
+ closeText: 'Aizvērt',
+ prevText: 'Iepr.',
+ nextText: 'Nāk.',
+ currentText: 'Šodien',
+ monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs',
+ 'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn',
+ 'Jūl','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
+ dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
+ dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
+ weekHeader: 'Ned.',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['lv']);
+});
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/mg/denied.txt b/inc/lang/mg/denied.txt
index edf20f1a1..d6d2b814e 100644
--- a/inc/lang/mg/denied.txt
+++ b/inc/lang/mg/denied.txt
@@ -1,4 +1,4 @@
====== Tsy tafiditra ======
-Miala tsiny fa tsy manana alalana hanohizana mankany ianao. Angamba hadinonao ny niditra.
+Miala tsiny fa tsy manana alalana hanohizana mankany ianao.
diff --git a/inc/lang/mk/jquery.ui.datepicker.js b/inc/lang/mk/jquery.ui.datepicker.js
new file mode 100644
index 000000000..028532551
--- /dev/null
+++ b/inc/lang/mk/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Macedonian i18n for the jQuery UI date picker plugin. */
+/* Written by Stojce Slavkovski. */
+jQuery(function($){
+ $.datepicker.regional['mk'] = {
+ closeText: 'Затвори',
+ prevText: '&#x3C;',
+ nextText: '&#x3E;',
+ currentText: 'Денес',
+ monthNames: ['Јануари','Февруари','Март','Април','Мај','Јуни',
+ 'Јули','Август','Септември','Октомври','Ноември','Декември'],
+ monthNamesShort: ['Јан','Фев','Мар','Апр','Мај','Јун',
+ 'Јул','Авг','Сеп','Окт','Ное','Дек'],
+ dayNames: ['Недела','Понеделник','Вторник','Среда','Четврток','Петок','Сабота'],
+ dayNamesShort: ['Нед','Пон','Вто','Сре','Чет','Пет','Саб'],
+ dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Са'],
+ weekHeader: 'Сед',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['mk']);
+});
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/denied.txt b/inc/lang/mr/denied.txt
index 1b499f51d..5415fde04 100644
--- a/inc/lang/mr/denied.txt
+++ b/inc/lang/mr/denied.txt
@@ -1,3 +1,4 @@
====== परवानगी नाकारली ======
-क्षमा करा, पण तुम्हाला यापुढे जाण्याचे हक्क नाहीत. कदाचित तुम्ही लॉगिन करायला विसरला आहात ? \ No newline at end of file
+क्षमा करा, पण तुम्हाला यापुढे जाण्याचे हक्क नाहीत.
+
diff --git a/inc/lang/mr/lang.php b/inc/lang/mr/lang.php
index 54b69974d..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/ms/jquery.ui.datepicker.js b/inc/lang/ms/jquery.ui.datepicker.js
new file mode 100644
index 000000000..e70de7299
--- /dev/null
+++ b/inc/lang/ms/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+jQuery(function($){
+ $.datepicker.regional['ms'] = {
+ closeText: 'Tutup',
+ prevText: '&#x3C;Sebelum',
+ nextText: 'Selepas&#x3E;',
+ currentText: 'hari ini',
+ monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
+ 'Julai','Ogos','September','Oktober','November','Disember'],
+ monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
+ 'Jul','Ogo','Sep','Okt','Nov','Dis'],
+ dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
+ dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
+ dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
+ weekHeader: 'Mg',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ms']);
+});
diff --git a/inc/lang/ne/denied.txt b/inc/lang/ne/denied.txt
index ab4bcf290..5c58cde28 100644
--- a/inc/lang/ne/denied.txt
+++ b/inc/lang/ne/denied.txt
@@ -1,3 +1,4 @@
====== अनुमति अमान्य ======
-माफ गर्नुहोला तपाईलाई अगाडि बढ्न अनुमति छैन। सम्भवत: तपाईले प्रवेश गर्न भुल्नु भयो। \ No newline at end of file
+माफ गर्नुहोला तपाईलाई अगाडि बढ्न अनुमति छैन।
+
diff --git a/inc/lang/ne/lang.php b/inc/lang/ne/lang.php
index 7fd14d2c5..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/denied.txt b/inc/lang/nl/denied.txt
index 6a8bf773f..a172ddab6 100644
--- a/inc/lang/nl/denied.txt
+++ b/inc/lang/nl/denied.txt
@@ -1,3 +1,4 @@
====== Toegang geweigerd ======
-Sorry: je hebt niet voldoende rechten om verder te gaan. Misschien ben je vergeten in te loggen?
+Sorry: je hebt niet voldoende rechten om verder te gaan.
+
diff --git a/inc/lang/nl/edit.txt b/inc/lang/nl/edit.txt
index 9718d0900..88a15cfe4 100644
--- a/inc/lang/nl/edit.txt
+++ b/inc/lang/nl/edit.txt
@@ -1 +1 @@
-Pas de pagina aan en klik op ''Opslaan''. Zie [[wiki:syntax]] voor de Wiki-syntax. Pas de pagina allen aan als hij **verbeterd** kan worden. Als je iets wilt uitproberen kun je spelen in de [[playground:playground|zandbak]].
+Pas de pagina aan en klik op ''Opslaan''. Zie [[wiki:syntax]] voor de Wiki-syntax. Pas de pagina alleen aan als hij **verbeterd** kan worden. Als je iets wilt uitproberen kun je spelen in de [[playground:playground|zandbak]].
diff --git a/inc/lang/nl/jquery.ui.datepicker.js b/inc/lang/nl/jquery.ui.datepicker.js
new file mode 100644
index 000000000..203f16069
--- /dev/null
+++ b/inc/lang/nl/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+jQuery(function($){
+ $.datepicker.regional.nl = {
+ closeText: 'Sluiten',
+ prevText: '←',
+ nextText: '→',
+ currentText: 'Vandaag',
+ monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+ 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+ monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
+ 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+ dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+ dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+ dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional.nl);
+});
diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php
index 227448cc9..b6cf11968 100644
--- a/inc/lang/nl/lang.php
+++ b/inc/lang/nl/lang.php
@@ -21,6 +21,8 @@
* @author Gerrit Uitslag <klapinklapin@gmail.com>
* @author Klap-in <klapinklapin@gmail.com>
* @author Remon <no@email.local>
+ * @author gicalle <gicalle@hotmail.com>
+ * @author Rene <wllywlnt@yahoo.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -65,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';
@@ -196,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';
@@ -252,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';
@@ -265,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/denied.txt b/inc/lang/no/denied.txt
index 6e7f1f28b..f60f48f6b 100644
--- a/inc/lang/no/denied.txt
+++ b/inc/lang/no/denied.txt
@@ -1,3 +1,4 @@
====== Adgang forbudt ======
-Beklager, men du har ikke rettigheter til dette. Kanskje du har glemt å logge inn?
+Beklager, men du har ikke rettigheter til dette.
+
diff --git a/inc/lang/no/jquery.ui.datepicker.js b/inc/lang/no/jquery.ui.datepicker.js
new file mode 100644
index 000000000..d36e430be
--- /dev/null
+++ b/inc/lang/no/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+
+jQuery(function($){
+ $.datepicker.regional['no'] = {
+ closeText: 'Lukk',
+ prevText: '&#xAB;Forrige',
+ nextText: 'Neste&#xBB;',
+ currentText: 'I dag',
+ monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+ monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+ dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
+ dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
+ dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
+ weekHeader: 'Uke',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''
+ };
+ $.datepicker.setDefaults($.datepicker.regional['no']);
+});
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/denied.txt b/inc/lang/pl/denied.txt
index d402463ef..2b268b921 100644
--- a/inc/lang/pl/denied.txt
+++ b/inc/lang/pl/denied.txt
@@ -1,4 +1,4 @@
====== Brak dostępu ======
-Nie masz wystarczających uprawnień. Zaloguj się!
+Nie masz wystarczających uprawnień.
diff --git a/inc/lang/pl/jquery.ui.datepicker.js b/inc/lang/pl/jquery.ui.datepicker.js
new file mode 100644
index 000000000..0ffc515b9
--- /dev/null
+++ b/inc/lang/pl/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['pl'] = {
+ closeText: 'Zamknij',
+ prevText: '&#x3C;Poprzedni',
+ nextText: 'Następny&#x3E;',
+ currentText: 'Dziś',
+ monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
+ 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
+ monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
+ 'Lip','Sie','Wrz','Pa','Lis','Gru'],
+ dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
+ dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'],
+ dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'],
+ weekHeader: 'Tydz',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pl']);
+});
diff --git a/inc/lang/pl/lang.php b/inc/lang/pl/lang.php
index 142dd3baa..e65866761 100644
--- a/inc/lang/pl/lang.php
+++ b/inc/lang/pl/lang.php
@@ -15,6 +15,7 @@
* @author Begina Felicysym <begina.felicysym@wp.eu>
* @author Aoi Karasu <aoikarasu@gmail.com>
* @author Tomasz Bosak <bosak.tomasz@gmail.com>
+ * @author Paweł Jan Czochański <czochanski@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -246,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';
@@ -259,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';
@@ -324,7 +325,7 @@ $lang['media_list_thumbs'] = 'Miniatury';
$lang['media_list_rows'] = 'Wiersze';
$lang['media_sort_name'] = 'Nazwa';
$lang['media_sort_date'] = 'Data';
-$lang['media_namespaces'] = 'Wybierz przestrzeń nazw';
+$lang['media_namespaces'] = 'Wybierz katalog';
$lang['media_files'] = 'Pliki w %s';
$lang['media_upload'] = 'Przesyłanie plików na %s';
$lang['media_search'] = 'Znajdź w %s';
@@ -337,6 +338,7 @@ $lang['media_perm_read'] = 'Przepraszamy, nie masz wystarczających uprawn
$lang['media_perm_upload'] = 'Przepraszamy, nie masz wystarczających uprawnień do przesyłania plików.';
$lang['media_update'] = 'Prześlij nową wersję';
$lang['media_restore'] = 'Odtwórz tą wersję';
-$lang['currentns'] = 'Obecna przestrzeń nazw.';
+$lang['currentns'] = 'Obecny katalog';
$lang['searchresult'] = 'Wyniki wyszukiwania';
$lang['plainhtml'] = 'Czysty HTML';
+$lang['wikimarkup'] = 'Znaczniki';
diff --git a/inc/lang/pt-br/denied.txt b/inc/lang/pt-br/denied.txt
index d7e423f42..9a71df619 100644
--- a/inc/lang/pt-br/denied.txt
+++ b/inc/lang/pt-br/denied.txt
@@ -1,3 +1,4 @@
====== Permissão Negada ======
-Desculpe, você não tem permissões suficientes para continuar. Por acaso esqueceu de autenticar-se?
+Desculpe, você não tem permissões suficientes para continuar.
+
diff --git a/inc/lang/pt-br/jquery.ui.datepicker.js b/inc/lang/pt-br/jquery.ui.datepicker.js
new file mode 100644
index 000000000..521967ec3
--- /dev/null
+++ b/inc/lang/pt-br/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['pt-BR'] = {
+ closeText: 'Fechar',
+ prevText: '&#x3C;Anterior',
+ nextText: 'Próximo&#x3E;',
+ currentText: 'Hoje',
+ monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
+ 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+ monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Out','Nov','Dez'],
+ dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+ dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pt-BR']);
+});
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/denied.txt b/inc/lang/pt/denied.txt
index eb2614387..3af816666 100644
--- a/inc/lang/pt/denied.txt
+++ b/inc/lang/pt/denied.txt
@@ -1,3 +1,4 @@
====== Permissão Negada ======
-Não possui direitos e permissões suficientes para continuar. Talvez se tenha esquecido de iniciar sessão? \ No newline at end of file
+Não possui direitos e permissões suficientes para continuar.
+
diff --git a/inc/lang/pt/jquery.ui.datepicker.js b/inc/lang/pt/jquery.ui.datepicker.js
new file mode 100644
index 000000000..4fb16f032
--- /dev/null
+++ b/inc/lang/pt/jquery.ui.datepicker.js
@@ -0,0 +1,22 @@
+/* Portuguese initialisation for the jQuery UI date picker plugin. */
+jQuery(function($){
+ $.datepicker.regional['pt'] = {
+ closeText: 'Fechar',
+ prevText: 'Anterior',
+ nextText: 'Seguinte',
+ currentText: 'Hoje',
+ monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
+ 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+ monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Out','Nov','Dez'],
+ dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+ dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ weekHeader: 'Sem',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pt']);
+});
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/admin.txt b/inc/lang/ro/admin.txt
index b19a4d804..8c7b3d6bd 100644
--- a/inc/lang/ro/admin.txt
+++ b/inc/lang/ro/admin.txt
@@ -1,3 +1,3 @@
====== Administrare ======
-Puteți vedea mai jos o listă cu activitățile administrative disponibile în DokuWiki. \ No newline at end of file
+Poți vedea mai jos o listă cu acțiunile administrative disponibile în DokuWiki.
diff --git a/inc/lang/ro/adminplugins.txt b/inc/lang/ro/adminplugins.txt
index 6712d8225..121a8fdb6 100644
--- a/inc/lang/ro/adminplugins.txt
+++ b/inc/lang/ro/adminplugins.txt
@@ -1 +1 @@
-===== Plugin-uri Adiționale ===== \ No newline at end of file
+===== Plugin-uri suplimentare =====
diff --git a/inc/lang/ro/backlinks.txt b/inc/lang/ro/backlinks.txt
index 3fd5e3415..ae52a105f 100644
--- a/inc/lang/ro/backlinks.txt
+++ b/inc/lang/ro/backlinks.txt
@@ -1,4 +1,3 @@
====== Legături înapoi ======
Aceasta e o listă de pagini care au legături către pagina curentă.
-
diff --git a/inc/lang/ro/conflict.txt b/inc/lang/ro/conflict.txt
index 072f574f4..dcac6774a 100644
--- a/inc/lang/ro/conflict.txt
+++ b/inc/lang/ro/conflict.txt
@@ -1,6 +1,7 @@
====== Există o nouă versiune ======
-Există o versiune nouă a documentului editat. Aceasta se întîmplă cînd un alt utilizator a schimbat documentul în timp ce îl editezi.
-
-Examinează diferențele arătate mai jos, apoi ia decizia care versiune o reții. Dacă alegi ''Salvează'', versiunea documentului va fi salvată. Apăsați ''Renunțare'' pentru a menține versiunea curentă.
+Există o versiune nouă a paginii editate. Aceasta se întâmplă atunci când
+un alt utilizator a modificat pagina în timp ce editai.
+Examinează diferențele indicate mai jos, apoi ia decizia care versiune o vei
+reține. Dacă alegi ''Salvează'', versiunea paginii va fi salvată. Apasă ''Renunțare'' pentru a menține versiunea curentă.
diff --git a/inc/lang/ro/denied.txt b/inc/lang/ro/denied.txt
index 430db7610..490233acf 100644
--- a/inc/lang/ro/denied.txt
+++ b/inc/lang/ro/denied.txt
@@ -1,4 +1,4 @@
-====== Acces Interzis ======
+====== Acces nepermis ======
-Din păcate nu aveți destule drepturi pentru a continua. Poate ați uitat să vă logați?
+Din păcate nu ai destule drepturi pentru a continua.
diff --git a/inc/lang/ro/diff.txt b/inc/lang/ro/diff.txt
index 197244453..4bf6250d9 100644
--- a/inc/lang/ro/diff.txt
+++ b/inc/lang/ro/diff.txt
@@ -1,4 +1,3 @@
====== Diferențe ======
-Aceasta arată diferențele dintre revziile selectate și versiunea curentă a paginii.
-
+Aici sunt prezentate diferențele dintre versiunile selectate și versiunea curentă a paginii.
diff --git a/inc/lang/ro/draft.txt b/inc/lang/ro/draft.txt
index 74badee8e..550db52ff 100644
--- a/inc/lang/ro/draft.txt
+++ b/inc/lang/ro/draft.txt
@@ -1,5 +1,8 @@
====== Fișierul schiță nu a fost găsit ======
-Ultima dvs. sesiune de editare nu s-a finalizat corect. În timpul lucrului, DocuWiki a salvat automat o schiță, pe care o puteți utiliza acum pentru a continua editarea. Mai jos puteți vedea informațiile care s-au salvat de la ultima dvs. sesiune.
+Ultima ta sesiune de editare nu s-a finalizat corect. În vreme ce lucrai,
+DokuWiki a salvat automat o schiță, pe care o poți utiliza acum pentru a
+continua editarea. Mai jos poți vedea informațiile care s-au salvat de la ultima sesiune.
-Decideți dacă vreți să //recuperați// sesiunea de editare pierdută, //ștergeți// schița salvată automat sau să //anulați// procesul de editare. \ No newline at end of file
+Decide dacă vrei să //recuperezi// sesiunea de editare pierdută, să //ștergi//
+schița salvată automat sau să //anulezi// procesul de editare.
diff --git a/inc/lang/ro/edit.txt b/inc/lang/ro/edit.txt
index 78761b9c4..cd5aa2e50 100644
--- a/inc/lang/ro/edit.txt
+++ b/inc/lang/ro/edit.txt
@@ -1,2 +1 @@
-Editează pagina și apasă ''Salvează''. Vezi [[wiki:syntax]] pentru sintaxă. Te rog editează pagina doar pentru a o **îmbunătați**. Dacă vrei să testezi cîteva lucruri, învață sa faci primii pași în [[playground:playground]].
-
+Editează pagina și apasă ''Salvează''. Vezi [[wiki:syntax]] pentru sintaxă. Te rog editează pagina doar pentru a o **îmbunătați**. Dacă vrei să testezi câteva lucruri, învață sa faci primii pași în [[playground:playground]].
diff --git a/inc/lang/ro/editrev.txt b/inc/lang/ro/editrev.txt
index 290dca496..983cd657d 100644
--- a/inc/lang/ro/editrev.txt
+++ b/inc/lang/ro/editrev.txt
@@ -1,2 +1,3 @@
-**Ai încărcat o versuine veche a documentului!** Dacă ai salvat-o, vei crea o versiune nouă cu această dată.
+**Ai încărcat o versiune anterioră a paginii.** Dacă ai salvat-o, vei crea o
+versiune nouă cu aceast conținut.
----
diff --git a/inc/lang/ro/index.txt b/inc/lang/ro/index.txt
index 5b88cc03b..1ae5b9ca5 100644
--- a/inc/lang/ro/index.txt
+++ b/inc/lang/ro/index.txt
@@ -1,4 +1,4 @@
====== Index ======
-Acesta e un index al tuturor paginilor ordonat după [[doku>namespaces|namespaces]].
-
+Acesta e un index al tuturor paginilor ordonat după [[doku>namespaces|spații
+de nume]].
diff --git a/inc/lang/ro/install.html b/inc/lang/ro/install.html
index 7fdc8fc21..222b86e54 100644
--- a/inc/lang/ro/install.html
+++ b/inc/lang/ro/install.html
@@ -1,10 +1,10 @@
-<p>Această pagină oferă asistență la instalarea pentru prima dată a <a href="http://dokuwiki.org">Dokuwiki</a>. Mai multe informații privind această instalare găsiți pe <a href="http://dokuwiki.org/installer">pagina de documentație</a>.</p>
+<p>Această pagină oferă asistență la instalarea pentru prima dată a <a href="http://dokuwiki.org">Dokuwiki</a>. Mai multe informații privind această instalare găsești în <a href="http://dokuwiki.org/installer">pagina de documentație</a>.</p>
-<p>DokuWiki folosește fișiere obișnuite pentru stocarea paginilor wiki și a informaților asociate acestor pagini (de ex. imagini, indecși de căutare, versiuni vechi, etc). Pentru a lucra cu succes, DokuWiki <strong>trebuie</strong> să aibă drepturi de scriere în directoarele ce conțin aceste fișiere.
-Acest script de instalare nu poate seta drepturile directoarelor. De regulă, aceasta se face direct, în linie de comandă, sau în cazul găzduirii, prin FTP sau prin panoul de control al gazdei (de ex. cPanel).</p>
+<p>DokuWiki folosește fișiere obișnuite pentru stocarea paginilor wiki și a informaților asociate acestor pagini (de ex. imagini, indecși de căutare, versiuni vechi etc.). Pentru a putea fi folosit, DokuWiki <strong>trebuie</strong> să aibă drepturi de scriere în directoarele ce conțin aceste fișiere.
+Acest script de instalare nu poate configura drepturile directoarelor. De regulă, aceasta se face direct, în linie de comandă, sau în cazul unoi soluții de hosting, prin FTP sau prin panoul de control al gazdei (de ex. cPanel).</p>
-<p>Acest script de instalare va configura DokuWiki pentru <abbr title="access control list">ACL</abbr>, care permite logarea administratorului și accesul la meniul de administrare pentru instalarea plugin-urilor, gestiunea utilizatorilor, a accesului la paginile wiki și modificarea setărilor de configurare.
-Nu este necesar pentru ca DokuWiki să funcționeze, însă face mai ușoară administrarea DokuWiki.</p>
+<p>Acest script de instalare va configura DokuWiki pentru <abbr title="access control list">ACL</abbr>, care permite autentificarea administratorului și accesul la meniul de administrare pentru instalarea plugin-urilor, gestiunea utilizatorilor, accesului la paginile wiki și modificarea configurației.
+Acest script nu este necesar pentru funcționarea DokuWiki, însă ușurează administrarea.
-<p>Utilizatorii experimentați sau utilizatorii ce au nevoie de setări speciale ar putea folosi această legătură privind<a href="http://dokuwiki.org/install">instrucțiunile de instalare</a> și <a href="http://dokuwiki.org/config">setările de configurare</a>.</p>
+<p>Utilizatorii experimentați sau utilizatorii care au nevoie de o configurație specială pot accesa paginile cu <a href="http://dokuwiki.org/install">instrucțiunile de instalare</a> și <a href="http://dokuwiki.org/config">opțiunile de configurare</a> a DokuWiki.</p>
diff --git a/inc/lang/ro/jquery.ui.datepicker.js b/inc/lang/ro/jquery.ui.datepicker.js
new file mode 100644
index 000000000..a988270d7
--- /dev/null
+++ b/inc/lang/ro/jquery.ui.datepicker.js
@@ -0,0 +1,26 @@
+/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+jQuery(function($){
+ $.datepicker.regional['ro'] = {
+ closeText: 'Închide',
+ prevText: '&#xAB; Luna precedentă',
+ nextText: 'Luna următoare &#xBB;',
+ currentText: 'Azi',
+ monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
+ 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+ monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+ 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
+ dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
+ dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
+ weekHeader: 'Săpt',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ro']);
+});
diff --git a/inc/lang/ro/lang.php b/inc/lang/ro/lang.php
index 028c55a20..31b2d7eba 100644
--- a/inc/lang/ro/lang.php
+++ b/inc/lang/ro/lang.php
@@ -28,7 +28,7 @@ $lang['btn_preview'] = 'Previzualizează';
$lang['btn_top'] = 'La început';
$lang['btn_newer'] = '<< mai recent';
$lang['btn_older'] = 'mai vechi>>';
-$lang['btn_revs'] = 'Versiuni vechi';
+$lang['btn_revs'] = 'Versiuni anterioare';
$lang['btn_recent'] = 'Modificări recente';
$lang['btn_upload'] = 'Upload';
$lang['btn_cancel'] = 'Renunțare';
@@ -53,7 +53,7 @@ $lang['btn_revert'] = 'Revenire';
$lang['btn_register'] = 'Înregistrează';
$lang['btn_apply'] = 'Aplică';
$lang['btn_media'] = 'Administrare media';
-$lang['loggedinas'] = 'Logat ca și';
+$lang['loggedinas'] = 'Autentificat ca';
$lang['user'] = 'Utilizator';
$lang['pass'] = 'Parola';
$lang['newpass'] = 'Parola nouă';
@@ -72,15 +72,15 @@ $lang['reguexists'] = 'Ne pare rău, un utilizator cu acest nume este
$lang['regsuccess'] = 'Utilizatorul a fost creat. Parola a fost trimisă prin e-mail.';
$lang['regsuccess2'] = 'Utilizatorul a fost creat.';
$lang['regmailfail'] = 'Se pare că a fost o eroare la trimiterea parolei prin e-mail. Contactează administratorul!';
-$lang['regbadmail'] = 'Adresa de e-mail este nevalidă - dacă sunteți de părere că este o eroare contactează administratorul.';
-$lang['regbadpass'] = 'Cele două parole furnizate nu sunt identice; încercați din nou.';
+$lang['regbadmail'] = 'Adresa de e-mail este nevalidă - dacă ești de părere că este o eroare contactează administratorul.';
+$lang['regbadpass'] = 'Cele două parole furnizate nu sunt identice; încearcă din nou.';
$lang['regpwmail'] = 'Parola ta DokuWiki';
-$lang['reghere'] = 'Înca nu ai un cont? Fă-ți unul!';
+$lang['reghere'] = 'Încă nu ai un cont? Creează unul!';
$lang['profna'] = 'Acest wiki nu permite modificarea profilului';
$lang['profnochange'] = 'Nici o modificare; nimic de făcut.';
-$lang['profnoempty'] = 'Nu sunt admise numele sau adresa de e-mail necompletate.';
+$lang['profnoempty'] = 'Nu sunt permise numele sau adresa de e-mail necompletate.';
$lang['profchanged'] = 'Profilul de utilizator a fost actualizat cu succes.';
-$lang['pwdforget'] = 'Parola uitată? Obține una nouă!';
+$lang['pwdforget'] = 'Parolă uitată? Obține una nouă!';
$lang['resendna'] = 'Acest wiki nu permite retrimiterea parolei.';
$lang['resendpwd'] = 'Configurează o parolă nouă pentru';
$lang['resendpwdmissing'] = 'Ne pare rău, trebuie completate toate câmpurile.';
@@ -103,15 +103,15 @@ Dorești să continui?';
$lang['js']['searchmedia'] = 'Caută fișiere';
$lang['js']['keepopen'] = 'Menține fereastra deschisă la selecție';
$lang['js']['hidedetails'] = 'Ascunde detalii';
-$lang['js']['mediatitle'] = 'Setări link';
-$lang['js']['mediadisplay'] = 'Tip link';
+$lang['js']['mediatitle'] = 'Configurare link';
+$lang['js']['mediadisplay'] = 'Tip de link';
$lang['js']['mediaalign'] = 'Aliniere';
$lang['js']['mediasize'] = 'Mărime imagine';
$lang['js']['mediatarget'] = 'Țintă link';
$lang['js']['mediaclose'] = 'Închide';
$lang['js']['mediainsert'] = 'Inserează';
$lang['js']['mediadisplayimg'] = 'Afișează imaginea';
-$lang['js']['mediadisplaylnk'] = 'Afișează doar linkul';
+$lang['js']['mediadisplaylnk'] = 'Afișează doar link-ul';
$lang['js']['mediasmall'] = 'Versiune mică';
$lang['js']['mediamedium'] = 'Versiune medie';
$lang['js']['medialarge'] = 'Versiune mare';
@@ -133,7 +133,7 @@ $lang['js']['restore_confirm'] = 'Ești sigur de restaurarea acestei versiuni?';
$lang['js']['media_diff'] = 'Arată diferențele:';
$lang['js']['media_diff_both'] = 'Unul lângă altul';
$lang['js']['media_diff_opacity'] = 'Străveziu';
-$lang['js']['media_diff_portions'] = 'Lovește cu putere';
+$lang['js']['media_diff_portions'] = 'Glisează';
$lang['js']['media_select'] = 'Selectează fișierele...';
$lang['js']['media_upload_btn'] = 'Încarcă';
$lang['js']['media_done_btn'] = 'Gata';
@@ -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';
@@ -283,7 +283,7 @@ $lang['i_success'] = 'Configurarea a fost finalizată cu succes. Acu
$lang['i_failure'] = 'Au apărut erori la scrierea fișierelor de configurare. Va trebui să le corectezi manual înainte de a putea folosi <a href="doku.php?id=wiki:welcome">noua ta instanță DokuWiki</a>.';
$lang['i_policy'] = 'Politica ACL (liste de control a accesului) inițială';
$lang['i_pol0'] = 'Wiki deschis (oricine poate citi, scrie și încărca fișiere)';
-$lang['i_pol1'] = 'Wiki public (oricine poate citi, utilizatorii înregistrați pot scrie și încărca fișiere';
+$lang['i_pol1'] = 'Wiki public (oricine poate citi, utilizatorii înregistrați pot scrie și încărca fișiere)';
$lang['i_pol2'] = 'Wiki închis (doar utilizatorii înregistrați pot citi, scrie și încărca fișiere)';
$lang['i_retry'] = 'Încearcă din nou';
$lang['i_license'] = 'Te rugăm să alegi licența sub care dorești să publici conținutul:';
diff --git a/inc/lang/ro/locked.txt b/inc/lang/ro/locked.txt
index 8708157ec..d1e80ad40 100644
--- a/inc/lang/ro/locked.txt
+++ b/inc/lang/ro/locked.txt
@@ -1,3 +1,4 @@
====== Pagină blocată ======
-Pagina este momentan blocată de alt utilizator. Trebuie să aștepți pînă cînd acest utilizator termină editarea ori expiră blocarea.
+Pagina este momentan blocată de alt utilizator. Trebuie să aștepți pînă când
+acest utilizator termină editarea sau până când expiră blocarea.
diff --git a/inc/lang/ro/login.txt b/inc/lang/ro/login.txt
index 81bca6298..7de38f621 100644
--- a/inc/lang/ro/login.txt
+++ b/inc/lang/ro/login.txt
@@ -1,4 +1,4 @@
-====== Login ======
-
-Nu sînteți logat! Introduceți datele de autentificare pentru logare. Trebuie să permiteți cookie-uri pentru logare.
+====== Autentificare ======
+Nu ești autentificat! Introdu datele de autentificare. Pentru ca
+autentificarea să funcționeze trebuie să fie permise cookie-urile în browser.
diff --git a/inc/lang/ro/mailtext.txt b/inc/lang/ro/mailtext.txt
index 77aca8c4b..8d20a301d 100644
--- a/inc/lang/ro/mailtext.txt
+++ b/inc/lang/ro/mailtext.txt
@@ -1,16 +1,17 @@
-A fost adăugată sau schimbată o pagină. Aici sînt detaliile:
+Salutare, @FULLNAME@!
-Data : @DATE@
-Navigator : @BROWSER@
-Adresa-IP : @IPADDRESS@
-Nume gazdă : @HOSTNAME@
-Versiune veche : @OLDPAGE@
-Versiune nouă : @NEWPAGE@
-Rezumat editare: @SUMMARY@
+A fost adăugată sau modificată o pagină. Aici sunt detaliile:
-@DIFF@
+Dată : @DATE@
+Browser : @BROWSER@
+Adresă IP : @IPADDRESS@
+Hostname : @HOSTNAME@
+Versiune anterioară : @OLDPAGE@
+Versiune curentă : @NEWPAGE@
+Sumar editare: @SUMMARY@
+@DIFF@
---
-Mailul a fost generat de DokuWiki la
+--
+Acest e-mail a fost generat de DokuWiki la
@DOKUWIKIURL@
diff --git a/inc/lang/ro/newpage.txt b/inc/lang/ro/newpage.txt
index 886258609..2ef35136e 100644
--- a/inc/lang/ro/newpage.txt
+++ b/inc/lang/ro/newpage.txt
@@ -1,3 +1,3 @@
-====== Subiectul nu există încă ======
+====== Pagina nu există încă ======
-Ați urmat o legătură către un subiect care nu există. O puteți crea prin apăsarea butonului ''Editează această pagină''.
+Ai urmat o legătură către o pagină care nu există. O poti crea prin apăsarea butonului ''Editează această pagină''.
diff --git a/inc/lang/ro/norev.txt b/inc/lang/ro/norev.txt
index 4a21abcbf..08bbb74dd 100644
--- a/inc/lang/ro/norev.txt
+++ b/inc/lang/ro/norev.txt
@@ -1,4 +1,4 @@
-====== Nu există versiunea ======
-
-Versiunea specificată nu există. Folosește butonul ''Versiuni vechi'' pentru o listă a versiunilor acestui document.
+====== Nu există versiunea paginii ======
+Versiunea indicată nu există. Folosește butonul ''Versiuni anterioare'' pentru
+o listă a versiunilor acestei pagini.
diff --git a/inc/lang/ro/password.txt b/inc/lang/ro/password.txt
index a7eb12dd9..eb325204b 100644
--- a/inc/lang/ro/password.txt
+++ b/inc/lang/ro/password.txt
@@ -1,10 +1,10 @@
-Salut @FULLNAME@!
+Salutare, @FULLNAME@!
-Aici sînt datele utilizator pentru @TITLE@ la @DOKUWIKIURL@
+Aici se găsesc credențialele de utilizator pentru @TITLE@ la @DOKUWIKIURL@
Login : @LOGIN@
Parola : @PASSWORD@
---
-Mesajul a fost generat de către DokuWiki la
+--
+Acest e-mail a fost generat de DokuWiki la
@DOKUWIKIURL@
diff --git a/inc/lang/ro/preview.txt b/inc/lang/ro/preview.txt
index 1964d7476..c89d19727 100644
--- a/inc/lang/ro/preview.txt
+++ b/inc/lang/ro/preview.txt
@@ -1,4 +1,3 @@
====== Previzualizare ======
-Acesta este modul în care va arăta textul. Nu uita: **Nu** e încă **salvat**!
-
+Acesta este modul în care va arăta textul. Ai în vedere: **Nu** e încă **salvat**!
diff --git a/inc/lang/ro/pwconfirm.txt b/inc/lang/ro/pwconfirm.txt
index ae2d9f963..0728b2ef0 100644
--- a/inc/lang/ro/pwconfirm.txt
+++ b/inc/lang/ro/pwconfirm.txt
@@ -1,13 +1,14 @@
-Salut @FULLNAME@!
+Salutare, @FULLNAME@!
-Cineva a cerut o parolă nouă pentru @TITLE@ pentru conectarea la @DOKUWIKIURL@
+Cineva a cerut o parolă nouă pentru @TITLE@ pentru conectarea la
+@DOKUWIKIURL@.
-Dacă nu ați solicitat o parolă nouă, ignorați acest email.
+Dacă nu ai solicitat o parolă nouă, ignoră acest e-mail.
-Pentru a confirma că cererea a fost într-adevăr trimisă de dumneavoastră, folosiți link-ul de mai jos.
+Pentru a confirma că cererea a fost într-adevăr trimisă de tine, folosește link-ul de mai jos.
@CONFIRM@
--
-Acest mail a fost generat de DocuWiki la
-@DOKUWIKIURL@ \ No newline at end of file
+Acest e-mail a fost generat de DokuWiki la
+@DOKUWIKIURL@
diff --git a/inc/lang/ro/read.txt b/inc/lang/ro/read.txt
index 72c33c0c0..442188f21 100644
--- a/inc/lang/ro/read.txt
+++ b/inc/lang/ro/read.txt
@@ -1,2 +1,2 @@
-Această pagină poate fi doar citită. Poți vedea sursa, dar n-o poți modifica. Consultă administratorul dacă crezi că e ceva în neregulă.
-
+Această pagină poate fi doar citită. Poți vedea sursa, dar nu poți modifica
+pagina. Consultă administratorul dacă ești de părere că ceva este în neregulă.
diff --git a/inc/lang/ro/recent.txt b/inc/lang/ro/recent.txt
index 8d4aa043a..e92ca8fa7 100644
--- a/inc/lang/ro/recent.txt
+++ b/inc/lang/ro/recent.txt
@@ -1,5 +1,3 @@
-====== Schimbări recente ======
-
-Următoarele pagini au fost schimbate recent.
-
+====== Modificări recente ======
+Următoarele pagini au fost modificate recent.
diff --git a/inc/lang/ro/register.txt b/inc/lang/ro/register.txt
index e062a46bc..1a6ef2538 100644
--- a/inc/lang/ro/register.txt
+++ b/inc/lang/ro/register.txt
@@ -1,3 +1,4 @@
====== Înregistrează-te ca utilizator nou ======
-Pentru a crea un wiki nou completează mai jos toate informațiile. Asigură-te că ai introdus o adresă de **e-mail validă** unde va fi trimisă noua parolă. Numele de utilizator trebuie de asemenea să fie valid [[doku>pagename|pagename]].
+Pentru a crea un wiki nou completează mai jos toate informațiile. Asigură-te
+că ai introdus o adresă de e-mail **validă** unde va fi trimisă noua parolă. Numele de utilizator trebuie de asemenea să fie valid [[doku>pagename|pagename]].
diff --git a/inc/lang/ro/registermail.txt b/inc/lang/ro/registermail.txt
index fb754af67..2aab247f7 100644
--- a/inc/lang/ro/registermail.txt
+++ b/inc/lang/ro/registermail.txt
@@ -1,14 +1,15 @@
-Un nou utilizator s-a înregsitrat. Iată detaliile:
+Salutare, @FULLNAME@!
-Nume utilizator : @NEWUSER@
+Un nou utilizator s-a înregistrat. Iată detaliile:
+
+Nume de utilizator : @NEWUSER@
Nume complet : @NEWNAME@
E-mail : @NEWEMAIL@
-
-Data : @DATE@
+Dată : @DATE@
Browser : @BROWSER@
Adresă IP : @IPADDRESS@
Hostname : @HOSTNAME@
---
-Acest mail a fost generat automat de către DokuWiki la
+--
+Acest e-mail a fost generat de DokuWiki la
@DOKUWIKIURL@
diff --git a/inc/lang/ro/resendpwd.txt b/inc/lang/ro/resendpwd.txt
index 4a67f9e80..24d995e89 100644
--- a/inc/lang/ro/resendpwd.txt
+++ b/inc/lang/ro/resendpwd.txt
@@ -1,3 +1,5 @@
====== Trimite parolă nouă ======
-Introduceți numele de utilizator în formularul de mai jos pentru a solicita o nouă parolă pentru această wiki. Un link de confirmare va fi trimis la adresa de email înregistrată. \ No newline at end of file
+Introduc numele de utilizator în formularul de mai jos pentru a solicita o
+nouă parolă pentru aceast wiki. Un link de confirmare va fi trimis la adresa
+de e-mail înregistrată.
diff --git a/inc/lang/ro/resetpwd.txt b/inc/lang/ro/resetpwd.txt
index 2eb8052f1..9cea53c4a 100644
--- a/inc/lang/ro/resetpwd.txt
+++ b/inc/lang/ro/resetpwd.txt
@@ -1,3 +1,3 @@
-====== Setează parolă nouă ======
+====== Configurează o parolă nouă ======
-Vă rugăm să introduceți o nouă parolă pentru contul dvs. pe acest wiki. \ No newline at end of file
+Te rog să introduci o parolă nouă pentru contul tău de pe acest wiki.
diff --git a/inc/lang/ro/revisions.txt b/inc/lang/ro/revisions.txt
index d42134c61..7cafaf046 100644
--- a/inc/lang/ro/revisions.txt
+++ b/inc/lang/ro/revisions.txt
@@ -1,4 +1,5 @@
-====== Versiune veche ======
-
-Acestea sînt versiunile vechi ale documentului curent. Pentru revenirea la o versiune mai veche, selecteaz-o de mai jos, clic pe ''Editează această pagină'' și salveaz-o.
+====== Versiune anterioară ======
+Acestea sunt versiunile anterioare ale paginii curente. Pentru revenirea la o
+versiune anteroară, selectează versiunea de mai jos, clic pe ''Editează
+această pagină'' și salvează versiunea.
diff --git a/inc/lang/ro/searchpage.txt b/inc/lang/ro/searchpage.txt
index 8c78c68c3..53e66adf0 100644
--- a/inc/lang/ro/searchpage.txt
+++ b/inc/lang/ro/searchpage.txt
@@ -1,5 +1,5 @@
====== Căutare ======
-Rezultatele căutării sînt afisate mai jos. Dacă n-ați găsit ce-ați căutat, puteți creea o pagină nouă după căutare prin folosirea butonului ''Editează această pagină''.
+Rezultatele căutării sunt afișate mai jos. Dacă nu ai găsit ce ai căutat, poți crea o pagină nouă prin folosirea butonului ''Editează această pagină''.
===== Rezultate =====
diff --git a/inc/lang/ro/showrev.txt b/inc/lang/ro/showrev.txt
index c1d5e545d..4c76fd402 100644
--- a/inc/lang/ro/showrev.txt
+++ b/inc/lang/ro/showrev.txt
@@ -1,2 +1,2 @@
-**Aceasta e o versiune veche a documentului!**
+**Aceasta e o versiune anterioară a paginii.**
----
diff --git a/inc/lang/ro/stopwords.txt b/inc/lang/ro/stopwords.txt
index 1f0d9536b..adcd7eff1 100644
--- a/inc/lang/ro/stopwords.txt
+++ b/inc/lang/ro/stopwords.txt
@@ -1,6 +1,8 @@
# Aceasta este o listă de cuvinte ignorate la indexare, câte un cuvânt pe linie
-# Când editați acest fișier, asigurați-vă că folosiți sfârșituri de linie UNIX (o singură linie nouă)
-# Nu e nevoie să includeți cuvinte mai scurte de 3 caractere - acestea sunt, oricum, ignorate
+# Când editezi acest fișier, asigură-te că folosești sfârșituri de linie UNIX
+# (o singură linie nouă).
+# Nu e nevoie să incluzi cuvinte mai scurte de 3 caractere - acestea sunt,
+# oricum, ignorate.
# Această listă se bazează pe cele ce pot fi găsite la http://www.ranks.nl/stopwords/
about
are
diff --git a/inc/lang/ro/subscr_digest.txt b/inc/lang/ro/subscr_digest.txt
index ad0a30708..8b0aac5c4 100644
--- a/inc/lang/ro/subscr_digest.txt
+++ b/inc/lang/ro/subscr_digest.txt
@@ -1,20 +1,20 @@
-Buna ziua!
+Salutare, @FULLNAME@!
-Pagina @PAGE@ în @TITLE@ wiki s-a modificat.
+Pagina @PAGE@ în @TITLE@ wiki a fost modificată.
Acestea sunt modificările:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-Vechea revizie: @OLDPAGE@
-Noua revizie: @NEWPAGE@
+Versiune anterioară: @OLDPAGE@
+Versiune curentă: @NEWPAGE@
-Pentru a anula notificarea paginii, logați-vă pe wiki la
-@DOKUWIKIURL@ apoi navigați la
+Pentru a anula notificarea paginii, autentifică-te pe wiki la
+@DOKUWIKIURL@ apoi accesează
@SUBSCRIBE@
-și dezabonați-vă de la pagină și/sau modificările numelui de spațiu.
+și dezabonează-te de la pagină și/sau modificările spațiului de nume.
--
-Acest mail a fost generat de DokuWiki la
-@DOKUWIKIURL@ \ No newline at end of file
+Acest e-mail a fost generat de DokuWiki la
+@DOKUWIKIURL@
diff --git a/inc/lang/ro/subscr_form.txt b/inc/lang/ro/subscr_form.txt
index e55dfe6cb..c198cafdc 100644
--- a/inc/lang/ro/subscr_form.txt
+++ b/inc/lang/ro/subscr_form.txt
@@ -1,3 +1,4 @@
====== Administrarea abonărilor ======
-Această pagină vă permite să vă administrați abonările pentru pagina curentă și numele de spațiu. \ No newline at end of file
+Această pagină îți permite să îți administrăzi abonările pentru pagina curentă
+și pentru spațiul de nume.
diff --git a/inc/lang/ro/subscr_list.txt b/inc/lang/ro/subscr_list.txt
index 1b55ea917..c34334268 100644
--- a/inc/lang/ro/subscr_list.txt
+++ b/inc/lang/ro/subscr_list.txt
@@ -1,17 +1,17 @@
-Bună ziua!
+Salutare, @FULLNAME@!
-Paginile din numele de spațiu @PAGE@ al @TITLE@ wiki s-au modificat.
-Acestea sunt modificările:
+Paginile din spațiul de nume @PAGE@ al @TITLE@ wiki au fost modificate.
+Modificările sunt următoarele:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-Pentru a anula notificarea paginii, logați-vă pe wiki la
-@DOKUWIKIURL@ apoi navigați la
+Pentru a anula notificarea paginii, autentificcă-te pe wiki la
+@DOKUWIKIURL@ apoi accesează
@SUBSCRIBE@
-și dezabonați-vă de la pagină și/sau modificările numelui de spațiu.
+și dezabonează-te de la pagină și/sau modificările spațiului de nume.
--
-Acest mail a fost generat de DokuWiki la
-@DOKUWIKIURL@ \ No newline at end of file
+Acest e-mail a fost generat de DokuWiki la
+@DOKUWIKIURL@
diff --git a/inc/lang/ro/subscr_single.txt b/inc/lang/ro/subscr_single.txt
index 006db741d..0fee1a831 100644
--- a/inc/lang/ro/subscr_single.txt
+++ b/inc/lang/ro/subscr_single.txt
@@ -1,23 +1,23 @@
-Bună ziua!
+Salutare, @FULLNAME@!
-Pagina @PAGE@ în @TITLE@ wiki s-a modificat.
-Acestea sunt modificările:
+Pagina @PAGE@ în @TITLE@ wiki a fost modificată.
+Modificările sunt următoarele:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-Data: @DATE@
+Dată: @DATE@
Utilizator: @USER@
Sumarul editării: @SUMMARY@
-Vechea revizie: @OLDPAGE@
-Noua revizie: @NEWPAGE@
+Versiune anterioară: @OLDPAGE@
+Versiune curentă: @NEWPAGE@
-Pentru a anula notificarea paginii, logați-vă pe wiki la
-@DOKUWIKIURL@ apoi navigați la
+Pentru a anula notificarea paginii, autentificcă-te pe wiki la
+@DOKUWIKIURL@ apoi accesează
@SUBSCRIBE@
-și dezabonați-vă de la pagină și/sau modificările numelui de spațiu.
+și dezabonează-te de la pagină și/sau modificările spațiului de nume.
--
-Acest mail a fost generat de DokuWiki la
-@DOKUWIKIURL@ \ No newline at end of file
+Acest e-mail a fost generat de DokuWiki la
+@DOKUWIKIURL@
diff --git a/inc/lang/ro/updateprofile.txt b/inc/lang/ro/updateprofile.txt
index f3985a1c6..de43c69cb 100644
--- a/inc/lang/ro/updateprofile.txt
+++ b/inc/lang/ro/updateprofile.txt
@@ -1,3 +1,4 @@
====== Actualizare profil utilizator ======
-Trebuie să completați doar câmpurile pe care doriți să le modificați. Nu puteți modifica numele de utilizator. \ No newline at end of file
+Trebuie să completezi doar câmpurile pe care dorești să le modifici. Nu poți
+modifica numele de utilizator.
diff --git a/inc/lang/ro/uploadmail.txt b/inc/lang/ro/uploadmail.txt
index c1e5736e2..81c2828e8 100644
--- a/inc/lang/ro/uploadmail.txt
+++ b/inc/lang/ro/uploadmail.txt
@@ -1,7 +1,9 @@
-Un fișier a fost încărcat în DocuWiki. Iată detaliile:
+Salutare, @FULLNAME@!
+
+Un fișier a fost încărcat în DokuWiki. Iată detaliile:
Fișier : @MEDIA@
-Data : @DATE@
+Dată : @DATE@
Browser : @BROWSER@
Adresă IP : @IPADDRESS@
Hostname : @HOSTNAME@
@@ -10,5 +12,5 @@ MIME Type : @MIME@
Utilizator : @USER@
--
-Acest mail a fost generat automat de către DokuWiki la
+Acest e-mail a fost generat de DokuWiki la
@DOKUWIKIURL@
diff --git a/inc/lang/ru/admin.txt b/inc/lang/ru/admin.txt
index e00daa447..cd609a347 100644
--- a/inc/lang/ru/admin.txt
+++ b/inc/lang/ru/admin.txt
@@ -1,4 +1,4 @@
====== Управление ======
-Ниже вы сможете найти список административных операций, доступных в «ДокуВики».
+Ниже вы сможете найти список административных операций, доступных в «Докувики».
diff --git a/inc/lang/ru/denied.txt b/inc/lang/ru/denied.txt
index f7f53ce88..6b7c82511 100644
--- a/inc/lang/ru/denied.txt
+++ b/inc/lang/ru/denied.txt
@@ -1,3 +1,4 @@
====== Доступ запрещён ======
-Извините, у вас не хватает прав для этого действия. Может быть вы забыли войти в вики под своим логином?
+Извините, у вас не хватает прав для этого действия.
+
diff --git a/inc/lang/ru/jquery.ui.datepicker.js b/inc/lang/ru/jquery.ui.datepicker.js
new file mode 100644
index 000000000..a51971405
--- /dev/null
+++ b/inc/lang/ru/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ru'] = {
+ closeText: 'Закрыть',
+ prevText: '&#x3C;Пред',
+ nextText: 'След&#x3E;',
+ currentText: 'Сегодня',
+ monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
+ 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
+ monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+ 'Июл','Авг','Сен','Окт','Ноя','Дек'],
+ dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
+ dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
+ dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
+ weekHeader: 'Нед',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ru']);
+});
diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php
index 237b819db..4cd3e5f0b 100644
--- a/inc/lang/ru/lang.php
+++ b/inc/lang/ru/lang.php
@@ -23,6 +23,9 @@
* @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua)
* @author Pavel <ivanovtsk@mail.ru>
* @author Artur <ncuxxx@gmail.com>
+ * @author Erli Moen <evseev.jr@gmail.com>
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Владимир <id37736@yandex.ru>
*/
$lang['encoding'] = ' utf-8';
$lang['direction'] = 'ltr';
@@ -67,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'] = 'Пароль';
@@ -89,7 +94,7 @@ $lang['regsuccess2'] = 'Пользователь создан.';
$lang['regmailfail'] = 'Похоже есть проблема с отправкой пароля по почте. Пожалуйста, сообщите об этом администратору.';
$lang['regbadmail'] = 'Данный вами адрес электронной почты выглядит неправильным. Если вы считаете это ошибкой, сообщите администратору.';
$lang['regbadpass'] = 'Два введённых пароля не идентичны. Пожалуйста, попробуйте ещё раз.';
-$lang['regpwmail'] = 'Ваш пароль для системы «ДокуВики»';
+$lang['regpwmail'] = 'Ваш пароль для системы «Докувики»';
$lang['reghere'] = 'У вас ещё нет аккаунта? Зарегистрируйтесь';
$lang['profna'] = 'Данная вики не поддерживает изменение профиля';
$lang['profnochange'] = 'Изменений не было внесено, профиль не обновлён.';
@@ -144,7 +149,7 @@ $lang['js']['medialeft'] = 'Выровнять изображение по
$lang['js']['mediaright'] = 'Выровнять изображение по правому краю.';
$lang['js']['mediacenter'] = 'Выровнять изображение по центру.';
$lang['js']['medianoalign'] = 'Не выравнивать.';
-$lang['js']['nosmblinks'] = 'Ссылка на сетевые каталоги Windows работает только из Интернет Эксплорера. Но вы можете скопировать ссылку.';
+$lang['js']['nosmblinks'] = 'Ссылка на сетевые каталоги Windows работает только из MS Internet Explorer, но вы можете скопировать ссылку.';
$lang['js']['linkwiz'] = 'Мастер ссылок';
$lang['js']['linkto'] = 'Ссылка на:';
$lang['js']['del_confirm'] = 'Вы на самом деле желаете удалить выбранное?';
@@ -196,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'] = 'Вы находитесь здесь';
@@ -252,7 +260,6 @@ $lang['admin_register'] = 'Добавить пользователя';
$lang['metaedit'] = 'Править метаданные';
$lang['metasaveerr'] = 'Ошибка записи метаданных';
$lang['metasaveok'] = 'Метаданные сохранены';
-$lang['img_backto'] = 'Вернуться к';
$lang['img_title'] = 'Название';
$lang['img_caption'] = 'Подпись';
$lang['img_date'] = 'Дата';
@@ -265,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'] = 'Нет адреса электронной почты, сопоставленного с вашей учётной записью. Вы не можете подписаться на рассылку';
@@ -285,33 +291,34 @@ $lang['subscr_style_list'] = 'список изменённых страни
$lang['authtempfail'] = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом своему администратору вики.';
$lang['authpwdexpire'] = 'Действие вашего пароля истекает через %d дней. Вы должны изменить его как можно скорее';
$lang['i_chooselang'] = 'Выберите свой язык/Choose your language';
-$lang['i_installer'] = 'Установка «ДокуВики»';
+$lang['i_installer'] = 'Установка «Докувики»';
$lang['i_wikiname'] = 'Название вики';
$lang['i_enableacl'] = 'Разрешить ограничение прав доступа (рекомендуется)';
$lang['i_superuser'] = 'Суперпользователь';
$lang['i_problems'] = 'Программа установки столкнулась с проблемами, перечисленными ниже. Чтобы продолжить, вам необходимо их устранить. ';
-$lang['i_modified'] = 'Из соображений безопасности эта программа запускается только на новой, неизменённой установке «ДокуВики».
+$lang['i_modified'] = 'Из соображений безопасности эта программа запускается только на новой, неизменённой установке «Докувики».
Вам нужно либо заново распаковать скачанный пакет установки, либо обратиться к полной
- <a href="http://www.dokuwiki.org/install">инструкции по установке «ДокуВики»</a>';
+ <a href="http://www.dokuwiki.org/install">инструкции по установке «Докувики»</a>';
$lang['i_funcna'] = 'Функция PHP <code>%s</code> недоступна. Может быть, она по какой-то причине заблокирована вашим хостером?';
$lang['i_phpver'] = 'Ваша версия PHP (<code>%s</code>) ниже требуемой (<code>%s</code>). Вам необходимо обновить установленную версию PHP.';
-$lang['i_permfail'] = '<code>%s</code> недоступна для записи «ДокуВики». Вам необходимо исправить системные права доступа для этой директории!';
+$lang['i_permfail'] = '<code>%s</code> недоступна для записи «Докувики». Вам необходимо исправить системные права доступа для этой директории!';
$lang['i_confexists'] = '<code>%s</code> уже существует';
-$lang['i_writeerr'] = 'Не удалось создать <code>%s</code>. Вам необходимо проверить системные права доступа к файлу/директориям и создать файл вручную. ';
+$lang['i_writeerr'] = 'Не удалось создать <code>%s</code>. Вам необходимо проверить системные права доступа к файлу и директориям, и создать файл вручную. ';
$lang['i_badhash'] = 'dokuwiki.php не распознан или изменён (хэш=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> — недопустимое или пустое значение';
$lang['i_success'] = 'Конфигурация прошла успешно. Теперь вы можете удалить файл install.php. Переходите к
- <a href="doku.php?id=wiki:welcome">своей новой «ДокуВики»</a>.';
-$lang['i_failure'] = 'При записи в файлы конфигурации были обнаружены ошибки. Возможно, вам придётся исправить их вручную, прежде чем вы сможете использовать <a href="doku.php?id=wiki:welcome">свою новую «ДокуВики»</a>.';
+ <a href="doku.php?id=wiki:welcome">своей новой «Докувики»</a>.';
+$lang['i_failure'] = 'При записи в файлы конфигурации были обнаружены ошибки. Возможно, вам придётся исправить их вручную, прежде чем вы сможете использовать <a href="doku.php?id=wiki:welcome">свою новую «Докувики»</a>.';
$lang['i_policy'] = 'Исходная политика прав доступа';
$lang['i_pol0'] = 'Открытая вики (чтение, запись, закачка файлов для всех)';
$lang['i_pol1'] = 'Общедоступная вики (чтение для всех, запись и загрузка файлов для зарегистрированных пользователей)';
$lang['i_pol2'] = 'Закрытая вики (чтение, запись и загрузка файлов только для зарегистрированных пользователей)';
+$lang['i_allowreg'] = 'Разрешить пользователям самостоятельно регистрироваться';
$lang['i_retry'] = 'Повторить попытку';
-$lang['i_license'] = 'Пожалуйста, выберите тип лицензии для своей вики:';
-$lang['i_license_none'] = 'Не отображать информацию о лицензионных операциях';
-$lang['i_pop_field'] = 'Пожалуйста, помогите нам улучшить «ДокуВики»:';
-$lang['i_pop_label'] = 'Отправлять раз в месяц анонимную пользовательскую информацию разработчикам «ДокуВики»';
+$lang['i_license'] = 'Пожалуйста, выберите тип лицензии для своей вики';
+$lang['i_license_none'] = 'Не отображать информацию о лицензии';
+$lang['i_pop_field'] = 'Пожалуйста, помогите нам улучшить «Докувики»:';
+$lang['i_pop_label'] = 'Отправлять раз в месяц анонимную пользовательскую информацию разработчикам «Докувики»';
$lang['recent_global'] = 'Вы просматриваете изменения в пространстве имён <b>%s</b>. Вы можете также <a href="%s">просмотреть недавние изменения во всей вики</a>.';
$lang['years'] = '%d лет назад';
$lang['months'] = '%d месяц(ев) назад';
@@ -345,3 +352,7 @@ $lang['media_perm_read'] = 'Извините, у вас недостато
$lang['media_perm_upload'] = 'Извините, у вас недостаточно прав для загрузки файлов.';
$lang['media_update'] = 'Загрузить новую версию';
$lang['media_restore'] = 'Восстановить эту версию';
+$lang['currentns'] = 'Текущее пространство имён';
+$lang['searchresult'] = 'Результаты поиска';
+$lang['plainhtml'] = 'Простой HTML';
+$lang['wikimarkup'] = 'вики-разметка';
diff --git a/inc/lang/ru/mailtext.txt b/inc/lang/ru/mailtext.txt
index 2b3f76bbd..953daddf2 100644
--- a/inc/lang/ru/mailtext.txt
+++ b/inc/lang/ru/mailtext.txt
@@ -13,5 +13,5 @@ IP-адрес: @IPADDRESS@
--
-Это письмо было сгенерировано «ДокуВики» по адресу
+Это письмо было сгенерировано «Докувики» по адресу
@DOKUWIKIURL@
diff --git a/inc/lang/ru/norev.txt b/inc/lang/ru/norev.txt
index 388d6149d..c088d0d5a 100644
--- a/inc/lang/ru/norev.txt
+++ b/inc/lang/ru/norev.txt
@@ -1,4 +1,3 @@
====== Такой версии не существует ======
Указанная версия страницы не существует. Нажмите на кнопку «История страницы», чтобы получить список доступных предыдущих версий этого документа.
-
diff --git a/inc/lang/ru/password.txt b/inc/lang/ru/password.txt
index eb100f334..fabdf2b68 100644
--- a/inc/lang/ru/password.txt
+++ b/inc/lang/ru/password.txt
@@ -6,5 +6,5 @@
Пароль: @PASSWORD@
--
-Это письмо было сгенерировано «ДокуВики» по адресу
+Это письмо было сгенерировано «Докувики» по адресу
@DOKUWIKIURL@
diff --git a/inc/lang/ru/pwconfirm.txt b/inc/lang/ru/pwconfirm.txt
index 9c27af752..954c75dfe 100644
--- a/inc/lang/ru/pwconfirm.txt
+++ b/inc/lang/ru/pwconfirm.txt
@@ -9,5 +9,5 @@
@CONFIRM@
--
-Это сообщение было сгенерировано «ДокуВики» по адресу
+Это сообщение было сгенерировано «Докувики» по адресу
@DOKUWIKIURL@
diff --git a/inc/lang/ru/registermail.txt b/inc/lang/ru/registermail.txt
index fc862b034..86ef11e8c 100644
--- a/inc/lang/ru/registermail.txt
+++ b/inc/lang/ru/registermail.txt
@@ -10,5 +10,5 @@
Хост: @HOSTNAME@
--
-Это сообщение было сгенерировано «ДокуВики» по адресу
+Это сообщение было сгенерировано «Докувики» по адресу
@DOKUWIKIURL@
diff --git a/inc/lang/ru/subscr_digest.txt b/inc/lang/ru/subscr_digest.txt
index 41774a4e9..ac0fc0528 100644
--- a/inc/lang/ru/subscr_digest.txt
+++ b/inc/lang/ru/subscr_digest.txt
@@ -15,6 +15,6 @@
@SUBSCRIBE@
и отмените подписку на страницу и/или пространство имен.
---
-Это письмо создано «ДокуВики» с сайта
+--
+Это письмо создано «Докувики» с сайта
@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/ru/subscr_list.txt b/inc/lang/ru/subscr_list.txt
index 41e1323bc..984a25eb0 100644
--- a/inc/lang/ru/subscr_list.txt
+++ b/inc/lang/ru/subscr_list.txt
@@ -12,6 +12,6 @@
@SUBSCRIBE@
и отмените подписку на страницу и/или пространство имён.
---
-Это письмо создано «ДокуВики» с сайта
+--
+Это письмо создано «Докувики» с сайта
@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/ru/subscr_single.txt b/inc/lang/ru/subscr_single.txt
index 911a48e96..679ca6fff 100644
--- a/inc/lang/ru/subscr_single.txt
+++ b/inc/lang/ru/subscr_single.txt
@@ -19,6 +19,6 @@
@SUBSCRIBE@
и отмените подписку на страницу и/или пространство имён.
---
-Это письмо создано «ДокуВики» с сайта
+--
+Это письмо создано «Докувики» с сайта
@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/ru/uploadmail.txt b/inc/lang/ru/uploadmail.txt
index f696f2c44..84103b45a 100644
--- a/inc/lang/ru/uploadmail.txt
+++ b/inc/lang/ru/uploadmail.txt
@@ -11,5 +11,5 @@
Пользователь: @USER@
--
-Это письмо было сгенерировано «ДокуВики» по адресу
+Это письмо было сгенерировано «Докувики» по адресу
@DOKUWIKIURL@
diff --git a/inc/lang/sk/denied.txt b/inc/lang/sk/denied.txt
index 6e9c98496..aa6f7b8fb 100644
--- a/inc/lang/sk/denied.txt
+++ b/inc/lang/sk/denied.txt
@@ -1,3 +1,4 @@
====== Nepovolená akcia ======
-Prepáčte, ale nemáte dostatočné oprávnenie k tejto činnosti. Možno ste sa zabudli prihlásiť?
+Prepáčte, ale nemáte dostatočné oprávnenie k tejto činnosti.
+
diff --git a/inc/lang/sk/jquery.ui.datepicker.js b/inc/lang/sk/jquery.ui.datepicker.js
new file mode 100644
index 000000000..0cb76c4e8
--- /dev/null
+++ b/inc/lang/sk/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+jQuery(function($){
+ $.datepicker.regional['sk'] = {
+ closeText: 'Zavrieť',
+ prevText: '&#x3C;Predchádzajúci',
+ nextText: 'Nasledujúci&#x3E;',
+ currentText: 'Dnes',
+ monthNames: ['január','február','marec','apríl','máj','jún',
+ 'júl','august','september','október','november','december'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
+ 'Júl','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['nedeľa','pondelok','utorok','streda','štvrtok','piatok','sobota'],
+ dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'],
+ dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'],
+ weekHeader: 'Ty',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sk']);
+});
diff --git a/inc/lang/sk/lang.php b/inc/lang/sk/lang.php
index a5fc47f5f..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';
@@ -290,6 +290,7 @@ $lang['i_policy'] = 'Počiatočná ACL politika';
$lang['i_pol0'] = 'Otvorená Wiki (čítanie, zápis a nahrávanie pre každého)';
$lang['i_pol1'] = 'Verejná Wiki (čítanie pre každého, zápis a nahrávanie pre registrovaných užívateľov)';
$lang['i_pol2'] = 'Uzatvorená Wiki (čítanie, zápis a nahrávanie len pre registrovaných užívateľov)';
+$lang['i_allowreg'] = 'Povolenie samostanej registrácie používateľov';
$lang['i_retry'] = 'Skúsiť znovu';
$lang['i_license'] = 'Vyberte licenciu, pod ktorou chcete uložiť váš obsah:';
$lang['i_license_none'] = 'Nezobrazovať žiadne licenčné informácie';
diff --git a/inc/lang/sl/denied.txt b/inc/lang/sl/denied.txt
index 5b5fd4d3a..206e167bb 100644
--- a/inc/lang/sl/denied.txt
+++ b/inc/lang/sl/denied.txt
@@ -1,3 +1,4 @@
====== Ni ustreznih dovoljenj ======
-Za nadaljevanje opravila je treba imeti ustrezna dovoljenja. Ali ste se morda pozabili prijaviti?
+Za nadaljevanje opravila je treba imeti ustrezna dovoljenja.
+
diff --git a/inc/lang/sl/jquery.ui.datepicker.js b/inc/lang/sl/jquery.ui.datepicker.js
new file mode 100644
index 000000000..048a47af7
--- /dev/null
+++ b/inc/lang/sl/jquery.ui.datepicker.js
@@ -0,0 +1,24 @@
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = č, s = š z = ž C = Č S = Š Z = Ž */
+jQuery(function($){
+ $.datepicker.regional['sl'] = {
+ closeText: 'Zapri',
+ prevText: '&#x3C;Prejšnji',
+ nextText: 'Naslednji&#x3E;',
+ currentText: 'Trenutni',
+ monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
+ 'Julij','Avgust','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Avg','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'],
+ dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'],
+ dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'],
+ weekHeader: 'Teden',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sl']);
+});
diff --git a/inc/lang/sl/lang.php b/inc/lang/sl/lang.php
index 371b6659d..c834611dc 100644
--- a/inc/lang/sl/lang.php
+++ b/inc/lang/sl/lang.php
@@ -9,6 +9,8 @@
* @author Gregor Skumavc (grega.skumavc@gmail.com)
* @author Matej Urbančič (mateju@svn.gnome.org)
* @author Matej Urbančič <mateju@svn.gnome.org>
+ * @author matej <mateju@svn.gnome.org>
+ * @author Jernej Vidmar <jernej.vidmar@vidmarboehm.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -53,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';
@@ -84,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';
@@ -178,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';
@@ -234,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';
@@ -247,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.';
@@ -265,6 +271,7 @@ $lang['subscr_style_every'] = 'elektronsko sporočilo ob vsaki spremembi';
$lang['subscr_style_digest'] = 'strnjeno elektronsko sporočilo sprememb za vsako stran (vsakih %.2f dni)';
$lang['subscr_style_list'] = 'seznam spremenjenih strani od zadnjega elektronskega sporočila (vsakih %.2f dni)';
$lang['authtempfail'] = 'Potrditev uporabnika je trenutno nedostopna. Stopite v stik s skrbnikom sistema wiki.';
+$lang['authpwdexpire'] = 'Geslo bo poteklo v %d dneh. Priporočljivo ga je zamenjati.';
$lang['i_chooselang'] = 'Izberite jezik';
$lang['i_installer'] = 'DokuWiki namestitev';
$lang['i_wikiname'] = 'Ime Wiki spletišča';
@@ -289,6 +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';
@@ -324,3 +333,4 @@ $lang['media_restore'] = 'Obnovi to različico';
$lang['currentns'] = 'Trenutni imenski prostor';
$lang['searchresult'] = 'Rezultati iskanja';
$lang['plainhtml'] = 'Zapis HTML';
+$lang['wikimarkup'] = 'Oblikovni jezik Wiki';
diff --git a/inc/lang/sl/resetpwd.txt b/inc/lang/sl/resetpwd.txt
new file mode 100644
index 000000000..c2a81ab9a
--- /dev/null
+++ b/inc/lang/sl/resetpwd.txt
@@ -0,0 +1 @@
+====== Nastavitev novega gesla ======<br><br>Vnesite novo geslo za račun Wiki. \ No newline at end of file
diff --git a/inc/lang/sq/denied.txt b/inc/lang/sq/denied.txt
index 03e10527f..60aa05e55 100644
--- a/inc/lang/sq/denied.txt
+++ b/inc/lang/sq/denied.txt
@@ -1,3 +1,4 @@
====== Leja Refuzohet ======
-Na vjen keq, ju nuk keni të drejta të mjaftueshme për të vazhduar. Mbase harruat të hyni? \ No newline at end of file
+Na vjen keq, ju nuk keni të drejta të mjaftueshme për të vazhduar.
+
diff --git a/inc/lang/sq/jquery.ui.datepicker.js b/inc/lang/sq/jquery.ui.datepicker.js
new file mode 100644
index 000000000..d6086a789
--- /dev/null
+++ b/inc/lang/sq/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['sq'] = {
+ closeText: 'mbylle',
+ prevText: '&#x3C;mbrapa',
+ nextText: 'Përpara&#x3E;',
+ currentText: 'sot',
+ monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
+ 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
+ monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
+ 'Kor','Gus','Sht','Tet','Nën','Dhj'],
+ dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
+ dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+ dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+ weekHeader: 'Ja',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sq']);
+});
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/denied.txt b/inc/lang/sr/denied.txt
index b74f2b1f8..521c28453 100644
--- a/inc/lang/sr/denied.txt
+++ b/inc/lang/sr/denied.txt
@@ -1,4 +1,4 @@
====== Забрањен приступ ======
-Извините, али немате довољно права да наставите. Можда сте заборавили да се пријавите?
+Извините, али немате довољно права да наставите.
diff --git a/inc/lang/sr/jquery.ui.datepicker.js b/inc/lang/sr/jquery.ui.datepicker.js
new file mode 100644
index 000000000..1349a26cf
--- /dev/null
+++ b/inc/lang/sr/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+ $.datepicker.regional['sr'] = {
+ closeText: 'Затвори',
+ prevText: '&#x3C;',
+ nextText: '&#x3E;',
+ currentText: 'Данас',
+ monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
+ 'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
+ monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун',
+ 'Јул','Авг','Сеп','Окт','Нов','Дец'],
+ dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
+ dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'],
+ dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'],
+ weekHeader: 'Сед',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sr']);
+});
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/denied.txt b/inc/lang/sv/denied.txt
index 64d129227..7ae09b85b 100644
--- a/inc/lang/sv/denied.txt
+++ b/inc/lang/sv/denied.txt
@@ -1,4 +1,4 @@
====== Åtkomst nekad ======
-Tyvärr, du har inte behörighet att fortsätta. Kanske har du glömt att logga in?
+Tyvärr, du har inte behörighet att fortsätta.
diff --git a/inc/lang/sv/jquery.ui.datepicker.js b/inc/lang/sv/jquery.ui.datepicker.js
new file mode 100644
index 000000000..cbb5ad135
--- /dev/null
+++ b/inc/lang/sv/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+jQuery(function($){
+ $.datepicker.regional['sv'] = {
+ closeText: 'Stäng',
+ prevText: '&#xAB;Förra',
+ nextText: 'Nästa&#xBB;',
+ currentText: 'Idag',
+ monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+ 'Juli','Augusti','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
+ dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
+ dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
+ weekHeader: 'Ve',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sv']);
+});
diff --git a/inc/lang/sv/lang.php b/inc/lang/sv/lang.php
index 7d85f543e..c057d8705 100644
--- a/inc/lang/sv/lang.php
+++ b/inc/lang/sv/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Joaquim Homrighausen <joho@webbplatsen.se>
* @author Per Foreby <per@foreby.se>
* @author Nicklas Henriksson <nicklas[at]nihe.se>
@@ -19,6 +19,7 @@
* @author Smorkster Andersson smorkster@gmail.com
* @author Henrik <henrik@idealis.se>
* @author Tor Härnqvist <tor.harnqvist@gmail.com>
+ * @author Hans Iwan Bratt <hibratt@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -148,6 +149,8 @@ $lang['js']['del_confirm'] = 'Vill du verkligen radera?';
$lang['js']['restore_confirm'] = 'Återställa denna version?';
$lang['js']['media_diff'] = 'Se skillnader:';
$lang['js']['media_diff_both'] = 'Sida vid sida';
+$lang['js']['media_diff_opacity'] = 'Genomskinlig';
+$lang['js']['media_diff_portions'] = 'Svep';
$lang['js']['media_select'] = 'Välj filer...';
$lang['js']['media_upload_btn'] = 'Ladda upp';
$lang['js']['media_done_btn'] = 'Färdig';
@@ -204,8 +207,10 @@ $lang['noflash'] = '<a href="http://www.adobe.com/products/flashpl
$lang['download'] = 'Ladda ner kodfragmentet';
$lang['tools'] = 'Verktyg';
$lang['user_tools'] = 'Användarverktyg';
+$lang['site_tools'] = 'Webbverktyg';
$lang['page_tools'] = 'Sidverktyg';
$lang['skip_to_content'] = 'hoppa till innehåll';
+$lang['sidebar'] = 'Sidmeny';
$lang['mail_newpage'] = 'sida tillagd:';
$lang['mail_changed'] = 'sida ändrad:';
$lang['mail_subscribe_list'] = 'sidor ändrade i namnrymd:';
@@ -244,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';
@@ -257,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';
@@ -298,6 +303,7 @@ $lang['i_policy'] = 'Initial ACL-policy';
$lang['i_pol0'] = 'Öppen wiki (alla får läsa, skriva och ladda upp filer)';
$lang['i_pol1'] = 'Publik wiki (alla får läsa, registrerade användare för skriva och ladda upp filer)';
$lang['i_pol2'] = 'Sluten wiki (endast registrerade användare får läsa, skriva och ladda upp filer)';
+$lang['i_allowreg'] = 'Tillåt användare att registrera sig själva';
$lang['i_retry'] = 'Försök igen';
$lang['i_license'] = 'Vänligen välj licens du vill använda för ditt innehåll:';
$lang['i_license_none'] = 'Visa ingen licensinformation';
@@ -335,3 +341,5 @@ $lang['media_perm_read'] = 'Du har tyvärr inte tillräckliga behörighete
$lang['media_perm_upload'] = 'Du har tyvärr inte tillräckliga behörigheter för att ladda upp filer.';
$lang['media_update'] = 'Ladda upp ny version';
$lang['media_restore'] = 'Återställ denna version';
+$lang['searchresult'] = 'Sökresultat';
+$lang['plainhtml'] = 'Ren HTML';
diff --git a/inc/lang/sv/subscr_digest.txt b/inc/lang/sv/subscr_digest.txt
new file mode 100644
index 000000000..6724726ac
--- /dev/null
+++ b/inc/lang/sv/subscr_digest.txt
@@ -0,0 +1,19 @@
+Hej
+
+Sidan @PAGE@ med @TITLE@ har ändrats.
+Här är ändringarna:
+
+-----------------------------
+@DIFF@
+-----------------------------
+
+Äldre versionen: @OLDPAGE@
+Ny version: @NEWPAGE@
+
+För att avbryta meddelanden om sidändringar logga in till wikin @DOKUWIKIURL@, besök sedan
+@SUBSCRIBE@
+och avbeställ ändringar av sidor och/eller namespace.
+
+--
+Detta meddelande har skapats av DokuWiki vid
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/th/denied.txt b/inc/lang/th/denied.txt
index 88b012a67..4cc29d626 100644
--- a/inc/lang/th/denied.txt
+++ b/inc/lang/th/denied.txt
@@ -1,3 +1,4 @@
====== ปฏิเสธสิทธิ์ ======
-ขออภัย คุณไม่มีสิทธิ์เพียงพอที่จะดำเนินการต่อ บางทีคุณอาจจะลืมล็อกอิน? \ No newline at end of file
+ขออภัย คุณไม่มีสิทธิ์เพียงพอที่จะดำเนินการต่อ
+
diff --git a/inc/lang/th/jquery.ui.datepicker.js b/inc/lang/th/jquery.ui.datepicker.js
new file mode 100644
index 000000000..aecfd27cc
--- /dev/null
+++ b/inc/lang/th/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+jQuery(function($){
+ $.datepicker.regional['th'] = {
+ closeText: 'ปิด',
+ prevText: '&#xAB;&#xA0;ย้อน',
+ nextText: 'ถัดไป&#xA0;&#xBB;',
+ currentText: 'วันนี้',
+ monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
+ 'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
+ monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
+ 'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'],
+ dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'],
+ dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+ dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['th']);
+});
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/denied.txt b/inc/lang/tr/denied.txt
index 04e9b8bfb..2acfd7a8f 100644
--- a/inc/lang/tr/denied.txt
+++ b/inc/lang/tr/denied.txt
@@ -1,4 +1,4 @@
====== Yetki Reddedildi ======
-Üzgünüz, devam etmek için yetkiniz yok. Giriş yapmayı unutmuş olabilir misiniz?
+Üzgünüz, devam etmek için yetkiniz yok.
diff --git a/inc/lang/tr/jquery.ui.datepicker.js b/inc/lang/tr/jquery.ui.datepicker.js
new file mode 100644
index 000000000..75b583a77
--- /dev/null
+++ b/inc/lang/tr/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+jQuery(function($){
+ $.datepicker.regional['tr'] = {
+ closeText: 'kapat',
+ prevText: '&#x3C;geri',
+ nextText: 'ileri&#x3e',
+ currentText: 'bugün',
+ monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
+ 'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
+ monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz',
+ 'Tem','Ağu','Eyl','Eki','Kas','Ara'],
+ dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
+ dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+ dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+ weekHeader: 'Hf',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['tr']);
+});
diff --git a/inc/lang/tr/lang.php b/inc/lang/tr/lang.php
index 6b9e0dd44..2af17fe27 100644
--- a/inc/lang/tr/lang.php
+++ b/inc/lang/tr/lang.php
@@ -10,6 +10,7 @@
* @author Caleb Maclennan <caleb@alerque.com>
* @author farukerdemoncel@gmail.com
* @author Mustafa Aslan <maslan@hotmail.com>
+ * @author huseyin can <huseyincan73@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -179,6 +180,7 @@ $lang['yours'] = 'Senin Sürümün';
$lang['diff'] = 'Kullanılan sürüm ile farkları göster';
$lang['diff2'] = 'Seçili sürümler arasındaki farkı göster';
$lang['difflink'] = 'Karşılaştırma görünümüne bağlantı';
+$lang['diff_type'] = 'farklı görünüş';
$lang['line'] = 'Satır';
$lang['breadcrumb'] = 'İz';
$lang['youarehere'] = 'Buradasınız';
@@ -191,10 +193,17 @@ $lang['external_edit'] = 'Dışarıdan düzenle';
$lang['summary'] = 'Özeti düzenle';
$lang['noflash'] = 'Bu içeriği göstermek için <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Eklentisi</a> gerekmektedir.';
$lang['download'] = 'Parçacığı indir';
+$lang['tools'] = 'Alet';
+$lang['user_tools'] = 'Kullanıcı Aletleri';
+$lang['site_tools'] = 'Site Aletleri';
+$lang['page_tools'] = 'Sayfa Aletleri';
+$lang['skip_to_content'] = 'Bağlanmak için kaydır';
+$lang['sidebar'] = 'kaydırma çubuğu';
$lang['mail_newpage'] = 'sayfa eklenme:';
$lang['mail_changed'] = 'sayfa değiştirilme:';
$lang['mail_new_user'] = 'yeni kullanıcı';
$lang['mail_upload'] = 'dosya yüklendi:';
+$lang['changes_type'] = 'görünüşü değiştir';
$lang['pages_changes'] = 'Sayfalar';
$lang['media_changes'] = 'Çokluortam dosyaları';
$lang['both_changes'] = 'Sayfalar ve çoklu ortam dosyaları';
@@ -224,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';
@@ -237,7 +246,10 @@ $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';
$lang['subscr_m_subscribe'] = 'Kayıt ol';
$lang['subscr_m_receive'] = 'Al';
$lang['authtempfail'] = 'Kullanıcı doğrulama geçici olarak yapılamıyor. Eğer bu durum devam ederse lütfen Wiki yöneticine haber veriniz.';
@@ -290,4 +302,5 @@ $lang['media_view'] = '%s';
$lang['media_edit'] = 'Düzenle %s';
$lang['media_history'] = 'Geçmiş %s';
$lang['media_perm_upload'] = 'Üzgünüm, karşıya dosya yükleme yetkiniz yok.';
+$lang['media_update'] = 'Yeni versiyonu yükleyin';
$lang['media_restore'] = 'Bu sürümü eski haline getir';
diff --git a/inc/lang/uk/denied.txt b/inc/lang/uk/denied.txt
index 5db12e1bc..635d31c38 100644
--- a/inc/lang/uk/denied.txt
+++ b/inc/lang/uk/denied.txt
@@ -1,4 +1,4 @@
====== Доступ заборонено ======
-Вибачте, але у вас не вистачає прав для продовження. Можливо ви забули увійти в систему?
+Вибачте, але у вас не вистачає прав для продовження.
diff --git a/inc/lang/uk/jquery.ui.datepicker.js b/inc/lang/uk/jquery.ui.datepicker.js
new file mode 100644
index 000000000..2bdc82ff7
--- /dev/null
+++ b/inc/lang/uk/jquery.ui.datepicker.js
@@ -0,0 +1,24 @@
+/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+/* Corrected by Igor Milla (igor.fsp.milla@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['uk'] = {
+ closeText: 'Закрити',
+ prevText: '&#x3C;',
+ nextText: '&#x3E;',
+ currentText: 'Сьогодні',
+ monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
+ 'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
+ monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
+ 'Лип','Сер','Вер','Жов','Лис','Гру'],
+ dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'],
+ dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'],
+ dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'],
+ weekHeader: 'Тиж',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['uk']);
+});
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/denied.txt b/inc/lang/vi/denied.txt
index 35acaeb62..fe6e759fc 100644
--- a/inc/lang/vi/denied.txt
+++ b/inc/lang/vi/denied.txt
@@ -1,3 +1,4 @@
====== Không được phép vào ======
-Rất tiếc là bạn không được phép để tiếp tục. Bạn quên đăng nhập hay sao?
+Rất tiếc là bạn không được phép để tiếp tục.
+
diff --git a/inc/lang/vi/jquery.ui.datepicker.js b/inc/lang/vi/jquery.ui.datepicker.js
new file mode 100644
index 000000000..b49e7eb13
--- /dev/null
+++ b/inc/lang/vi/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+jQuery(function($){
+ $.datepicker.regional['vi'] = {
+ closeText: 'Đóng',
+ prevText: '&#x3C;Trước',
+ nextText: 'Tiếp&#x3E;',
+ currentText: 'Hôm nay',
+ monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
+ 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
+ monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
+ 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
+ dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
+ dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+ dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+ weekHeader: 'Tu',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['vi']);
+});
diff --git a/inc/lang/vi/lang.php b/inc/lang/vi/lang.php
index c6b61da51..ccc179eec 100644
--- a/inc/lang/vi/lang.php
+++ b/inc/lang/vi/lang.php
@@ -1,42 +1,38 @@
<?php
+
/**
- * vietnamese language file
- *
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author James Do <jdo@myrealbox.com>
+ *
+ * @author James Do <jdo@myrealbox.com>
*/
-
-
-
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
-$lang['doublequoteopening'] = '“'; //&ldquo;
-$lang['doublequoteclosing'] = '”'; //&rdquo;
-$lang['singlequoteopening'] = '‘'; //&lsquo;
-$lang['singlequoteclosing'] = '’'; //&rsquo;
-$lang['apostrophe'] = '’'; //&rsquo;
-
-$lang['btn_edit'] = 'Biên soạn trang này';
-$lang['btn_source'] = 'Xem mã nguồn';
-$lang['btn_show'] = 'Xem trang';
-$lang['btn_create'] = 'Tạo trang này';
-$lang['btn_search'] = 'Tìm';
-$lang['btn_save'] = 'Lưu';
-$lang['btn_preview']= 'Duyệt trước';
-$lang['btn_top'] = 'Trở lên trên';
+$lang['doublequoteopening'] = '“';
+$lang['doublequoteclosing'] = '”';
+$lang['singlequoteopening'] = '‘';
+$lang['singlequoteclosing'] = '’';
+$lang['apostrophe'] = '’';
+$lang['btn_edit'] = 'Biên soạn trang này';
+$lang['btn_source'] = 'Xem mã nguồn';
+$lang['btn_show'] = 'Xem trang';
+$lang['btn_create'] = 'Tạo trang này';
+$lang['btn_search'] = 'Tìm';
+$lang['btn_save'] = 'Lưu';
+$lang['btn_preview'] = 'Duyệt trước';
+$lang['btn_top'] = 'Trở lên trên';
$lang['btn_newer'] = '<< mới hơn';
$lang['btn_older'] = 'cũ hơn >>';
-$lang['btn_revs'] = 'Các phiên bản cũ';
-$lang['btn_recent'] = 'Thay đổi gần đây';
-$lang['btn_upload'] = 'Tải lên';
-$lang['btn_cancel'] = 'Huỷ bỏ';
-$lang['btn_index'] = 'Mục lục';
-$lang['btn_secedit']= 'Biên soạn';
-$lang['btn_login'] = 'Đăng nhập';
-$lang['btn_logout'] = 'Thoát';
-$lang['btn_admin'] = 'Quản lý';
-$lang['btn_update'] = 'Cập nhật';
-$lang['btn_delete'] = 'Xoá';
+$lang['btn_revs'] = 'Các phiên bản cũ';
+$lang['btn_recent'] = 'Thay đổi gần đây';
+$lang['btn_upload'] = 'Tải lên';
+$lang['btn_cancel'] = 'Huỷ bỏ';
+$lang['btn_index'] = 'Mục lục';
+$lang['btn_secedit'] = 'Biên soạn';
+$lang['btn_login'] = 'Đăng nhập';
+$lang['btn_logout'] = 'Thoát';
+$lang['btn_admin'] = 'Quản lý';
+$lang['btn_update'] = 'Cập nhật';
+$lang['btn_delete'] = 'Xoá';
$lang['btn_back'] = 'Quay lại';
$lang['btn_backlink'] = 'Liên kết tới đây';
$lang['btn_profile'] = 'Cập nhật hồ sơ';
@@ -46,40 +42,36 @@ $lang['btn_draft'] = 'Sửa bản nháp';
$lang['btn_recover'] = 'Phục hồi bản nháp';
$lang['btn_draftdel'] = 'Xóa bản nháp';
$lang['btn_revert'] = 'Phục hồi';
-$lang['btn_register'] = 'Đăng ký';
+$lang['btn_register'] = 'Đăng ký';
$lang['btn_apply'] = 'Chấp nhận';
$lang['btn_media'] = 'Quản lý tệp tin';
-
-$lang['loggedinas'] = 'Username đang dùng';
-$lang['user'] = 'Username';
-$lang['pass'] = 'Mật khẩu';
+$lang['loggedinas'] = 'Username đang dùng';
+$lang['user'] = 'Username';
+$lang['pass'] = 'Mật khẩu';
$lang['newpass'] = 'Mật khẩu mới';
$lang['oldpass'] = 'Nhập lại mật khẩu hiện tại';
$lang['passchk'] = 'lần nữa';
-$lang['remember'] = 'Lưu username/password lại';
-$lang['fullname'] = 'Họ và tên';
-$lang['email'] = 'E-Mail';
+$lang['remember'] = 'Lưu username/password lại';
+$lang['fullname'] = 'Họ và tên';
+$lang['email'] = 'E-Mail';
$lang['profile'] = 'Hồ sơ thành viên';
-$lang['badlogin'] = 'Username hoặc password không đúng.';
+$lang['badlogin'] = 'Username hoặc password không đúng.';
$lang['minoredit'] = 'Minor Changes';
-$lang['draftdate'] = 'Bản nháp được tự động lưu lúc'; // full dformat date will be added
+$lang['draftdate'] = 'Bản nháp được tự động lưu lúc';
$lang['nosecedit'] = 'Các trang web đã được thay đổi trong khi chờ đợi, phần thông tin quá hạn đã được thay thế bằng trang đầy đủ.';
-
-$lang['regmissing'] = 'Bạn cần điền vào tất cả các trường';
-$lang['reguexists'] = 'Bạn khác đã dùng username này rồi.';
-$lang['regsuccess'] = 'Đã tạo username, và đã gởi password.';
+$lang['regmissing'] = 'Bạn cần điền vào tất cả các trường';
+$lang['reguexists'] = 'Bạn khác đã dùng username này rồi.';
+$lang['regsuccess'] = 'Đã tạo username, và đã gởi password.';
$lang['regsuccess2'] = 'Thành viên vừa được tạo.';
-$lang['regmailfail']= 'Không gởi password được. Xin bạn liên hệ với người quản lý.';
-$lang['regbadmail'] = 'Email hình như không đúng. Xin bạn liên hệ với người quản lý.';
+$lang['regmailfail'] = 'Không gởi password được. Xin bạn liên hệ với người quản lý.';
+$lang['regbadmail'] = 'Email hình như không đúng. Xin bạn liên hệ với người quản lý.';
$lang['regbadpass'] = 'Hai mật khẩu đưa ra là không giống nhau, xin vui lòng thử lại.';
-$lang['regpwmail'] = 'Password DokuWiki của bạn là';
-$lang['reghere'] = 'Xin bạn đăng ký username nếu chưa có';
-
+$lang['regpwmail'] = 'Password DokuWiki của bạn là';
+$lang['reghere'] = 'Xin bạn đăng ký username nếu chưa có';
$lang['profna'] = 'Wiki này không hỗ trợ sửa đổi hồ sơ cá nhân';
$lang['profnochange'] = 'Không có thay đổi, không có gì để làm.';
$lang['profnoempty'] = 'Không được để trống tên hoặc địa chỉ email.';
$lang['profchanged'] = 'Cập nhật hồ sơ thành viên thành công.';
-
$lang['pwdforget'] = 'Bạn quên mật khẩu? Tạo lại mật khẩu mới';
$lang['resendna'] = 'Wiki này không hỗ trợ gửi lại mật khẩu.';
$lang['resendpwd'] = 'Gửi mật khẩu mới cho';
@@ -88,20 +80,17 @@ $lang['resendpwdnouser'] = 'Xin lỗi, chúng tôi không thể tìm thấ
$lang['resendpwdbadauth'] = 'Xin lỗi, mã này xác thực không hợp lệ. Hãy chắc chắn rằng bạn sử dụng liên kết xác nhận đầy đủ.';
$lang['resendpwdconfirm'] = 'Một liên kết xác nhận đã được gửi bằng email.';
$lang['resendpwdsuccess'] = 'Mật khẩu mới của bạn đã được gửi bằng email.';
-
$lang['license'] = 'Trừ khi có ghi chú khác, nội dung trên wiki này được cấp phép theo giấy phép sau đây:';
$lang['licenseok'] = 'Lưu ý: Bằng cách chỉnh sửa trang này, bạn đồng ý cấp giấy phép nội dung của bạn theo giấy phép sau:';
-
$lang['searchmedia'] = 'Tìm tên file:';
$lang['searchmedia_in'] = 'Tìm ở %s';
-$lang['txt_upload'] = 'Chọn tệp để tải lên';
-$lang['txt_filename'] = 'Điền wikiname (tuỳ ý)';
+$lang['txt_upload'] = 'Chọn tệp để tải lên';
+$lang['txt_filename'] = 'Điền wikiname (tuỳ ý)';
$lang['txt_overwrt'] = 'Ghi đè file trùng';
-$lang['lockedby'] = 'Đang khoá bởi';
-$lang['lockexpire'] = 'Sẽ được mở khóa vào lúc';
-
-$lang['js']['willexpire'] = 'Trong một phút nữa bài viết sẽ được mở khóa để cho phép người khác chỉnh sửa.\nĐể tránh xung đột, bạn nên bấm nút Duyệt trước để lập lại thời gian khoá bài';
-$lang['js']['notsavedyet'] = 'Hiện có những thay đổi chưa được bảo lưu, và sẽ mất.\nBạn thật sự muốn tiếp tục?';
+$lang['lockedby'] = 'Đang khoá bởi';
+$lang['lockexpire'] = 'Sẽ được mở khóa vào lúc';
+$lang['js']['willexpire'] = 'Trong một phút nữa bài viết sẽ được mở khóa để cho phép người khác chỉnh sửa.\nĐể tránh xung đột, bạn nên bấm nút Duyệt trước để lập lại thời gian khoá bài';
+$lang['js']['notsavedyet'] = 'Hiện có những thay đổi chưa được bảo lưu, và sẽ mất.\nBạn thật sự muốn tiếp tục?';
$lang['js']['searchmedia'] = 'Tìm kiếm tập tin';
$lang['js']['keepopen'] = 'Giữ cửa sổ đang mở trên lựa chọn';
$lang['js']['hidedetails'] = 'Ẩn thông tin chi tiết';
@@ -126,29 +115,27 @@ $lang['js']['medialeft'] = 'Căn ảnh sang trái.';
$lang['js']['mediaright'] = 'Căn ảnh sang phải.';
$lang['js']['mediacenter'] = 'Cản ảnh ra giữa.';
$lang['js']['medianoalign'] = 'Không căn.';
-$lang['js']['nosmblinks'] = 'Nối với các Windows shares chỉ có hiệu lực với Microsoft Internet Explorer.\nBạn vẫn có thể sao và chép các mốc nối.';
+$lang['js']['nosmblinks'] = 'Nối với các Windows shares chỉ có hiệu lực với Microsoft Internet Explorer.\nBạn vẫn có thể sao và chép các mốc nối.';
$lang['js']['linkwiz'] = 'Hộp thoại liên kết';
$lang['js']['linkto'] = 'Liên kết tới:';
-$lang['js']['del_confirm']= 'Xoá mục này?';
+$lang['js']['del_confirm'] = 'Xoá mục này?';
$lang['js']['restore_confirm'] = 'Sẵn sàng phục hồi phiên bản này?';
-$lang['js']['media_diff'] = 'So sánh:';
-$lang['js']['media_select'] = 'Chọn nhiều file…';
-$lang['js']['media_upload_btn'] = 'Tải lên';
-$lang['js']['media_done_btn'] = 'Xong';
-$lang['js']['media_drop'] = 'Kéo các file vào đây để tải lên';
-$lang['js']['media_overwrt'] = 'Ghi đè các file trùng';
-
-$lang['rssfailed'] = 'Nguồn này gặp phải lỗi';
-$lang['nothingfound']= 'Không tìm được gì';
-
-$lang['mediaselect'] = 'Xem';
-$lang['fileupload'] = 'Tải lên tệp media';
-$lang['uploadsucc'] = 'Tải lên thành công';
-$lang['uploadfail'] = 'Tải lên thất bại. Có thể vì không đủ quyền?';
-$lang['uploadwrong'] = 'Tải lên bị từ chối. Cấm tải loại tệp này';
+$lang['js']['media_diff'] = 'So sánh:';
+$lang['js']['media_select'] = 'Chọn nhiều file…';
+$lang['js']['media_upload_btn'] = 'Tải lên';
+$lang['js']['media_done_btn'] = 'Xong';
+$lang['js']['media_drop'] = 'Kéo các file vào đây để tải lên';
+$lang['js']['media_overwrt'] = 'Ghi đè các file trùng';
+$lang['rssfailed'] = 'Nguồn này gặp phải lỗi';
+$lang['nothingfound'] = 'Không tìm được gì';
+$lang['mediaselect'] = 'Xem';
+$lang['fileupload'] = 'Tải lên tệp media';
+$lang['uploadsucc'] = 'Tải lên thành công';
+$lang['uploadfail'] = 'Tải lên thất bại. Có thể vì không đủ quyền?';
+$lang['uploadwrong'] = 'Tải lên bị từ chối. Cấm tải loại tệp này';
$lang['uploadexist'] = 'Tệp tin bị trùng. Chưa có gì xảy ra.';
-$lang['namespaces'] = 'Thư mục';
-$lang['mediafiles'] = 'Tệp có sẵn ở';
+$lang['namespaces'] = 'Thư mục';
+$lang['mediafiles'] = 'Tệp có sẵn ở';
$lang['accessdenied'] = 'Bạn không được phép xem trang này.';
$lang['mediausage'] = 'Sử dụng cú pháp sau đây để dẫn đến tập tin này:';
$lang['mediaview'] = 'Xem tệp gốc';
@@ -157,60 +144,55 @@ $lang['mediaupload'] = 'Tải một tập tin lên thư mục hiện t
$lang['mediaextchange'] = 'Phần mở rộng thay đổi từ .%s thành .%s!';
$lang['ref_inuse'] = 'Không thể xóa tập tin vì nó đang được sử dụng cho các trang sau:';
$lang['ref_hidden'] = 'Một số tài liệu sử dụng cho trang này bạn không được cấp phép truy cập.';
-
-$lang['hits'] = 'Trùng';
-$lang['quickhits'] = 'Trang trùng hợp';
-$lang['toc'] = 'Nội dung';
-$lang['current'] = 'hiện tại';
-$lang['yours'] = 'Phiên bản hiện tại';
-$lang['diff'] = 'cho xem khác biệt với phiên bản hiện tại';
+$lang['hits'] = 'Trùng';
+$lang['quickhits'] = 'Trang trùng hợp';
+$lang['toc'] = 'Nội dung';
+$lang['current'] = 'hiện tại';
+$lang['yours'] = 'Phiên bản hiện tại';
+$lang['diff'] = 'cho xem khác biệt với phiên bản hiện tại';
$lang['diff2'] = 'Sự khác biệt giữa các bản được lựa chọn';
$lang['difflink'] = 'Liên kết để xem bản so sánh này';
$lang['diff_type'] = 'Xem sự khác biệt:';
$lang['diff_inline'] = 'Nội tuyến';
$lang['diff_side'] = 'Xếp cạnh nhau';
-$lang['line'] = 'Dòng';
-$lang['breadcrumb'] = 'Trang đã xem';
+$lang['line'] = 'Dòng';
+$lang['breadcrumb'] = 'Trang đã xem';
$lang['youarehere'] = 'Bạn đang ở đây';
-$lang['lastmod'] = 'Thời điểm thay đổi';
-$lang['by'] = 'do';
-$lang['deleted'] = 'bị xoá';
-$lang['created'] = 'được tạo ra';
-$lang['restored'] = 'phiên bản cũ đã được khôi phục (%s)';
+$lang['lastmod'] = 'Thời điểm thay đổi';
+$lang['by'] = 'do';
+$lang['deleted'] = 'bị xoá';
+$lang['created'] = 'được tạo ra';
+$lang['restored'] = 'phiên bản cũ đã được khôi phục (%s)';
$lang['external_edit'] = 'external edit';
-$lang['summary'] = 'Tóm tắt biên soạn';
+$lang['summary'] = 'Tóm tắt biên soạn';
$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> cần được cài để có thể xem nội dung này.';
-
-$lang['mail_newpage'] = 'Trang được thêm:';
-$lang['mail_changed'] = 'Trang thay đổi:';
-
+$lang['mail_newpage'] = 'Trang được thêm:';
+$lang['mail_changed'] = 'Trang thay đổi:';
$lang['changes_type'] = 'Xem thay đổi của';
$lang['pages_changes'] = 'Trang';
$lang['media_changes'] = 'Tệp media';
$lang['both_changes'] = 'Cả trang và các tập tin media';
-
-$lang['qb_bold'] = 'Chữ đậm';
-$lang['qb_italic'] = 'Chữ nghiêng';
-$lang['qb_underl'] = 'Chữ gạch dưới';
-$lang['qb_code'] = 'Chữ mã nguồn';
+$lang['qb_bold'] = 'Chữ đậm';
+$lang['qb_italic'] = 'Chữ nghiêng';
+$lang['qb_underl'] = 'Chữ gạch dưới';
+$lang['qb_code'] = 'Chữ mã nguồn';
$lang['qb_strike'] = 'Strike-through Text';
-$lang['qb_h1'] = 'Đầu đề cấp 1';
-$lang['qb_h2'] = 'Đầu đề cấp 2';
-$lang['qb_h3'] = 'Đầu đề cấp 3';
-$lang['qb_h4'] = 'Đầu đề cấp 4';
-$lang['qb_h5'] = 'Đầu đề cấp 5';
-$lang['qb_link'] = 'Mốc nối nội tại';
-$lang['qb_extlink'] = 'Mốc nối ra ngoài';
-$lang['qb_hr'] = 'Gạch ngang';
-$lang['qb_ol'] = 'Điểm trong danh sách có thứ tự';
-$lang['qb_ul'] = 'Điểm trong danh sách không đánh số';
-$lang['qb_media'] = 'Thêm ảnh và tệp khác';
-$lang['qb_sig'] = 'Đặt chữ ký';
-
+$lang['qb_h1'] = 'Đầu đề cấp 1';
+$lang['qb_h2'] = 'Đầu đề cấp 2';
+$lang['qb_h3'] = 'Đầu đề cấp 3';
+$lang['qb_h4'] = 'Đầu đề cấp 4';
+$lang['qb_h5'] = 'Đầu đề cấp 5';
+$lang['qb_link'] = 'Mốc nối nội tại';
+$lang['qb_extlink'] = 'Mốc nối ra ngoài';
+$lang['qb_hr'] = 'Gạch ngang';
+$lang['qb_ol'] = 'Điểm trong danh sách có thứ tự';
+$lang['qb_ul'] = 'Điểm trong danh sách không đánh số';
+$lang['qb_media'] = 'Thêm ảnh và tệp khác';
+$lang['qb_sig'] = 'Đặt chữ ký';
$lang['metaedit'] = 'Sửa Metadata';
$lang['metasaveerr'] = 'Thất bại khi viết metadata';
$lang['metasaveok'] = 'Metadata đã được lưu';
-$lang['img_backto'] = 'Quay lại';
+$lang['btn_img_backto'] = 'Quay lại %s';
$lang['img_title'] = 'Tiêu đề';
$lang['img_caption'] = 'Ghi chú';
$lang['img_date'] = 'Ngày';
@@ -223,12 +205,9 @@ $lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Từ khóa';
$lang['img_width'] = 'Rộng';
$lang['img_height'] = 'Cao';
-$lang['img_manager'] = 'Xem trong trình quản lý tệp media';
-
-/* installer strings */
+$lang['btn_mediaManager'] = 'Xem trong trình quản lý tệp media';
$lang['i_chooselang'] = 'Chọn ngôn ngữ';
$lang['i_retry'] = 'Thử lại';
-
$lang['years'] = 'cách đây %d năm';
$lang['months'] = 'cách đây %d tháng';
$lang['weeks'] = 'cách đây %d tuần';
@@ -236,9 +215,7 @@ $lang['days'] = 'cách đây %d ngày';
$lang['hours'] = 'cách đây %d giờ';
$lang['minutes'] = 'cách đây %d phút';
$lang['seconds'] = 'cách đây %d giây';
-
$lang['wordblock'] = 'Thay đổi của bạn đã không được lưu lại bởi vì nó có chứa văn bản bị chặn (spam).';
-
$lang['media_uploadtab'] = 'Tải lên';
$lang['media_searchtab'] = 'Tìm';
$lang['media_file'] = 'Tệp';
@@ -262,5 +239,3 @@ $lang['media_perm_read'] = 'Sorry, bạn không đủ quyền truy cập.'
$lang['media_perm_upload'] = 'Xin lỗi, bạn không đủ quyền để upload file lên.';
$lang['media_update'] = 'Tải lên phiên bản mới';
$lang['media_restore'] = 'Phục hồi phiên bản này';
-
-//Setup VIM: ex: et ts=2 :
diff --git a/inc/lang/zh-tw/denied.txt b/inc/lang/zh-tw/denied.txt
index 5a4d483a5..23f306d07 100644
--- a/inc/lang/zh-tw/denied.txt
+++ b/inc/lang/zh-tw/denied.txt
@@ -1,4 +1,4 @@
====== 權限拒絕 ======
-抱歉,您沒有足夠權限繼續執行。或許您忘了登入?
+抱歉,您沒有足夠權限繼續執行。
diff --git a/inc/lang/zh-tw/jquery.ui.datepicker.js b/inc/lang/zh-tw/jquery.ui.datepicker.js
new file mode 100644
index 000000000..b9105ea50
--- /dev/null
+++ b/inc/lang/zh-tw/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-TW'] = {
+ closeText: '關閉',
+ prevText: '&#x3C;上月',
+ nextText: '下月&#x3E;',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','九月','十月','十一月','十二月'],
+ monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','九月','十月','十一月','十二月'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-TW']);
+});
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/denied.txt b/inc/lang/zh/denied.txt
index 276741c40..94721e48a 100644
--- a/inc/lang/zh/denied.txt
+++ b/inc/lang/zh/denied.txt
@@ -1,3 +1,4 @@
====== 拒绝授权 ======
-对不起,您没有足够权限,无法继续。也许您忘了登录? \ No newline at end of file
+对不起,您没有足够权限,无法继续。
+
diff --git a/inc/lang/zh/jquery.ui.datepicker.js b/inc/lang/zh/jquery.ui.datepicker.js
new file mode 100644
index 000000000..d337e4a99
--- /dev/null
+++ b/inc/lang/zh/jquery.ui.datepicker.js
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-CN'] = {
+ closeText: '关闭',
+ prevText: '&#x3C;上月',
+ nextText: '下月&#x3E;',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','九月','十月','十一月','十二月'],
+ monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','九月','十月','十一月','十二月'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});
diff --git a/inc/lang/zh/lang.php b/inc/lang/zh/lang.php
index 0c0011925..e9e737251 100644
--- a/inc/lang/zh/lang.php
+++ b/inc/lang/zh/lang.php
@@ -19,6 +19,10 @@
* @author Donald <donaldtcong@gmail.com>
* @author Yangyu Huang <yangyu.huang@gmail.com>
* @author anjianshi <anjianshi@gmail.com>
+ * @author oott123 <ip.192.168.1.1@qq.com>
+ * @author Cupen <Cupenoruler@foxmail.com>
+ * @author xiqingongzi <Xiqingongzi@Gmail.com>
+ * @author qinghao <qingxianhao@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -63,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'] = '密码';
@@ -194,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'] = '您在这里';
@@ -250,7 +259,6 @@ $lang['admin_register'] = '添加新用户';
$lang['metaedit'] = '编辑元数据';
$lang['metasaveerr'] = '写入元数据失败';
$lang['metasaveok'] = '元数据已保存';
-$lang['img_backto'] = '返回到';
$lang['img_title'] = '标题';
$lang['img_caption'] = '说明';
$lang['img_date'] = '日期';
@@ -263,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'] = '没有与您登录信息相关联的地址,您无法被添加到订阅列表';
@@ -346,3 +353,5 @@ $lang['media_update'] = '上传新版本';
$lang['media_restore'] = '恢复这个版本';
$lang['currentns'] = '当前命名空间';
$lang['searchresult'] = '搜索结果';
+$lang['plainhtml'] = '纯HTML';
+$lang['wikimarkup'] = 'Wiki Markup 语言';
diff --git a/inc/lessc.inc.php b/inc/lessc.inc.php
index 0699de52f..3d0ed768a 100644
--- a/inc/lessc.inc.php
+++ b/inc/lessc.inc.php
@@ -708,7 +708,7 @@ class lessc {
}
$oldParent = $mixin->parent;
- if ($mixin != $block) $mixin->parent = $block;
+ if ($mixin !== $block) $mixin->parent = $block;
foreach ($this->sortProps($mixin->props) as $subProp) {
if ($suffix !== null &&
diff --git a/inc/load.php b/inc/load.php
index c5b40ffd8..f1deffe19 100644
--- a/inc/load.php
+++ b/inc/load.php
@@ -76,6 +76,7 @@ function load_autoload($name){
'ZipLib' => DOKU_INC.'inc/ZipLib.class.php',
'DokuWikiFeedCreator' => DOKU_INC.'inc/feedcreator.class.php',
'Doku_Parser_Mode' => DOKU_INC.'inc/parser/parser.php',
+ 'Doku_Parser_Mode_Plugin' => DOKU_INC.'inc/parser/parser.php',
'SafeFN' => DOKU_INC.'inc/SafeFN.class.php',
'Sitemapper' => DOKU_INC.'inc/Sitemapper.php',
'PassHash' => DOKU_INC.'inc/PassHash.class.php',
@@ -95,6 +96,12 @@ function load_autoload($name){
'DokuWiki_Remote_Plugin' => DOKU_PLUGIN.'remote.php',
'DokuWiki_Auth_Plugin' => DOKU_PLUGIN.'auth.php',
+ 'Doku_Renderer' => DOKU_INC.'inc/parser/renderer.php',
+ 'Doku_Renderer_xhtml' => DOKU_INC.'inc/parser/xhtml.php',
+ 'Doku_Renderer_code' => DOKU_INC.'inc/parser/code.php',
+ 'Doku_Renderer_xhtmlsummary' => DOKU_INC.'inc/parser/xhtmlsummary.php',
+ 'Doku_Renderer_metadata' => DOKU_INC.'inc/parser/metadata.php',
+
);
if(isset($classes[$name])){
diff --git a/inc/mail.php b/inc/mail.php
index 0b60c0a5b..9994ac63e 100644
--- a/inc/mail.php
+++ b/inc/mail.php
@@ -40,6 +40,8 @@ if (!defined('PREG_PATTERN_VALID_EMAIL')) define('PREG_PATTERN_VALID_EMAIL', '['
function mail_setup(){
global $conf;
global $USERINFO;
+ /** @var Input $INPUT */
+ global $INPUT;
// auto constructed address
$host = @parse_url(DOKU_URL,PHP_URL_HOST);
@@ -53,11 +55,8 @@ function mail_setup(){
$replace['@MAIL@'] = $noreply;
}
- if(!empty($_SERVER['REMOTE_USER'])){
- $replace['@USER@'] = $_SERVER['REMOTE_USER'];
- }else{
- $replace['@USER@'] = 'noreply';
- }
+ // use 'noreply' if no user
+ $replace['@USER@'] = $INPUT->server->str('REMOTE_USER', 'noreply', true);
if(!empty($USERINFO['name'])){
$replace['@NAME@'] = $USERINFO['name'];
diff --git a/inc/media.php b/inc/media.php
index d69426414..b5347d145 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -115,7 +115,7 @@ function media_ispublic($id){
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_metaform($id,$auth){
- global $lang, $config_cascade;
+ global $lang;
if($auth < AUTH_UPLOAD) {
echo '<div class="nothing">'.$lang['media_perm_upload'].'</div>'.NL;
@@ -167,6 +167,8 @@ function media_metaform($id,$auth){
$form->addElement(form_makeButton('submit', '', $lang['btn_save'], array('accesskey' => 's', 'name' => 'mediado[save]')));
$form->addElement('</div>'.NL);
$form->printForm();
+
+ return true;
}
/**
@@ -176,7 +178,7 @@ function media_metaform($id,$auth){
*/
function media_inuse($id) {
global $conf;
- $mediareferences = array();
+
if($conf['refcheck']){
$mediareferences = ft_mediause($id,true);
if(!count($mediareferences)) {
@@ -199,7 +201,9 @@ define('DOKU_MEDIA_EMPTY_NS', 8);
*
* If configured, checks for media references before deletion
*
- * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $id media id
+ * @param int $auth current auth check result
* @return int One of: 0,
* DOKU_MEDIA_DELETED,
* DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS,
@@ -248,6 +252,8 @@ function media_delete($id,$auth){
/**
* Handle file uploads via XMLHttpRequest
*
+ * @param string $ns target namespace
+ * @param int $auth current auth check result
* @return mixed false on error, id of the new file on success
*/
function media_upload_xhr($ns,$auth){
@@ -255,7 +261,7 @@ function media_upload_xhr($ns,$auth){
global $INPUT;
$id = $INPUT->get->str('qqfile');
- list($ext,$mime,$dl) = mimetype($id);
+ list($ext,$mime) = mimetype($id);
$input = fopen("php://input", "r");
if (!($tmp = io_mktmpdir())) return false;
$path = $tmp.'/'.md5($id);
@@ -278,7 +284,7 @@ function media_upload_xhr($ns,$auth){
'copy'
);
unlink($path);
- if ($tmp) dir_delete($tmp);
+ if ($tmp) io_rmdir($tmp, true);
if (is_array($res)) {
msg($res[0], $res[1]);
return false;
@@ -291,6 +297,9 @@ function media_upload_xhr($ns,$auth){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @author Michael Klier <chi@chimeric.de>
+ * @param string $ns target namespace
+ * @param int $auth current auth check result
+ * @param bool|array $file $_FILES member, $_FILES['upload'] if false
* @return mixed false on error, id of the new file on success
*/
function media_upload($ns,$auth,$file=false){
@@ -307,8 +316,8 @@ function media_upload($ns,$auth,$file=false){
if($file['error']) return false;
// check extensions
- list($fext,$fmime,$dl) = mimetype($file['name']);
- list($iext,$imime,$dl) = mimetype($id);
+ list($fext,$fmime) = mimetype($file['name']);
+ list($iext,$imime) = mimetype($id);
if($fext && !$iext){
// no extension specified in id - read original one
$id .= '.'.$fext;
@@ -492,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'))) {
@@ -563,10 +573,10 @@ function media_contentcheck($file,$mime){
*/
function media_notify($id,$file,$mime,$old_rev=false){
global $conf;
- if(empty($conf['notify'])) return; //notify enabled?
+ if(empty($conf['notify'])) return false; //notify enabled?
$subscription = new Subscription();
- return $subscription->send_media_diff($conf['notify'], 'uploadmail', $id, $old_rev, '');
+ return $subscription->send_media_diff($conf['notify'], 'uploadmail', $id, $old_rev);
}
/**
@@ -640,7 +650,8 @@ function media_tabs_files($selected_tab = ''){
* Prints tabs for files details actions
*
* @author Kate Arzamastseva <pshns@ukr.net>
- * @param string $selected_tab - opened tab
+ * @param string $image filename of the current image
+ * @param string $selected_tab opened tab
*/
function media_tabs_details($image, $selected_tab = ''){
global $lang, $conf;
@@ -649,7 +660,7 @@ function media_tabs_details($image, $selected_tab = ''){
$tabs['view'] = array('href' => media_managerURL(array('tab_details' => 'view'), '&'),
'caption' => $lang['media_viewtab']);
- list($ext, $mime) = mimetype($image);
+ list(, $mime) = mimetype($image);
if ($mime == 'image/jpeg' && @file_exists(mediaFN($image))) {
$tabs['edit'] = array('href' => media_managerURL(array('tab_details' => 'edit'), '&'),
'caption' => $lang['media_edittab']);
@@ -669,7 +680,6 @@ function media_tabs_details($image, $selected_tab = ''){
*/
function media_tab_files_options(){
global $lang;
- global $NS;
global $INPUT;
global $ID;
$form = new Doku_Form(array('class' => 'options', 'method' => 'get',
@@ -695,7 +705,7 @@ function media_tab_files_options(){
if ($checked == $option) {
$attrs['checked'] = 'checked';
}
- $form->addElement(form_makeRadioField($group, $option,
+ $form->addElement(form_makeRadioField($group . '_dwmedia', $option,
$lang['media_' . $group . '_' . $option],
$content[0] . '__' . $option,
$option, $attrs));
@@ -719,10 +729,23 @@ function _media_get_sort_type() {
return _media_get_display_param('sort', array('default' => 'name', 'date'));
}
+/**
+ * Returns type of listing for the list of files in media manager
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ * @return string - list type
+ */
function _media_get_list_type() {
return _media_get_display_param('list', array('default' => 'thumbs', 'rows'));
}
+/**
+ * Get display parameters
+ *
+ * @param string $param name of parameter
+ * @param array $values allowed values, where default value has index key 'default'
+ * @return string the parameter value
+ */
function _media_get_display_param($param, $values) {
global $INPUT;
if (in_array($INPUT->str($param), $values)) {
@@ -776,7 +799,6 @@ function media_tab_upload($ns,$auth=null,$jump='') {
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_tab_search($ns,$auth=null) {
- global $lang;
global $INPUT;
$do = $INPUT->str('mediado');
@@ -796,7 +818,7 @@ function media_tab_search($ns,$auth=null) {
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_tab_view($image, $ns, $auth=null, $rev=false) {
- global $lang, $conf;
+ global $lang;
if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*");
if ($image && $auth >= AUTH_READ) {
@@ -816,11 +838,10 @@ function media_tab_view($image, $ns, $auth=null, $rev=false) {
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_tab_edit($image, $ns, $auth=null) {
- global $lang;
if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*");
if ($image) {
- list($ext, $mime) = mimetype($image);
+ list(, $mime) = mimetype($image);
if ($mime == 'image/jpeg') media_metaform($image,$auth);
}
}
@@ -852,6 +873,10 @@ function media_tab_history($image, $ns, $auth=null) {
/**
* Prints mediafile details
*
+ * @param string $image media id
+ * @param $auth
+ * @param int|bool $rev
+ * @param JpegMeta|bool $meta
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_preview($image, $auth, $rev=false, $meta=false) {
@@ -935,9 +960,10 @@ function media_preview_buttons($image, $auth, $rev=false) {
* Returns image width and height for mediamanager preview panel
*
* @author Kate Arzamastseva <pshns@ukr.net>
- * @param string $image
- * @param int $rev
+ * @param string $image
+ * @param int $rev
* @param JpegMeta $meta
+ * @param int $size
* @return array
*/
function media_image_preview_size($image, $rev, $meta, $size = 500) {
@@ -979,8 +1005,6 @@ function media_getTag($tags,$meta,$alt=''){
* @return array
*/
function media_file_tags($meta) {
- global $config_cascade;
-
// load the field descriptions
static $fields = null;
if(is_null($fields)){
@@ -995,7 +1019,7 @@ function media_file_tags($meta) {
foreach($fields as $key => $tag){
$t = array();
if (!empty($tag[0])) $t = array($tag[0]);
- if(is_array($tag[3])) $t = array_merge($t,$tag[3]);
+ if(isset($tag[3]) && is_array($tag[3])) $t = array_merge($t,$tag[3]);
$value = media_getTag($t, $meta);
$tags[] = array('tag' => $tag, 'value' => $value);
}
@@ -1033,7 +1057,6 @@ function media_details($image, $auth, $rev=false, $meta=false) {
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_diff($image, $ns, $auth, $fromajax = false) {
- global $lang;
global $conf;
global $INPUT;
@@ -1071,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 {
@@ -1092,9 +1116,15 @@ function media_diff($image, $ns, $auth, $fromajax = false) {
}
+/**
+ * Callback for media file diff
+ *
+ * @param $data
+ * @return bool|void
+ */
function _media_file_diff($data) {
if(is_array($data) && count($data)===6) {
- return media_file_diff($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]);
+ media_file_diff($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]);
} else {
return false;
}
@@ -1107,13 +1137,12 @@ function _media_file_diff($data) {
*/
function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){
global $lang;
- global $config_cascade;
global $INPUT;
$l_meta = new JpegMeta(mediaFN($image, $l_rev));
$r_meta = new JpegMeta(mediaFN($image, $r_rev));
- $is_img = preg_match("/\.(jpe?g|gif|png)$/", $image);
+ $is_img = preg_match('/\.(jpe?g|gif|png)$/', $image);
if ($is_img) {
$l_size = media_image_preview_size($image, $l_rev, $l_meta);
$r_size = media_image_preview_size($image, $r_rev, $r_meta);
@@ -1140,7 +1169,7 @@ function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){
if ($difftype == 'opacity' || $difftype == 'portions') {
media_image_diff($image, $l_rev, $r_rev, $l_size, $r_size, $difftype);
if (!$fromajax) echo '</div>';
- return '';
+ return;
}
}
@@ -1274,7 +1303,7 @@ function media_restore($image, $rev, $auth){
$removed = (!file_exists(mediaFN($image)) && file_exists(mediaMetaFN($image, '.changes')));
if (!$image || (!file_exists(mediaFN($image)) && !$removed)) return false;
if (!$rev || !file_exists(mediaFN($image, $rev))) return false;
- list($iext,$imime,$dl) = mimetype($image);
+ list(,$imime,) = mimetype($image);
$res = media_upload_finish(mediaFN($image, $rev),
mediaFN($image),
$image,
@@ -1364,7 +1393,7 @@ function media_printfile($item,$auth,$jump,$display_namespace=false){
}
// Prepare fileicons
- list($ext,$mime,$dl) = mimetype($item['file'],false);
+ list($ext) = mimetype($item['file'],false);
$class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext);
$class = 'select mediafile mf_'.$class;
@@ -1419,17 +1448,23 @@ function media_printfile($item,$auth,$jump,$display_namespace=false){
echo '</div>'.NL;
}
-function media_printicon($filename){
- list($ext,$mime,$dl) = mimetype(mediaFN($filename),false);
+/**
+ * Display a media icon
+ *
+ * @param $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/'.$ext.'.png')) {
- $icon = DOKU_BASE.'lib/images/fileicons/'.$ext.'.png';
+ if (@file_exists(DOKU_INC.'lib/images/fileicons/'.$size.'/'.$ext.'.png')) {
+ $icon = DOKU_BASE.'lib/images/fileicons/'.$size.'/'.$ext.'.png';
} else {
- $icon = DOKU_BASE.'lib/images/fileicons/file.png';
+ $icon = DOKU_BASE.'lib/images/fileicons/'.$size.'/file.png';
}
return '<img src="'.$icon.'" alt="'.$filename.'" class="icon" />';
-
}
/**
@@ -1438,8 +1473,6 @@ function media_printicon($filename){
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false){
- global $lang;
- global $conf;
// Prepare filename
$file = utf8_decodeFN($item['file']);
@@ -1455,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;
@@ -1552,12 +1585,13 @@ function media_printimgdetail($item, $fullscreen=false){
* parameters
*
* @author Kate Arzamastseva <pshns@ukr.net>
- * @param array $params
- * @param string $amp - separator
- * @return string - link
+ * @param array|bool $params
+ * @param string $amp - separator
+ * @param bool $abs
+ * @param bool $params_array
+ * @return string|array - link
*/
function media_managerURL($params=false, $amp='&amp;', $abs=false, $params_array=false) {
- global $conf;
global $ID;
global $INPUT;
@@ -1753,7 +1787,7 @@ function media_nstree_item($item){
global $INPUT;
$pos = strrpos($item['id'], ':');
$label = substr($item['id'], $pos > 0 ? $pos + 1 : 0);
- if(!$item['label']) $item['label'] = $label;
+ if(empty($item['label'])) $item['label'] = $label;
$ret = '';
if (!($INPUT->str('do') == 'media'))
@@ -1800,6 +1834,7 @@ function media_resize_image($file, $ext, $w, $h=0){
if($info == false) return $file; // that's no image - it's a spaceship!
if(!$h) $h = round(($w * $info[1]) / $info[0]);
+ if(!$w) $w = round(($h * $info[0]) / $info[1]);
// we wont scale up to infinity
if($w > 2000 || $h > 2000) return $file;
@@ -1814,7 +1849,7 @@ function media_resize_image($file, $ext, $w, $h=0){
if( $mtime > filemtime($file) ||
media_resize_imageIM($ext,$file,$info[0],$info[1],$local,$w,$h) ||
media_resize_imageGD($ext,$file,$info[0],$info[1],$local,$w,$h) ){
- if($conf['fperm']) chmod($local, $conf['fperm']);
+ if(!empty($conf['fperm'])) @chmod($local, $conf['fperm']);
return $local;
}
//still here? resizing failed
@@ -1875,7 +1910,7 @@ function media_crop_image($file, $ext, $w, $h=0){
if( $mtime > @filemtime($file) ||
media_crop_imageIM($ext,$file,$info[0],$info[1],$local,$cw,$ch,$cx,$cy) ||
media_resize_imageGD($ext,$file,$cw,$ch,$local,$cw,$ch,$cx,$cy) ){
- if($conf['fperm']) chmod($local, $conf['fperm']);
+ if(!empty($conf['fperm'])) @chmod($local, $conf['fperm']);
return media_resize_image($local,$ext, $w, $h);
}
@@ -2129,4 +2164,61 @@ function media_resize_imageGD($ext,$from,$from_w,$from_h,$to,$to_w,$to_h,$ofs_x=
return $okay;
}
+/**
+ * Return other media files with the same base name
+ * but different extensions.
+ *
+ * @param string $src - ID of media file
+ * @param array $exts - alternative extensions to find other files for
+ * @return array - mime type => file ID
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ */
+function media_alternativefiles($src, $exts){
+
+ $files = array();
+ list($srcExt, $srcMime) = mimetype($src);
+ $filebase = substr($src, 0, -1 * (strlen($srcExt)+1));
+
+ foreach($exts as $ext) {
+ $fileid = $filebase.'.'.$ext;
+ $file = mediaFN($fileid);
+ if(file_exists($file)) {
+ list($fileExt, $fileMime) = mimetype($file);
+ $files[$fileMime] = $fileid;
+ }
+ }
+ return $files;
+}
+
+/**
+ * Check if video/audio is supported to be embedded.
+ *
+ * @param string $mime - mimetype of media file
+ * @param string $type - type of media files to check ('video', 'audio', or none)
+ * @return boolean
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ */
+function media_supportedav($mime, $type=NULL){
+ $supportedAudio = array(
+ 'ogg' => 'audio/ogg',
+ 'mp3' => 'audio/mpeg',
+ 'wav' => 'audio/wav',
+ );
+ $supportedVideo = array(
+ 'webm' => 'video/webm',
+ 'ogv' => 'video/ogg',
+ 'mp4' => 'video/mp4',
+ );
+ if ($type == 'audio') {
+ $supportedAv = $supportedAudio;
+ } elseif ($type == 'video') {
+ $supportedAv = $supportedVideo;
+ } else {
+ $supportedAv = array_merge($supportedAudio, $supportedVideo);
+ }
+ return in_array($mime, $supportedAv);
+}
+
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
diff --git a/inc/pageutils.php b/inc/pageutils.php
index c8d3cf4bb..8474c5697 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -19,6 +19,7 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
function getID($param='id',$clean=true){
+ /** @var Input $INPUT */
global $INPUT;
global $conf;
global $ACT;
@@ -27,7 +28,7 @@ function getID($param='id',$clean=true){
//construct page id from request URI
if(empty($id) && $conf['userewrite'] == 2){
- $request = $_SERVER['REQUEST_URI'];
+ $request = $INPUT->server->str('REQUEST_URI');
$script = '';
//get the script URL
@@ -36,15 +37,15 @@ function getID($param='id',$clean=true){
if($param != 'id') {
$relpath = 'lib/exe/';
}
- $script = $conf['basedir'].$relpath.utf8_basename($_SERVER['SCRIPT_FILENAME']);
-
- }elseif($_SERVER['PATH_INFO']){
- $request = $_SERVER['PATH_INFO'];
- }elseif($_SERVER['SCRIPT_NAME']){
- $script = $_SERVER['SCRIPT_NAME'];
- }elseif($_SERVER['DOCUMENT_ROOT'] && $_SERVER['SCRIPT_FILENAME']){
- $script = preg_replace ('/^'.preg_quote($_SERVER['DOCUMENT_ROOT'],'/').'/','',
- $_SERVER['SCRIPT_FILENAME']);
+ $script = $conf['basedir'].$relpath.utf8_basename($INPUT->server->str('SCRIPT_FILENAME'));
+
+ }elseif($INPUT->server->str('PATH_INFO')){
+ $request = $INPUT->server->str('PATH_INFO');
+ }elseif($INPUT->server->str('SCRIPT_NAME')){
+ $script = $INPUT->server->str('SCRIPT_NAME');
+ }elseif($INPUT->server->str('DOCUMENT_ROOT') && $INPUT->server->str('SCRIPT_FILENAME')){
+ $script = preg_replace ('/^'.preg_quote($INPUT->server->str('DOCUMENT_ROOT'),'/').'/','',
+ $INPUT->server->str('SCRIPT_FILENAME'));
$script = '/'.$script;
}
@@ -94,6 +95,7 @@ function getID($param='id',$clean=true){
* @author Andreas Gohr <andi@splitbrain.org>
* @param string $raw_id The pageid to clean
* @param boolean $ascii Force ASCII
+ * @return string cleaned id
*/
function cleanID($raw_id,$ascii=false){
global $conf;
@@ -244,6 +246,7 @@ function page_exists($id,$rev='',$clean=true) {
* @param $rev string page revision, empty string for current
* @param $clean bool flag indicating that $raw_id should be cleaned. Only set to false
* when $id is guaranteed to have been cleaned already.
+ * @return string full path
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
@@ -361,6 +364,7 @@ function mediaFN($id, $rev=''){
*
* @param string $id The id of the local file
* @param string $ext The file extension (usually txt)
+ * @return string full filepath to localized file
* @author Andreas Gohr <andi@splitbrain.org>
*/
function localeFN($id,$ext='txt'){
@@ -543,6 +547,11 @@ function isHiddenPage($id){
return $data['hidden'];
}
+/**
+ * callback checks if page is hidden
+ *
+ * @param array $data event data see isHiddenPage()
+ */
function _isHiddenPage(&$data) {
global $conf;
global $ACT;
diff --git a/inc/parser/code.php b/inc/parser/code.php
index 0b8e3ee02..d77ffd1aa 100644
--- a/inc/parser/code.php
+++ b/inc/parser/code.php
@@ -5,7 +5,6 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/parser/renderer.php';
class Doku_Renderer_code extends Doku_Renderer {
var $_codeblock=0;
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/metadata.php b/inc/parser/metadata.php
index 8ba159d62..82a268fd6 100644
--- a/inc/parser/metadata.php
+++ b/inc/parser/metadata.php
@@ -16,8 +16,6 @@ if ( !defined('DOKU_TAB') ) {
define ('DOKU_TAB',"\t");
}
-require_once DOKU_INC . 'inc/parser/renderer.php';
-
/**
* The Renderer
*/
@@ -301,7 +299,7 @@ class Doku_Renderer_metadata extends Doku_Renderer {
// first resolve and clean up the $id
resolve_pageid(getNS($ID), $id, $exists);
- list($page, $hash) = explode('#', $id, 2);
+ @list($page, $hash) = explode('#', $id, 2);
// set metadata
$this->meta['relation']['references'][$page] = $exists;
diff --git a/inc/parser/parser.php b/inc/parser/parser.php
index 1f14b98a3..252bd9170 100644
--- a/inc/parser/parser.php
+++ b/inc/parser/parser.php
@@ -125,43 +125,91 @@ class Doku_Parser {
}
//-------------------------------------------------------------------
+
/**
- * This class and all the subclasses below are
- * used to reduce the effort required to register
- * modes with the Lexer. For performance these
- * could all be eliminated later perhaps, or
- * the Parser could be serialized to a file once
- * all modes are registered
+ * Class Doku_Parser_Mode_Interface
*
- * @author Harry Fuecks <hfuecks@gmail.com>
+ * Defines a mode (syntax component) in the Parser
*/
-class Doku_Parser_Mode {
+interface Doku_Parser_Mode_Interface {
+ /**
+ * returns a number used to determine in which order modes are added
+ */
+ public function getSort();
+
+ /**
+ * Called before any calls to connectTo
+ */
+ function preConnect();
+
+ /**
+ * Connects the mode
+ *
+ * @param string $mode
+ */
+ function connectTo($mode);
/**
+ * Called after all calls to connectTo
+ */
+ function postConnect();
+
+ /**
+ * Check if given mode is accepted inside this mode
+ *
+ * @param string $mode
+ * @return bool
+ */
+ function accepts($mode);
+}
+
+/**
+ * This class and all the subclasses below are used to reduce the effort required to register
+ * modes with the Lexer.
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ */
+class Doku_Parser_Mode implements Doku_Parser_Mode_Interface {
+ /**
* @var Doku_Lexer $Lexer
*/
var $Lexer;
-
var $allowedModes = array();
- // returns a number used to determine in which order modes are added
function getSort() {
trigger_error('getSort() not implemented in '.get_class($this), E_USER_WARNING);
}
- // Called before any calls to connectTo
function preConnect() {}
-
- // Connects the mode
function connectTo($mode) {}
-
- // Called after all calls to connectTo
function postConnect() {}
-
function accepts($mode) {
return in_array($mode, (array) $this->allowedModes );
}
+}
+
+/**
+ * Basically the same as Doku_Parser_Mode but extends from DokuWiki_Plugin
+ *
+ * Adds additional functions to syntax plugins
+ */
+class Doku_Parser_Mode_Plugin extends DokuWiki_Plugin implements Doku_Parser_Mode_Interface {
+ /**
+ * @var Doku_Lexer $Lexer
+ */
+ var $Lexer;
+ var $allowedModes = array();
+
+ function getSort() {
+ trigger_error('getSort() not implemented in '.get_class($this), E_USER_WARNING);
+ }
+ function preConnect() {}
+ function connectTo($mode) {}
+ function postConnect() {}
+ function accepts($mode) {
+ return in_array($mode, (array) $this->allowedModes );
+ }
}
//-------------------------------------------------------------------
diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php
index c697e990c..e92b81bd7 100644
--- a/inc/parser/renderer.php
+++ b/inc/parser/renderer.php
@@ -6,8 +6,6 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/plugin.php';
-require_once DOKU_INC . 'inc/pluginutils.php';
/**
* An empty renderer, produces no output
@@ -59,9 +57,15 @@ class Doku_Renderer extends DokuWiki_Plugin {
return false;
}
-
- //handle plugin rendering
- function plugin($name,$data){
+ /**
+ * handle plugin rendering
+ *
+ * @param string $name Plugin name
+ * @param mixed $data custom data set by handler
+ * @param string $state matched state if any
+ * @param string $match raw matched syntax
+ */
+ function plugin($name,$data,$state='',$match=''){
$plugin = plugin_load('syntax',$name);
if($plugin != null){
$plugin->render($this->getFormat(),$this,$data);
@@ -245,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(){}
@@ -267,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 ancor name only
- list($name,$hash) = explode('#',$name,2);
+ @list($name, $hash) = explode('#', $name, 2);
if($hash) return $hash;
- if($conf['useslash']){
- $name = strtr($name,';/',';:');
- }else{
- $name = strtr($name,';',':');
+ if($conf['useslash']) {
+ $name = strtr($name, ';/', ';:');
+ } else {
+ $name = strtr($name, ';', ':');
}
return noNSorNS($name);
@@ -286,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
@@ -297,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 fd02c0ce0..cf36a8175 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -17,9 +17,6 @@ if ( !defined('DOKU_TAB') ) {
define ('DOKU_TAB',"\t");
}
-require_once DOKU_INC . 'inc/parser/renderer.php';
-require_once DOKU_INC . 'inc/html.php';
-
/**
* The Renderer
*/
@@ -562,6 +559,12 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* $search,$returnonly & $linktype are not for the renderer but are used
* elsewhere - no need to implement them in other renderers
*
+ * @param string $id pageid
+ * @param string|null $name link name
+ * @param string|null $search adds search url param
+ * @param bool $returnonly whether to return html or write to doc attribute
+ * @param string $linktype type to set use of headings
+ * @return void|string writes to doc attribute or returns html depends on $returnonly
* @author Andreas Gohr <andi@splitbrain.org>
*/
function internallink($id, $name = null, $search=null,$returnonly=false,$linktype='content') {
@@ -603,7 +606,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
}
//keep hash anchor
- list($id,$hash) = explode('#',$id,2);
+ @list($id,$hash) = explode('#',$id,2);
if(!empty($hash)) $hash = $this->_headerToLink($hash);
//prepare for formating
@@ -685,7 +688,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
}
/**
- */
+ */
function interwikilink($match, $name = null, $wikiName, $wikiUri) {
global $conf;
@@ -697,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']);
@@ -781,7 +793,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
}
function internalmedia ($src, $title=null, $align=null, $width=null,
- $height=null, $cache=null, $linking=null) {
+ $height=null, $cache=null, $linking=null, $return=NULL) {
global $ID;
list($src,$hash) = explode('#',$src,2);
resolve_mediaid(getNS($ID),$src, $exists);
@@ -793,8 +805,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
list($ext,$mime,$dl) = mimetype($src,false);
if(substr($mime,0,5) == 'image' && $render){
$link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),($linking=='direct'));
- }elseif($mime == 'application/x-shockwave-flash' && $render){
- // don't link flash movies
+ }elseif(($mime == 'application/x-shockwave-flash' || media_supportedav($mime)) && $render){
+ // don't link movies
$noLink = true;
}else{
// add file icons
@@ -812,8 +824,13 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
}
//output formatted
- if ($linking == 'nolink' || $noLink) $this->doc .= $link['name'];
- else $this->doc .= $this->_formatLink($link);
+ if ($return) {
+ if ($linking == 'nolink' || $noLink) return $link['name'];
+ else return $this->_formatLink($link);
+ } else {
+ if ($linking == 'nolink' || $noLink) $this->doc .= $link['name'];
+ else $this->doc .= $this->_formatLink($link);
+ }
}
function externalmedia ($src, $title=null, $align=null, $width=null,
@@ -829,8 +846,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
if(substr($mime,0,5) == 'image' && $render){
// link only jpeg images
// if ($ext != 'jpg' && $ext != 'jpeg') $noLink = true;
- }elseif($mime == 'application/x-shockwave-flash' && $render){
- // don't link flash movies
+ }elseif(($mime == 'application/x-shockwave-flash' || media_supportedav($mime)) && $render){
+ // don't link movies
$noLink = true;
}else{
// add file icons
@@ -946,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;
@@ -1091,6 +1116,30 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$ret .= ' />';
+ }elseif(media_supportedav($mime, 'video') || media_supportedav($mime, 'audio')){
+ // first get the $title
+ $title = !is_null($title) ? $this->_xmlEntities($title) : false;
+ if (!$render) {
+ // if the file is not supposed to be rendered
+ // return the title of the file (just the sourcename if there is no title)
+ return $title ? $title : $this->_xmlEntities(utf8_basename(noNS($src)));
+ }
+
+ $att = array();
+ $att['class'] = "media$align";
+ if ($title) {
+ $att['title'] = $title;
+ }
+
+ if (media_supportedav($mime, 'video')) {
+ //add video
+ $ret .= $this->_video($src, $width, $height, $att);
+ }
+ if (media_supportedav($mime, 'audio')) {
+ //add audio
+ $ret .= $this->_audio($src, $att);
+ }
+
}elseif($mime == 'application/x-shockwave-flash'){
if (!$render) {
// if the flash is not supposed to be rendered
@@ -1223,6 +1272,93 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
}
+ /**
+ * Embed video(s) in HTML
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ *
+ * @param string $src - ID of video to embed
+ * @param int $width - width of the video in pixels
+ * @param int $height - height of the video in pixels
+ * @param array $atts - additional attributes for the <video> tag
+ * @return string
+ */
+ function _video($src,$width,$height,$atts=null){
+ // prepare width and height
+ if(is_null($atts)) $atts = array();
+ $atts['width'] = (int) $width;
+ $atts['height'] = (int) $height;
+ if(!$atts['width']) $atts['width'] = 320;
+ if(!$atts['height']) $atts['height'] = 240;
+
+ // prepare alternative formats
+ $extensions = array('webm', 'ogv', 'mp4');
+ $alternatives = media_alternativefiles($src, $extensions);
+ $poster = media_alternativefiles($src, array('jpg', 'png'), true);
+ $posterUrl = '';
+ if (!empty($poster)) {
+ $posterUrl = ml(reset($poster),array('cache'=>$cache),true,'&');
+ }
+
+ $out = '';
+ // open video tag
+ $out .= '<video '.buildAttributes($atts).' controls="controls"';
+ if ($posterUrl) $out .= ' poster="'.hsc($posterUrl).'"';
+ $out .= '>'.NL;
+ $fallback = '';
+
+ // output source for each alternative video format
+ foreach($alternatives as $mime => $file) {
+ $url = ml($file,array('cache'=>$cache),true,'&');
+ $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(utf8_basename(noNS($file)));
+
+ $out .= '<source src="'.hsc($url).'" type="'.$mime.'" />'.NL;
+ // alternative content (just a link to the file)
+ $fallback .= $this->internalmedia($file, $title, NULL, NULL, NULL, $cache=NULL, $linking='linkonly', $return=true);
+ }
+
+ // finish
+ $out .= $fallback;
+ $out .= '</video>'.NL;
+ return $out;
+ }
+
+ /**
+ * Embed audio in HTML
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ *
+ * @param string $src - ID of audio to embed
+ * @param array $atts - additional attributes for the <audio> tag
+ * @return string
+ */
+ function _audio($src,$atts=null){
+
+ // prepare alternative formats
+ $extensions = array('ogg', 'mp3', 'wav');
+ $alternatives = media_alternativefiles($src, $extensions);
+
+ $out = '';
+ // open audio tag
+ $out .= '<audio '.buildAttributes($atts).' controls="controls">'.NL;
+ $fallback = '';
+
+ // output source for each alternative audio format
+ foreach($alternatives as $mime => $file) {
+ $url = ml($file,array('cache'=>$cache),true,'&');
+ $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(utf8_basename(noNS($file)));
+
+ $out .= '<source src="'.hsc($url).'" type="'.$mime.'" />'.NL;
+ // alternative content (just a link to the file)
+ $fallback .= $this->internalmedia($file, $title, NULL, NULL, NULL, $cache=NULL, $linking='linkonly', $return=true);
+ }
+
+ // finish
+ $out .= $fallback;
+ $out .= '</audio>'.NL;
+ return $out;
+ }
+
}
//Setup VIM: ex: et ts=4 :
diff --git a/inc/parser/xhtmlsummary.php b/inc/parser/xhtmlsummary.php
index 95f86cbef..867b71f6a 100644
--- a/inc/parser/xhtmlsummary.php
+++ b/inc/parser/xhtmlsummary.php
@@ -1,6 +1,5 @@
<?php
if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/parser/xhtml.php';
/**
* The summary XHTML form selects either up to the first two paragraphs
diff --git a/inc/parserutils.php b/inc/parserutils.php
index b67daaabb..9c2a0b570 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -112,8 +112,7 @@ function p_cached_output($file, $format='xhtml', $id='') {
} else {
$parsed = p_render($format, p_cached_instructions($file,false,$id), $info);
- if ($info['cache']) {
- $cache->storeCache($parsed); //save cachefile
+ if ($info['cache'] && $cache->storeCache($parsed)) { // storeCache() attempts to save cachefile
if($conf['allowdebug'] && $format=='xhtml') $parsed .= "\n<!-- no cachefile used, but created {$cache->cache} -->\n";
}else{
$cache->removeCache(); //try to delete cachefile
@@ -158,6 +157,8 @@ function p_cached_instructions($file,$cacheonly=false,$id='') {
*
* @author Harry Fuecks <hfuecks@gmail.com>
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $text raw wiki syntax text
+ * @return array a list of instruction arrays
*/
function p_get_instructions($text){
@@ -428,8 +429,9 @@ function p_render_metadata($id, $orig){
global $ID, $METADATA_RENDERERS;
// avoid recursive rendering processes for the same id
- if (isset($METADATA_RENDERERS[$id]))
+ if (isset($METADATA_RENDERERS[$id])) {
return $orig;
+ }
// store the original metadata in the global $METADATA_RENDERERS so p_set_metadata can use it
$METADATA_RENDERERS[$id] =& $orig;
@@ -442,8 +444,6 @@ function p_render_metadata($id, $orig){
$evt = new Doku_Event('PARSER_METADATA_RENDER', $orig);
if ($evt->advise_before()) {
- require_once DOKU_INC."inc/parser/metadata.php";
-
// get instructions
$instructions = p_cached_instructions(wikiFN($id),false,$id);
if(is_null($instructions)){
@@ -586,7 +586,7 @@ function p_sort_modes($a, $b){
function p_render($mode,$instructions,&$info){
if(is_null($instructions)) return '';
- $Renderer =& p_get_renderer($mode);
+ $Renderer = p_get_renderer($mode);
if (is_null($Renderer)) return null;
$Renderer->reset();
@@ -614,43 +614,53 @@ function p_render($mode,$instructions,&$info){
}
/**
+ * Figure out the correct renderer class to use for $mode,
+ * instantiate and return it
+ *
* @param $mode string Mode of the renderer to get
* @return null|Doku_Renderer The renderer
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
*/
-function & p_get_renderer($mode) {
+function p_get_renderer($mode) {
/** @var Doku_Plugin_Controller $plugin_controller */
global $conf, $plugin_controller;
$rname = !empty($conf['renderer_'.$mode]) ? $conf['renderer_'.$mode] : $mode;
$rclass = "Doku_Renderer_$rname";
+ // if requested earlier or a bundled renderer
if( class_exists($rclass) ) {
$Renderer = new $rclass();
return $Renderer;
}
- // try default renderer first:
- $file = DOKU_INC."inc/parser/$rname.php";
- if(@file_exists($file)){
- require_once $file;
+ // not bundled, see if its an enabled renderer plugin & when $mode is 'xhtml', the renderer can supply that format.
+ $Renderer = $plugin_controller->load('renderer',$rname);
+ if ($Renderer && is_a($Renderer, 'Doku_Renderer') && ($mode != 'xhtml' || $mode == $Renderer->getFormat())) {
+ return $Renderer;
+ }
- if ( !class_exists($rclass) ) {
- trigger_error("Unable to resolve render class $rclass",E_USER_WARNING);
- msg("Renderer '$rname' for $mode not valid",-1);
- return null;
+ // there is a configuration error!
+ // not bundled, not a valid enabled plugin, use $mode to try to fallback to a bundled renderer
+ $rclass = "Doku_Renderer_$mode";
+ if ( class_exists($rclass) ) {
+ // viewers should see renderered output, so restrict the warning to admins only
+ $msg = "No renderer '$rname' found for mode '$mode', check your plugins";
+ if ($mode == 'xhtml') {
+ $msg .= " and the 'renderer_xhtml' config setting";
}
- $Renderer = new $rclass();
- }else{
- // Maybe a plugin/component is available?
- $Renderer = $plugin_controller->load('renderer',$rname);
+ $msg .= ".<br/>Attempting to fallback to the bundled renderer.";
+ msg($msg,-1,'','',MSG_ADMINS_ONLY);
- if(!isset($Renderer) || is_null($Renderer)){
- msg("No renderer '$rname' found for mode '$mode'",-1);
- return null;
- }
+ $Renderer = new $rclass;
+ $Renderer->nocache(); // fallback only (and may include admin alerts), don't cache
+ return $Renderer;
}
- return $Renderer;
+ // fallback failed, alert the world
+ msg("No renderer '$rname' found for mode '$mode'",-1);
+ return null;
}
/**
diff --git a/inc/plugin.php b/inc/plugin.php
index dccd37bd9..7de4fbd74 100644
--- a/inc/plugin.php
+++ b/inc/plugin.php
@@ -239,10 +239,35 @@ class DokuWiki_Plugin {
}
/**
+ * A fallback to provide access to the old render() method
+ *
+ * Since syntax plugins provide their own render method with a different signature and they now
+ * inherit from Doku_Plugin we can no longer have a render() method here (Strict Standards Violation).
+ * Instead use render_text()
+ *
+ * @deprecated 2014-01-22
+ * @param $name
+ * @param $arguments
+ * @return null|string
+ */
+ function __call($name, $arguments) {
+ if($name == 'render'){
+ if(!isset($arguments[1])) $arguments[1] = 'xhtml';
+ return $this->render_text($arguments[0], $arguments[1]);
+ }
+ trigger_error("no such method $name", E_USER_ERROR);
+ return null;
+ }
+
+ /**
* output text string through the parser, allows dokuwiki markup to be used
* very ineffecient for small pieces of data - try not to use
+ *
+ * @param string $text wiki markup to parse
+ * @param string $format output format
+ * @return null|string
*/
- function render($text, $format='xhtml') {
+ function render_text($text, $format='xhtml') {
return p_render($format, p_get_instructions($text),$info);
}
diff --git a/inc/pluginutils.php b/inc/pluginutils.php
index 894bbefb6..911c4e5c0 100644
--- a/inc/pluginutils.php
+++ b/inc/pluginutils.php
@@ -37,7 +37,7 @@ function plugin_list($type='',$all=false) {
* @param $name string name of the plugin to load
* @param $new bool true to return a new instance of the plugin, false to use an already loaded instance
* @param $disabled bool true to load even disabled plugins
- * @return DokuWiki_Plugin|DokuWiki_Syntax_Plugin|null the plugin object or null on failure
+ * @return DokuWiki_Plugin|null the plugin object or null on failure
*/
function plugin_load($type,$name,$new=false,$disabled=false) {
/** @var $plugin_controller Doku_Plugin_Controller */
diff --git a/inc/remote.php b/inc/remote.php
index 2ef28afd2..e27aa74f8 100644
--- a/inc/remote.php
+++ b/inc/remote.php
@@ -169,6 +169,9 @@ class RemoteAPI {
public function hasAccess() {
global $conf;
global $USERINFO;
+ /** @var Input $INPUT */
+ global $INPUT;
+
if (!$conf['remote']) {
return false;
}
@@ -179,7 +182,7 @@ class RemoteAPI {
return true;
}
- return auth_isMember($conf['remoteuser'], $_SERVER['REMOTE_USER'], (array) $USERINFO['grps']);
+ return auth_isMember($conf['remoteuser'], $INPUT->server->str('REMOTE_USER'), (array) $USERINFO['grps']);
}
/**
diff --git a/inc/search.php b/inc/search.php
index c2d31b959..5489dc2c0 100644
--- a/inc/search.php
+++ b/inc/search.php
@@ -141,7 +141,7 @@ function search_media(&$data,$base,$file,$type,$lvl,$opts){
//we do nothing with directories
if($type == 'd') {
- if(!$opts['depth']) return true; // recurse forever
+ if(empty($opts['depth'])) return true; // recurse forever
$depth = substr_count($file,'/');
if($depth >= $opts['depth']) return false; // depth reached
return true;
@@ -157,12 +157,12 @@ function search_media(&$data,$base,$file,$type,$lvl,$opts){
//check ACL for namespace (we have no ACL for mediafiles)
$info['perm'] = auth_quickaclcheck(getNS($info['id']).':*');
- if(!$opts['skipacl'] && $info['perm'] < AUTH_READ){
+ if(empty($opts['skipacl']) && $info['perm'] < AUTH_READ){
return false;
}
//check pattern filter
- if($opts['pattern'] && !@preg_match($opts['pattern'], $info['id'])){
+ if(!empty($opts['pattern']) && !@preg_match($opts['pattern'], $info['id'])){
return false;
}
@@ -176,7 +176,7 @@ function search_media(&$data,$base,$file,$type,$lvl,$opts){
}else{
$info['isimg'] = false;
}
- if($opts['hash']){
+ if(!empty($opts['hash'])){
$info['hash'] = md5(io_readFile(mediaFN($info['id']),false));
}
@@ -317,25 +317,25 @@ function pathID($path,$keeptxt=false){
* How the function behaves, depends on the options passed in the $opts
* array, where the following settings can be used.
*
- * depth int recursion depth. 0 for unlimited
- * keeptxt bool keep .txt extension for IDs
- * listfiles bool include files in listing
- * listdirs bool include namespaces in listing
- * pagesonly bool restrict files to pages
- * skipacl bool do not check for READ permission
- * sneakyacl bool don't recurse into nonreadable dirs
- * hash bool create MD5 hash for files
- * meta bool return file metadata
- * filematch string match files against this regexp
- * idmatch string match full ID against this regexp
- * dirmatch string match directory against this regexp when adding
- * nsmatch string match namespace against this regexp when adding
- * recmatch string match directory against this regexp when recursing
- * showmsg bool warn about non-ID files
- * showhidden bool show hidden files too
- * firsthead bool return first heading for pages
+ * depth int recursion depth. 0 for unlimited (default: 0)
+ * keeptxt bool keep .txt extension for IDs (default: false)
+ * listfiles bool include files in listing (default: false)
+ * listdirs bool include namespaces in listing (default: false)
+ * pagesonly bool restrict files to pages (default: false)
+ * skipacl bool do not check for READ permission (default: false)
+ * sneakyacl bool don't recurse into nonreadable dirs (default: false)
+ * hash bool create MD5 hash for files (default: false)
+ * meta bool return file metadata (default: false)
+ * filematch string match files against this regexp (default: '', so accept everything)
+ * idmatch string match full ID against this regexp (default: '', so accept everything)
+ * dirmatch string match directory against this regexp when adding (default: '', so accept everything)
+ * nsmatch string match namespace against this regexp when adding (default: '', so accept everything)
+ * recmatch string match directory against this regexp when recursing (default: '', so accept everything)
+ * showmsg bool warn about non-ID files (default: false)
+ * showhidden bool show hidden files(e.g. by hidepages config) too (default: false)
+ * firsthead bool return first heading for pages (default: false)
*
- * @param array &$data - Reference to the result data structure
+ * @param array &$data - Reference to the result data structure
* @param string $base - Base usually $conf['datadir']
* @param string $file - current file or directory relative to $base
* @param string $type - Type either 'd' for directory or 'f' for file
@@ -351,17 +351,18 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){
$return = true;
// get ID and check if it is a valid one
- $item['id'] = pathID($file,($type == 'd' || $opts['keeptxt']));
+ $item['id'] = pathID($file,($type == 'd' || !empty($opts['keeptxt'])));
if($item['id'] != cleanID($item['id'])){
- if($opts['showmsg'])
+ if(!empty($opts['showmsg'])){
msg(hsc($item['id']).' is not a valid file name for DokuWiki - skipped',-1);
+ }
return false; // skip non-valid files
}
$item['ns'] = getNS($item['id']);
if($type == 'd') {
// decide if to recursion into this directory is wanted
- if(!$opts['depth']){
+ if(empty($opts['depth'])){
$return = true; // recurse forever
}else{
$depth = substr_count($file,'/');
@@ -371,8 +372,12 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){
$return = true;
}
}
- if($return && !preg_match('/'.$opts['recmatch'].'/',$file)){
- $return = false; // doesn't match
+
+ if ($return) {
+ $match = empty($opts['recmatch']) || preg_match('/'.$opts['recmatch'].'/',$file);
+ if (!$match) {
+ return false; // doesn't match
+ }
}
}
@@ -407,7 +412,7 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){
$item['level'] = $lvl;
$item['open'] = $return;
- if($opts['meta']){
+ if(!empty($opts['meta'])){
$item['file'] = utf8_basename($file);
$item['size'] = filesize($base.'/'.$file);
$item['mtime'] = filemtime($base.'/'.$file);
@@ -417,8 +422,8 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){
}
if($type == 'f'){
- if($opts['hash']) $item['hash'] = md5(io_readFile($base.'/'.$file,false));
- if($opts['firsthead']) $item['title'] = p_get_first_heading($item['id'],METADATA_DONT_RENDER);
+ if(!empty($opts['hash'])) $item['hash'] = md5(io_readFile($base.'/'.$file,false));
+ if(!empty($opts['firsthead'])) $item['title'] = p_get_first_heading($item['id'],METADATA_DONT_RENDER);
}
// finally add the item
diff --git a/inc/subscription.php b/inc/subscription.php
index ddf2f39e6..298e7c12b 100644
--- a/inc/subscription.php
+++ b/inc/subscription.php
@@ -256,8 +256,10 @@ class Subscription {
if(!$this->isenabled()) return false;
global $ID;
+ /** @var Input $INPUT */
+ global $INPUT;
if(!$id) $id = $ID;
- if(!$user) $user = $_SERVER['REMOTE_USER'];
+ if(!$user) $user = $INPUT->server->str('REMOTE_USER');
$subs = $this->subscribers($id, $user);
if(!count($subs)) return false;
@@ -288,17 +290,19 @@ class Subscription {
public function send_bulk($page) {
if(!$this->isenabled()) return 0;
- /** @var auth_basic $auth */
+ /** @var DokuWiki_Auth_Plugin $auth */
global $auth;
global $conf;
global $USERINFO;
+ /** @var Input $INPUT */
+ global $INPUT;
$count = 0;
$subscriptions = $this->subscribers($page, null, array('digest', 'list'));
// remember current user info
$olduinfo = $USERINFO;
- $olduser = $_SERVER['REMOTE_USER'];
+ $olduser = $INPUT->server->str('REMOTE_USER');
foreach($subscriptions as $target => $users) {
if(!$this->lock($target)) continue;
@@ -315,7 +319,7 @@ class Subscription {
// Work as the user to make sure ACLs apply correctly
$USERINFO = $auth->getUserData($user);
- $_SERVER['REMOTE_USER'] = $user;
+ $INPUT->server->set('REMOTE_USER',$user);
if($USERINFO === false) continue;
if(!$USERINFO['mail']) continue;
@@ -334,9 +338,10 @@ class Subscription {
foreach($changes as $rev) {
$n = 0;
while(!is_null($rev) && $rev['date'] >= $lastupdate &&
- ($_SERVER['REMOTE_USER'] === $rev['user'] ||
+ ($INPUT->server->str('REMOTE_USER') === $rev['user'] ||
$rev['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT)) {
- $rev = getRevisions($rev['id'], $n++, 1);
+ $pagelog = new PageChangeLog($rev['id']);
+ $rev = $pagelog->getRevisions($n++, 1);
$rev = (count($rev) > 0) ? $rev[0] : null;
}
@@ -369,7 +374,7 @@ class Subscription {
// restore current user info
$USERINFO = $olduinfo;
- $_SERVER['REMOTE_USER'] = $olduser;
+ $INPUT->server->set('REMOTE_USER',$olduser);
return $count;
}
@@ -515,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);
@@ -651,9 +657,11 @@ class Subscription {
public function notifyaddresses(&$data) {
if(!$this->isenabled()) return;
- /** @var auth_basic $auth */
+ /** @var DokuWiki_Auth_Plugin $auth */
global $auth;
global $conf;
+ /** @var Input $INPUT */
+ global $INPUT;
$id = $data['id'];
$self = $data['self'];
@@ -667,7 +675,7 @@ class Subscription {
$userinfo = $auth->getUserData($user);
if($userinfo === false) continue;
if(!$userinfo['mail']) continue;
- if(!$self && $user == $_SERVER['REMOTE_USER']) continue; //skip our own changes
+ if(!$self && $user == $INPUT->server->str('REMOTE_USER')) continue; //skip our own changes
$level = auth_aclcheck($id, $user, $userinfo['grps']);
if($level >= AUTH_READ) {
diff --git a/inc/template.php b/inc/template.php
index 60e178d1a..35b54b4c3 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -154,7 +154,7 @@ function tpl_content_core() {
html_resendpwd();
break;
case 'denied':
- print p_locale_xhtml('denied');
+ html_denied();
break;
case 'profile' :
html_updateprofile();
@@ -210,7 +210,7 @@ function tpl_toc($return = false) {
} else {
$tocok = true;
}
- $toc = $meta['description']['tableofcontents'];
+ $toc = isset($meta['description']['tableofcontents']) ? $meta['description']['tableofcontents'] : null;
if(!$tocok || !is_array($toc) || !$conf['tocminheads'] || count($toc) < $conf['tocminheads']) {
$toc = array();
}
@@ -291,6 +291,8 @@ function tpl_metaheaders($alt = true) {
global $lang;
global $conf;
global $updateVersion;
+ /** @var Input $INPUT */
+ global $INPUT;
// prepare the head array
$head = array();
@@ -316,15 +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',
@@ -333,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'],
@@ -401,7 +405,7 @@ function tpl_metaheaders($alt = true) {
// make $INFO and other vars available to JavaScripts
$json = new JSON();
$script = "var NS='".$INFO['namespace']."';";
- if($conf['useacl'] && !empty($_SERVER['REMOTE_USER'])) {
+ if($conf['useacl'] && $INPUT->server->str('REMOTE_USER')) {
$script .= "var SIG='".toolbar_signature()."';";
}
$script .= 'var JSINFO = '.$json->encode($JSINFO).';';
@@ -548,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) {
@@ -556,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.'" ';
@@ -603,17 +611,20 @@ function tpl_get_action($type) {
global $REV;
global $ACT;
global $conf;
+ /** @var Input $INPUT */
+ global $INPUT;
// check disabled actions and fix the badly named ones
if($type == 'history') $type = 'revisions';
if ($type == 'subscription') $type = 'subscribe';
if(!actionOK($type)) return false;
- $accesskey = null;
- $id = $ID;
- $method = 'get';
- $params = array('do' => $type);
- $nofollow = true;
+ $accesskey = null;
+ $id = $ID;
+ $method = 'get';
+ $params = array('do' => $type);
+ $nofollow = true;
+ $replacement = '';
switch($type) {
case 'edit':
// most complicated type - we need to decide on current action
@@ -637,7 +648,7 @@ function tpl_get_action($type) {
$accesskey = 'v';
}
} else {
- $params = array();
+ $params = array('do' => '');
$type = 'show';
$accesskey = 'v';
}
@@ -658,7 +669,7 @@ function tpl_get_action($type) {
break;
case 'top':
$accesskey = 't';
- $params = array();
+ $params = array('do' => '');
$id = '#dokuwiki__top';
break;
case 'back':
@@ -667,12 +678,17 @@ function tpl_get_action($type) {
return false;
}
$id = $parent;
- $params = array();
+ $params = array('do' => '');
$accesskey = 'b';
break;
+ case 'img_backto':
+ $params = array();
+ $accesskey = 'b';
+ $replacement = $ID;
+ break;
case 'login':
$params['sectok'] = getSecurityToken();
- if(isset($_SERVER['REMOTE_USER'])) {
+ if($INPUT->server->has('REMOTE_USER')) {
if(!actionOK('logout')) {
return false;
}
@@ -681,12 +697,12 @@ function tpl_get_action($type) {
}
break;
case 'register':
- if(!empty($_SERVER['REMOTE_USER'])) {
+ if($INPUT->server->str('REMOTE_USER')) {
return false;
}
break;
case 'resendpwd':
- if(!empty($_SERVER['REMOTE_USER'])) {
+ if($INPUT->server->str('REMOTE_USER')) {
return false;
}
break;
@@ -703,25 +719,40 @@ function tpl_get_action($type) {
$params['sectok'] = getSecurityToken();
break;
case 'subscribe':
- if(!$_SERVER['REMOTE_USER']) {
+ if(!$INPUT->server->str('REMOTE_USER')) {
return false;
}
break;
case 'backlink':
break;
case 'profile':
- if(!isset($_SERVER['REMOTE_USER'])) {
+ if(!$INPUT->server->has('REMOTE_USER')) {
return false;
}
break;
case 'media':
$params['ns'] = getNS($ID);
break;
+ case 'mediaManager':
+ // View image in media manager
+ global $IMG;
+ $imgNS = getNS($IMG);
+ $authNS = auth_quickaclcheck("$imgNS:*");
+ if ($authNS < AUTH_UPLOAD) {
+ return false;
+ }
+ $params = array(
+ 'ns' => $imgNS,
+ 'image' => $IMG,
+ 'do' => 'media'
+ );
+ //$type = 'media';
+ break;
default:
return '[unknown %s type]';
break;
}
- return compact('accesskey', 'type', 'id', 'method', 'params', 'nofollow');
+ return compact('accesskey', 'type', 'id', 'method', 'params', 'nofollow', 'replacement');
}
/**
@@ -885,9 +916,11 @@ function tpl_youarehere($sep = ' » ') {
*/
function tpl_userinfo() {
global $lang;
- global $INFO;
- if(isset($_SERVER['REMOTE_USER'])) {
- print $lang['loggedinas'].': <bdi>'.hsc($INFO['userinfo']['name']).'</bdi> (<bdi>'.hsc($_SERVER['REMOTE_USER']).'</bdi>)';
+ /** @var Input $INPUT */
+ global $INPUT;
+
+ if($INPUT->server->str('REMOTE_USER')) {
+ print $lang['loggedinas'].': '.userlink();
return true;
}
return false;
@@ -1011,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
@@ -1030,6 +1124,7 @@ function tpl_img_getTag($tags, $alt = '', $src = null) {
*/
function tpl_img($maxwidth = 0, $maxheight = 0, $link = true, $params = null) {
global $IMG;
+ /** @var Input $INPUT */
global $INPUT;
$w = tpl_img_getTag('File.Width');
$h = tpl_img_getTag('File.Height');
@@ -1123,10 +1218,11 @@ function tpl_indexerWebBug() {
*
* use this function to access template configuration variables
*
- * @param string $id
- * @return string
+ * @param string $id name of the value to access
+ * @param mixed $notset what to return if the setting is not available
+ * @return mixed
*/
-function tpl_getConf($id) {
+function tpl_getConf($id, $notset=false) {
global $conf;
static $tpl_configloaded = false;
@@ -1143,7 +1239,11 @@ function tpl_getConf($id) {
}
}
- return $conf['tpl'][$tpl][$id];
+ if(isset($conf['tpl'][$tpl][$id])){
+ return $conf['tpl'][$tpl][$id];
+ }
+
+ return $notset;
}
/**
@@ -1237,6 +1337,7 @@ function tpl_mediaContent($fromajax = false, $sort='natural') {
global $INUSE;
global $NS;
global $JUMPTO;
+ /** @var Input $INPUT */
global $INPUT;
$do = $INPUT->extract('do')->str('do');
@@ -1286,6 +1387,7 @@ function tpl_mediaFileList() {
global $NS;
global $JUMPTO;
global $lang;
+ /** @var Input $INPUT */
global $INPUT;
$opened_tab = $INPUT->str('tab_files');
@@ -1326,7 +1428,9 @@ function tpl_mediaFileList() {
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function tpl_mediaFileDetails($image, $rev) {
- global $AUTH, $NS, $conf, $DEL, $lang, $INPUT;
+ global $AUTH, $NS, $conf, $DEL, $lang;
+ /** @var Input $INPUT */
+ global $INPUT;
$removed = (!file_exists(mediaFN($image)) && file_exists(mediaMetaFN($image, '.changes')) && $conf['mediarevisions']);
if(!$image || (!file_exists(mediaFN($image)) && !$removed) || $DEL) return;
@@ -1404,12 +1508,14 @@ function tpl_actiondropdown($empty = '', $button = '&gt;') {
global $ID;
global $REV;
global $lang;
+ /** @var Input $INPUT */
+ global $INPUT;
echo '<form action="'.script().'" method="get" accept-charset="utf-8">';
echo '<div class="no">';
echo '<input type="hidden" name="id" value="'.$ID.'" />';
if($REV) echo '<input type="hidden" name="rev" value="'.$REV.'" />';
- if (!empty($_SERVER['REMOTE_USER'])) {
+ if ($INPUT->server->str('REMOTE_USER')) {
echo '<input type="hidden" name="sectok" value="'.getSecurityToken().'" />';
}
@@ -1775,11 +1881,14 @@ function tpl_media() {
*/
function tpl_classes() {
global $ACT, $conf, $ID, $INFO;
+ /** @var Input $INPUT */
+ global $INPUT;
+
$classes = array(
'dokuwiki',
'mode_'.$ACT,
'tpl_'.$conf['template'],
- !empty($_SERVER['REMOTE_USER']) ? 'loggedIn' : '',
+ $INPUT->server->bool('REMOTE_USER') ? 'loggedIn' : '',
$INFO['exists'] ? '' : 'notFound',
($ID == $conf['start']) ? 'home' : '',
);
diff --git a/inc/toolbar.php b/inc/toolbar.php
index b588d4477..7cc29e866 100644
--- a/inc/toolbar.php
+++ b/inc/toolbar.php
@@ -56,7 +56,7 @@ function toolbar_JSdefines($varname){
'type' => 'format',
'title' => $lang['qb_code'],
'icon' => 'mono.png',
- 'key' => 'c',
+ 'key' => 'm',
'open' => "''",
'close' => "''",
'block' => false
@@ -241,10 +241,12 @@ function toolbar_JSdefines($varname){
function toolbar_signature(){
global $conf;
global $INFO;
+ /** @var Input $INPUT */
+ global $INPUT;
$sig = $conf['signature'];
$sig = dformat(null,$sig);
- $sig = str_replace('@USER@',$_SERVER['REMOTE_USER'],$sig);
+ $sig = str_replace('@USER@',$INPUT->server->str('REMOTE_USER'),$sig);
$sig = str_replace('@NAME@',$INFO['userinfo']['name'],$sig);
$sig = str_replace('@MAIL@',$INFO['userinfo']['mail'],$sig);
$sig = str_replace('@DATE@',dformat(),$sig);