summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_test/tests/lib/exe/js_js_compress.test.php60
-rw-r--r--doku.php2
-rw-r--r--inc/auth.php1
-rw-r--r--inc/compatibility.php36
-rw-r--r--inc/infoutils.php21
-rw-r--r--inc/lang/hr/lang.php16
-rw-r--r--inc/lang/ko/lang.php4
-rw-r--r--inc/lang/no/lang.php2
-rw-r--r--lib/exe/css.php3
-rw-r--r--lib/exe/js.php34
-rw-r--r--lib/plugins/auth.php2
-rw-r--r--lib/plugins/authplain/_test/escaping.test.php43
-rw-r--r--lib/plugins/authplain/auth.php34
-rw-r--r--lib/plugins/extension/lang/hr/lang.php20
-rw-r--r--lib/plugins/usermanager/lang/hr/lang.php4
15 files changed, 230 insertions, 52 deletions
diff --git a/_test/tests/lib/exe/js_js_compress.test.php b/_test/tests/lib/exe/js_js_compress.test.php
index b1ae2a84f..78e089d89 100644
--- a/_test/tests/lib/exe/js_js_compress.test.php
+++ b/_test/tests/lib/exe/js_js_compress.test.php
@@ -145,6 +145,66 @@ EOF;
$this->assertEquals($out, js_compress($text));
}
+ function test_plusplus1(){
+ $text = 'a = 5 + ++b;';
+ $this->assertEquals('a=5+ ++b;',js_compress($text));
+ }
+
+ function test_plusplus2(){
+ $text = 'a = 5+ ++b;';
+ $this->assertEquals('a=5+ ++b;',js_compress($text));
+ }
+
+ function test_plusplus3(){
+ $text = 'a = 5++ + b;';
+ $this->assertEquals('a=5++ +b;',js_compress($text));
+ }
+
+ function test_plusplus4(){
+ $text = 'a = 5++ +b;';
+ $this->assertEquals('a=5++ +b;',js_compress($text));
+ }
+
+ function test_minusminus1(){
+ $text = 'a = 5 - --b;';
+ $this->assertEquals('a=5- --b;',js_compress($text));
+ }
+
+ function test_minusminus2(){
+ $text = 'a = 5- --b;';
+ $this->assertEquals('a=5- --b;',js_compress($text));
+ }
+
+ function test_minusminus3(){
+ $text = 'a = 5-- - b;';
+ $this->assertEquals('a=5-- -b;',js_compress($text));
+ }
+
+ function test_minusminus4(){
+ $text = 'a = 5-- -b;';
+ $this->assertEquals('a=5-- -b;',js_compress($text));
+ }
+
+ function test_minusplus1(){
+ $text = 'a = 5-- +b;';
+ $this->assertEquals('a=5--+b;',js_compress($text));
+ }
+
+ function test_minusplus2(){
+ $text = 'a = 5-- + b;';
+ $this->assertEquals('a=5--+b;',js_compress($text));
+ }
+
+ function test_plusminus1(){
+ $text = 'a = 5++ - b;';
+ $this->assertEquals('a=5++-b;',js_compress($text));
+ }
+
+ function test_plusminus2(){
+ $text = 'a = 5++ -b;';
+ $this->assertEquals('a=5++-b;',js_compress($text));
+ }
+
/**
* Test the files provided with the original JsStrip
*/
diff --git a/doku.php b/doku.php
index 261ceaec2..71eee564e 100644
--- a/doku.php
+++ b/doku.php
@@ -9,7 +9,7 @@
*/
// update message version
-$updateVersion = 46;
+$updateVersion = 46.1;
// xdebug_start_profiling();
diff --git a/inc/auth.php b/inc/auth.php
index e938830ef..4b1e6ce31 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -335,7 +335,6 @@ function auth_browseruid() {
$ip = clientIP(true);
$uid = '';
$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);
diff --git a/inc/compatibility.php b/inc/compatibility.php
index 2738c9bb1..cb865a2d7 100644
--- a/inc/compatibility.php
+++ b/inc/compatibility.php
@@ -41,12 +41,42 @@ if(!function_exists('gzopen') && function_exists('gzopen64')) {
*
* @link http://stackoverflow.com/questions/23417519/php-zlib-gzopen-not-exists
*
- * @param string $filename
- * @param string $mode
- * @param int $use_include_path
+ * @param string $filename
+ * @param string $mode
+ * @param int $use_include_path
* @return mixed
*/
function gzopen($filename, $mode, $use_include_path = 0) {
return gzopen64($filename, $mode, $use_include_path);
}
+}
+
+if(!function_exists('gzseek') && function_exists('gzseek64')) {
+ /**
+ * work around for PHP compiled against certain zlib versions #865
+ *
+ * @link http://stackoverflow.com/questions/23417519/php-zlib-gzopen-not-exists
+ *
+ * @param resource $zp
+ * @param int $offset
+ * @param int $whence
+ * @return int
+ */
+ function gzseek($zp, $offset, $whence = SEEK_SET) {
+ return gzseek64($zp, $offset, $whence);
+ }
+}
+
+if(!function_exists('gztell') && function_exists('gztell64')) {
+ /**
+ * work around for PHP compiled against certain zlib versions #865
+ *
+ * @link http://stackoverflow.com/questions/23417519/php-zlib-gzopen-not-exists
+ *
+ * @param resource $zp
+ * @return int
+ */
+ function gztell($zp) {
+ return gztell64($zp);
+ }
} \ No newline at end of file
diff --git a/inc/infoutils.php b/inc/infoutils.php
index f9ba11560..8fe344093 100644
--- a/inc/infoutils.php
+++ b/inc/infoutils.php
@@ -20,27 +20,28 @@ function checkUpdateMessages(){
if(!$conf['updatecheck']) return;
if($conf['useacl'] && !$INFO['ismanager']) return;
- $cf = $conf['cachedir'].'/messages.txt';
+ $cf = getCacheName($updateVersion, '.updmsg');
$lm = @filemtime($cf);
// check if new messages needs to be fetched
if($lm < time()-(60*60*24) || $lm < @filemtime(DOKU_INC.DOKU_SCRIPT)){
@touch($cf);
- dbglog("checkUpdateMessages(): downloading messages.txt");
+ dbglog("checkUpdateMessages(): downloading messages to ".$cf);
$http = new DokuHTTPClient();
$http->timeout = 12;
- $data = $http->get(DOKU_MESSAGEURL.$updateVersion);
- if(substr(trim($data), -1) != '%') {
- // this doesn't look like one of our messages, maybe some WiFi login interferred
- $data = '';
- }else {
- io_saveFile($cf,$data);
+ $resp = $http->get(DOKU_MESSAGEURL.$updateVersion);
+ if(is_string($resp) && ($resp == "" || substr(trim($resp), -1) == '%')) {
+ // basic sanity check that this is either an empty string response (ie "no messages")
+ // or it looks like one of our messages, not WiFi login or other interposed response
+ io_saveFile($cf,$resp);
+ } else {
+ dbglog("checkUpdateMessages(): unexpected HTTP response received");
}
}else{
- dbglog("checkUpdateMessages(): messages.txt up to date");
- $data = io_readFile($cf);
+ dbglog("checkUpdateMessages(): messages up to date");
}
+ $data = io_readFile($cf);
// show messages through the usual message mechanism
$msgs = explode("\n%\n",$data);
foreach($msgs as $msg){
diff --git a/inc/lang/hr/lang.php b/inc/lang/hr/lang.php
index d7c20b413..c3cf6d822 100644
--- a/inc/lang/hr/lang.php
+++ b/inc/lang/hr/lang.php
@@ -62,7 +62,7 @@ $lang['oldpass'] = 'Potvrdi trenutnu lozinku';
$lang['passchk'] = 'još jednom';
$lang['remember'] = 'Zapamti me';
$lang['fullname'] = 'Ime i prezime';
-$lang['email'] = 'Email';
+$lang['email'] = 'E-pošta';
$lang['profile'] = 'Korisnički profil';
$lang['badlogin'] = 'Ne ispravno korisničko ime ili lozinka.';
$lang['badpassconfirm'] = 'Nažalost, lozinka nije ispravna';
@@ -100,8 +100,8 @@ $lang['license'] = 'Osim na mjestima gdje je naznačeno drugačije
$lang['licenseok'] = 'Pažnja: promjenom ovog dokumenta pristajete licencirati sadržaj sljedećom licencom: ';
$lang['searchmedia'] = 'Traži naziv datoteke:';
$lang['searchmedia_in'] = 'Traži u %s';
-$lang['txt_upload'] = 'Odaberite datoteku za postavljanje:';
-$lang['txt_filename'] = 'Postaviti kao (nije obavezno):';
+$lang['txt_upload'] = 'Odaberite datoteku za učitavanje:';
+$lang['txt_filename'] = 'Učitaj kao (nije obavezno):';
$lang['txt_overwrt'] = 'Prepiši postojeću datoteku';
$lang['maxuploadsize'] = 'Moguće je učitati maks. %s po datoteci.';
$lang['lockedby'] = 'Trenutno zaključao:';
@@ -156,7 +156,7 @@ $lang['uploadsucc'] = 'Učitavanje uspješno';
$lang['uploadfail'] = 'Neuspješno učitavanje. Možda dozvole na poslužitelju nisu ispravne?';
$lang['uploadwrong'] = 'Učitavanje nije dopušteno. Nastavak datoteke je zabranjen!';
$lang['uploadexist'] = 'Datoteka već postoji.';
-$lang['uploadbadcontent'] = 'Postavljeni sadržaj ne odgovara ekstenziji %s datoteke.';
+$lang['uploadbadcontent'] = 'Učitani sadržaj ne odgovara ekstenziji %s datoteke.';
$lang['uploadspam'] = 'Učitavanje je spriječeno od spam crne liste.';
$lang['uploadxss'] = 'Učitavanje je spriječeno zbog mogućeg zlonamjernog sadržaja.';
$lang['uploadsize'] = 'Učitana datoteka je prevelika (max. %s)';
@@ -191,7 +191,7 @@ $lang['difflastrev'] = 'Zadnja izmjena';
$lang['diffbothprevrev'] = 'Starije izmjene na obje strane';
$lang['diffbothnextrev'] = 'Novije izmjene na obje strane';
$lang['line'] = 'Redak';
-$lang['breadcrumb'] = 'Putanja:';
+$lang['breadcrumb'] = 'Zadnje viđeno:';
$lang['youarehere'] = 'Vi ste ovdje:';
$lang['lastmod'] = 'Zadnja izmjena:';
$lang['by'] = 'od';
@@ -212,7 +212,7 @@ $lang['mail_newpage'] = 'stranica dodana:';
$lang['mail_changed'] = 'stranica izmjenjena:';
$lang['mail_subscribe_list'] = 'stranice promijenjene u imenskom prostoru:';
$lang['mail_new_user'] = 'novi korisnik:';
-$lang['mail_upload'] = 'datoteka postavljena:';
+$lang['mail_upload'] = 'datoteka učitana:';
$lang['changes_type'] = 'Vidi promjene od';
$lang['pages_changes'] = 'Stranice';
$lang['media_changes'] = 'Datoteke';
@@ -277,7 +277,7 @@ $lang['subscr_style_list'] = 'listu promijenjenih stranica od zadnje primlje
$lang['authtempfail'] = 'Autentifikacija korisnika je privremeno nedostupna. Molimo Vas da kontaktirate administratora.';
$lang['authpwdexpire'] = 'Vaša lozinka će isteći za %d dana, trebate ju promijeniti.';
$lang['i_chooselang'] = 'Izaberite vaš jezik';
-$lang['i_installer'] = 'DokuWiki instalacija';
+$lang['i_installer'] = 'DokuWiki postavljanje';
$lang['i_wikiname'] = 'Naziv Wikija';
$lang['i_enableacl'] = 'Omogući ACL (preporučeno)';
$lang['i_superuser'] = 'Superkorisnik';
@@ -340,3 +340,5 @@ $lang['currentns'] = 'Tekući imenički prostor';
$lang['searchresult'] = 'Rezultati pretraživanja';
$lang['plainhtml'] = 'Čisti HTML';
$lang['wikimarkup'] = 'Wiki kod';
+$lang['page_nonexist_rev'] = 'Stranica ne postoji na %s. Ona je naknadno napravljena na <a href="%s">%s</a>.';
+$lang['unable_to_parse_date'] = 'Ne mogu analizirati parametar "%s".';
diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php
index 3cedf021a..61bb58350 100644
--- a/inc/lang/ko/lang.php
+++ b/inc/lang/ko/lang.php
@@ -74,7 +74,7 @@ $lang['badpassconfirm'] = '죄송하지만 비밀번호가 잘못되었
$lang['minoredit'] = '사소한 바뀜';
$lang['draftdate'] = '초안 자동 저장 시간';
$lang['nosecedit'] = '한 동안 문서가 바뀌었으며, 문단 정보가 오래되어 문서 전체를 대신 열었습니다.';
-$lang['searchcreatepage'] = "만약 원하는 문서를 찾지 못했다면, ''문서 만들기''나 ''문서 편집''을 사용해 검색어와 같은 이름의 문서를 만들거나 편집할 수 있습니다.";
+$lang['searchcreatepage'] = '만약 원하는 문서를 찾지 못했다면, \'\'문서 만들기\'\'나 \'\'문서 편집\'\'을 사용해 검색어와 같은 이름의 문서를 만들거나 편집할 수 있습니다.';
$lang['regmissing'] = '죄송하지만 모든 필드를 채워야 합니다.';
$lang['reguexists'] = '죄송하지만 같은 이름을 사용하는 사용자가 있습니다.';
$lang['regsuccess'] = '사용자를 만들었으며 비밀번호는 이메일로 보냈습니다.';
@@ -344,3 +344,5 @@ $lang['currentns'] = '현재 이름공간';
$lang['searchresult'] = '검색 결과';
$lang['plainhtml'] = '일반 HTML';
$lang['wikimarkup'] = '위키 문법';
+$lang['page_nonexist_rev'] = '문서가 %s에 존재하지 않았습니다. 그 뒤로 <a href="%s">%s</a>에 만들어졌습니다.';
+$lang['unable_to_parse_date'] = '"%s" 변수에서 구문 분석할 수 없습니다.';
diff --git a/inc/lang/no/lang.php b/inc/lang/no/lang.php
index 5e508617e..aeea982f2 100644
--- a/inc/lang/no/lang.php
+++ b/inc/lang/no/lang.php
@@ -116,7 +116,7 @@ $lang['searchmedia_in'] = 'Søk i %s';
$lang['txt_upload'] = 'Velg fil som skal lastes opp:';
$lang['txt_filename'] = 'Skriv inn wikinavn (alternativt):';
$lang['txt_overwrt'] = 'Overskriv eksisterende fil';
-$lang['maxuploadsize'] = 'Opplast maks % per fil.';
+$lang['maxuploadsize'] = 'Opplast maks %s per fil.';
$lang['lockedby'] = 'Låst av:';
$lang['lockexpire'] = 'Låsingen utløper:';
$lang['js']['willexpire'] = 'Din redigeringslås for dette dokumentet kommer snart til å utløpe.\nFor å unngå versjonskonflikter bør du forhåndsvise dokumentet ditt for å forlenge redigeringslåsen.';
diff --git a/lib/exe/css.php b/lib/exe/css.php
index 6c1d60751..f7235fd4e 100644
--- a/lib/exe/css.php
+++ b/lib/exe/css.php
@@ -166,8 +166,11 @@ function css_out(){
* @return string
*/
function css_parseless($css) {
+ global $conf;
+
$less = new lessc();
$less->importDir[] = DOKU_INC;
+ $less->setPreserveComments(!$conf['compress']);
if (defined('DOKU_UNITTEST')){
$less->importDir[] = TMP_DIR;
diff --git a/lib/exe/js.php b/lib/exe/js.php
index bec12ef7a..2ab78dfc3 100644
--- a/lib/exe/js.php
+++ b/lib/exe/js.php
@@ -289,6 +289,10 @@ function js_compress($s){
// items that don't need spaces next to them
$chars = "^&|!+\-*\/%=\?:;,{}()<>% \t\n\r'\"[]";
+ // items which need a space if the sign before and after whitespace is equal.
+ // E.g. '+ ++' may not be compressed to '+++' --> syntax error.
+ $ops = "+-";
+
$regex_starters = array("(", "=", "[", "," , ":", "!");
$whitespaces_chars = array(" ", "\t", "\n", "\r", "\0", "\x0B");
@@ -389,19 +393,27 @@ function js_compress($s){
// whitespaces
if( $ch == ' ' || $ch == "\r" || $ch == "\n" || $ch == "\t" ){
- // leading spaces
- if($i+1 < $slen && (strpos($chars,$s[$i+1]) !== false)){
- $i = $i + 1;
- continue;
- }
- // trailing spaces
- // if this ch is space AND the last char processed
- // is special, then skip the space
$lch = substr($result,-1);
- if($lch && (strpos($chars,$lch) !== false)){
- $i = $i + 1;
- continue;
+
+ // Only consider deleting whitespace if the signs before and after
+ // are not equal and are not an operator which may not follow itself.
+ if ((!$lch || $s[$i+1] == ' ')
+ || $lch != $s[$i+1]
+ || strpos($ops,$s[$i+1]) === false) {
+ // leading spaces
+ if($i+1 < $slen && (strpos($chars,$s[$i+1]) !== false)){
+ $i = $i + 1;
+ continue;
+ }
+ // trailing spaces
+ // if this ch is space AND the last char processed
+ // is special, then skip the space
+ if($lch && (strpos($chars,$lch) !== false)){
+ $i = $i + 1;
+ continue;
+ }
}
+
// else after all of this convert the "whitespace" to
// a single space. It will get appended below
$ch = ' ';
diff --git a/lib/plugins/auth.php b/lib/plugins/auth.php
index b38b591a3..02e0613dd 100644
--- a/lib/plugins/auth.php
+++ b/lib/plugins/auth.php
@@ -129,7 +129,7 @@ class DokuWiki_Auth_Plugin extends DokuWiki_Plugin {
$eventdata = array('type' => $type, 'params' => $params, 'modification_result' => null);
$evt = new Doku_Event('AUTH_USER_CHANGE', $eventdata);
if($evt->advise_before(true)) {
- $result = call_user_func_array(array($this, $validTypes[$type]), $params);
+ $result = call_user_func_array(array($this, $validTypes[$type]), $evt->data['params']);
$evt->data['modification_result'] = $result;
}
$evt->advise_after();
diff --git a/lib/plugins/authplain/_test/escaping.test.php b/lib/plugins/authplain/_test/escaping.test.php
index cd5294157..cbfbbc587 100644
--- a/lib/plugins/authplain/_test/escaping.test.php
+++ b/lib/plugins/authplain/_test/escaping.test.php
@@ -13,12 +13,12 @@
*/
class helper_plugin_authplain_escaping_test extends DokuWikiTest {
- protected $pluginsEnabled = array('authplain');
+ protected $pluginsEnabled = array('authplainharness');
protected $auth;
protected function reloadUsers() {
/* auth caches data loaded from file, but recreated object forces reload */
- $this->auth = new auth_plugin_authplain();
+ $this->auth = new auth_plugin_authplainharness();
}
function setUp() {
@@ -76,7 +76,44 @@ class helper_plugin_authplain_escaping_test extends DokuWikiTest {
$this->assertEquals($saved['name'], $user['name']);
$this->assertTrue($this->auth->checkPass("testuser", $user['pass']));
}
+
+ // really only required for developers to ensure this plugin will
+ // work with systems running on PCRE 6.6 and lower.
+ public function testLineSplit(){
+ $this->auth->setPregsplit_safe(false);
+
+ $names = array(
+ 'plain',
+ 'ut-fठ8',
+ 'colon:',
+ 'backslash\\',
+ 'alltogether\\ठ:'
+ );
+ $userpass = 'user:password_hash:';
+ $other_user_data = ':email@address:group1,group2';
+
+ foreach ($names as $testname) {
+ $escaped = str_replace(array('\\',':'),array('\\\\','\\:'),$testname); // escape : & \
+ $test_line = $userpass.$escaped.$other_user_data;
+ $result = $this->auth->splitUserData($test_line);
+
+ $this->assertEquals($escaped, $result[2]);
+ }
+ }
}
-?> \ No newline at end of file
+class auth_plugin_authplainharness extends auth_plugin_authplain {
+
+ public function setPregsplit_safe($bool) {
+ $this->_pregsplit_safe = $bool;
+ }
+
+ public function getPregsplit_safe(){
+ return $this->_pregsplit_safe;
+ }
+
+ public function splitUserData($line){
+ return $this->_splitUserData($line);
+ }
+} \ No newline at end of file
diff --git a/lib/plugins/authplain/auth.php b/lib/plugins/authplain/auth.php
index b3ca988b9..3d303597c 100644
--- a/lib/plugins/authplain/auth.php
+++ b/lib/plugins/authplain/auth.php
@@ -17,6 +17,9 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
/** @var array filter pattern */
protected $_pattern = array();
+ /** @var bool safe version of preg_split */
+ protected $_pregsplit_safe = false;
+
/**
* Constructor
*
@@ -44,6 +47,8 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
$this->cando['getUsers'] = true;
$this->cando['getUserCount'] = true;
}
+
+ $this->_pregsplit_safe = version_compare(PCRE_VERSION,'6.7','>=');
}
/**
@@ -329,7 +334,7 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
if(empty($line)) continue;
/* NB: preg_split can be deprecated/replaced with str_getcsv once dokuwiki is min php 5.3 */
- $row = preg_split('/(?<![^\\\\]\\\\)\:/', $line, 5); // allow for : escaped as \:
+ $row = $this->_splitUserData($line);
$row = str_replace('\\:', ':', $row);
$row = str_replace('\\\\', '\\', $row);
@@ -342,6 +347,33 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
}
}
+ protected function _splitUserData($line){
+ // due to a bug in PCRE 6.6, preg_split will fail with the regex we use here
+ // refer github issues 877 & 885
+ if ($this->_pregsplit_safe){
+ return preg_split('/(?<![^\\\\]\\\\)\:/', $line, 5); // allow for : escaped as \:
+ }
+
+ $row = array();
+ $piece = '';
+ $len = strlen($line);
+ for($i=0; $i<$len; $i++){
+ if ($line[$i]=='\\'){
+ $piece .= $line[$i];
+ $i++;
+ if ($i>=$len) break;
+ } else if ($line[$i]==':'){
+ $row[] = $piece;
+ $piece = '';
+ continue;
+ }
+ $piece .= $line[$i];
+ }
+ $row[] = $piece;
+
+ return $row;
+ }
+
/**
* return true if $user + $info match $filter criteria, false otherwise
*
diff --git a/lib/plugins/extension/lang/hr/lang.php b/lib/plugins/extension/lang/hr/lang.php
index 4905fe864..f43defcb1 100644
--- a/lib/plugins/extension/lang/hr/lang.php
+++ b/lib/plugins/extension/lang/hr/lang.php
@@ -6,24 +6,24 @@
* @author Davor Turkalj <turki.bsc@gmail.com>
*/
$lang['menu'] = 'Upravitelj dodataka';
-$lang['tab_plugins'] = 'Instalirani dodatci';
-$lang['tab_templates'] = 'Instalirani predlošci';
-$lang['tab_search'] = 'Potraži i instaliraj';
-$lang['tab_install'] = 'Ručno instaliranje';
+$lang['tab_plugins'] = 'Ugrađeni dodatci';
+$lang['tab_templates'] = 'Ugrađeni predlošci';
+$lang['tab_search'] = 'Potraži i ugradi';
+$lang['tab_install'] = 'Ručna ugradnja';
$lang['notimplemented'] = 'Ova mogućnost još nije napravljena';
-$lang['notinstalled'] = 'Dodatak nije instaliran';
+$lang['notinstalled'] = 'Dodatak nije ugrađen';
$lang['alreadyenabled'] = 'Ovaj dodatak je već omogućen';
$lang['alreadydisabled'] = 'Ovaj dodatak je već onemogućen';
$lang['pluginlistsaveerror'] = 'Dogodila se greška pri snimanju liste dodataka';
$lang['unknownauthor'] = 'Nepoznat autor';
$lang['unknownversion'] = 'Nepoznata inačica';
$lang['btn_info'] = 'Prikaži više informacija';
-$lang['btn_update'] = 'Dopuni';
+$lang['btn_update'] = 'Dogradi';
$lang['btn_uninstall'] = 'Ukloni';
$lang['btn_enable'] = 'Omogući';
$lang['btn_disable'] = 'Onemogući';
-$lang['btn_install'] = 'Postavi';
-$lang['btn_reinstall'] = 'Ponovno postavi';
+$lang['btn_install'] = 'Ugradi';
+$lang['btn_reinstall'] = 'Ponovno ugradi';
$lang['js']['reallydel'] = 'Zaista ukloniti ovo proširenje?';
$lang['search_for'] = 'Pretraži proširenja';
$lang['search'] = 'Pretraži';
@@ -34,11 +34,11 @@ $lang['homepage_link'] = 'Upute';
$lang['bugs_features'] = 'Greške';
$lang['tags'] = 'Oznake:';
$lang['author_hint'] = 'Potraži dodatke od ovog autora';
-$lang['installed'] = 'Postavljeno:';
+$lang['installed'] = 'Ugrađeno:';
$lang['downloadurl'] = 'URL adresa preuzimanja:';
$lang['repository'] = 'Repozitorij:';
$lang['unknown'] = '<em>nepoznat</em>';
-$lang['installed_version'] = 'Postavljena inačica:';
+$lang['installed_version'] = 'Ugrađena inačica:';
$lang['install_date'] = 'Vaše zadnje osvježavanje:';
$lang['available_version'] = 'Dostupna inačica';
$lang['compatible'] = 'Kompatibilan s:';
diff --git a/lib/plugins/usermanager/lang/hr/lang.php b/lib/plugins/usermanager/lang/hr/lang.php
index 80613ed6f..a71afb60a 100644
--- a/lib/plugins/usermanager/lang/hr/lang.php
+++ b/lib/plugins/usermanager/lang/hr/lang.php
@@ -33,7 +33,7 @@ $lang['line'] = 'Linija br.';
$lang['error'] = 'Poruka o grešci';
$lang['summary'] = 'Prikaz korisnika %1$d-%2$d od %3$d nađenih. Ukupno %4$d korisnika.';
$lang['nonefound'] = 'Nema korisnika koji odgovaraju filtru.Ukupno %d korisnika.';
-$lang['delete_ok'] = '%d korisnik obrisano';
+$lang['delete_ok'] = '%d korisnika obrisano';
$lang['delete_fail'] = '%d neuspjelih brisanja.';
$lang['update_ok'] = 'Korisnik uspješno izmijenjen';
$lang['update_fail'] = 'Neuspjela izmjena korisnika';
@@ -49,7 +49,7 @@ $lang['note_group'] = 'Novi korisnik biti će dodijeljen u podrazumij
$lang['note_pass'] = 'Lozinka će biti generirana ako se polje ostavi prazno i obavješćivanje korisnika je omogućeno.';
$lang['add_ok'] = 'Korisnik uspješno dodan';
$lang['add_fail'] = 'Neuspješno dodavanje korisnika';
-$lang['notify_ok'] = 'Obavijest korisniku poslana';
+$lang['notify_ok'] = 'Poslana obavijest korisniku';
$lang['notify_fail'] = 'Obavijest korisniku ne može biti poslana';
$lang['import_userlistcsv'] = 'Datoteka s popisom korisnika (CSV):';
$lang['import_header'] = 'Zadnje greške pri uvozu';