Compare commits

...

18 Commits

Author SHA1 Message Date
e83bdda10f Check captcha before password, delete via cron and fix backtologin with global password enabled 2017-09-01 19:21:03 +02:00
b250285a71 Added Bulgarian translation 2017-07-17 18:51:24 +02:00
0080aee4c3 Updates Spanish translation 2017-05-24 17:26:02 +02:00
a59e248851 Prepare Spanish language files for translation 2017-05-17 19:00:35 +02:00
507407cfc1 Make captcha a little harder + minor SQL optimization 2017-04-20 17:32:27 +02:00
450d97c40f Updated Russian translation + minor improvements 2017-03-04 20:19:30 +01:00
9a99d34798 Fix update from older versions 2017-01-23 17:43:54 +01:00
2ae523feee Fix restoring members in backup and restore 2017-01-17 18:16:11 +01:00
d4a35bc60e Restructure initalization code to fix setting up new chats 2017-01-01 14:25:58 +01:00
8142c9c799 Fix ignore list in profile when using prefix + minor optimization 2016-12-30 10:25:54 +01:00
361137db9f Prevent non-admins from loging in incognito via setup 2016-12-30 08:36:13 +01:00
5c32a8859f Force space after /me to prevent posting "as someone else" 2016-12-30 07:19:18 +01:00
208c354284 Sort ignore list alphabetically 2016-12-30 07:05:59 +01:00
c5b080154c Let offline members be ignored 2016-12-30 07:00:43 +01:00
0e6acb8806 List offline members in ignore too, if they posted a message 2016-12-30 06:46:35 +01:00
675568bd30 Performance optimization in cron 2016-12-30 06:08:50 +01:00
f7950e8ee1 Replace configurable static size for notes and post textarea with css 2016-12-27 19:19:16 +01:00
b1713dadc1 Don't display manual refresh message if animation is unsupported 2016-12-26 09:44:23 +01:00
12 changed files with 762 additions and 566 deletions

View File

@ -1,3 +1,23 @@
Version 1.23.6 - Sep. 1, 2017
Added Russian and Bulgarian translation
Updated Spanish translation
Bugfixes and optimizations
Version 1.23.4 - Jan. 23, 2017
Fix update from older versions
Version 1.23.3 - Jan. 17, 2017
Fix restoring members in backup and restore
Version 1.23.2 - Jan. 1, 2017
Restructure initalization code to fix setting up new chats
Version 1.23.1 - Dec. 30, 2016
Replace configurable static size for notes and post textarea with css
Let offline members be ignored
Force space after /me to prevent posting "as someone else"
Prevent non-admins from loging in incognito via setup
Version 1.23 - Dec. 25, 2016 Version 1.23 - Dec. 25, 2016
Optimizations Optimizations
More secure session key generation and password storage More secure session key generation and password storage

325
chat.php
View File

@ -2,7 +2,7 @@
/* /*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - Main program * LE CHAT-PHP - a PHP Chat based on LE CHAT - Main program
* *
* Copyright (C) 2015-2016 Daniel Winzen <d@winzen4.de> * Copyright (C) 2015-2017 Daniel Winzen <d@winzen4.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -47,9 +47,6 @@ if(!isset($_REQUEST['session']) && isset($_COOKIE[COOKIENAME])){
} }
load_lang(); load_lang();
check_db(); check_db();
if(!check_init()){
send_init();
}
cron(); cron();
route(); route();
@ -57,7 +54,6 @@ route();
function route(){ function route(){
global $U; global $U;
if(!isset($_REQUEST['action'])){ if(!isset($_REQUEST['action'])){
update_db();
send_login(); send_login();
}elseif($_REQUEST['action']==='view'){ }elseif($_REQUEST['action']==='view'){
check_session(); check_session();
@ -149,8 +145,6 @@ function route(){
send_admin(route_admin()); send_admin(route_admin());
}elseif($_REQUEST['action']==='setup'){ }elseif($_REQUEST['action']==='setup'){
route_setup(); route_setup();
}elseif($_REQUEST['action']==='init'){
init_chat();
}else{ }else{
send_login(); send_login();
} }
@ -170,7 +164,7 @@ function route_admin(){
}elseif($_REQUEST['what']==='room'){ }elseif($_REQUEST['what']==='room'){
clean_room(); clean_room();
}elseif($_REQUEST['what']==='nick'){ }elseif($_REQUEST['what']==='nick'){
$stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'members WHERE nickname=? AND status>=?;'); $stmt=$db->prepare('SELECT null FROM ' . PREFIX . 'members WHERE nickname=? AND status>=?;');
$stmt->execute([$_REQUEST['nickname'], $U['status']]); $stmt->execute([$_REQUEST['nickname'], $U['status']]);
if(!$stmt->fetch(PDO::FETCH_ASSOC)){ if(!$stmt->fetch(PDO::FETCH_ASSOC)){
del_all_messages($_REQUEST['nickname'], 0); del_all_messages($_REQUEST['nickname'], 0);
@ -225,7 +219,6 @@ function route_admin(){
function route_setup(){ function route_setup(){
global $U; global $U;
update_db();
if(!valid_admin()){ if(!valid_admin()){
send_alogin(); send_alogin();
} }
@ -273,14 +266,15 @@ function print_stylesheet($init=false){
echo '.approve_waiting #action td:only-child,.help #backcredit,.login td:only-child,.alogin td:only-child,.init td:only-child{text-align:center;} .sessions td,.sessions th,.approve_waiting td,.approve_waiting th{padding: 5px;} '; echo '.approve_waiting #action td:only-child,.help #backcredit,.login td:only-child,.alogin td:only-child,.init td:only-child{text-align:center;} .sessions td,.sessions th,.approve_waiting td,.approve_waiting th{padding: 5px;} ';
echo '.sessions td td{padding: 1px;} .messages #bottom_link{position:fixed;top:0.5em;right:0.5em;} .messages #top_link{position:fixed;bottom:0.5em;right:0.5em;} '; echo '.sessions td td{padding: 1px;} .messages #bottom_link{position:fixed;top:0.5em;right:0.5em;} .messages #top_link{position:fixed;bottom:0.5em;right:0.5em;} ';
echo '.post table,.controls table,.login table{border-spacing:0px;margin-left:auto;margin-right:auto;} .login table{border:2px solid;} .controls{overflow-y:none;} '; echo '.post table,.controls table,.login table{border-spacing:0px;margin-left:auto;margin-right:auto;} .login table{border:2px solid;} .controls{overflow-y:none;} ';
echo '#manualrefresh{display:block;position:fixed;text-align:center;left:25%;width:50%;animation:timeout_messages '; echo '#manualrefresh{display:block;position:fixed;text-align:center;left:25%;width:50%;top:-200%;animation:timeout_messages ';
if(isset($U['refresh'])){ if(isset($U['refresh'])){
echo $U['refresh']+20; echo $U['refresh']+20;
}else{ }else{
echo '160'; echo '160';
} }
echo 's;z-index:2;background-color:#500000;border:2px solid #ff0000;} '; echo 's forwards;z-index:2;background-color:#500000;border:2px solid #ff0000;} ';
echo '@keyframes timeout_messages{0%{top:-200%;} 99%{top:-200%;} 100%{top:0%;}}'; echo '@keyframes timeout_messages{0%{top:-200%;} 99%{top:-200%;} 100%{top:0%;}} ';
echo '.notes textarea{height:80vh;width:80%;}';
echo '</style>'; echo '</style>';
if($init){ if($init){
return; return;
@ -438,29 +432,21 @@ function send_captcha(){
$bg=imagecolorallocate($im, 0, 0, 0); $bg=imagecolorallocate($im, 0, 0, 0);
$fg=imagecolorallocate($im, 255, 255, 255); $fg=imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $bg); imagefill($im, 0, 0, $bg);
$line=imagecolorallocate($im, 100, 100, 100); imagestring($im, 5, 5, 5, $code, $fg);
for($i=0;$i<3;++$i){ $line=imagecolorallocate($im, 255, 255, 255);
for($i=0;$i<2;++$i){
imageline($im, 0, mt_rand(0, 24), 55, mt_rand(0, 24), $line); imageline($im, 0, mt_rand(0, 24), 55, mt_rand(0, 24), $line);
} }
$dots=imagecolorallocate($im, 200, 200, 200); $dots=imagecolorallocate($im, 255, 255, 255);
for($i=0;$i<100;++$i){ for($i=0;$i<100;++$i){
imagesetpixel($im, mt_rand(0, 55), mt_rand(0, 24), $dots); imagesetpixel($im, mt_rand(0, 55), mt_rand(0, 24), $dots);
} }
imagestring($im, 5, 5, 5, $code, $fg);
echo '<img width="55" height="24" src="data:image/gif;base64,'; echo '<img width="55" height="24" src="data:image/gif;base64,';
}else{ }else{
$im=imagecreatetruecolor(150, 200); $im=imagecreatetruecolor(150, 200);
$bg=imagecolorallocate($im, 0, 0, 0); $bg=imagecolorallocate($im, 0, 0, 0);
$fg=imagecolorallocate($im, 255, 255, 255); $fg=imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $bg); imagefill($im, 0, 0, $bg);
$line=imagecolorallocate($im, 100, 100, 100);
for($i=0;$i<5;++$i){
imageline($im, 0, mt_rand(0, 200), 150, mt_rand(0, 200), $line);
}
$dots=imagecolorallocate($im, 200, 200, 200);
for($i=0;$i<1000;++$i){
imagesetpixel($im, mt_rand(0, 150), mt_rand(0, 200), $dots);
}
$chars=[]; $chars=[];
for($i=0;$i<10;++$i){ for($i=0;$i<10;++$i){
$found=false; $found=false;
@ -499,6 +485,14 @@ function send_captcha(){
for($i=5;$i<9;++$i){ for($i=5;$i<9;++$i){
imageline($im, $chars[$i]['x']+4, $chars[$i]['y']+8, $chars[$i+1]['x']+4, $chars[$i+1]['y']+8, $follow); imageline($im, $chars[$i]['x']+4, $chars[$i]['y']+8, $chars[$i+1]['x']+4, $chars[$i+1]['y']+8, $follow);
} }
$line=imagecolorallocate($im, 255, 255, 255);
for($i=0;$i<5;++$i){
imageline($im, 0, mt_rand(0, 200), 150, mt_rand(0, 200), $line);
}
$dots=imagecolorallocate($im, 255, 255, 255);
for($i=0;$i<1000;++$i){
imagesetpixel($im, mt_rand(0, 150), mt_rand(0, 200), $dots);
}
echo '<img width="150" height="200" src="data:image/gif;base64,'; echo '<img width="150" height="200" src="data:image/gif;base64,';
} }
ob_start(); ob_start();
@ -753,7 +747,7 @@ function restore_backup($C){
if(isset($_REQUEST['members']) && isset($code['members'])){ if(isset($_REQUEST['members']) && isset($code['members'])){
$db->exec('DELETE FROM ' . PREFIX . 'inbox;'); $db->exec('DELETE FROM ' . PREFIX . 'inbox;');
$db->exec('DELETE FROM ' . PREFIX . 'members;'); $db->exec('DELETE FROM ' . PREFIX . 'members;');
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, boxwidth, boxheight, notesboxwidth, notesboxheight, regedby, lastlogin, timestamps, embed, incognito, style, nocache, tz, eninbox, sortupdown, hidechatters, nocache_old) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);'); $stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, regedby, lastlogin, timestamps, embed, incognito, style, nocache, tz, eninbox, sortupdown, hidechatters, nocache_old) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);');
foreach($code['members'] as $member){ foreach($code['members'] as $member){
$new_settings=['nocache', 'tz', 'eninbox', 'sortupdown', 'hidechatters', 'nocache_old']; $new_settings=['nocache', 'tz', 'eninbox', 'sortupdown', 'hidechatters', 'nocache_old'];
foreach($new_settings as $setting){ foreach($new_settings as $setting){
@ -761,7 +755,7 @@ function restore_backup($C){
$member[$setting]=0; $member[$setting]=0;
} }
} }
$stmt->execute([$member['nickname'], $member['passhash'], $member['status'], $member['refresh'], $member['bgcolour'], $member['boxwidth'], $member['boxheight'], $member['notesboxwidth'], $member['notesboxheight'], $member['regedby'], $member['lastlogin'], $member['timestamps'], $member['embed'], $member['incognito'], $member['style'], $member['nocache'], $member['tz'], $member['eninbox'], $member['sortupdown'], $member['hidechatters']]); $stmt->execute([$member['nickname'], $member['passhash'], $member['status'], $member['refresh'], $member['bgcolour'], $member['regedby'], $member['lastlogin'], $member['timestamps'], $member['embed'], $member['incognito'], $member['style'], $member['nocache'], $member['tz'], $member['eninbox'], $member['sortupdown'], $member['hidechatters'], $member['nocache_old']]);
} }
} }
if(isset($_REQUEST['notes']) && isset($code['notes'])){ if(isset($_REQUEST['notes']) && isset($code['notes'])){
@ -1442,7 +1436,7 @@ function send_frameset(){
} }
echo "<frame name=\"post\" src=\"$_SERVER[SCRIPT_NAME]?action=post&session=$U[session]&lang=$language\">"; echo "<frame name=\"post\" src=\"$_SERVER[SCRIPT_NAME]?action=post&session=$U[session]&lang=$language\">";
} }
echo "<noframes><body>$I[noframes]".form_target('_parent', 'login').submit($I['backtologin'], 'class="backbutton"').'</form></body></noframes></frameset></html>'; echo "<noframes><body>$I[noframes]".form_target('_parent', '').submit($I['backtologin'], 'class="backbutton"').'</form></body></noframes></frameset></html>';
exit; exit;
} }
@ -1575,14 +1569,11 @@ function send_notes($type){
}else{ }else{
$note['text']=''; $note['text']='';
} }
$stmt=$db->prepare('SELECT notesboxwidth, notesboxheight FROM ' . PREFIX . 'members WHERE nickname=?;');
$stmt->execute([$U['nickname']]);
$settings=$stmt->fetch(PDO::FETCH_ASSOC);
if(MSGENCRYPTED){ if(MSGENCRYPTED){
$note['text']=openssl_decrypt($note['text'], 'aes-256-cbc', ENCRYPTKEY, 0, '1234567890123456'); $note['text']=openssl_decrypt($note['text'], 'aes-256-cbc', ENCRYPTKEY, 0, '1234567890123456');
} }
echo "</p>".form('notes'); echo "</p>".form('notes');
echo "$hiddendo<textarea name=\"text\" rows=\"$settings[notesboxheight]\" cols=\"$settings[notesboxwidth]\">".htmlspecialchars($note['text']).'</textarea><br>'; echo "$hiddendo<textarea name=\"text\">".htmlspecialchars($note['text']).'</textarea><br>';
echo submit($I['savenotes']).'</form><br>'; echo submit($I['savenotes']).'</form><br>';
if($num[0]>1){ if($num[0]>1){
echo "<br><table><tr><td>$I[revisions]</td>"; echo "<br><table><tr><td>$I[revisions]</td>";
@ -1603,7 +1594,7 @@ function send_approve_waiting(){
global $I, $db; global $I, $db;
print_start('approve_waiting'); print_start('approve_waiting');
echo "<h2>$I[waitingroom]</h2>"; echo "<h2>$I[waitingroom]</h2>";
$result=$db->query('SELECT * FROM ' . PREFIX . 'sessions WHERE entry=0 AND status=1 ORDER BY id;'); $result=$db->query('SELECT * FROM ' . PREFIX . 'sessions WHERE entry=0 AND status=1 ORDER BY id LIMIT 100;');
if($tmp=$result->fetchAll(PDO::FETCH_ASSOC)){ if($tmp=$result->fetchAll(PDO::FETCH_ASSOC)){
echo form('admin', 'approve'); echo form('admin', 'approve');
echo '<table>'; echo '<table>';
@ -1718,9 +1709,9 @@ function send_post($rejected=''){
} }
echo '<table><tr><td><table><tr id="firstline"><td>'.style_this(htmlspecialchars($U['nickname']), $U['style']).'</td><td>:</td>'; echo '<table><tr><td><table><tr id="firstline"><td>'.style_this(htmlspecialchars($U['nickname']), $U['style']).'</td><td>:</td>';
if(isset($_REQUEST['multi'])){ if(isset($_REQUEST['multi'])){
echo "<td><textarea name=\"message\" rows=\"$U[boxheight]\" cols=\"$U[boxwidth]\" style=\"$U[style]\" autofocus>$rejected</textarea></td>"; echo "<td><textarea name=\"message\" rows=\"3\" cols=\"40\" style=\"$U[style]\" autofocus>$rejected</textarea></td>";
}else{ }else{
echo "<td><input type=\"text\" name=\"message\" value=\"$rejected\" size=\"$U[boxwidth]\" style=\"$U[style]\" autofocus></td>"; echo "<td><input type=\"text\" name=\"message\" value=\"$rejected\" size=\"40\" style=\"$U[style]\" autofocus></td>";
} }
echo '<td>'.submit($I['talkto']).'</td><td><select name="sendto" size="1">'; echo '<td>'.submit($I['talkto']).'</td><td><select name="sendto" size="1">';
echo '<option '; echo '<option ';
@ -1845,7 +1836,7 @@ function send_profile($arg=''){
echo form('profile', 'save')."<h2>$I[profile]</h2><i>$arg</i><table>"; echo form('profile', 'save')."<h2>$I[profile]</h2><i>$arg</i><table>";
thr(); thr();
$ignored=[]; $ignored=[];
$stmt=$db->prepare('SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?;'); $stmt=$db->prepare('SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=? ORDER BY LOWER(ign);');
$stmt->execute([$U['nickname']]); $stmt->execute([$U['nickname']]);
while($tmp=$stmt->fetch(PDO::FETCH_ASSOC)){ while($tmp=$stmt->fetch(PDO::FETCH_ASSOC)){
$ignored[]=htmlspecialchars($tmp['ign']); $ignored[]=htmlspecialchars($tmp['ign']);
@ -1861,7 +1852,7 @@ function send_profile($arg=''){
} }
echo "<tr><td><table id=\"ignore\"><tr><th>$I[ignore]</th><td>"; echo "<tr><td><table id=\"ignore\"><tr><th>$I[ignore]</th><td>";
echo "<select name=\"ignore\" size=\"1\"><option value=\"\">$I[choose]</option>"; echo "<select name=\"ignore\" size=\"1\"><option value=\"\">$I[choose]</option>";
$stmt=$db->prepare('SELECT poster, style FROM ' . PREFIX . 'messages INNER JOIN ' . PREFIX . 'sessions ON (' . PREFIX . 'messages.poster=' . PREFIX . 'sessions.nickname) WHERE poster!=? AND poster NOT IN (SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?) GROUP BY poster;'); $stmt=$db->prepare('SELECT poster, style FROM ' . PREFIX . 'messages INNER JOIN (SELECT nickname, style FROM ' . PREFIX . 'sessions UNION SELECT nickname, style FROM ' . PREFIX . 'members) AS t ON (' . PREFIX . 'messages.poster=t.nickname) WHERE poster!=? AND poster NOT IN (SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?) GROUP BY poster ORDER BY LOWER(poster);');
$stmt->execute([$U['nickname'], $U['nickname']]); $stmt->execute([$U['nickname'], $U['nickname']]);
while($nick=$stmt->fetch(PDO::FETCH_NUM)){ while($nick=$stmt->fetch(PDO::FETCH_NUM)){
echo '<option value="'.htmlspecialchars($nick[0])."\" style=\"$nick[1]\">".htmlspecialchars($nick[0]).'</option>'; echo '<option value="'.htmlspecialchars($nick[0])."\" style=\"$nick[1]\">".htmlspecialchars($nick[0]).'</option>';
@ -1960,21 +1951,6 @@ function send_profile($arg=''){
} }
echo '</select></td></tr></table></td></tr>'; echo '</select></td></tr></table></td></tr>';
thr(); thr();
echo "<tr><td><table id=\"boxsize\"><tr><th>$I[pbsize]</th><td><table>";
echo "<tr><td>&nbsp;</td><td>$I[width]</td><td><input type=\"number\" name=\"boxwidth\" size=\"3\" maxlength=\"3\" value=\"$U[boxwidth]\"></td>";
echo "<td>&nbsp;</td><td>$I[height]</td><td><input type=\"number\" name=\"boxheight\" size=\"3\" maxlength=\"3\" value=\"$U[boxheight]\"></td>";
echo '</tr></table></td></tr></table></td></tr>';
thr();
if($U['status']>=5){
$stmt=$db->prepare('SELECT notesboxwidth, notesboxheight FROM ' . PREFIX . 'members WHERE nickname=?;');
$stmt->execute([$U['nickname']]);
$settings=$stmt->fetch(PDO::FETCH_ASSOC);
echo "<tr><td><table id=\"notesboxsize\"><tr><th>$I[nbsize]</th><td><table>";
echo "<tr><td>&nbsp;</td><td>$I[width]</td><td><input type=\"number\" name=\"notesboxwidth\" size=\"3\" maxlength=\"3\" value=\"$settings[notesboxwidth]\"></td>";
echo "<td>&nbsp;</td><td>$I[height]</td><td><input type=\"number\" name=\"notesboxheight\" size=\"3\" maxlength=\"3\" value=\"$settings[notesboxheight]\"></td>";
echo '</tr></table></td></tr></table></td></tr>';
thr();
}
if($U['status']>=2){ if($U['status']>=2){
echo "<tr><td><table id=\"changepass\"><tr><th>$I[changepass]</th></tr>"; echo "<tr><td><table id=\"changepass\"><tr><th>$I[changepass]</th></tr>";
echo '<tr><td><table>'; echo '<tr><td><table>';
@ -2039,9 +2015,9 @@ function send_download(){
$stmt->execute([$_REQUEST['id']]); $stmt->execute([$_REQUEST['id']]);
if($data=$stmt->fetch(PDO::FETCH_ASSOC)){ if($data=$stmt->fetch(PDO::FETCH_ASSOC)){
header("Content-Type: $data[type]"); header("Content-Type: $data[type]");
header("Content-disposition: filename=\"$data[filename]\""); header("Content-Disposition: filename=\"$data[filename]\"");
header('Pragma: no-cache'); header('Pragma: no-cache');
header('Cache-Control: no-cache, no-store, must-revalidate, max-age=0'); header('Cache-Control: no-cache, no-store, must-revalidate, max-age=0, private');
header('Expires: 0'); header('Expires: 0');
echo base64_decode($data['data']); echo base64_decode($data['data']);
}else{ }else{
@ -2055,7 +2031,7 @@ function send_download(){
function send_logout(){ function send_logout(){
global $I, $U; global $I, $U;
print_start('logout'); print_start('logout');
echo '<h1>'.sprintf($I['bye'], style_this(htmlspecialchars($U['nickname']), $U['style'])).'</h1>'.form_target('_parent', 'login').submit($I['backtologin'], 'class="backbutton"').'</form>'; echo '<h1>'.sprintf($I['bye'], style_this(htmlspecialchars($U['nickname']), $U['style'])).'</h1>'.form_target('_parent', '').submit($I['backtologin'], 'class="backbutton"').'</form>';
print_end(); print_end();
} }
@ -2066,7 +2042,7 @@ function send_colours(){
for($red=0x00;$red<=0xFF;$red+=0x33){ for($red=0x00;$red<=0xFF;$red+=0x33){
for($green=0x00;$green<=0xFF;$green+=0x33){ for($green=0x00;$green<=0xFF;$green+=0x33){
for($blue=0x00;$blue<=0xFF;$blue+=0x33){ for($blue=0x00;$blue<=0xFF;$blue+=0x33){
$hcol=sprintf('%02X', $red).sprintf('%02X', $green).sprintf('%02X', $blue); $hcol=sprintf('%02X%02X%02X', $red, $green, $blue);
echo "<span style=\"color:#$hcol\">$hcol</span> "; echo "<span style=\"color:#$hcol\">$hcol</span> ";
} }
echo '<br>'; echo '<br>';
@ -2141,7 +2117,7 @@ function send_chat_disabled(){
function send_error($err){ function send_error($err){
global $I; global $I;
print_start('error'); print_start('error');
echo "<h2>$I[error]: $err</h2>".form_target('_parent', 'login').submit($I['backtologin'], 'class="backbutton"').'</form>'; echo "<h2>$I[error]: $err</h2>".form_target('_parent', '').submit($I['backtologin'], 'class="backbutton"').'</form>';
print_end(); print_end();
} }
@ -2184,6 +2160,7 @@ function print_chatters(){
$stmt=$db->prepare('SELECT nickname, style, status FROM ' . PREFIX . 'sessions WHERE entry!=0 AND status>0 AND incognito=0 AND nickname NOT IN (SELECT ign FROM '. PREFIX . 'ignored WHERE ignby=? UNION SELECT ignby FROM '. PREFIX . 'ignored WHERE ign=?) ORDER BY status DESC, lastpost DESC;'); $stmt=$db->prepare('SELECT nickname, style, status FROM ' . PREFIX . 'sessions WHERE entry!=0 AND status>0 AND incognito=0 AND nickname NOT IN (SELECT ign FROM '. PREFIX . 'ignored WHERE ignby=? UNION SELECT ignby FROM '. PREFIX . 'ignored WHERE ign=?) ORDER BY status DESC, lastpost DESC;');
$stmt->execute([$U['nickname'], $U['nickname']]); $stmt->execute([$U['nickname'], $U['nickname']]);
$nc=substr(time(), -6); $nc=substr(time(), -6);
$G=$M=[];
while($user=$stmt->fetch(PDO::FETCH_NUM)){ while($user=$stmt->fetch(PDO::FETCH_NUM)){
$link="<a href=\"$_SERVER[SCRIPT_NAME]?action=post&amp;session=$U[session]&amp;lang=$language&amp;nc=$nc&amp;sendto=".htmlspecialchars($user[0]).'" target="post">'.style_this(htmlspecialchars($user[0]), $user[1]).'</a>'; $link="<a href=\"$_SERVER[SCRIPT_NAME]?action=post&amp;session=$U[session]&amp;lang=$language&amp;nc=$nc&amp;sendto=".htmlspecialchars($user[0]).'" target="post">'.style_this(htmlspecialchars($user[0]), $user[1]).'</a>';
if($user[2]<=2){ if($user[2]<=2){
@ -2208,43 +2185,16 @@ function print_chatters(){
// session management // session management
function create_session($setup, $nickname, $password){ function create_session($setup, $nickname, $password){
global $I, $U, $db, $memcached; global $I, $U;
$U['nickname']=str_replace(' ', '', $nickname); $U['nickname']=preg_replace('/\s/', '', $nickname);
if(!check_member($password)){ if(check_member($password)){
if($setup && $U['status']>=7){
$U['incognito']=1;
}
$U['entry']=$U['lastpost']=time();
}else{
add_user_defaults($password); add_user_defaults($password);
} check_captcha($_REQUEST['challenge'], $_REQUEST['captcha']);
$U['entry']=$U['lastpost']=time();
if($setup){
$U['incognito']=1;
}
$captcha=(int) get_setting('captcha');
if($captcha!==0 && ($U['status']==1 || get_setting('dismemcaptcha')==0)){
if(!isset($_REQUEST['challenge'])){
send_error($I['wrongcaptcha']);
}
if(!MEMCACHED){
$stmt=$db->prepare('SELECT code FROM ' . PREFIX . 'captcha WHERE id=?;');
$stmt->execute([$_REQUEST['challenge']]);
$stmt->bindColumn(1, $code);
if(!$stmt->fetch(PDO::FETCH_BOUND)){
send_error($I['captchaexpire']);
}
$time=time();
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'captcha WHERE id=? OR time<(?-(SELECT value FROM ' . PREFIX . "settings WHERE setting='captchatime'));");
$stmt->execute([$_REQUEST['challenge'], $time]);
}else{
if(!$code=$memcached->get(DBNAME . '-' . PREFIX . "captcha-$_REQUEST[challenge]")){
send_error($I['captchaexpire']);
}
$memcached->delete(DBNAME . '-' . PREFIX . "captcha-$_REQUEST[challenge]");
}
if($_REQUEST['captcha']!==$code){
if($captcha!==3 || strrev($_REQUEST['captcha'])!==$code){
send_error($I['wrongcaptcha']);
}
}
}
if($U['status']==1){
$ga=(int) get_setting('guestaccess'); $ga=(int) get_setting('guestaccess');
if(!valid_nick($U['nickname'])){ if(!valid_nick($U['nickname'])){
send_error(sprintf($I['invalnick'], get_setting('maxname'), get_setting('nickregex'))); send_error(sprintf($I['invalnick'], get_setting('maxname'), get_setting('nickregex')));
@ -2264,6 +2214,37 @@ function create_session($setup, $nickname, $password){
write_new_session($password); write_new_session($password);
} }
function check_captcha($challenge, $captcha_code){
global $I, $db, $memcached;
$captcha=(int) get_setting('captcha');
if($captcha!==0){
if(empty($challenge)){
send_error($I['wrongcaptcha']);
}
if(MEMCACHED){
if(!$code=$memcached->get(DBNAME . '-' . PREFIX . "captcha-$_REQUEST[challenge]")){
send_error($I['captchaexpire']);
}
$memcached->delete(DBNAME . '-' . PREFIX . "captcha-$_REQUEST[challenge]");
}else{
$stmt=$db->prepare('SELECT code FROM ' . PREFIX . 'captcha WHERE id=?;');
$stmt->execute([$challenge]);
$stmt->bindColumn(1, $code);
if(!$stmt->fetch(PDO::FETCH_BOUND)){
send_error($I['captchaexpire']);
}
$time=time();
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'captcha WHERE id=? OR time<(?-(SELECT value FROM ' . PREFIX . "settings WHERE setting='captchatime'));");
$stmt->execute([$challenge, $time]);
}
if($captcha_code!==$code){
if($captcha!==3 || strrev($captcha_code)!==$code){
send_error($I['wrongcaptcha']);
}
}
}
}
function write_new_session($password){ function write_new_session($password){
global $I, $U, $db; global $I, $U, $db;
$stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'sessions WHERE nickname=?;'); $stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'sessions WHERE nickname=?;');
@ -2279,7 +2260,7 @@ function write_new_session($password){
} }
}else{ }else{
// create new session // create new session
$stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'sessions WHERE session=?;'); $stmt=$db->prepare('SELECT null FROM ' . PREFIX . 'sessions WHERE session=?;');
do{ do{
if(function_exists('random_bytes')){ if(function_exists('random_bytes')){
$U['session']=bin2hex(random_bytes(16)); $U['session']=bin2hex(random_bytes(16));
@ -2298,8 +2279,8 @@ function write_new_session($password){
}else{ }else{
$ip=''; $ip='';
} }
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'sessions (session, nickname, status, refresh, style, lastpost, passhash, boxwidth, boxheight, useragent, bgcolour, entry, timestamps, embed, incognito, ip, nocache, tz, eninbox, sortupdown, hidechatters, nocache_old) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);'); $stmt=$db->prepare('INSERT INTO ' . PREFIX . 'sessions (session, nickname, status, refresh, style, lastpost, passhash, useragent, bgcolour, entry, timestamps, embed, incognito, ip, nocache, tz, eninbox, sortupdown, hidechatters, nocache_old) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);');
$stmt->execute([$U['session'], $U['nickname'], $U['status'], $U['refresh'], $U['style'], $U['lastpost'], $U['passhash'], $U['boxwidth'], $U['boxheight'], $useragent, $U['bgcolour'], $U['entry'], $U['timestamps'], $U['embed'], $U['incognito'], $ip, $U['nocache'], $U['tz'], $U['eninbox'], $U['sortupdown'], $U['hidechatters'], $U['nocache_old']]); $stmt->execute([$U['session'], $U['nickname'], $U['status'], $U['refresh'], $U['style'], $U['lastpost'], $U['passhash'], $useragent, $U['bgcolour'], $U['entry'], $U['timestamps'], $U['embed'], $U['incognito'], $ip, $U['nocache'], $U['tz'], $U['eninbox'], $U['sortupdown'], $U['hidechatters'], $U['nocache_old']]);
setcookie(COOKIENAME, $U['session']); setcookie(COOKIENAME, $U['session']);
if($U['status']>=3 && !$U['incognito']){ if($U['status']>=3 && !$U['incognito']){
add_system_message(sprintf(get_setting('msgenter'), style_this(htmlspecialchars($U['nickname']), $U['style']))); add_system_message(sprintf(get_setting('msgenter'), style_this(htmlspecialchars($U['nickname']), $U['style'])));
@ -2517,6 +2498,9 @@ function check_member($password){
$stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'members WHERE nickname=?;'); $stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'members WHERE nickname=?;');
$stmt->execute([$U['nickname']]); $stmt->execute([$U['nickname']]);
if($temp=$stmt->fetch(PDO::FETCH_ASSOC)){ if($temp=$stmt->fetch(PDO::FETCH_ASSOC)){
if(get_setting('dismemcaptcha')==0){
check_captcha($_REQUEST['challenge'], $_REQUEST['captcha']);
}
if($temp['passhash']===md5(sha1(md5($U['nickname'].$password)))){ if($temp['passhash']===md5(sha1(md5($U['nickname'].$password)))){
// old hashing method, update on the fly // old hashing method, update on the fly
$temp['passhash']=password_hash($password, PASSWORD_DEFAULT); $temp['passhash']=password_hash($password, PASSWORD_DEFAULT);
@ -2566,8 +2550,8 @@ function register_guest($status, $nick){
}else{ }else{
return sprintf($I['cantreg'], htmlspecialchars($nick)); return sprintf($I['cantreg'], htmlspecialchars($nick));
} }
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, boxwidth, boxheight, regedby, timestamps, embed, style, incognito, nocache, tz, eninbox, sortupdown, hidechatters, nocache_old) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);'); $stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, regedby, timestamps, embed, style, incognito, nocache, tz, eninbox, sortupdown, hidechatters, nocache_old) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);');
$stmt->execute([$reg['nickname'], $reg['passhash'], $reg['status'], $reg['refresh'], $reg['bgcolour'], $reg['boxwidth'], $reg['boxheight'], $U['nickname'], $reg['timestamps'], $reg['embed'], $reg['style'], $reg['incognito'], $reg['nocache'], $reg['tz'], $reg['eninbox'], $reg['sortupdown'], $reg['hidechatters'], $reg['nocache_old']]); $stmt->execute([$reg['nickname'], $reg['passhash'], $reg['status'], $reg['refresh'], $reg['bgcolour'], $U['nickname'], $reg['timestamps'], $reg['embed'], $reg['style'], $reg['incognito'], $reg['nocache'], $reg['tz'], $reg['eninbox'], $reg['sortupdown'], $reg['hidechatters'], $reg['nocache_old']]);
if($reg['status']==3){ if($reg['status']==3){
add_system_message(sprintf(get_setting('msgmemreg'), style_this(htmlspecialchars($reg['nickname']), $reg['style']))); add_system_message(sprintf(get_setting('msgmemreg'), style_this(htmlspecialchars($reg['nickname']), $reg['style'])));
}else{ }else{
@ -2578,11 +2562,11 @@ function register_guest($status, $nick){
function register_new($nick, $pass){ function register_new($nick, $pass){
global $I, $U, $db; global $I, $U, $db;
$nick=str_replace(' ', '', $nick); $nick=preg_replace('/\s/', '', $nick);
if(empty($nick)){ if(empty($nick)){
return ''; return '';
} }
$stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'sessions WHERE nickname=?'); $stmt=$db->prepare('SELECT null FROM ' . PREFIX . 'sessions WHERE nickname=?');
$stmt->execute([$nick]); $stmt->execute([$nick]);
if($stmt->fetch(PDO::FETCH_NUM)){ if($stmt->fetch(PDO::FETCH_NUM)){
return sprintf($I['cantreg'], htmlspecialchars($nick)); return sprintf($I['cantreg'], htmlspecialchars($nick));
@ -2593,7 +2577,7 @@ function register_new($nick, $pass){
if(!valid_pass($pass)){ if(!valid_pass($pass)){
return sprintf($I['invalpass'], get_setting('minpass'), get_setting('passregex')); return sprintf($I['invalpass'], get_setting('minpass'), get_setting('passregex'));
} }
$stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'members WHERE nickname=?'); $stmt=$db->prepare('SELECT null FROM ' . PREFIX . 'members WHERE nickname=?');
$stmt->execute([$nick]); $stmt->execute([$nick]);
if($stmt->fetch(PDO::FETCH_NUM)){ if($stmt->fetch(PDO::FETCH_NUM)){
return sprintf($I['alreadyreged'], htmlspecialchars($nick)); return sprintf($I['alreadyreged'], htmlspecialchars($nick));
@ -2656,7 +2640,7 @@ function passreset($nick, $pass){
if(empty($nick)){ if(empty($nick)){
return ''; return '';
} }
$stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'members WHERE nickname=? AND status<?;'); $stmt=$db->prepare('SELECT null FROM ' . PREFIX . 'members WHERE nickname=? AND status<?;');
$stmt->execute([$nick, $U['status']]); $stmt->execute([$nick, $U['status']]);
if($stmt->fetch(PDO::FETCH_ASSOC)){ if($stmt->fetch(PDO::FETCH_ASSOC)){
$passhash=password_hash($pass, PASSWORD_DEFAULT); $passhash=password_hash($pass, PASSWORD_DEFAULT);
@ -2705,22 +2689,6 @@ function amend_profile(){
$U['style'].='font-weight:bold;'; $U['style'].='font-weight:bold;';
} }
} }
if($_REQUEST['boxwidth']>0 && $_REQUEST['boxwidth']<1000){
$U['boxwidth']=$_REQUEST['boxwidth'];
}
if($_REQUEST['boxheight']>0 && $_REQUEST['boxheight']<1000){
$U['boxheight']=$_REQUEST['boxheight'];
}
if(isset($_REQUEST['notesboxwidth']) && $_REQUEST['notesboxwidth']>0 && $_REQUEST['notesboxwidth']<1000){
$U['notesboxwidth']=$_REQUEST['notesboxwidth'];
}else{
$U['notesboxwidth']=80;
}
if(isset($_REQUEST['notesboxheight']) && $_REQUEST['notesboxheight']>0 && $_REQUEST['notesboxheight']<1000){
$U['notesboxheight']=$_REQUEST['notesboxheight'];
}else{
$U['notesboxheight']=30;
}
if($U['status']>=5 && isset($_REQUEST['incognito']) && get_setting('incognito')){ if($U['status']>=5 && isset($_REQUEST['incognito']) && get_setting('incognito')){
$U['incognito']=1; $U['incognito']=1;
}else{ }else{
@ -2748,18 +2716,18 @@ function amend_profile(){
function save_profile(){ function save_profile(){
global $I, $U, $db; global $I, $U, $db;
amend_profile(); amend_profile();
$stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET refresh=?, style=?, boxwidth=?, boxheight=?, bgcolour=?, timestamps=?, embed=?, incognito=?, nocache=?, tz=?, eninbox=?, sortupdown=?, hidechatters=? WHERE session=?;'); $stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET refresh=?, style=?, bgcolour=?, timestamps=?, embed=?, incognito=?, nocache=?, tz=?, eninbox=?, sortupdown=?, hidechatters=? WHERE session=?;');
$stmt->execute([$U['refresh'], $U['style'], $U['boxwidth'], $U['boxheight'], $U['bgcolour'], $U['timestamps'], $U['embed'], $U['incognito'], $U['nocache'], $U['tz'], $U['eninbox'], $U['sortupdown'], $U['hidechatters'], $U['session']]); $stmt->execute([$U['refresh'], $U['style'], $U['bgcolour'], $U['timestamps'], $U['embed'], $U['incognito'], $U['nocache'], $U['tz'], $U['eninbox'], $U['sortupdown'], $U['hidechatters'], $U['session']]);
if($U['status']>=2){ if($U['status']>=2){
$stmt=$db->prepare('UPDATE ' . PREFIX . 'members SET refresh=?, bgcolour=?, boxwidth=?, boxheight=?, notesboxwidth=?, notesboxheight=?, timestamps=?, embed=?, incognito=?, style=?, nocache=?, tz=?, eninbox=?, sortupdown=?, hidechatters=? WHERE nickname=?;'); $stmt=$db->prepare('UPDATE ' . PREFIX . 'members SET refresh=?, bgcolour=?, timestamps=?, embed=?, incognito=?, style=?, nocache=?, tz=?, eninbox=?, sortupdown=?, hidechatters=? WHERE nickname=?;');
$stmt->execute([$U['refresh'], $U['bgcolour'], $U['boxwidth'], $U['boxheight'], $U['notesboxwidth'], $U['notesboxheight'], $U['timestamps'], $U['embed'], $U['incognito'], $U['style'], $U['nocache'], $U['tz'], $U['eninbox'], $U['sortupdown'], $U['hidechatters'], $U['nickname']]); $stmt->execute([$U['refresh'], $U['bgcolour'], $U['timestamps'], $U['embed'], $U['incognito'], $U['style'], $U['nocache'], $U['tz'], $U['eninbox'], $U['sortupdown'], $U['hidechatters'], $U['nickname']]);
} }
if(!empty($_REQUEST['unignore'])){ if(!empty($_REQUEST['unignore'])){
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'ignored WHERE ign=? AND ignby=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'ignored WHERE ign=? AND ignby=?;');
$stmt->execute([$_REQUEST['unignore'], $U['nickname']]); $stmt->execute([$_REQUEST['unignore'], $U['nickname']]);
} }
if(!empty($_REQUEST['ignore'])){ if(!empty($_REQUEST['ignore'])){
$stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'sessions WHERE nickname=? AND nickname NOT IN (SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?);'); $stmt=$db->prepare('SELECT null FROM ' . PREFIX . 'messages WHERE poster=? AND poster NOT IN (SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?);');
$stmt->execute([$_REQUEST['ignore'], $U['nickname']]); $stmt->execute([$_REQUEST['ignore'], $U['nickname']]);
if($U['nickname']!==$_REQUEST['ignore'] && $stmt->fetch(PDO::FETCH_NUM)){ if($U['nickname']!==$_REQUEST['ignore'] && $stmt->fetch(PDO::FETCH_NUM)){
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'ignored (ign, ignby) VALUES (?, ?);'); $stmt=$db->prepare('INSERT INTO ' . PREFIX . 'ignored (ign, ignby) VALUES (?, ?);');
@ -2801,7 +2769,7 @@ function save_profile(){
function set_new_nickname(){ function set_new_nickname(){
global $I, $U, $db; global $I, $U, $db;
$_REQUEST['newnickname']=str_replace(' ', '', $_REQUEST['newnickname']); $_REQUEST['newnickname']=preg_replace('/\s/', '', $_REQUEST['newnickname']);
if(!valid_nick($_REQUEST['newnickname'])){ if(!valid_nick($_REQUEST['newnickname'])){
return sprintf($I['invalnick'], get_setting('maxname'), get_setting('nickregex')); return sprintf($I['invalnick'], get_setting('maxname'), get_setting('nickregex'));
} }
@ -2838,14 +2806,12 @@ function add_user_defaults($password){
$U['bgcolour']=get_setting('colbg'); $U['bgcolour']=get_setting('colbg');
if(!isset($_REQUEST['colour']) || !preg_match('/^[a-f0-9]{6}$/i', $_REQUEST['colour']) || abs(greyval($_REQUEST['colour'])-greyval(get_setting('colbg')))<75){ if(!isset($_REQUEST['colour']) || !preg_match('/^[a-f0-9]{6}$/i', $_REQUEST['colour']) || abs(greyval($_REQUEST['colour'])-greyval(get_setting('colbg')))<75){
do{ do{
$colour=sprintf('%02X', mt_rand(0, 256)).sprintf('%02X', mt_rand(0, 256)).sprintf('%02X', mt_rand(0, 256)); $colour=sprintf('%06X', mt_rand(0, 16581375));
}while(abs(greyval($colour)-greyval(get_setting('colbg')))<75); }while(abs(greyval($colour)-greyval(get_setting('colbg')))<75);
}else{ }else{
$colour=$_REQUEST['colour']; $colour=$_REQUEST['colour'];
} }
$U['style']="color:#$colour;"; $U['style']="color:#$colour;";
$U['boxwidth']=40;
$U['boxheight']=3;
$U['timestamps']=get_setting('timestamps'); $U['timestamps']=get_setting('timestamps');
$U['embed']=1; $U['embed']=1;
$U['incognito']=0; $U['incognito']=0;
@ -2861,6 +2827,7 @@ function add_user_defaults($password){
$U['sortupdown']=get_setting('sortupdown'); $U['sortupdown']=get_setting('sortupdown');
$U['hidechatters']=get_setting('hidechatters'); $U['hidechatters']=get_setting('hidechatters');
$U['passhash']=password_hash($password, PASSWORD_DEFAULT); $U['passhash']=password_hash($password, PASSWORD_DEFAULT);
$U['entry']=$U['lastpost']=time();
} }
// message handling // message handling
@ -2925,8 +2892,8 @@ function validate_input(){
} }
} }
if($poststatus!==9 && preg_match('~^/me~iu', $message)){ if($poststatus!==9 && preg_match('~^/me~iu', $message)){
$displaysend=style_this(htmlspecialchars($U['nickname']), $U['style']); $displaysend=style_this(htmlspecialchars("$U[nickname] "), $U['style']);
$message=preg_replace("~^/me~iu", '', $message); $message=preg_replace("~^/me\s?~iu", '', $message);
} }
$message=apply_filter($message, $poststatus, $U['nickname']); $message=apply_filter($message, $poststatus, $U['nickname']);
$message=create_hotlinks($message); $message=create_hotlinks($message);
@ -3102,7 +3069,7 @@ function apply_mention($message){
function add_message($message, $recipient, $poster, $delstatus, $poststatus, $displaysend, $style){ function add_message($message, $recipient, $poster, $delstatus, $poststatus, $displaysend, $style){
global $db; global $db;
if(empty($message)){ if($message===''){
return false; return false;
} }
$newmessage=[ $newmessage=[
@ -3124,7 +3091,7 @@ function add_message($message, $recipient, $poster, $delstatus, $poststatus, $di
} }
function add_system_message($mes){ function add_system_message($mes){
if(empty($mes)){ if($mes===''){
return; return;
} }
$sysmessage=[ $sysmessage=[
@ -3325,7 +3292,7 @@ function save_setup($C){
if($_REQUEST['memberexpire']<5){ if($_REQUEST['memberexpire']<5){
$_REQUEST['memberexpire']=5; $_REQUEST['memberexpire']=5;
} }
if($_REQUEST['captchatime']<30){ if($_REQUEST['captchatime']<30){
$_REQUEST['memberexpire']=30; $_REQUEST['memberexpire']=30;
} }
if($_REQUEST['defaultrefresh']<5){ if($_REQUEST['defaultrefresh']<5){
@ -3449,7 +3416,7 @@ function style_this($text, $styleinfo){
function check_init(){ function check_init(){
global $db; global $db;
return @$db->query('SELECT * FROM ' . PREFIX . 'settings LIMIT 1;'); return @$db->query('SELECT null FROM ' . PREFIX . 'settings LIMIT 1;');
} }
// run every minute doing various database cleanup task // run every minute doing various database cleanup task
@ -3459,6 +3426,7 @@ function cron(){
if(get_setting('nextcron')>$time){ if(get_setting('nextcron')>$time){
return; return;
} }
update_setting('nextcron', $time+10);
// delete old sessions // delete old sessions
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE (status<=2 AND lastpost<(?-60*(SELECT value FROM ' . PREFIX . "settings WHERE setting='guestexpire'))) OR (status>2 AND lastpost<(?-60*(SELECT value FROM " . PREFIX . "settings WHERE setting='memberexpire')));"); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE (status<=2 AND lastpost<(?-60*(SELECT value FROM ' . PREFIX . "settings WHERE setting='guestexpire'))) OR (status>2 AND lastpost<(?-60*(SELECT value FROM " . PREFIX . "settings WHERE setting='memberexpire')));");
$stmt->execute([$time, $time]); $stmt->execute([$time, $time]);
@ -3472,9 +3440,17 @@ function cron(){
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'messages WHERE id IN (SELECT * FROM (SELECT id FROM ' . PREFIX . 'messages WHERE postdate<(?-60*(SELECT value FROM ' . PREFIX . "settings WHERE setting='messageexpire'))) AS t);"); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'messages WHERE id IN (SELECT * FROM (SELECT id FROM ' . PREFIX . 'messages WHERE postdate<(?-60*(SELECT value FROM ' . PREFIX . "settings WHERE setting='messageexpire'))) AS t);");
$stmt->execute([$time]); $stmt->execute([$time]);
// delete expired ignored people // delete expired ignored people
$db->exec('DELETE FROM ' . PREFIX . 'ignored WHERE ign NOT IN (SELECT nickname FROM ' . PREFIX . 'sessions UNION SELECT nickname FROM ' . PREFIX . 'members UNION SELECT poster FROM ' . PREFIX . 'messages) OR ignby NOT IN (SELECT nickname FROM ' . PREFIX . 'sessions UNION SELECT nickname FROM ' . PREFIX . 'members UNION SELECT poster FROM ' . PREFIX . 'messages);'); $result=$db->query('SELECT id FROM ' . PREFIX . 'ignored WHERE ign NOT IN (SELECT nickname FROM ' . PREFIX . 'sessions UNION SELECT nickname FROM ' . PREFIX . 'members UNION SELECT poster FROM ' . PREFIX . 'messages) OR ignby NOT IN (SELECT nickname FROM ' . PREFIX . 'sessions UNION SELECT nickname FROM ' . PREFIX . 'members UNION SELECT poster FROM ' . PREFIX . 'messages);');
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'ignored WHERE id=?;');
while($tmp=$result->fetch(PDO::FETCH_NUM)){
$stmt->execute($tmp);
}
// delete files that do not belong to any message // delete files that do not belong to any message
$db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages UNION SELECT postid FROM ' . PREFIX . 'inbox);'); $result=$db->query('SELECT id FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages UNION SELECT postid FROM ' . PREFIX . 'inbox);');
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'files WHERE id=?;');
while($tmp=$result->fetch(PDO::FETCH_NUM)){
$stmt->execute($tmp);
}
// delete old notes // delete old notes
$limit=get_setting('numnotes'); $limit=get_setting('numnotes');
$db->exec('DELETE FROM ' . PREFIX . 'notes WHERE type!=2 AND id NOT IN (SELECT * FROM ( (SELECT id FROM ' . PREFIX . "notes WHERE type=0 ORDER BY id DESC LIMIT $limit) UNION (SELECT id FROM " . PREFIX . "notes WHERE type=1 ORDER BY id DESC LIMIT $limit) ) AS t);"); $db->exec('DELETE FROM ' . PREFIX . 'notes WHERE type!=2 AND id NOT IN (SELECT * FROM ( (SELECT id FROM ' . PREFIX . "notes WHERE type=0 ORDER BY id DESC LIMIT $limit) UNION (SELECT id FROM " . PREFIX . "notes WHERE type=1 ORDER BY id DESC LIMIT $limit) ) AS t);");
@ -3483,7 +3459,9 @@ function cron(){
while($tmp=$result->fetch(PDO::FETCH_NUM)){ while($tmp=$result->fetch(PDO::FETCH_NUM)){
$stmt->execute([$tmp[0], $tmp[0]]); $stmt->execute([$tmp[0], $tmp[0]]);
} }
update_setting('nextcron', $time+10); // delete old captchas
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'captcha WHERE time<(?-(SELECT value FROM ' . PREFIX . "settings WHERE setting='captchatime'));");
$stmt->execute([$time]);
} }
function destroy_chat($C){ function destroy_chat($C){
@ -3522,8 +3500,8 @@ function init_chat(){
$suwrite=''; $suwrite='';
if(check_init()){ if(check_init()){
$suwrite=$I['initdbexist']; $suwrite=$I['initdbexist'];
$result=$db->query('SELECT * FROM ' . PREFIX . 'members WHERE status=8;'); $result=$db->query('SELECT null FROM ' . PREFIX . 'members WHERE status=8;');
if($result->fetch(PDO::FETCH_ASSOC)){ if($result->fetch(PDO::FETCH_NUM)){
$suwrite=$I['initsuexist']; $suwrite=$I['initsuexist'];
} }
}elseif(!preg_match('/^[a-z0-9]{1,20}$/i', $_REQUEST['sunick'])){ }elseif(!preg_match('/^[a-z0-9]{1,20}$/i', $_REQUEST['sunick'])){
@ -3565,7 +3543,7 @@ function init_chat(){
$db->exec('CREATE INDEX ' . PREFIX . 'inbox_poster ON ' . PREFIX . 'inbox(poster);'); $db->exec('CREATE INDEX ' . PREFIX . 'inbox_poster ON ' . PREFIX . 'inbox(poster);');
$db->exec('CREATE INDEX ' . PREFIX . 'inbox_recipient ON ' . PREFIX . 'inbox(recipient);'); $db->exec('CREATE INDEX ' . PREFIX . 'inbox_recipient ON ' . PREFIX . 'inbox(recipient);');
$db->exec('CREATE TABLE ' . PREFIX . "linkfilter (id $primary, filtermatch varchar(255) NOT NULL, filterreplace varchar(255) NOT NULL, regex smallint NOT NULL)$diskengine$charset;"); $db->exec('CREATE TABLE ' . PREFIX . "linkfilter (id $primary, filtermatch varchar(255) NOT NULL, filterreplace varchar(255) NOT NULL, regex smallint NOT NULL)$diskengine$charset;");
$db->exec('CREATE TABLE ' . PREFIX . "members (id $primary, nickname varchar(50) NOT NULL UNIQUE, passhash varchar(255) NOT NULL, status smallint NOT NULL, refresh smallint NOT NULL, bgcolour char(6) NOT NULL, boxwidth smallint NOT NULL DEFAULT 40, boxheight smallint NOT NULL DEFAULT 3, notesboxheight smallint NOT NULL DEFAULT 30, notesboxwidth smallint NOT NULL DEFAULT 80, regedby varchar(50) DEFAULT '', lastlogin integer DEFAULT 0, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, style varchar(255) NOT NULL, nocache smallint NOT NULL, tz varchar(255) NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL, nocache_old smallint NOT NULL)$diskengine$charset;"); $db->exec('CREATE TABLE ' . PREFIX . "members (id $primary, nickname varchar(50) NOT NULL UNIQUE, passhash varchar(255) NOT NULL, status smallint NOT NULL, refresh smallint NOT NULL, bgcolour char(6) NOT NULL, regedby varchar(50) DEFAULT '', lastlogin integer DEFAULT 0, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, style varchar(255) NOT NULL, nocache smallint NOT NULL, tz varchar(255) NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL, nocache_old smallint NOT NULL)$diskengine$charset;");
$db->exec('ALTER TABLE ' . PREFIX . 'inbox ADD FOREIGN KEY (recipient) REFERENCES ' . PREFIX . 'members(nickname) ON DELETE CASCADE ON UPDATE CASCADE;'); $db->exec('ALTER TABLE ' . PREFIX . 'inbox ADD FOREIGN KEY (recipient) REFERENCES ' . PREFIX . 'members(nickname) ON DELETE CASCADE ON UPDATE CASCADE;');
$db->exec('CREATE TABLE ' . PREFIX . "messages (id $primary, postdate integer NOT NULL, poststatus smallint NOT NULL, poster varchar(50) NOT NULL, recipient varchar(50) NOT NULL, text text NOT NULL, delstatus smallint NOT NULL)$diskengine$charset;"); $db->exec('CREATE TABLE ' . PREFIX . "messages (id $primary, postdate integer NOT NULL, poststatus smallint NOT NULL, poster varchar(50) NOT NULL, recipient varchar(50) NOT NULL, text text NOT NULL, delstatus smallint NOT NULL)$diskengine$charset;");
$db->exec('CREATE INDEX ' . PREFIX . 'poster ON ' . PREFIX . 'messages (poster);'); $db->exec('CREATE INDEX ' . PREFIX . 'poster ON ' . PREFIX . 'messages (poster);');
@ -3575,7 +3553,7 @@ function init_chat(){
$db->exec('CREATE TABLE ' . PREFIX . "notes (id $primary, type smallint NOT NULL, lastedited integer NOT NULL, editedby varchar(50) NOT NULL, text text NOT NULL)$diskengine$charset;"); $db->exec('CREATE TABLE ' . PREFIX . "notes (id $primary, type smallint NOT NULL, lastedited integer NOT NULL, editedby varchar(50) NOT NULL, text text NOT NULL)$diskengine$charset;");
$db->exec('CREATE INDEX ' . PREFIX . 'notes_type ON ' . PREFIX . 'notes(type);'); $db->exec('CREATE INDEX ' . PREFIX . 'notes_type ON ' . PREFIX . 'notes(type);');
$db->exec('CREATE INDEX ' . PREFIX . 'notes_editedby ON ' . PREFIX . 'notes(editedby);'); $db->exec('CREATE INDEX ' . PREFIX . 'notes_editedby ON ' . PREFIX . 'notes(editedby);');
$db->exec('CREATE TABLE ' . PREFIX . "sessions (id $primary, session char(32) NOT NULL UNIQUE, nickname varchar(50) NOT NULL UNIQUE, status smallint NOT NULL, refresh smallint NOT NULL, style varchar(255) NOT NULL, lastpost integer NOT NULL, passhash varchar(255) NOT NULL, postid char(6) NOT NULL DEFAULT '000000', boxwidth smallint NOT NULL DEFAULT 40, boxheight smallint NOT NULL DEFAULT 3, useragent varchar(255) NOT NULL, kickmessage varchar(255) DEFAULT '', bgcolour char(6) NOT NULL, notesboxheight smallint NOT NULL DEFAULT 30, notesboxwidth smallint NOT NULL DEFAULT 80, entry integer NOT NULL, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, ip varchar(45) NOT NULL, nocache smallint NOT NULL, tz varchar(255) NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL, nocache_old smallint NOT NULL)$memengine$charset;"); $db->exec('CREATE TABLE ' . PREFIX . "sessions (id $primary, session char(32) NOT NULL UNIQUE, nickname varchar(50) NOT NULL UNIQUE, status smallint NOT NULL, refresh smallint NOT NULL, style varchar(255) NOT NULL, lastpost integer NOT NULL, passhash varchar(255) NOT NULL, postid char(6) NOT NULL DEFAULT '000000', useragent varchar(255) NOT NULL, kickmessage varchar(255) DEFAULT '', bgcolour char(6) NOT NULL, entry integer NOT NULL, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, ip varchar(45) NOT NULL, nocache smallint NOT NULL, tz varchar(255) NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL, nocache_old smallint NOT NULL)$memengine$charset;");
$db->exec('CREATE INDEX ' . PREFIX . 'status ON ' . PREFIX . 'sessions(status);'); $db->exec('CREATE INDEX ' . PREFIX . 'status ON ' . PREFIX . 'sessions(status);');
$db->exec('CREATE INDEX ' . PREFIX . 'lastpost ON ' . PREFIX . 'sessions(lastpost);'); $db->exec('CREATE INDEX ' . PREFIX . 'lastpost ON ' . PREFIX . 'sessions(lastpost);');
$db->exec('CREATE INDEX ' . PREFIX . 'incognito ON ' . PREFIX . 'sessions(incognito);'); $db->exec('CREATE INDEX ' . PREFIX . 'incognito ON ' . PREFIX . 'sessions(incognito);');
@ -3667,7 +3645,7 @@ function init_chat(){
'incognito' =>0, 'incognito' =>0,
'nocache' =>0, 'nocache' =>0,
'nocache_old' =>1, 'nocache_old' =>1,
'tz' =>0, 'tz' =>'UTC',
'eninbox' =>0, 'eninbox' =>0,
'sortupdown' =>0, 'sortupdown' =>0,
'hidechatters' =>0, 'hidechatters' =>0,
@ -3753,7 +3731,6 @@ function update_db(){
$db->exec('ALTER TABLE ' , PREFIX . 'captcha CHARACTER SET utf8 COLLATE utf8_bin;'); $db->exec('ALTER TABLE ' , PREFIX . 'captcha CHARACTER SET utf8 COLLATE utf8_bin;');
$db->exec('ALTER TABLE ' . PREFIX . 'filter CHARACTER SET utf8 COLLATE utf8_bin;'); $db->exec('ALTER TABLE ' . PREFIX . 'filter CHARACTER SET utf8 COLLATE utf8_bin;');
$db->exec('ALTER TABLE ' . PREFIX . 'ignored CHARACTER SET utf8 COLLATE utf8_bin;'); $db->exec('ALTER TABLE ' . PREFIX . 'ignored CHARACTER SET utf8 COLLATE utf8_bin;');
$db->exec('ALTER TABLE ' . PREFIX . 'members CHARACTER SET utf8 COLLATE utf8_bin;');
$db->exec('ALTER TABLE ' . PREFIX . 'messages CHARACTER SET utf8 COLLATE utf8_bin;'); $db->exec('ALTER TABLE ' . PREFIX . 'messages CHARACTER SET utf8 COLLATE utf8_bin;');
$db->exec('ALTER TABLE ' . PREFIX . 'notes CHARACTER SET utf8 COLLATE utf8_bin;'); $db->exec('ALTER TABLE ' . PREFIX . 'notes CHARACTER SET utf8 COLLATE utf8_bin;');
$db->exec('ALTER TABLE ' . PREFIX . 'settings CHARACTER SET utf8 COLLATE utf8_bin;'); $db->exec('ALTER TABLE ' . PREFIX . 'settings CHARACTER SET utf8 COLLATE utf8_bin;');
@ -3775,7 +3752,6 @@ function update_db(){
} }
$stmt->execute([$style, $temp['id']]); $stmt->execute([$style, $temp['id']]);
} }
$db->exec('ALTER TABLE ' . PREFIX . 'members DROP colour, DROP fontface, DROP fonttags;');
$db->exec('INSERT INTO ' . PREFIX . "settings (setting, value) VALUES ('colbg', '000000'), ('coltxt', 'FFFFFF'), ('maxname', '20'), ('minpass', '5'), ('defaultrefresh', '20'), ('dismemcaptcha', '0'), ('suguests', '0'), ('imgembed', '1'), ('timestamps', '1'), ('trackip', '0'), ('captchachars', '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), ('memkick', '1'), ('forceredirect', '0'), ('redirect', ''), ('incognito', '1');"); $db->exec('INSERT INTO ' . PREFIX . "settings (setting, value) VALUES ('colbg', '000000'), ('coltxt', 'FFFFFF'), ('maxname', '20'), ('minpass', '5'), ('defaultrefresh', '20'), ('dismemcaptcha', '0'), ('suguests', '0'), ('imgembed', '1'), ('timestamps', '1'), ('trackip', '0'), ('captchachars', '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), ('memkick', '1'), ('forceredirect', '0'), ('redirect', ''), ('incognito', '1');");
} }
if($dbversion<12){ if($dbversion<12){
@ -3784,7 +3760,6 @@ function update_db(){
$db->exec('ALTER TABLE ' . PREFIX . 'filter MODIFY id integer unsigned NOT NULL AUTO_INCREMENT, MODIFY `match` varchar(255) NOT NULL, MODIFY replace varchar(20000) NOT NULL;'); $db->exec('ALTER TABLE ' . PREFIX . 'filter MODIFY id integer unsigned NOT NULL AUTO_INCREMENT, MODIFY `match` varchar(255) NOT NULL, MODIFY replace varchar(20000) NOT NULL;');
$db->exec('ALTER TABLE ' . PREFIX . 'ignored MODIFY ignored varchar(50) NOT NULL, MODIFY `by` varchar(50) NOT NULL, ADD INDEX(ignored), ADD INDEX(`by`);'); $db->exec('ALTER TABLE ' . PREFIX . 'ignored MODIFY ignored varchar(50) NOT NULL, MODIFY `by` varchar(50) NOT NULL, ADD INDEX(ignored), ADD INDEX(`by`);');
$db->exec('ALTER TABLE ' . PREFIX . 'linkfilter MODIFY match varchar(255) NOT NULL, MODIFY replace varchar(255) NOT NULL;'); $db->exec('ALTER TABLE ' . PREFIX . 'linkfilter MODIFY match varchar(255) NOT NULL, MODIFY replace varchar(255) NOT NULL;');
$db->exec('ALTER TABLE ' . PREFIX . "members MODIFY id integer unsigned NOT NULL AUTO_INCREMENT, MODIFY nickname varchar(50) NOT NULL UNIQUE, MODIFY passhash char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, MODIFY bgcolour char(6) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, MODIFY boxwidth smallint NOT NULL DEFAULT 40, MODIFY boxheight smallint NOT NULL DEFAULT 3, MODIFY notesboxheight smallint NOT NULL DEFAULT 30, MODIFY notesboxwidth smallint NOT NULL DEFAULT 80, MODIFY regedby varchar(50) NOT NULL, MODIFY embed smallint NOT NULL DEFAULT 1, MODIFY incognito smallint NOT NULL DEFAULT 0, MODIFY style varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;");
$db->exec('ALTER TABLE ' . PREFIX . 'messages MODIFY poster varchar(50) NOT NULL, MODIFY recipient varchar(50) NOT NULL, MODIFY text varchar(20000) NOT NULL, ADD INDEX(poster), ADD INDEX(recipient), ADD INDEX(postdate), ADD INDEX(poststatus);'); $db->exec('ALTER TABLE ' . PREFIX . 'messages MODIFY poster varchar(50) NOT NULL, MODIFY recipient varchar(50) NOT NULL, MODIFY text varchar(20000) NOT NULL, ADD INDEX(poster), ADD INDEX(recipient), ADD INDEX(postdate), ADD INDEX(poststatus);');
$db->exec('ALTER TABLE ' . PREFIX . 'notes MODIFY type char(5) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, MODIFY editedby varchar(50) NOT NULL, MODIFY text varchar(20000) NOT NULL;'); $db->exec('ALTER TABLE ' . PREFIX . 'notes MODIFY type char(5) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, MODIFY editedby varchar(50) NOT NULL, MODIFY text varchar(20000) NOT NULL;');
$db->exec('ALTER TABLE ' . PREFIX . 'settings MODIFY id integer unsigned NOT NULL, MODIFY setting varchar(50) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, MODIFY value varchar(20000) NOT NULL;'); $db->exec('ALTER TABLE ' . PREFIX . 'settings MODIFY id integer unsigned NOT NULL, MODIFY setting varchar(50) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, MODIFY value varchar(20000) NOT NULL;');
@ -3907,11 +3882,11 @@ function update_db(){
foreach($data as $tmp){ foreach($data as $tmp){
$stmt->execute($tmp); $stmt->execute($tmp);
} }
$result=$olddb->query('SELECT nickname, passhash, status, refresh, bgcolour, boxwidth, boxheight, notesboxwidth, notesboxheight, regedby, lastlogin, timestamps, embed, incognito, style, nocache, tz, eninbox, sortupdown, hidechatters FROM ' . PREFIX . 'members;'); $result=$olddb->query('SELECT nickname, passhash, status, refresh, bgcolour, regedby, lastlogin, timestamps, embed, incognito, style, nocache, tz, eninbox, sortupdown, hidechatters FROM ' . PREFIX . 'members;');
$data=$result->fetchAll(PDO::FETCH_NUM); $data=$result->fetchAll(PDO::FETCH_NUM);
$db->exec('DROP TABLE ' . PREFIX . 'members;'); $db->exec('DROP TABLE ' . PREFIX . 'members;');
$db->exec('CREATE TABLE ' . PREFIX . "members (id integer PRIMARY KEY AUTO_INCREMENT, nickname varchar(50) NOT NULL UNIQUE, passhash char(32) NOT NULL, status smallint NOT NULL, refresh smallint NOT NULL, bgcolour char(6) NOT NULL, boxwidth smallint NOT NULL DEFAULT 40, boxheight smallint NOT NULL DEFAULT 3, notesboxheight smallint NOT NULL DEFAULT 30, notesboxwidth smallint NOT NULL DEFAULT 80, regedby varchar(50) DEFAULT '', lastlogin integer DEFAULT 0, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, style varchar(255) NOT NULL, nocache smallint NOT NULL, tz smallint NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;"); $db->exec('CREATE TABLE ' . PREFIX . "members (id integer PRIMARY KEY AUTO_INCREMENT, nickname varchar(50) NOT NULL UNIQUE, passhash char(32) NOT NULL, status smallint NOT NULL, refresh smallint NOT NULL, bgcolour char(6) NOT NULL, regedby varchar(50) DEFAULT '', lastlogin integer DEFAULT 0, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, style varchar(255) NOT NULL, nocache smallint NOT NULL, tz smallint NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;");
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, boxwidth, boxheight, notesboxwidth, notesboxheight, regedby, lastlogin, timestamps, embed, incognito, style, nocache, tz, eninbox, sortupdown, hidechatters) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);'); $stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, regedby, lastlogin, timestamps, embed, incognito, style, nocache, tz, eninbox, sortupdown, hidechatters) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);');
foreach($data as $tmp){ foreach($data as $tmp){
$stmt->execute($tmp); $stmt->execute($tmp);
} }
@ -3951,25 +3926,11 @@ function update_db(){
} }
if($dbversion<34){ if($dbversion<34){
$msg.="<br>$I[cssupdate]"; $msg.="<br>$I[cssupdate]";
$db->exec('DROP TABLE ' . PREFIX . 'sessions;');
$db->exec('CREATE TABLE ' . PREFIX . "sessions (id integer PRIMARY KEY AUTO_INCREMENT, session char(32) NOT NULL UNIQUE, nickname varchar(50) NOT NULL UNIQUE, status smallint NOT NULL, refresh smallint NOT NULL, style varchar(255) NOT NULL, lastpost integer NOT NULL, passhash char(32) NOT NULL, postid char(6) NOT NULL DEFAULT '000000', boxwidth smallint NOT NULL DEFAULT 40, boxheight smallint NOT NULL DEFAULT 3, useragent varchar(255) NOT NULL, kickmessage varchar(255) DEFAULT '', bgcolour char(6) NOT NULL, entry integer NOT NULL, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, ip varchar(45) NOT NULL, nocache smallint NOT NULL, nocache_old smallint NOT NULL, tz smallint NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL)$memengine$charset;");
$db->exec('CREATE INDEX ' . PREFIX . 'status ON ' . PREFIX . 'sessions(status);');
$db->exec('CREATE INDEX ' . PREFIX . 'lastpost ON ' . PREFIX . 'sessions(lastpost);');
$db->exec('CREATE INDEX ' . PREFIX . 'incognito ON ' . PREFIX . 'sessions(incognito);');
$db->exec('ALTER TABLE ' . PREFIX . 'members ADD COLUMN nocache_old smallint NOT NULL DEFAULT 0;'); $db->exec('ALTER TABLE ' . PREFIX . 'members ADD COLUMN nocache_old smallint NOT NULL DEFAULT 0;');
} }
if($dbversion<35){
$db->exec('ALTER TABLE ' . PREFIX . 'inbox ADD FOREIGN KEY (recipient) REFERENCES ' . PREFIX . 'members(nickname) ON DELETE CASCADE ON UPDATE CASCADE;');
}
if($dbversion<36){
$db->exec('ALTER TABLE ' . PREFIX . 'members MODIFY passhash varchar(255) NOT NULL;');
$db->exec('ALTER TABLE ' . PREFIX . 'sessions MODIFY passhash varchar(255) NOT NULL;');
}
if($dbversion<37){ if($dbversion<37){
$db->exec('ALTER TABLE ' . PREFIX . 'members MODIFY tz varchar(255) NOT NULL;'); $db->exec('ALTER TABLE ' . PREFIX . 'members MODIFY tz varchar(255) NOT NULL;');
$db->exec('ALTER TABLE ' . PREFIX . 'sessions MODIFY tz varchar(255) NOT NULL;');
$db->exec('UPDATE ' . PREFIX . "members SET tz='UTC';"); $db->exec('UPDATE ' . PREFIX . "members SET tz='UTC';");
$db->exec('UPDATE ' . PREFIX . "sessions SET tz='UTC';");
$db->exec('UPDATE ' . PREFIX . "settings SET value='UTC' WHERE setting='defaulttz';"); $db->exec('UPDATE ' . PREFIX . "settings SET value='UTC' WHERE setting='defaulttz';");
} }
if($dbversion<38){ if($dbversion<38){
@ -3998,6 +3959,32 @@ function update_db(){
if($dbversion<40){ if($dbversion<40){
$db->exec('INSERT INTO ' . PREFIX . "settings (setting, value) VALUES ('filtermodkick', '1');"); $db->exec('INSERT INTO ' . PREFIX . "settings (setting, value) VALUES ('filtermodkick', '1');");
} }
if($dbversion<41){
$db->exec('DROP TABLE ' . PREFIX . 'sessions;');
$db->exec('CREATE TABLE ' . PREFIX . "sessions (id $primary, session char(32) NOT NULL UNIQUE, nickname varchar(50) NOT NULL UNIQUE, status smallint NOT NULL, refresh smallint NOT NULL, style varchar(255) NOT NULL, lastpost integer NOT NULL, passhash varchar(255) NOT NULL, postid char(6) NOT NULL DEFAULT '000000', useragent varchar(255) NOT NULL, kickmessage varchar(255) DEFAULT '', bgcolour char(6) NOT NULL, entry integer NOT NULL, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, ip varchar(45) NOT NULL, nocache smallint NOT NULL, tz varchar(255) NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL, nocache_old smallint NOT NULL)$memengine$charset;");
$db->exec('CREATE INDEX ' . PREFIX . 'status ON ' . PREFIX . 'sessions(status);');
$db->exec('CREATE INDEX ' . PREFIX . 'lastpost ON ' . PREFIX . 'sessions(lastpost);');
$db->exec('CREATE INDEX ' . PREFIX . 'incognito ON ' . PREFIX . 'sessions(incognito);');
$result=$db->query('SELECT nickname, passhash, status, refresh, bgcolour, regedby, lastlogin, timestamps, embed, incognito, style, nocache, nocache_old, tz, eninbox, sortupdown, hidechatters FROM ' . PREFIX . 'members;');
$members=$result->fetchAll(PDO::FETCH_NUM);
$result=$db->query('SELECT postdate, postid, poster, recipient, text FROM ' . PREFIX . 'inbox;');
$inbox=$result->fetchAll(PDO::FETCH_NUM);
$db->exec('DROP TABLE ' . PREFIX . 'inbox;');
$db->exec('DROP TABLE ' . PREFIX . 'members;');
$db->exec('CREATE TABLE ' . PREFIX . "members (id $primary, nickname varchar(50) NOT NULL UNIQUE, passhash varchar(255) NOT NULL, status smallint NOT NULL, refresh smallint NOT NULL, bgcolour char(6) NOT NULL, regedby varchar(50) DEFAULT '', lastlogin integer DEFAULT 0, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, style varchar(255) NOT NULL, nocache smallint NOT NULL, nocache_old smallint NOT NULL, tz varchar(255) NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL)$diskengine$charset");
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, regedby, lastlogin, timestamps, embed, incognito, style, nocache, nocache_old, tz, eninbox, sortupdown, hidechatters) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);');
foreach($members as $tmp){
$stmt->execute($tmp);
}
$db->exec('CREATE TABLE ' . PREFIX . "inbox (id $primary, postdate integer NOT NULL, postid integer NOT NULL UNIQUE, poster varchar(50) NOT NULL, recipient varchar(50) NOT NULL, text text NOT NULL)$diskengine$charset;");
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'inbox (postdate, postid, poster, recipient, text) VALUES(?, ?, ?, ?, ?);');
foreach($inbox as $tmp){
$stmt->execute($tmp);
}
$db->exec('CREATE INDEX ' . PREFIX . 'inbox_poster ON ' . PREFIX . 'inbox(poster);');
$db->exec('CREATE INDEX ' . PREFIX . 'inbox_recipient ON ' . PREFIX . 'inbox(recipient);');
$db->exec('ALTER TABLE ' . PREFIX . 'inbox ADD FOREIGN KEY (recipient) REFERENCES ' . PREFIX . 'members(nickname) ON DELETE CASCADE ON UPDATE CASCADE;');
}
update_setting('dbversion', DBVERSION); update_setting('dbversion', DBVERSION);
if($msgencrypted!==MSGENCRYPTED){ if($msgencrypted!==MSGENCRYPTED){
if(!extension_loaded('openssl')){ if(!extension_loaded('openssl')){
@ -4113,6 +4100,14 @@ function check_db(){
$memcached=new Memcached(); $memcached=new Memcached();
$memcached->addServer(MEMCACHEDHOST, MEMCACHEDPORT); $memcached->addServer(MEMCACHEDHOST, MEMCACHEDPORT);
} }
if(!isset($_REQUEST['action']) || $_REQUEST['action']==='setup'){
if(!check_init()){
send_init();
}
update_db();
}elseif($_REQUEST['action']==='init'){
init_chat();
}
} }
function load_fonts(){ function load_fonts(){
@ -4135,10 +4130,10 @@ function load_fonts(){
function load_lang(){ function load_lang(){
global $I, $L, $language; global $I, $L, $language;
$L=[ $L=[
'bg' =>'Български',
'de' =>'Deutsch', 'de' =>'Deutsch',
'en' =>'English', 'en' =>'English',
'es_AR' =>'Español (Argentina)', 'es' =>'Español',
'es_ES' =>'Español (España)',
'fr' =>'Français', 'fr' =>'Français',
'id' =>'Bahasa Indonesia', 'id' =>'Bahasa Indonesia',
'ru' =>'Русский', 'ru' =>'Русский',
@ -4167,8 +4162,8 @@ function load_lang(){
function load_config(){ function load_config(){
mb_internal_encoding('UTF-8'); mb_internal_encoding('UTF-8');
define('VERSION', '1.23'); // Script version define('VERSION', '1.23.5'); // Script version
define('DBVERSION', 40); // Database layout version define('DBVERSION', 41); // Database layout version
define('MSGENCRYPTED', false); // Store messages encrypted in the database to prevent other database users from reading them - true/false - visit the setup page after editing! define('MSGENCRYPTED', false); // Store messages encrypted in the database to prevent other database users from reading them - true/false - visit the setup page after editing!
define('ENCRYPTKEY', 'MY_KEY'); // Encryption key for messages define('ENCRYPTKEY', 'MY_KEY'); // Encryption key for messages
define('DBHOST', 'localhost'); // Database host define('DBHOST', 'localhost'); // Database host
@ -4189,4 +4184,4 @@ function load_config(){
define('COOKIENAME', PREFIX . 'chat_session'); // Cookie name storing the session information define('COOKIENAME', PREFIX . 'chat_session'); // Cookie name storing the session information
define('LANG', 'en'); // Default language define('LANG', 'en'); // Default language
} }
?>

368
lang_bg.php Normal file
View File

@ -0,0 +1,368 @@
<?php
/*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - Bulgarian translation
*
* Copyright (C) 2015-2017 Daniel Winzen <d@winzen4.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//Native language name: Български
$T=[
'nodb' => 'Няма връзка с базата данни!',
'nodbsetup' => 'Няма връзка с базата данни, моля създайте база данни и редактирайте скрипта да използва правилната база данни със съответния потребител и парола.',
'changelang' => 'Смени езика:',
'expire' => 'Невалидна/изтекла сесия',
'kicked' => 'Ти беше изгонен от чата!',
'invalnick' => 'Невалиден ник (Максимум %1$d символа и трябва да съвпада с регулярния израз "%2$s")',
'invalpass' => 'Невалидна парола (Най-малко %1$d символа и трябва да съвпада с регулярния израз "%2$s")',
'noconfirm' => 'Полето за потвърждение на паролата не съвпада!',
'incorregex' => 'Невалиден регулярен израз!',
'bottom' => 'Най-долу',
'top' => 'Горе',
'choose' => '(избери)',
'setup' => 'Инсталация на чата',
'init' => 'Първоначална инсталация',
'sulogin' => 'Потребителско име на супер-администратора:',
'sunick' => 'Ник на супер-администратора:',
'supass' => 'Парола на супер-администратора:',
'suconfirm' => 'Потвърди паролата:',
'susuccess' => 'Успешна регистрация!',
'initbtn' => 'Инициализация на чата',
'initdbexist' => 'Таблиците в базата данни вече съществуват! За да продължите, моля първо изтрийте тези таблици ръчно.',
'initsuexist' => 'Вече съществува супер-администратор!',
'initgosetup' => 'Отиди към страницата за инсталация',
'captcha' => 'Captcha',
'enabled' => 'Разрешено',
'onlyguests' => 'Само за гости',
'disabled' => 'Забранено',
'simple' => 'Просто',
'moderate' => 'Умерено',
'extreme' => 'Екстремно',
'nick' => 'Ник:',
'pass' => 'Парола:',
'globalloginpass' => 'Глобална парола:',
'login' => 'Вход',
'dbupdate' => 'Базата данни бе успешно обновена!',
'sysmessages' => 'Системни съобщения',
'msgenter' => 'Влизане',
'msgexit' => 'Напускане',
'msgmemreg' => 'Членът е регистриран',
'msgsureg' => 'Кандидатът е регистриран',
'msgkick' => 'Изгонен',
'msgmultikick' => 'Множество изгонени',
'msgallkick' => 'Всички са изгонени',
'msgclean' => 'Стаята беше почистена',
'dateformat' => '<a target="_blank" href="http://php.net/manual/en/function.date.php#refsect1-function.date-parameters">Формат на дата</a>',
'admfunc' => 'Административни функции',
'allguests' => 'Всички гости',
'cleanmsgs' => 'Изчисти съобщенията',
'room' => 'Цялата стая',
'selection' => 'Избор',
'cleannick' => 'Следния ник:',
'clean' => 'Изчисти',
'kickchat' => 'Изгони потребител (%d минути)',
'kickreason' => 'Причина:',
'kickpurge' => 'Заличи съобщенията',
'kick' => 'Изгони',
'logoutinact' => 'Изкарай неактивен потребител от чата',
'logout' => 'Изкарай',
'sessions' => 'Виж активните сесии',
'view' => 'Виж',
'filter' => 'Филтър',
'guestacc' => 'Промени достъпа за гост',
'guestallow' => 'Позволи',
'guestwait' => 'Позволи с чакалня',
'adminallow' => 'Изисквай одобрение от модератор',
'guestdisallow' => 'Само членове',
'addsuguest' => 'Регистрирай кандидат',
'register' => 'Регистрирай',
'admmembers' => 'Членове',
'memdel' => 'Изтрий от базата данни',
'memdeny' => 'Забрани достъп (!)',
'memsuguest' => 'Направи кандидат (G)',
'memreg' => 'Направи обикновен член',
'memmod' => 'Направи модератор (M)',
'memsumod' => 'Направи супер-модератор (SM)',
'memadm' => 'Направи администратор (A)',
'change' => 'Промени',
'regguest' => 'Регистрирай гост',
'regmem' => 'Регистрирай нов член',
'sessact' => 'Активни сесии',
'sessnick' => 'Ник',
'sesstimeout' => 'Изтичане след',
'sessua' => 'User-Agent',
'fid' => 'Филтър ID:',
'match' => 'Съвпадение',
'replace' => 'Замени',
'allowpm' => 'Разреши в ЛС',
'regex' => 'Регулярен израз',
'apply' => 'Приложи',
'newfilter' => 'Нов филтър:',
'add' => 'Добави',
'noframes' => 'Този чат използва <b>фреймове</b>. Моля позволете фреймовете във вашия браузър или използвайте друг, подходящ.',
'delselmes' => 'Изтрий избраните съобщения',
'staffnotes' => 'Бележки на екипа',
'adminnotes' => 'Администраторски бележки',
'notessaved' => 'Бележките са запазени!',
'lastedited' => 'Последна редакция от %1$s на %2$s',
'savenotes' => 'Запази бележките',
'waitingroom' => 'Чакалня',
'waittext' => 'Добре дошъл, %1$s, влизането ти беше отложено, ще можеш да влезеш в чата след %2$d секунди.',
'admwaittext' => 'Добре дошъл, %1$s, влизането ти беше отложено, ще можеш да влезеш в чата след като бъдеш одобрен от модератор.',
'waitreload' => 'Ако тази страница не се презарежда сама на всеки %d секунди, моля използвайте бутона за презареждане по-долу за да я презаредите ръчно',
'reload' => 'Презареди',
'rules' => 'Правила',
'talkto' => 'Изпрати до',
'toall' => 'Всички в чата',
'tomem' => 'Само до членовете',
'tostaff' => 'Само до екипа',
'toadmin' => 'Само до админ',
'alsopurge' => 'Също заличи съобщенията',
'dellast' => 'Изтрий последното съобщение',
'delall' => 'Изтрий всички съобщения',
'switchsingle' => 'Превключи на многоредово поле',
'switchmulti' => 'Превключи на едноредово поле',
'help' => 'Помощ',
'helpguest' => 'Предназначението на всички функции трябва да е ясно, просто използвай бутоните. В профила си можеш да променяш интервала на опресняване на чата и цвета на шрифта, а също така и да игнорираш потребители.<br><u>Забележка:</u> Това е чат, така че ако спреш да чатиш, след известно време ще бъдеш амтоматично изкаран от чата.',
'helpembed' => 'Ако искаш да вградиш изображение в поста си, просто използвай тага [img] пред линка с изображението. Пример: [img]http://example.com/images/file.jpg ще вгради изображението в поста ти.',
'helpmem' => 'Членове: Вие ще имате някои допълнителни опции. Може да променяте цвета на фона, да променяте паролата си по всяко време, и разбира се, да изтриете акаунта си.',
'helpmod' => 'Модератори: Забележете админ бутона най-долу. Натискането му ще изведе страница, през която ще можете да почистите стаята, да гоните потребители, да преглеждате всички активни сесии и да забраните напълно достъпа на гости, ако е необходимо.',
'helpadm' => 'Администратори: Вие ще можете допълнително да регистрирате гости, да редактирате профили на членове и да регистрирате нови никове.',
'profile' => 'Твоят профил',
'ignore' => 'Игнорирай',
'unignore' => 'Спри да игнорираш',
'refreshrate' => 'Честота на опресняване (5-150 секунди)',
'fontcolour' => 'Цвят на шрифта',
'viewexample' => 'Виж примери',
'bgcolour' => 'Цвят на фона',
'fontface' => 'Облик на шрифта',
'roomdefault' => 'По подразбиране за стаята',
'bold' => 'Получер',
'italic' => 'Курсив',
'small' => 'Малък',
'fontexample' => 'Пример за избрания шрифт',
'timestamps' => 'Покажи времеви маркери',
'embed' => 'Вграждане на изображения',
'incognito' => 'Режим Инкогнито',
'changenick' => 'Промени ник',
'changepass' => 'Промени парола',
'oldpass' => 'Стара парола:',
'newpass' => 'Нова парола:',
'confirmpass' => 'Потвърди новата парола:',
'savechanges' => 'Запази промените',
'reloadpb' => 'Презареди пощенската кутия',
'reloadmsgs' => 'Презареди съобщенията',
'chgprofile' => 'Профил',
'adminbtn' => 'Администрация',
'admnotes' => 'Администраторски бележки',
'notes' => 'Бележки',
'clone' => 'Клонирай',
'randh' => 'Правила & Помощ',
'exit' => 'Изход от чата',
'bye' => 'Чао, драги %s, скоро те очакваме отново!',
'colourtable' => 'Таблица с цветове',
'backtoprofile' => 'Обратно в твоя профил',
'copy' => 'Препиши:',
'choosecol' => 'Гости, изберете цвят:',
'randomcol' => 'Произволен цвят',
'enter' => 'Влез в чата',
'error' => 'Грешка',
'members' => 'Членове',
'guests' => 'Гости',
'approveguests' => '%d нови гости чакат одобрение',
'allowchecked' => 'Допусни избраните',
'allowall' => 'Допусни всички',
'denychecked' => 'Не допускай избраните',
'denyall' => 'Не допускай никого',
'denymessage' => 'Изпрати съобщение до недопуснатите:',
'butallowdeny' => 'Изпрати',
'waitempty' => 'Няма повече заявки за присъединяване, чакащи одобрение.',
'wrongcaptcha' => 'Грешна Captcha',
'captchaexpire' => 'Captcha-та е вече използвана или е изтекла.',
'noguests' => 'Съжаляваме, но в момента се допускат само членове!',
'curchat' => 'В стаята има %d потребители:',
'cantreg' => 'Не мога да регистрирам %s',
'alreadyreged' => '%s е вече регистриран.',
'successreg' => '%s е успешно регистриран.',
'cantchgstat' => 'Не мога да променя статуса на %s',
'succdel' => '%s е успешно изтрит от базата данни.',
'succchg' => 'Статусът за %s бе успешно променен.',
'wrongpass' => 'Грешна парола!',
'wrongglobalpass' => 'Грешна глобална парола!',
'succprofile' => 'Профилът ти беше успешно съхранен.',
'backtologin' => 'Обратно към страницата за вход.',
'backtochat' => 'Обратно към чата.',
'Beige' => 'Бежово',
'Black' => 'Черно',
'Blue' => 'Синьо',
'BlueViolet' => 'Виолетово-синьо',
'Brown' => 'Кафяво',
'Cyan' => 'Зелено-синьо',
'DarkBlue' => 'Тъмносиньо',
'DarkGreen' => 'Тъмнозелено',
'DarkRed' => 'Тъмночервено',
'DarkViolet' => 'Тъмновиолетово',
'DeepSkyBlue' => 'Небесно синьо',
'Gold' => 'Златно',
'Grey' => 'Сиво',
'Green' => 'Зелено',
'HotPink' => 'Топло розово',
'Indigo' => 'Индиго',
'LightBlue' => 'Светлосиньо',
'LightGreen' => 'Светлозелено',
'LimeGreen' => 'Липовозелено',
'Magenta' => 'Лилаво-червено (Маджента)',
'Olive' => 'Тъмно жълто-зелено',
'Orange' => 'Оранжево',
'OrangeRed' => 'Оранжево-червено',
'Purple' => 'Лилаво',
'Red' => 'Червено',
'RoyalBlue' => 'Кралско синьо',
'SeaGreen' => 'Морско зелено',
'Sienna' => 'Златисто-жълто (Охра)',
'Silver' => 'Сребърно',
'Tan' => 'Жълто-кафяво',
'Teal' => 'Синьо-зелено',
'Violet' => 'Виолетово',
'White' => 'Бяло',
'Yellow' => 'Жълто',
'YellowGreen' => 'Жълто-зелено',
'redirectto' => 'Пренасочване към:',
'nonhttp' => 'Заявен е не-http линк:',
'httpredir' => 'Ако не работи, опитай това:',
'actions' => 'Действия',
'sesip' => 'IP-адрес',
'css' => 'CSS стил',
'memberexpire' => 'Изтичане на сесията на членове (минути)',
'guestexpire' => 'Изтичане на сесията за гости (минути)',
'kickpenalty' => 'Наказание с изгонване (минути)',
'entrywait' => 'Време за изчакване в чакалнята (секунди)',
'captchatime' => 'Валидност на Captcha-та (секунди)',
'messageexpire' => 'Съобщенията изтичат след (минути)',
'messagelimit' => 'Лимит на съобщенията (публичен)',
'maxmessage' => 'Максимална дължина на съобщението',
'confirm' => 'Сигурен ли си?',
'yes' => 'Да',
'no' => 'Не',
'colbg' => 'Цвят на фона',
'coltxt' => 'Цвят на текста',
'maxname' => 'Максимална дължина на ник',
'minpass' => 'Минимална дължина на паролата',
'defaultrefresh' => 'Интервал на опресняване на съобщенията по подразбиране (секунди)',
'suguests' => 'Позволи кандидати',
'rulestxt' => 'Правила (html)',
'imgembed' => 'Вгради изображения',
'trackip' => 'Покажи IP-то на сесията',
'captchachars' => 'Символи, използвани за Captcha-та',
'memkick' => 'Членовете могат да гонят, ако няма модератор в стаята',
'forceredirect' => 'Пренасочване',
'redirect' => 'Мой скрипт за пренасочване',
'backuprestore' => 'Бекъп и възстановяване',
'backup' => 'Направи бекъп',
'restore' => 'Възстанови',
'settings' => 'Настройки',
'linkfilter' => 'Филтър за линкове',
'chatname' => 'Име на чата',
'destroy' => 'Унищожи чата',
'destroyed' => 'Успешно унищожи чата',
'topic' => 'Тема',
'passreset' => 'Нулирай парола',
'cantresetpass' => 'Не мога да нулирам паролата',
'succpassreset' => 'Успешно нулира паролата',
'entermsg' => '%s влезе в чата.',
'exitmsg' => '%s напусна чата.',
'memregmsg' => '%s вече е регистриран член.',
'suregmsg' => '%s вече е регистриран кандидат.',
'kickmsg' => '%s беше изгонен.',
'multikickmsg' => '%s бяха изгонени.',
'allkickmsg' => 'Всички гости бяха изгонени.',
'cleanmsg' => '%s беше почистена.',
'sendallmsg' => '%s - ',
'sendmemmsg' => '[М] %s - ',
'sendmodmsg' => '[Екип] %s - ',
'sendadmmsg' => '[Админ] %s - ',
'sendprvmsg' => '[%1$s до %2$s] - ',
'msgsendall' => 'Съобщение до всички',
'msgsendmem' => 'Съобщение само до членовете',
'msgsendmod' => 'Съобщение само до екипа',
'msgsendadm' => 'Съобщение само до администраторите',
'msgsendprv' => 'Лично съобщение',
'numnotes' => 'Брой версии на бележки, които да се пазят',
'revisions' => 'Версии:',
'older' => 'По-стари',
'newer' => 'По-нови',
'accessdenied' => 'Достъпът е забранен',
'loggedinas' => 'В момента си логнат като %s и нямаш достъп до тази част.',
'newnickname' => 'Нов ник:',
'nicknametaken' => 'Този ник се използва от друг',
'nopass' => 'Невалидна парола (поне %d символа), не променям ника',
'gdextrequired' => 'Добавката gd за PHP е необходима за тази функционалност. Моля, първо я инсталирайте.',
'memcachedextrequired' => 'Добавката memcached за PHP е необходима за кеш функционалностите. Моля, първо я инсталирайте или върнете настройките за memcached обратно на false.',
'opensslextrequired' => 'Добавката openssl за PHP е необходима the криптиращата функционалност. Моля, първо я инсталирайте или върнете настройките за криптиране обратно на false.',
'pdo_mysqlextrequired' => 'Добавката pdo_mysql за PHP е необходима за избрания драйвер за базата данни. Моля, първо я инсталирайте.',
'pdo_pgsqlextrequired' => 'Добавката pdo_pgsql за PHP е необходима за избрания драйвер за базата данни. Моля, първо я инсталирайте.',
'pdo_sqliteextrequired' => 'Добавката pdo_sqlite за PHP е необходима за избрния драйвер за базата данни. Моля, първо я инсталирайте.',
'jsonextrequired' => 'Добавката json за PHP е необходима за тази функционалност. Моля, първо я инсталирайте.',
'sendmail' => 'Изпрати мейл при ново публично съобщение',
'mailsender' => 'Изпрати мейл, използвайки този адрес',
'mailreceiver' => 'Изпрати мейл до този адрес',
'modfallback' => 'Използвай чакалня, ако няма модератор да одобрява гостите',
'regpass' => 'Повтори паролата <br>за да се регистрираш',
'guestreg' => 'Разреши на гостите да се регистрират сами',
'asmember' => 'Като член',
'assuguest' => 'Като кандидат',
'fatalerror' => 'Фатална грешка',
'prevmatch' => 'Съвпадението ти беше както следва',
'matchtoolong' => 'Съвпадението ти беше прекалено дълго. Може да използваш най-много 255 символа. Опитай се да го разделиш.',
'nocache' => 'Автоматично скролиране (за старите браузъри или сортиране от горе надолу).',
'disablepm' => 'Забрани личните съобщения',
'disablechat' => 'Забрани чата',
'disabletext' => 'Съобщение относно забранения чат (html)',
'disabledtext' => 'Временно забранен',
'defaulttz' => 'Часова зона по подрзбиране',
'tz' => 'Часова зона',
'optional' => '(опционално)',
'userloggedin' => 'Потребителят с това потребителско име е вече логнат.',
'regednick' => 'Този ник е на регистриран член.',
'eninbox' => 'Позволи офлайн пощенска кутия',
'inboxmsgs' => 'Прочети %d съобщения в пощенската ти кутия',
'offline' => '(офлайн)',
'deleteacc' => 'Изтрий акаунт',
'eninnone' => 'За никого',
'eninall' => 'За всички',
'eninmem' => 'Само за членове',
'eninstaff' => 'Само за екипа',
'eninadmin' => 'Само за администратори',
'nickregex' => 'Регулярен израз за никове',
'passregex' => 'Регулярен израз за пароли',
'externalcss' => 'Линк към външен CSS файл',
'greetingmsg' => 'Добре дошъл, %s!',
'entryhelp' => 'Ако този фрейм не се презареди след %d секунди, ще е необходимо да позволите автоматичното презареждане (meta презареждане) в своя браузър. Също се уверете, че нямате уеб филтър, локален филтър или добавка за браузъра, която да блокира автоматичното презареждане! Такива са например "Polipo", "NoScript", и други.<br>Възможно решение е (също в случай на грешки при презареждане на ниво сървър/прокси) да използвате бутона за ръчно презареждане на вашия браузър.',
'enablegreeting' => 'Покажи приветствено съобщение преди да покажеш самото съобщение',
'unban' => 'Премахни бан',
'sortupdown' => 'Подреди съобщенията от горе надолу',
'sortframe' => 'Преподредба',
'cs' => 'Чувствително към малки и големи букви',
'hidechatters' => 'Скрий списъка с потребители',
'enfileupload' => 'Позволи качването на файлове',
'msgattache' => 'Прикачен файл',
'filenotfound' => 'Файлът не е намерен!',
'maxuploadsize' => 'Максимален размер на файл в KB',
'maxsize' => 'Макс %d KB',
'cssupdate' => 'Забележка: CSS-ът по подразбиране е вече вграден в кода и може да бъде премахнат от CSS настройките',
'manualrefresh' => 'Необходимо ръчно опресняване',
'personalnotes' => 'Лични бележки',
'filtermodkick' => 'Прилагай филтъра за изгонване и за модераторите',
];

View File

@ -2,7 +2,7 @@
/* /*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - German translation * LE CHAT-PHP - a PHP Chat based on LE CHAT - German translation
* *
* Copyright (C) 2015-2016 Daniel Winzen <d@winzen4.de> * Copyright (C) 2015-2017 Daniel Winzen <d@winzen4.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -135,7 +135,7 @@ $T=[
'switchsingle' => 'Zu Einzel-Zeile wechseln', 'switchsingle' => 'Zu Einzel-Zeile wechseln',
'switchmulti' => 'Zu Mehrfach-Zeilen wechseln', 'switchmulti' => 'Zu Mehrfach-Zeilen wechseln',
'help' => 'Hilfe', 'help' => 'Hilfe',
'helpguest' => 'Alle Funktionen sollten recht selbsterklärend sein, benutze einfach die Knöpfe. In Ihrem Profil könnsen Sie die Aktualisierungsrate, Schriftfarbe und Ihre gewünschte Postboxgröße anpassen.<br><u>Hinweis:</u> Dies ist ein Chat, wenn Sie also nichts schreiben, werden Sie automatisch nach einiger Zeit abgemeldet.', 'helpguest' => 'Alle Funktionen sollten recht selbsterklärend sein, benutze einfach die Knöpfe. In Ihrem Profil könnsen Sie die Aktualisierungsrate und Schriftfarbe anpassen, sowie Nutzer ignorieren.<br><u>Hinweis:</u> Dies ist ein Chat, wenn Sie also nichts schreiben, werden Sie automatisch nach einiger Zeit abgemeldet.',
'helpembed' => 'Wenn Sie ein Bild einbetten möchten, fügen Sie einfach ein [img] vor die Adresse des Bildes. Beispiel: [img]http://example.com/images/file.jpg bettet das Bild in Ihrem Beitrag ein.', 'helpembed' => 'Wenn Sie ein Bild einbetten möchten, fügen Sie einfach ein [img] vor die Adresse des Bildes. Beispiel: [img]http://example.com/images/file.jpg bettet das Bild in Ihrem Beitrag ein.',
'helpmem' => 'Mitglieder: Sie werden einige zusätzliche Optionen in Ihrem Profil haben. Sie können Ihre Schriftart ändern, Ihr Passwort jederzeit ändern und natürlich können Sie auch Ihr Profil löschen.', 'helpmem' => 'Mitglieder: Sie werden einige zusätzliche Optionen in Ihrem Profil haben. Sie können Ihre Schriftart ändern, Ihr Passwort jederzeit ändern und natürlich können Sie auch Ihr Profil löschen.',
'helpmod' => 'Moderatoren: Achten Sie auf den Admin-Knof unten. Er ruft eine Seite auf, auf der Sie Nachrichten löschen können, Teilnehmer rausschmeißen können, alle aktive Sitzungen anzeigen lassen können und den Gastzugriff deaktivieren können, falls dies nötig sein sollte.', 'helpmod' => 'Moderatoren: Achten Sie auf den Admin-Knof unten. Er ruft eine Seite auf, auf der Sie Nachrichten löschen können, Teilnehmer rausschmeißen können, alle aktive Sitzungen anzeigen lassen können und den Gastzugriff deaktivieren können, falls dies nötig sein sollte.',
@ -156,10 +156,6 @@ $T=[
'timestamps' => 'Zeitstempel anzeigen', 'timestamps' => 'Zeitstempel anzeigen',
'embed' => 'Bilder einbetten', 'embed' => 'Bilder einbetten',
'incognito' => 'Inkognito Modus', 'incognito' => 'Inkognito Modus',
'pbsize' => 'Postboxgröße',
'nbsize' => 'Notizboxgröße',
'width' => 'Breite:',
'height' => 'Höhe:',
'changenick' => 'Nickname ändern', 'changenick' => 'Nickname ändern',
'changepass' => 'Passwort ändern', 'changepass' => 'Passwort ändern',
'oldpass' => 'Altes Passwort:', 'oldpass' => 'Altes Passwort:',
@ -370,4 +366,4 @@ $T=[
'personalnotes' => 'Persönliche Notizen', 'personalnotes' => 'Persönliche Notizen',
'filtermodkick' => 'Kickfilter auf Moderatoren anwenden', 'filtermodkick' => 'Kickfilter auf Moderatoren anwenden',
]; ];
?>

View File

@ -2,7 +2,7 @@
/* /*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - English translation * LE CHAT-PHP - a PHP Chat based on LE CHAT - English translation
* *
* Copyright (C) 2015-2016 Daniel Winzen <d@winzen4.de> * Copyright (C) 2015-2017 Daniel Winzen <d@winzen4.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -135,7 +135,7 @@ $I=[
'switchsingle' => 'Switch to single-line', 'switchsingle' => 'Switch to single-line',
'switchmulti' => 'Switch to multi-line', 'switchmulti' => 'Switch to multi-line',
'help' => 'Help', 'help' => 'Help',
'helpguest' => 'All functions should be pretty much self-explaining, just use the buttons. In your profile you can adjust the refresh rate, font colour and your preferred input box size.<br><u>Note:</u> This is a chat, so if you don\'t keep talking, you will be automatically logged out after a while.', 'helpguest' => 'All functions should be pretty much self-explaining, just use the buttons. In your profile you can adjust the refresh rate and font colour, as well as ignore users.<br><u>Note:</u> This is a chat, so if you don\'t keep talking, you will be automatically logged out after a while.',
'helpembed' => 'If you want to embed an image in your post, simply put [img] in front of your image URL. Example: [img]http://example.com/images/file.jpg will embed the image in your post.', 'helpembed' => 'If you want to embed an image in your post, simply put [img] in front of your image URL. Example: [img]http://example.com/images/file.jpg will embed the image in your post.',
'helpmem' => 'Members: You\'ll have some more options in your profile. You can adjust your font face, change your password anytime and of course you can delete your account.', 'helpmem' => 'Members: You\'ll have some more options in your profile. You can adjust your font face, change your password anytime and of course you can delete your account.',
'helpmod' => 'Moderators: Notice the Admin-button at the bottom. It\'ll bring up a page where you can clean the room, kick chatters, view all active sessions and disable guest access completely if needed.', 'helpmod' => 'Moderators: Notice the Admin-button at the bottom. It\'ll bring up a page where you can clean the room, kick chatters, view all active sessions and disable guest access completely if needed.',
@ -156,10 +156,6 @@ $I=[
'timestamps' => 'Show Timestamps', 'timestamps' => 'Show Timestamps',
'embed' => 'Embed images', 'embed' => 'Embed images',
'incognito' => 'Incognito mode', 'incognito' => 'Incognito mode',
'pbsize' => 'Post box size',
'nbsize' => 'Notes box size',
'width' => 'Width:',
'height' => 'Height:',
'changenick' => 'Change Nickname', 'changenick' => 'Change Nickname',
'changepass' => 'Change Password', 'changepass' => 'Change Password',
'oldpass' => 'Old password:', 'oldpass' => 'Old password:',
@ -370,4 +366,4 @@ $I=[
'personalnotes' => 'Personal notes', 'personalnotes' => 'Personal notes',
'filtermodkick' => 'Apply kick filter on moderators', 'filtermodkick' => 'Apply kick filter on moderators',
]; ];
?>

View File

@ -1,8 +1,8 @@
<?php <?php
/* /*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - Spanish (ar) translation * LE CHAT-PHP - a PHP Chat based on LE CHAT - Spanish translation
* *
* Copyright (C) 2015-2016 Daniel Winzen <d@winzen4.de> * Copyright (C) 2015-2017 Daniel Winzen <d@winzen4.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -18,13 +18,15 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
//Native language name: Español (Argentina) //Native language name: Español
$T=[ $T=[
'nodb' => '¡Sin conexión a la base de datos!', 'nodb' => '¡Sin conexión a la base de datos!',
'nodbsetup' => '¡No pudo conectarse a la base de datos! Por favor creá la base de datos y editá el script para usarla con el nombre de usuario y clave dados.', 'nodbsetup' => '¡No pudo conectarse a la base de datos! Por favor creá la base de datos y editá el script para usarla con el nombre de usuario y clave dados.',
'changelang' => 'Cambiar idioma:', 'changelang' => 'Cambiar idioma:',
'expire' => 'La sesión es inválida o expiró', 'expire' => 'La sesión es inválida o expiró',
'kicked' => '¡Te expulsaron!', 'kicked' => '¡Te expulsaron!',
'invalnick' => 'NickName inválido (%1$d characters maximum and has to match the regular expression "%2$s")',
'invalpass' => 'Contraseña erronea(At least %1$d characters and has to match the regular expression "%2$s")',
'noconfirm' => '¡La contraseña y su confirmación no coinciden!', 'noconfirm' => '¡La contraseña y su confirmación no coinciden!',
'incorregex' => '¡Expresión regular incorrecta!', 'incorregex' => '¡Expresión regular incorrecta!',
'bottom' => 'Inicio', 'bottom' => 'Inicio',
@ -49,7 +51,7 @@ $T=[
'moderate' => 'Moderado', 'moderate' => 'Moderado',
'extreme' => 'Extremo', 'extreme' => 'Extremo',
'nick' => 'Apodo:', 'nick' => 'Apodo:',
'pass' => 'Constraseña:', 'pass' => 'Contraseña:',
'globalloginpass' => 'Contraseña global:', 'globalloginpass' => 'Contraseña global:',
'login' => 'Identificarse', 'login' => 'Identificarse',
'dbupdate' => '¡La base de datos fue actualizada con éxito!', 'dbupdate' => '¡La base de datos fue actualizada con éxito!',
@ -68,8 +70,8 @@ $T=[
'cleanmsgs' => 'Limpiar mensajes', 'cleanmsgs' => 'Limpiar mensajes',
'room' => 'Sala entera', 'room' => 'Sala entera',
'selection' => 'Selección', 'selection' => 'Selección',
'cleannick' => 'Following nickname:', 'cleannick' => 'Siguiente Nick:',
'clean' => 'Clean', 'clean' => 'Limpiar',
'kickchat' => 'Expulsado (%d minutos)', 'kickchat' => 'Expulsado (%d minutos)',
'kickreason' => 'Motivo de expulsión:', 'kickreason' => 'Motivo de expulsión:',
'kickpurge' => 'Mensaje de purga', 'kickpurge' => 'Mensaje de purga',
@ -79,7 +81,7 @@ $T=[
'sessions' => 'Ver sesiones activas', 'sessions' => 'Ver sesiones activas',
'view' => 'Ver', 'view' => 'Ver',
'filter' => 'Filtro', 'filter' => 'Filtro',
'guestacc' => 'Change Guestaccess', 'guestacc' => 'Cambiar acceso de invitado',
'guestallow' => 'Permitir', 'guestallow' => 'Permitir',
'guestwait' => 'Permitir con sala de espera', 'guestwait' => 'Permitir con sala de espera',
'adminallow' => 'Requiere aprobación del moderator', 'adminallow' => 'Requiere aprobación del moderator',
@ -99,7 +101,7 @@ $T=[
'regmem' => 'Registrar miembro nuevo', 'regmem' => 'Registrar miembro nuevo',
'sessact' => 'Sesiones activas', 'sessact' => 'Sesiones activas',
'sessnick' => 'Apodo', 'sessnick' => 'Apodo',
'sesstimeout' => 'Vecnimiento', 'sesstimeout' => 'Vencimiento',
'sessua' => 'Navegador', 'sessua' => 'Navegador',
'fid' => 'ID del filtro:', 'fid' => 'ID del filtro:',
'match' => 'Coincidencia', 'match' => 'Coincidencia',
@ -133,7 +135,7 @@ $T=[
'switchsingle' => 'Cambiar a una sola línea', 'switchsingle' => 'Cambiar a una sola línea',
'switchmulti' => 'Cambiar a múltiples líneas', 'switchmulti' => 'Cambiar a múltiples líneas',
'help' => 'Ayuda', 'help' => 'Ayuda',
'helpguest' => 'Todas las funciones deberían ser auto-explicativas, sólo usa los botones. En tu perfil puedes ajustar el tiempo de actualización, el color del texto y el tamaño de caja que prefieras.<br><u>Nota:</u> Esto es una sala de chat, así que si no te mantenés hablando, vas a ser expulsado automáticamete después de un tiempo.', 'helpguest' => 'Todas las funciones deberían ser auto-explicativas, sólo usa los botones. En tu perfil puedes ajustar el tiempo de actualización, el color del texto y el tamaño de caja que prefieras.<br><u>Nota:</u> Esto es una sala de chat, así que si no te mantenés hablando, vas a ser expulsado automáticamente después de un tiempo.',
'helpembed' => 'Si querés incluir una imagen en tu publicación, simplemente poné [img] al comienzo de la dirección URL de la imagen. Por ejemplo: [img]http://example.com/images/file.jpg incluirá la imagen en tu publicación.', 'helpembed' => 'Si querés incluir una imagen en tu publicación, simplemente poné [img] al comienzo de la dirección URL de la imagen. Por ejemplo: [img]http://example.com/images/file.jpg incluirá la imagen en tu publicación.',
'helpmem' => 'Miembros: Vas a tener algunas opciones más en tu perfil. Vas a poder ajustar la tipografía del texto y cambiar la contraseña en cualquier momento.', 'helpmem' => 'Miembros: Vas a tener algunas opciones más en tu perfil. Vas a poder ajustar la tipografía del texto y cambiar la contraseña en cualquier momento.',
'helpmod' => 'Moderadores: Notá el botón de administración al final de la página. Te va a llevar a una página donde podés limpiar la sala, expulsar personas, ver todas las sesiones activas y deshabilitar el acceso a invitados totalmente si fuese necesario.', 'helpmod' => 'Moderadores: Notá el botón de administración al final de la página. Te va a llevar a una página donde podés limpiar la sala, expulsar personas, ver todas las sesiones activas y deshabilitar el acceso a invitados totalmente si fuese necesario.',
@ -149,14 +151,12 @@ $T=[
'roomdefault' => 'Sala por defecto', 'roomdefault' => 'Sala por defecto',
'bold' => 'Negrita', 'bold' => 'Negrita',
'italic' => 'Bastardilla', 'italic' => 'Bastardilla',
'small' => 'Pequeño',
'fontexample' => 'Ejemplo de la tipografía seleccionada', 'fontexample' => 'Ejemplo de la tipografía seleccionada',
'timestamps' => 'Mostrar fecha y hora', 'timestamps' => 'Mostrar fecha y hora',
'embed' => 'Habilitar imágenes', 'embed' => 'Habilitar imágenes',
'incognito' => 'Modo incógnito', 'incognito' => 'Modo incógnito',
'pbsize' => 'Tamaño de la caja de publicación', 'changenick' => 'Cambiar Nick',
'nbsize' => 'Tamaño de la caja de notas',
'width' => 'Ancho:',
'height' => 'Alto:',
'changepass' => 'Cambiar la contraseña', 'changepass' => 'Cambiar la contraseña',
'oldpass' => 'Contraseña anterior:', 'oldpass' => 'Contraseña anterior:',
'newpass' => 'Contraseña nueva:', 'newpass' => 'Contraseña nueva:',
@ -171,7 +171,7 @@ $T=[
'clone' => 'Clone', 'clone' => 'Clone',
'randh' => 'Reglas y ayuda', 'randh' => 'Reglas y ayuda',
'exit' => 'Salir de la sala', 'exit' => 'Salir de la sala',
'bye' => '¡Chau %s, visitanos pronto!', 'bye' => '¡Chau %s, visítanos pronto!',
'colourtable' => 'Colourtable', 'colourtable' => 'Colourtable',
'backtoprofile' => 'Volver a tu perfil', 'backtoprofile' => 'Volver a tu perfil',
'copy' => 'Copiar:', 'copy' => 'Copiar:',
@ -199,11 +199,11 @@ $T=[
'cantchgstat' => 'No pudo cambiarse el estado de %s', 'cantchgstat' => 'No pudo cambiarse el estado de %s',
'succdel' => '%s fue eliminado de la base de datos.', 'succdel' => '%s fue eliminado de la base de datos.',
'succchg' => 'Se cambió el estado de %s sin problemas.', 'succchg' => 'Se cambió el estado de %s sin problemas.',
'wrongpass' => '¡Constraseña incorrecta!', 'wrongpass' => '¡Contraseña incorrecta!',
'wrongglobalpass' => '¡Constraseña global incorrecta!', 'wrongglobalpass' => '¡Contraseña global incorrecta!',
'succprofile' => 'Tu perfil se guardó sin problemas.', 'succprofile' => 'Tu perfil se guardó sin problemas.',
'backtologin' => 'Volver a la página de identificación.', 'backtologin' => 'Volver a la página de identificación.',
'backtochat' => 'Vovler a la sala.', 'backtochat' => 'Volver a la sala.',
'Beige' => 'Beige', 'Beige' => 'Beige',
'Black' => 'Negro', 'Black' => 'Negro',
'Blue' => 'Azul', 'Blue' => 'Azul',
@ -271,7 +271,7 @@ $T=[
'redirect' => 'Script de redirección personalizado', 'redirect' => 'Script de redirección personalizado',
'backuprestore' => 'Copias de seguridad', 'backuprestore' => 'Copias de seguridad',
'backup' => 'Hacer copia', 'backup' => 'Hacer copia',
'restore' => 'Restablacer copia', 'restore' => 'Restablecer copia',
'settings' => 'Configuración', 'settings' => 'Configuración',
'linkfilter' => 'Filtro de enlaces', 'linkfilter' => 'Filtro de enlaces',
'chatname' => 'Nombre de la sala', 'chatname' => 'Nombre de la sala',
@ -279,8 +279,8 @@ $T=[
'destroyed' => 'Sala destruida satisfactoriamente', 'destroyed' => 'Sala destruida satisfactoriamente',
'topic' => 'Asunto', 'topic' => 'Asunto',
'passreset' => 'Reiniciar contraseña', 'passreset' => 'Reiniciar contraseña',
'cantresetpass' => 'Can\'t reset password', 'cantresetpass' => 'No se puede reiniciar contraseña',
'succpassreset' => 'Successfully reset password', 'succpassreset' => 'Contraseña reiniciada correctamente',
'entermsg' => '%s entró en la sala.', 'entermsg' => '%s entró en la sala.',
'exitmsg' => '%s se fue de la sala.', 'exitmsg' => '%s se fue de la sala.',
'memregmsg' => '%s ahora es un miembro registrado.', 'memregmsg' => '%s ahora es un miembro registrado.',
@ -299,14 +299,70 @@ $T=[
'msgsendmod' => 'Sólo mensajes a staff', 'msgsendmod' => 'Sólo mensajes a staff',
'msgsendadm' => 'Sólo mensajes a administradores', 'msgsendadm' => 'Sólo mensajes a administradores',
'msgsendprv' => 'Mensaje privado', 'msgsendprv' => 'Mensaje privado',
'numnotes' => 'Number of notes revisions to keep', 'numnotes' => 'Numero de notas para revisar',
'revisions' => 'Revisiones:', 'revisions' => 'Revisiones:',
'older' => 'Older', 'older' => 'Antiguo',
'newer' => 'Newer', 'newer' => 'Nuevo',
'accessdenied' => 'Acceso no permitido', 'accessdenied' => 'Acceso no permitido',
'loggedinas' => 'Estás identificado como %s y no tenés acceso a esta sección.', 'loggedinas' => 'Estás identificado como %s y no tenés acceso a esta sección.',
'newnickname' => 'Nuevo apodo:', 'newnickname' => 'Nuevo apodo:',
'nicknametaken' => 'Ese apodo ya fue tomado', 'nicknametaken' => 'Ese apodo ya fue tomado',
'nopass' => 'Constraseña incorrecta (al menos %d caracteres), no se cambia apodo' 'nopass' => 'Constraseña incorrecta (al menos %d caracteres), no se cambia apodo',
'gdextrequired' => 'La extensión gd de PHP es requerida para esto. Instálela primero.',
'memcachedextrequired' => 'La extensión memcached de PHP es requerida para esto. Instalela primero o configure memcached en false.',
'opensslextrequired' => 'La extensión openssl de PHP es necesaria para la encriptación. Instálela o configure la encriptación en false.',
'pdo_mysqlextrequired' => 'La extensión pdo_mysql de PHP es necesaria para la database driver seleccionada. Instálelo primero.',
'pdo_pgsqlextrequired' => ' La extensión pdo_pgsql de PHP es necesaria para la database driver seleccionada. Instálelo primero.',
'pdo_sqliteextrequired' => ' La extensión pdo_sqlite de PHP es necesaria para la database driver seleccionada. Instálelo primero.',
'jsonextrequired' => 'La extensión json de PHP es necesaria para esta configuración. Instálela primero.',
'sendmail' => 'Enviar mail en nuevo mensaje público',
'mailsender' => 'Enviar mail usando esta dirección',
'mailreceiver' => 'Enviar mail a esta dirección',
'modfallback' => 'Volver a la sala de espera, si ningún moderador aprovo la visita',
'regpass' => 'Repetir contraseña<br>para registrarse',
'guestreg' => 'Dar permisos de invitado a si mismos',
'asmember' => 'Como miembro',
'assuguest' => 'Como aplicante',
'fatalerror' => 'Error fatal',
'prevmatch' => 'Your match was as follows',
'matchtoolong' => 'Your match was too long. You can use max. 255 characters. Try splitting it up.',
'nocache' => 'Autoscroll (para buscadores antiguos o tipo top to bottom).',
'disablepm' => 'Desactivar mensajes privados',
'disablechat' => 'Desactivar chat',
'disabletext' => 'Mensaje de chat desactivado (html)',
'disabledtext' => 'Desactivado temporalmente',
'defaulttz' => 'Zona horaria predeterminada',
'tz' => 'Zona horaria',
'optional' => '(opcional)',
'userloggedin' => 'Un usuario con ese nombre ya está registrado.',
'regednick' => 'Este nombre es un usuario registrado.',
'eninbox' => 'Activar inbox offline',
'inboxmsgs' => 'Leer %d mensajes en tu bandeja',
'offline' => '(offline)',
'deleteacc' => 'Borrar cuenta',
'eninnone' => 'Para nadie',
'eninall' => 'Para todos',
'eninmem' => 'Solo para miembros',
'eninstaff' => 'Solo para staff',
'eninadmin' => 'Solo para administradores',
'nickregex' => 'Nickname regex',
'passregex' => 'Password regex',
'externalcss' => 'Link para archivo CSS externo',
'greetingmsg' => 'Bienvenido %s!',
'entryhelp' => 'Si no se te redirige en %d segundos, asegurate de tener activado la redirección automática (meta refresh) en tu navegador. También asegurate de que ningún filtro web, local proxy tool o browser plugin evita tu redirección automática! Podría ser por ejemplo "Polipo", "NoScript", etc.<br>o puedes usar el botón de recargar de manera manual.',
'enablegreeting' => ' Mostrar un saludo antes de los mensajes',
'unban' => 'Desbanear',
'sortupdown' => 'Sort messages from top to bottom',
'sortframe' => 'Rearrange',
'cs' => 'Case sensitive',
'hidechatters' => 'Esconder lista de chatters',
'enfileupload' => 'Habilitar subida de archivos',
'msgattache' => 'Attachement',
'filenotfound' => 'Documento no encontrado!',
'maxuploadsize' => 'Máxima subida en KB',
'maxsize' => 'Max %d KB',
'cssupdate' => 'Note: Css predeterminado está ahora hardcoded y puede ser removido de la configuración CSS',
'manualrefresh' => 'Recarga manual requerida',
'personalnotes' => 'Notas personales',
'filtermodkick' => 'Aplicar Kick filter en moderadores o administradores',
]; ];
?>

View File

@ -1,312 +0,0 @@
<?php
/*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - Spanish (ES) translation
*
* Copyright (C) 2015-2016 Daniel Winzen <d@winzen4.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//Native language name: Español (España)
$T=[
'nodb' => '¡Sin conexión a la base de datos!',
'nodbsetup' => '¡No pudo conectarse a la base de datos! Por favor crea la base de datos y edita el script para usarla con el nombre de usuario y clave dados.',
'changelang' => 'Cambiar idioma:',
'expire' => 'La sesión es inválida o expiró',
'kicked' => '¡Te expulsaron!',
'noconfirm' => '¡La contraseña y su confirmación no coinciden!',
'incorregex' => '¡Expresión regular incorrecta!',
'bottom' => 'Inicio',
'top' => 'Fin',
'choose' => '(elija)',
'setup' => 'Configuración del chat',
'init' => 'Configuración inicial',
'sulogin' => 'Registro de Superadministrador',
'sunick' => 'Apodo del superadmin:',
'supass' => 'Contraseña del superadmin:',
'suconfirm' => 'Confirmar contraseña:',
'susuccess' => '¡Registrado con éxito!',
'initbtn' => 'Inicializar chat',
'initdbexist' => '¡La base de datos ya existe! Para continuar, primero tienes que borrar esas tablas manualmente.',
'initsuexist' => '¡Ya existe un superadministrador!',
'initgosetup' => 'Ir a la página de configuración',
'captcha' => 'Captcha',
'enabled' => 'Habilitado',
'onlyguests' => 'Sólo para invitados',
'disabled' => 'Deshabilitado',
'simple' => 'Simple',
'moderate' => 'Moderado',
'extreme' => 'Extremo',
'nick' => 'Apodo:',
'pass' => 'Constraseña:',
'globalloginpass' => 'Contraseña global:',
'login' => 'Identificarse',
'dbupdate' => '¡La base de datos fue actualizada con éxito!',
'sysmessages' => 'Mensajes de sistema',
'msgenter' => 'Entrando',
'msgexit' => 'Saliendo',
'msgmemreg' => 'Miembro registrado',
'msgsureg' => 'Aplicante registrado',
'msgkick' => 'Expulsado',
'msgmultikick' => 'Expulsión múltiple',
'msgallkick' => 'Todos expulsados',
'msgclean' => 'Sala limpiada',
'dateformat' => '<a target="_blank" href="http://php.net/manual/en/function.date.php#refsect1-function.date-parameters">Date formating</a>',
'admfunc' => 'Funciones administrativas',
'allguests' => 'Todos invitados',
'cleanmsgs' => 'Limpiar mensajes',
'room' => 'Sala entera',
'selection' => 'Selección',
'cleannick' => 'Following nickname:',
'clean' => 'Clean',
'kickchat' => 'Expulsado (%d minutos)',
'kickreason' => 'Motivo de expulsión:',
'kickpurge' => 'Mensaje de purga',
'kick' => 'Expulsar',
'logoutinact' => 'Desconectar persona inactiva',
'logout' => 'Desconectar',
'sessions' => 'Ver sesiones activas',
'view' => 'Ver',
'filter' => 'Filtro',
'guestacc' => 'Change Guestaccess',
'guestallow' => 'Permitir',
'guestwait' => 'Permitir con sala de espera',
'adminallow' => 'Requiere aprobación del moderator',
'guestdisallow' => 'Sólo miembros',
'addsuguest' => 'Agregar aplicante',
'register' => 'Registrar',
'admmembers' => 'Miembros',
'memdel' => 'Borrar de la base de datos',
'memdeny' => 'Denegar acceso (!)',
'memsuguest' => 'Convertir en aplicante (G)',
'memreg' => 'Convertir en miembro regular',
'memmod' => 'Convertir en moderador (M)',
'memsumod' => 'Convertir en supermoderador (SM)',
'memadm' => 'Convertir administrador (A)',
'change' => 'Cambiar',
'regguest' => 'Registrar invitado',
'regmem' => 'Registrar miembro nuevo',
'sessact' => 'Sesiones activas',
'sessnick' => 'Apodo',
'sesstimeout' => 'Expiración',
'sessua' => 'Navegador',
'fid' => 'ID del filtro:',
'match' => 'Coincidencia',
'replace' => 'Reemplazar',
'allowpm' => 'Permitir en MP',
'regex' => 'Expresión regular',
'apply' => 'Aplicar',
'newfilter' => 'Filtro nuevo:',
'add' => 'Añadir',
'noframes' => 'Este chat usa <b>frames</b>. ¡Por favor, habilítalos en tu navegador o usa uno que los permita!',
'delselmes' => 'Borrar mensajes seleccionados',
'staffnotes' => 'Notas del equipo',
'adminnotes' => 'Notas de administrador',
'notessaved' => '¡Notas guardadas!',
'lastedited' => 'Editada por última vez por %1$s el %2$s',
'savenotes' => 'Guardar notas',
'waitingroom' => 'Sala de espera',
'waittext' => 'Bienvenido %1$s, tu identificación fue demorada, podrás acceder a la sala en %2$d segundos.',
'admwaittext' => 'Bienvenido %1$s, tu identificación fue demorada, podrás acceder a la sala en cuanto un administrador lo permita.',
'waitreload' => 'Si esta página no se actualiza cada %d segundos, usa el botón de abajo para hacerlo manualmente.',
'reload' => 'Recargar',
'rules' => 'Reglas',
'talkto' => 'Enviar a',
'toall' => 'Todos',
'tomem' => 'Sólo miembros',
'tostaff' => 'Sólo equipo',
'toadmin' => 'Sólo administradores',
'alsopurge' => 'Además purgar mensajes',
'dellast' => 'Eliminar el último mensaje',
'delall' => 'Eliminar todos los mensajes',
'switchsingle' => 'Cambiar a una sola línea',
'switchmulti' => 'Cambiar a múltiples líneas',
'help' => 'Ayuda',
'helpguest' => 'Todas las funciones deberían ser auto-explicativas, sólo usa los botones. En tu perfil puedes ajustar el tiempo de refresco, el color del texto y el tamaño de caja que prefieras.<br><u>Nota:</u> Esto es una sala de chat, así que si no te mantienes hablando, serás desconectado automáticamete luego de un tiempo.',
'helpembed' => 'Si quieres incluir una imagen en tu publicación, simplemente pon [img] al comienzo de la dirección URL de la imagen. Por ejemplo: [img]http://example.com/images/file.jpg incluirá la imagen en tu publicación.',
'helpmem' => 'Miembros: Tendrás algunas opciones adicionales en tu perfil. Podrás ajustar la tipografía del texto y cambiar la contraseña en cualquier momento.',
'helpmod' => 'Moderadores: Nota el botón de administración al final de la página. Te llevará a una página donde puedes limpiar la sala, expulsar personas, ver todas las sesiones activas y deshabilitar el acceso a invitados totalmente si fuese necesario.',
'helpadm' => 'Administradores: Además podrás registrar invitados, editar miembros y registrar nuevos apodos sin que estén en la sala.',
'profile' => 'Tu perfil',
'ignore' => 'Ignorar',
'unignore' => 'Dejar de ignorar',
'refreshrate' => 'Tiempo de actualización (5-150 segundos)',
'fontcolour' => 'Color de texto',
'viewexample' => 'Ver ejemplos',
'bgcolour' => 'Color de fondo',
'fontface' => 'Tipografía',
'roomdefault' => 'Sala por defecto',
'bold' => 'Negrita',
'italic' => 'Bastardilla',
'fontexample' => 'Ejemplo de la tipografía seleccionada',
'timestamps' => 'Mostrar fecha y hora',
'embed' => 'Habilitar imágenes',
'incognito' => 'Modo incógnito',
'pbsize' => 'Tamaño de la caja de publicación',
'nbsize' => 'Tamaño de la caja de notas',
'width' => 'Ancho:',
'height' => 'Alto:',
'changepass' => 'Cambiar la contraseña',
'oldpass' => 'Contraseña anterior:',
'newpass' => 'Contraseña nueva:',
'confirmpass' => 'Confirmar contraseña nueva:',
'savechanges' => 'Guardar cambios',
'reloadpb' => 'Recargar caja de publicación',
'reloadmsgs' => 'Recargar mensajes',
'chgprofile' => 'Perfil',
'adminbtn' => 'Admin',
'admnotes' => 'Notas de administrador',
'notes' => 'Notas',
'clone' => 'Clone',
'randh' => 'Reglas y ayuda',
'exit' => 'Salir de la sala',
'bye' => '¡Chau %s, visitanos pronto!',
'colourtable' => 'Colourtable',
'backtoprofile' => 'Volver a tu perfil',
'copy' => 'Copiar:',
'choosecol' => 'Invitado, elija un color:',
'randomcol' => 'Color al azar',
'enter' => 'Ingresar a la sala',
'error' => 'Error',
'members' => 'Miembros',
'guests' => 'Invitados',
'approveguests' => '%d nuevos invitados para aprobar',
'allowchecked' => 'Aceptar marcados',
'allowall' => 'Aceptar todos',
'denychecked' => 'Rechazar marcados',
'denyall' => 'Rechazar todos',
'denymessage' => 'Enviar mensaje a rechazados:',
'butallowdeny' => 'Enviar',
'waitempty' => 'No hay más peticiones para aprobar.',
'wrongcaptcha' => 'Captcha incorrecto',
'captchaexpire' => 'Captcha ya usado o expirado.',
'noguests' => '¡Perdón! Actualmente sólo se permiten miembros.',
'curchat' => 'Actualmente hay %d personas en la sala:',
'cantreg' => 'No pudo registrarse %s',
'alreadyreged' => '%s ya fue registrado.',
'successreg' => '%s se registro exitosamente.',
'cantchgstat' => 'No pudo cambiarse el estado de %s',
'succdel' => '%s fue eliminado de la base de datos.',
'succchg' => 'Se cambió el estado de %s exitosamente.',
'wrongpass' => '¡Constraseña incorrecta!',
'wrongglobalpass' => '¡Constraseña global incorrecta!',
'succprofile' => 'Tu perfil se guardó satisfactoriamente.',
'backtologin' => 'Volver a la página de identificación.',
'backtochat' => 'Vovler a la sala.',
'Beige' => 'Beis',
'Black' => 'Negro',
'Blue' => 'Azul',
'BlueViolet' => 'Azul violáceo',
'Brown' => 'Marrón',
'Cyan' => 'Cian',
'DarkBlue' => 'Azul oscuro',
'DarkGreen' => 'Verde oscuro',
'DarkRed' => 'Rojo oscuro',
'DarkViolet' => 'Violeta oscuro',
'DeepSkyBlue' => 'Azul celeste',
'Gold' => 'Dorado',
'Grey' => 'Gris',
'Green' => 'Verde',
'HotPink' => 'Rosa cálido',
'Indigo' => 'Índigo',
'LightBlue' => 'Azul claro',
'LightGreen' => 'Verde claro',
'LimeGreen' => 'Verde lima',
'Magenta' => 'Magenta',
'Olive' => 'Oliva',
'Orange' => 'Naranja',
'OrangeRed' => 'Rojo anaranjado',
'Purple' => 'Púrpura',
'Red' => 'Rojo',
'RoyalBlue' => 'Azul real',
'SeaGreen' => 'Verde marino',
'Sienna' => 'Siena',
'Silver' => 'Plateado',
'Tan' => 'Bronceado',
'Teal' => 'Cerceta',
'Violet' => 'Violeta',
'White' => 'Blanco',
'Yellow' => 'Amarillo',
'YellowGreen' => 'Verde amarillento',
'redirectto' => 'Redirigir hacia:',
'nonhttp' => 'Petición de enlace que no es http:',
'httpredir' => 'Si no funciona, prueba esto:',
'actions' => 'Acciones',
'sesip' => 'Dirección IP',
'css' => 'Estilo CSS',
'memberexpire' => 'Expiración para miembros (minutos)',
'guestexpire' => 'Expiración para invitados (minutos)',
'kickpenalty' => 'Penalidad al expulsar (minutos)',
'entrywait' => 'Tiempo en sala de espera (segundos)',
'captchatime' => 'Expiración de captcha (segundos)',
'messageexpire' => 'Expiracíon de mensajes (minutos)',
'messagelimit' => 'Límite de mensajes (público)',
'maxmessage' => 'Largo máximo de mensaje',
'confirm' => '¿Estás seguro?',
'yes' => 'Sí',
'no' => 'No',
'colbg' => 'Color de fondo',
'coltxt' => 'Color de texto',
'maxname' => 'Largo máximo para apodos',
'minpass' => 'Largo mínimo para contraseñas',
'defaultrefresh' => 'Tiempo de refresco de mensajes por defecto (segundos)',
'suguests' => 'Habilitar aplicantes',
'rulestxt' => 'Reglas (html)',
'imgembed' => 'Imágenes incrustadas',
'trackip' => 'Mostrar IP de la sesión',
'captchachars' => 'Caracteres usados en el Captcha',
'memkick' => 'Los miembros pueden expulsar, si no hay moderador presente',
'forceredirect' => 'Forzar redirección',
'redirect' => 'Script de redirección personalizado',
'backuprestore' => 'Respaldar y restaurar',
'backup' => 'Respaldar',
'restore' => 'Restaurar',
'settings' => 'Preferencias',
'linkfilter' => 'Filtro de enlaces',
'chatname' => 'Nombre de la sala',
'destroy' => 'Destruir sala',
'destroyed' => 'Sala destruida satisfactoriamente',
'topic' => 'Asunto',
'passreset' => 'Reiniciar contraseña',
'cantresetpass' => 'Can\'t reset password',
'succpassreset' => 'Successfully reset password',
'entermsg' => '%s entró en la sala.',
'exitmsg' => '%s se fue de la sala.',
'memregmsg' => '%s ahora es un miembro registrado.',
'suregmsg' => '%s ahora es un aplicante registrado.',
'kickmsg' => '%s fue expulsado.',
'multikickmsg' => '%s fueron expulsados.',
'allkickmsg' => 'Todas las personas fueron expulsadas.',
'cleanmsg' => '%s fue limpiada.',
'sendallmsg' => '%s - ',
'sendmemmsg' => '[M] %s - ',
'sendmodmsg' => '[Equipo] %s - ',
'sendadmmsg' => '[Admin] %s - ',
'sendprvmsg' => '[%1$s a %2$s] - ',
'msgsendall' => 'Mensajes a todos',
'msgsendmem' => 'Sólo mensajes a miembros',
'msgsendmod' => 'Sólo mensajes a equipo',
'msgsendadm' => 'Sólo mensajes a administradores',
'msgsendprv' => 'Mensaje privado',
'numnotes' => 'Number of notes revisions to keep',
'revisions' => 'Revisiones:',
'older' => 'Older',
'newer' => 'Newer',
'accessdenied' => 'Acceso denegado',
'loggedinas' => 'Estás identificado como %s y no tenés acceso a esta sección.',
'newnickname' => 'Nuevo apodo:',
'nicknametaken' => 'Ese apodo ya fue tomado',
'nopass' => 'Constraseña incorrecta (al menos %d caracteres), no se cambia apodo'
];
?>

View File

@ -2,7 +2,7 @@
/* /*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - French translation * LE CHAT-PHP - a PHP Chat based on LE CHAT - French translation
* *
* Copyright (C) 2015-2016 Daniel Winzen <d@winzen4.de> * Copyright (C) 2015-2017 Daniel Winzen <d@winzen4.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -153,10 +153,6 @@ $T=[
'timestamps' => 'Afficher l\'horodatage', 'timestamps' => 'Afficher l\'horodatage',
'embed' => 'Images imbriquées', 'embed' => 'Images imbriquées',
'incognito' => 'Mode incognito', 'incognito' => 'Mode incognito',
'pbsize' => 'Dimension de la boite du texte',
'nbsize' => 'Dimension de la boite du chat',
'width' => 'Largeur:',
'height' => 'Hauteur:',
'changepass' => 'Changer le mot de passe', 'changepass' => 'Changer le mot de passe',
'oldpass' => 'Ancien mot de passe:', 'oldpass' => 'Ancien mot de passe:',
'newpass' => 'Nouveau mot de passe:', 'newpass' => 'Nouveau mot de passe:',
@ -309,4 +305,4 @@ $T=[
'nicknametaken' => 'Pseudo déjà pris', 'nicknametaken' => 'Pseudo déjà pris',
'nopass' => 'Mot de passe invalide (au moins % caractères), ne pas changer le pseudo', 'nopass' => 'Mot de passe invalide (au moins % caractères), ne pas changer le pseudo',
]; ];
?>

View File

@ -2,7 +2,7 @@
/* /*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - Indonesian translation * LE CHAT-PHP - a PHP Chat based on LE CHAT - Indonesian translation
* *
* Copyright (C) 2015-2016 Daniel Winzen <d@winzen4.de> * Copyright (C) 2015-2017 Daniel Winzen <d@winzen4.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -153,10 +153,6 @@ $T=[
'timestamps' => 'Tunjukkan penanda waktu', 'timestamps' => 'Tunjukkan penanda waktu',
'embed' => 'Tanamkan gambar', 'embed' => 'Tanamkan gambar',
'incognito' => 'Mode penyamaran', 'incognito' => 'Mode penyamaran',
'pbsize' => 'Ukuran kotak pos',
'nbsize' => 'Ukuran otak catatan',
'width' => 'Lebar:',
'height' => 'Tinggi:',
'changepass' => 'Ubah kata sandi', 'changepass' => 'Ubah kata sandi',
'oldpass' => 'Kata sandi lama:', 'oldpass' => 'Kata sandi lama:',
'newpass' => 'Kata sandi baru:', 'newpass' => 'Kata sandi baru:',
@ -309,4 +305,4 @@ $T=[
'nicknametaken' => 'Nama sudah ada', 'nicknametaken' => 'Nama sudah ada',
'nopass' => 'Kata sandi salah (Minimal %d karakter), tak merubah nama' 'nopass' => 'Kata sandi salah (Minimal %d karakter), tak merubah nama'
]; ];
?>

View File

@ -2,7 +2,7 @@
/* /*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - Russian translation * LE CHAT-PHP - a PHP Chat based on LE CHAT - Russian translation
* *
* Copyright (C) 2015-2016 Daniel Winzen <d@winzen4.de> * Copyright (C) 2015-2017 Daniel Winzen <d@winzen4.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -25,7 +25,9 @@ $T=[
'changelang' => 'Изменить язык:', 'changelang' => 'Изменить язык:',
'expire' => 'Недействительная/с истекшим сроком сессия', 'expire' => 'Недействительная/с истекшим сроком сессия',
'kicked' => 'Забанен!', 'kicked' => 'Забанен!',
'noconfirm' => 'Подтверждение пароля не совпадает!', 'invalnick' => 'Некорректное имя (%1$d символов максимум и оно должно совпадать с выражением "%2$s")',
'invalpass' => 'Некорректный пароль (Хотя бы %1$d символов и он должен совпадать с выражением "%2$s")',
'noconfirm' => 'Введенные пароли не совпадают!',
'incorregex' => 'Неправильное регулярное выражение!', 'incorregex' => 'Неправильное регулярное выражение!',
'bottom' => 'Вниз', 'bottom' => 'Вниз',
'top' => 'Вверх', 'top' => 'Вверх',
@ -117,9 +119,9 @@ $T=[
'lastedited' => 'Последний раз редактировал %1$s %2$s', 'lastedited' => 'Последний раз редактировал %1$s %2$s',
'savenotes' => 'Сохранить заметки', 'savenotes' => 'Сохранить заметки',
'waitingroom' => 'Гостевая', 'waitingroom' => 'Гостевая',
'waittext' => 'Добро пожаловать %1$s, Ваш логин задерживается, Вы можете получить доступ в чат через %2$d секунд.', 'waittext' => 'Добро пожаловать %1$s, наблюдается задержка входа, доступ к чату будет осуществлен через %2$d секунд.',
'admwaittext' => 'Добро пожаловать %1$s, Ваш логин задерживается, Вы можете получить доступ в чат в ближайшее время, когда разрешит модератор.', 'admwaittext' => 'Добро пожаловать %1$s, наблюдается задержка входа, доступ к чату будет доступен после подтверждения модератором.',
'waitreload' => 'Если эта страница не отвечает, обновления каждые %d секунд, используйте кнопку ниже, чтобы загрузить его вручную!', 'waitreload' => 'Если эта страница не отвечает, не обновляется каждые %d секунд, используйте кнопку ниже, чтобы перезагрузить ее вручную!',
'reload' => 'Перезагрузить', 'reload' => 'Перезагрузить',
'rules' => 'Правила', 'rules' => 'Правила',
'talkto' => 'Отправить', 'talkto' => 'Отправить',
@ -130,13 +132,13 @@ $T=[
'alsopurge' => 'Также очистить сообщения', 'alsopurge' => 'Также очистить сообщения',
'dellast' => 'Удалить последнее сообщение', 'dellast' => 'Удалить последнее сообщение',
'delall' => 'Удалить все сообщения', 'delall' => 'Удалить все сообщения',
'switchsingle' => 'Переключитесь на одну линию', 'switchsingle' => 'Включить однострочный режим',
'switchmulti' => 'Переключитесь на мульти-линию', 'switchmulti' => 'Включить многострочный режим',
'help' => 'Помощь', 'help' => 'Помощь',
'helpguest' => 'Все функции интуитивно понятны, просто используйте кнопки. В настройках вашего профиля вы можете настроить частоту обновления, цвет шрифта и желаемый размер окна входа.<br><u>Заметка:</u> Это чат, поэтому даже если вы ничего не пишете, то будете автоматически зарегистрированы через некоторое время..', 'helpguest' => 'Все функции интуитивно понятны, просто используйте кнопки. В настройках вашего профиля вы можете настроить частоту обновления, цвет шрифта и желаемый размер окна входа.<br><u>Заметка:</u> Это чат, поэтому даже если вы ничего не пишете, то будете автоматически зарегистрированы через некоторое время..',
'helpembed' => 'Если вы хотите встроить изображение в свой пост, просто положите [img] перед вашим URL-изображением. Пример: [img]http://example.com/images/file.jpg будет вставлять изображения в вашем посте.<br>', 'helpembed' => 'Если вы хотите встроить изображение в свой пост, прикрепите [img] перед вашим URL-изображением. Пример: [img]http://example.com/images/file.jpg будет прикреплять картинку к вашему сообщению.<br>',
'helpmem' => 'Участники: У вас есть несколько вариантов настроек в вашем профиле. Можно настроить шрифт и изменить свой пароль в любое время.', 'helpmem' => 'Участники: У вас есть несколько вариантов настроек в вашем профиле. Можно настроить шрифт и изменить свой пароль в любое время.',
'helpmod' => 'Модераторы: Обратите внимание кнопку администратора внизу. Это перенесет на страницу, где вы можете очистить комнату, забанить, просмотреть все активные сеансы и отключить гостевой доступ полностью, если необходимо.', 'helpmod' => 'Модераторы: Обратите внимание кнопку администратора внизу. Это перенесет вас на страницу, где вы можете очистить комнату, забанить, просмотреть все активные сеансы и отключить гостевой доступ полностью, если необходимо.',
'helpadm' => 'Администраторы: Вы способны регистрировать гостей, редактировать пользователей и регистрировать новые ники без их присутствия в комнате.', 'helpadm' => 'Администраторы: Вы способны регистрировать гостей, редактировать пользователей и регистрировать новые ники без их присутствия в комнате.',
'profile' => 'Ваш профиль', 'profile' => 'Ваш профиль',
'ignore' => 'Игнорировать', 'ignore' => 'Игнорировать',
@ -149,14 +151,12 @@ $T=[
'roomdefault' => 'По умолчанию', 'roomdefault' => 'По умолчанию',
'bold' => 'Жирный', 'bold' => 'Жирный',
'italic' => 'Курсив', 'italic' => 'Курсив',
'small' => 'Маленький',
'fontexample' => 'Пример выбранного вами шрифта', 'fontexample' => 'Пример выбранного вами шрифта',
'timestamps' => 'Показать отметки времени', 'timestamps' => 'Показать отметки времени',
'embed' => 'Вставить изображения', 'embed' => 'Вставить изображения',
'incognito' => 'Режим инкогнито', 'incognito' => 'Режим инкогнито',
'pbsize' => 'Размер окна сообщений', 'changenick' => 'Изменить имя',
'nbsize' => 'Размер окна заметок',
'width' => 'Ширина:',
'height' => 'Высота:',
'changepass' => 'Изменить пароль', 'changepass' => 'Изменить пароль',
'oldpass' => 'Старый пароль:', 'oldpass' => 'Старый пароль:',
'newpass' => 'Новый пароль:', 'newpass' => 'Новый пароль:',
@ -175,21 +175,21 @@ $T=[
'colourtable' => 'Примеры цветов', 'colourtable' => 'Примеры цветов',
'backtoprofile' => 'Вернуться к вашему профилю', 'backtoprofile' => 'Вернуться к вашему профилю',
'copy' => 'Копия:', 'copy' => 'Копия:',
'choosecol' => 'Гости выбирают цвет:', 'choosecol' => 'Выберите ваш цвет:',
'randomcol' => 'Случайный цвет', 'randomcol' => 'Случайный цвет',
'enter' => 'Войти в чат', 'enter' => 'Войти в чат',
'error' => 'Ошибка', 'error' => 'Ошибка',
'members' => 'Зарегистрированные', 'members' => 'Зарегистрированные',
'guests' => 'Гости', 'guests' => 'Гости',
'approveguests' => '%d новые гости для одобрения', 'approveguests' => '%d новые гости для одобрения',
'allowchecked' => 'Разрешить проверять', 'allowchecked' => 'Разрешить проверку',
'allowall' => 'Позволять всем', 'allowall' => 'Разрешить всем',
'denychecked' => 'Запретить проверять', 'denychecked' => 'Запретить проверку',
'denyall' => 'Запретить всем', 'denyall' => 'Запретить всем',
'denymessage' => 'Отправить сообщение с отказом:', 'denymessage' => 'Отправить сообщение с отказом:',
'butallowdeny' => 'Отправить', 'butallowdeny' => 'Отправить',
'waitempty' => 'Нет больше запросов для одобрения.', 'waitempty' => 'Больше запросов для одобрения нет.',
'wrongcaptcha' => 'Неправильный код', 'wrongcaptcha' => 'Неверная капча!',
'captchaexpire' => 'Защитный код уже используется или время истекло.', 'captchaexpire' => 'Защитный код уже используется или время истекло.',
'noguests' => 'Извините, входят только зарегистрированные!', 'noguests' => 'Извините, входят только зарегистрированные!',
'curchat' => 'Сейчас %d разговор (ов) в комнате:', 'curchat' => 'Сейчас %d разговор (ов) в комнате:',
@ -261,18 +261,109 @@ $T=[
'maxname' => 'Максимальная длина имени', 'maxname' => 'Максимальная длина имени',
'minpass' => 'Минимальная длина пароля', 'minpass' => 'Минимальная длина пароля',
'defaultrefresh' => 'По умолчанию время перезагрузки сообщения (секунды)', 'defaultrefresh' => 'По умолчанию время перезагрузки сообщения (секунды)',
'suguests' => 'Включить заявителей', 'suguests' => 'Разрешить гостей',
'rulestxt' => 'Правила (html)', 'rulestxt' => 'Правила (html)',
'imgembed' => 'Вставка изображений', 'imgembed' => 'Вставка изображений',
'trackip' => 'Показать IP-сессию', 'trackip' => 'Показать IP-сессию',
'captchachars' => 'Символы, используемые в Captcha', 'captchachars' => 'Символы, используемые в Captcha',
'memkick' => 'Пользователи могут банить, если не присутствует модератор', 'memkick' => 'Пользователи могут исключать, если не присутствует модератор',
'forceredirect' => 'Принудительное перенаправление', 'forceredirect' => 'Принудительное перенаправление',
'redirect' => 'Пользовательский скрипт перенаправления', 'redirect' => 'Пользовательский скрипт перенаправления',
'backuprestore' => 'Бэкап и восстановление', 'backuprestore' => 'Бэкап и восстановление',
'backup' => 'Бэкап', 'backup' => 'Бэкап',
'restore' => 'Восстановление', 'restore' => 'Восстановление',
'settings' => 'Настройки', 'settings' => 'Настройки',
'linkfilter' => 'Фильтрация ссылок' 'linkfilter' => 'Фильтрация ссылок',
'chatname' => 'Название чата',
'destroy' => 'Уничтожить чат',
'destroyed' => 'Чат успешно уничтожен',
'topic' => 'Тема',
'passreset' => 'Сброс пароля',
'cantresetpass' => 'Невозможно сбросить пароль',
'succpassreset' => 'Пароль успешно сброшен',
'entermsg' => '%s вошел в чат.',
'exitmsg' => '%s покинул чат.',
'memregmsg' => '%s теперь зарегистрированный член.',
'suregmsg' => '%s теперь зарегистрированный заявитель.',
'kickmsg' => '%s исключен из чата.',
'multikickmsg' => '%s исключены из чата.',
'allkickmsg' => 'Все гости исключены из чата.',
'cleanmsg' => '%s был очищен.',
'sendallmsg' => '%s - ',
'sendmemmsg' => '[M] %s - ',
'sendmodmsg' => '[Staff] %s - ',
'sendadmmsg' => '[Admin] %s - ',
'sendprvmsg' => '[%1$s to %2$s] - ',
'msgsendall' => 'Сообщение всем',
'msgsendmem' => 'Сообщение только членам',
'msgsendmod' => 'Сообщение только модераторам',
'msgsendadm' => 'Сообщение только администраторам',
'msgsendprv' => 'Личное сообщение',
'numnotes' => 'Число исправлений для сохранения',
'revisions' => 'Исправления:',
'older' => 'Старые',
'newer' => 'Новые',
'accessdenied' => 'В доступе отказано.',
'loggedinas' => 'Вы вошли как %s и не имеете доступа к этой секции.',
'newnickname' => 'Новое имя:',
'nicknametaken' => 'Имя уже занято',
'nopass' => 'Некорректный пароль (Хотя бы %d символов), не меняя имени',
'gdextrequired' => 'The gd extension of PHP is required for this feature. Please install it first.',
'memcachedextrequired' => 'The memcached extension of PHP is required for the caching feature. Please install it first or set the memcached setting back to false.',
'opensslextrequired' => 'The openssl extension of PHP is required for the encryption feature. Please install it first or set the encrypted setting back to false.',
'pdo_mysqlextrequired' => 'The pdo_mysql extension of PHP is required for the selected database driver. Please install it first.',
'pdo_pgsqlextrequired' => 'The pdo_pgsql extension of PHP is required for the selected database driver. Please install it first.',
'pdo_sqliteextrequired' => 'The pdo_sqlite extension of PHP is required for the selected database driver. Please install it first.',
'jsonextrequired' => 'The json extension of PHP is required for this feature. Please install it first.',
'sendmail' => 'Отправить сообщение как новое публичное сообщение',
'mailsender' => 'Отправить сообщение используя этот адрес',
'mailreceiver' => 'Отправить сообщение по этому адресу',
'modfallback' => 'Вернуться в комнату ожидания, если отстутсвует модератор для подтверждения гостей',
'regpass' => 'Повторите пароль<br>Зарегистрироваться',
'guestreg' => 'Разрешить гостям регистрироваться самостоятельно',
'asmember' => 'Как член',
'assuguest' => 'Как заявитель',
'fatalerror' => 'Фатальная ошибка',
'prevmatch' => 'Тексты в полях совпадают',
'matchtoolong' => 'Текст в поле слишком длинное. Можно использовать максимум 255 символов, попробуйте разбить поле на части.',
'nocache' => 'Автопрокрутка (для старых браузеров, для сортрировки сверху-вниз).',
'disablepm' => 'Отключить личные сообщения',
'disablechat' => 'Отключить чат',
'disabletext' => 'Чат отключил сообщение (html)',
'disabledtext' => 'Временно отключен',
'defaulttz' => 'Часовой пояс по умолчанию',
'tz' => 'Часовой пояс',
'optional' => '(опционально)',
'userloggedin' => 'Пользователь с этим именем уже в сети.',
'regednick' => 'Это имя принадлежит зарегистрированному пользователю.',
'eninbox' => 'Включить оффлайн-почту',
'inboxmsgs' => 'Прочитайте %d входящих сообщений',
'offline' => '(оффлайн)',
'deleteacc' => 'Удалить аккаунт',
'eninnone' => 'Ни для кого',
'eninall' => 'Для всех',
'eninmem' => 'Только для членов',
'eninstaff' => 'Только для модераторов',
'eninadmin' => 'Только для админов',
'nickregex' => 'Nickname regex',
'passregex' => 'Password regex',
'externalcss' => 'Ссылка на внешний CSS файл',
'greetingmsg' => 'Добро пожаловать %s!',
'entryhelp' => 'Если это окно не обновится в течение %d секунд, Вам нужно включить автоматическое обновление (meta refresh) в вашем браузере. Также убедитесь в отстутствии веб-фильтра, проверьте настройки прокси, либо плагины браузера на блокировку автоматического обновления! Примеры плагинов: "Polipo", "NoScript", и т.д.<br>Тем не менее, (в случае ошибок перезагрузки страниц из-за сервера/прокси) Вы всегда можете использовать кнопки внизу страницы для ручного обновления страницыы.',
'enablegreeting' => 'Показывать приветственное сообщение перед остальными сообщениями',
'unban' => 'Разблокировать',
'sortupdown' => 'Сортировать сообщения сверху вниз',
'sortframe' => 'Перестроить',
'cs' => 'Регистр-чувствительный',
'hidechatters' => 'Спрятать список людей в чате',
'enfileupload' => 'Разрешить файловые загрузки',
'msgattache' => 'Прикрепление',
'filenotfound' => 'Файл не обнаружен!',
'maxuploadsize' => 'Максимальный размер файла в КБ',
'maxsize' => 'Макс. %d КБ',
'cssupdate' => 'Note: Default CSS is now hardcoded and can be removed from the CSS setting',
'manualrefresh' => 'Требуется обновить страницу вручную',
'personalnotes' => 'Личные заметки',
'filtermodkick' => 'Применить фильтр исключения для модераторов',
]; ];
?>

View File

@ -1,14 +1,14 @@
<?php <?php
$native = 'Deutsch'; // Native lanugae name $native = 'Español (España)'; // Native lanugae name
$english = 'German'; // Enlish language name $english = 'Spanish (ES)'; // Enlish language name
$code = 'de'; // Language code $code = 'es_ES'; // Language code
ob_start(); ob_start();
echo "<?php $file = "<?php
/* /*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - $english translation * LE CHAT-PHP - a PHP Chat based on LE CHAT - $english translation
* *
* Copyright (C) 2015-2016 Daniel Winzen <d@winzen4.de> * Copyright (C) 2015-2017 Daniel Winzen <d@winzen4.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -37,9 +37,7 @@ foreach($T as $id=>$value){
} }
} }
foreach($I as $id=>$value){ foreach($I as $id=>$value){
echo "\t'$id' => '".str_replace("'", "\'", $value)."',\n"; $file .= "\t'$id' => '".str_replace("'", "\'", $value)."',\n";
} }
echo "];\n?>\n"; $file .= "];\n";
$file=ob_get_clean();
file_put_contents("lang_$code.php", $file); file_put_contents("lang_$code.php", $file);
?>

View File

@ -2,7 +2,7 @@
/* /*
* LE CHAT-PHP - a PHP Chat based on LE CHAT - Simplified Chinese translation * LE CHAT-PHP - a PHP Chat based on LE CHAT - Simplified Chinese translation
* *
* Copyright (C) 2015-2016 Daniel Winzen <d@winzen4.de> * Copyright (C) 2015-2017 Daniel Winzen <d@winzen4.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -155,10 +155,6 @@ $T=[
'timestamps' => 'Show Timestamps', 'timestamps' => 'Show Timestamps',
'embed' => 'Embed images', 'embed' => 'Embed images',
'incognito' => 'Incognito mode', 'incognito' => 'Incognito mode',
'pbsize' => 'Post box size',
'nbsize' => 'Notes box size',
'width' => 'Width:',
'height' => 'Height:',
'changepass' => 'Change Password', 'changepass' => 'Change Password',
'oldpass' => 'Old password:', 'oldpass' => 'Old password:',
'newpass' => 'New password:', 'newpass' => 'New password:',
@ -365,4 +361,4 @@ $T=[
'maxsize' => 'Max %d KB', 'maxsize' => 'Max %d KB',
'cssupdate' => 'Note: Default CSS is now hardcoded and can be removed from the CSS setting', 'cssupdate' => 'Note: Default CSS is now hardcoded and can be removed from the CSS setting',
]; ];
?>