diff --git a/.gitignore b/.gitignore index 7657407c..eee0e4e4 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ /templates/cache # other stuff -.DS_Store? +.DS_Store thumbs.db Icon? Thumbs.db diff --git a/README.md b/README.md index 50dcc621..b98e0dad 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,13 @@ Tinyboard - A lightweight PHP imageboard. ========================================== +Tinyboard + vichan-devel +------------ +Tinyboard branch taking lightweightness somewhat more liberally. Running live at +https://pl.vichan.net/ (Polish) and http://vichan.net/ (International; may be outdated). + +It contains many changes from original Tinyboard, mainly in frontend area. + About ------------ Tinyboard is a light-weight, fast, highly configurable and user-friendly diff --git a/inc/api.php b/inc/api.php new file mode 100644 index 00000000..5592d8af --- /dev/null +++ b/inc/api.php @@ -0,0 +1,123 @@ + 'no', + 'thread' => 'resto', + 'subject' => 'sub', + 'email' => 'email', + 'name' => 'name', + 'trip' => 'trip', + 'capcode' => 'capcode', + 'body' => 'com', + 'time' => 'time', + 'thumb' => 'thumb', // non-compatible field + 'thumbx' => 'tn_w', + 'thumby' => 'tn_h', + 'file' => 'file', // non-compatible field + 'filex' => 'w', + 'filey' => 'h', + 'filesize' => 'fsize', + //'filename' => 'filename', + 'omitted' => 'omitted_posts', + 'omitted_images' => 'omitted_images', + //'posts' => 'replies', + //'ip' => '', + 'sticky' => 'sticky', + 'locked' => 'locked', + //'bumplocked' => '', + //'embed' => '', + //'root' => '', + //'mod' => '', + //'hr' => '', + ); + + static $ints = array( + 'no' => 1, + 'resto' => 1, + 'time' => 1, + 'tn_w' => 1, + 'tn_h' => 1, + 'w' => 1, + 'h' => 1, + 'fsize' => 1, + 'omitted_posts' => 1, + 'omitted_images' => 1, + 'sticky' => 1, + 'locked' => 1, + ); + + private function translatePost($post) { + $apiPost = array(); + foreach (self::$postFields as $local => $translated) { + if (!isset($post->$local)) + continue; + + $toInt = isset(self::$ints[$translated]); + $val = $post->$local; + if ($val !== null && $val !== '') { + $apiPost[$translated] = $toInt ? (int) $val : $val; + } + } + + if (isset($post->filename)) { + $dotPos = strrpos($post->filename, '.'); + $apiPost['filename'] = substr($post->filename, 0, $dotPos); + $apiPost['ext'] = substr($post->filename, $dotPos); + } + + return $apiPost; + } + + function translateThread(Thread $thread) { + $apiPosts = array(); + $op = $this->translatePost($thread); + $op['resto'] = 0; + $apiPosts['posts'][] = $op; + + foreach ($thread->posts as $p) { + $apiPosts['posts'][] = $this->translatePost($p); + } + + return $apiPosts; + } + + function translatePage(array $threads) { + $apiPage = array(); + foreach ($threads as $thread) { + $apiPage['threads'][] = $this->translateThread($thread); + } + return $apiPage; + } + + function translateCatalogPage(array $threads) { + $apiPage = array(); + foreach ($threads as $thread) { + $ts = $this->translateThread($thread); + $apiPage['threads'][] = current($ts['posts']); + } + return $apiPage; + } + + function translateCatalog($catalog) { + $apiCatalog = array(); + foreach ($catalog as $page => $threads) { + $apiPage = $this->translateCatalogPage($threads); + $apiPage['page'] = $page; + $apiCatalog[] = $apiPage; + } + + return $apiCatalog; + } +} diff --git a/inc/config.php b/inc/config.php index 729c23ea..a3b3d528 100644 --- a/inc/config.php +++ b/inc/config.php @@ -326,6 +326,11 @@ // Reply limit (stops bumping thread when this is reached) $config['reply_limit'] = 250; + // Image hard limit (stops allowing new image replies when this is reached if not zero) + $config['image_hard_limit'] = 0; + // Reply hard limit (stops allowing new replies when this is reached if not zero) + $config['reply_hard_limit'] = 0; + // Strip repeating characters when making hashes $config['robot_enable'] = false; $config['robot_strip_repeating'] = true; @@ -379,6 +384,9 @@ // When true, a blank password will be used for files (not usable for deletion). $config['field_disable_password'] = false; + // Require users to see the ban page at least once for a ban even if it has since expired? + $config['require_ban_view'] = false; + /* * ==================== * Markup settings @@ -552,6 +560,9 @@ // Number of characters in the poster ID (maximum is 40) $config['poster_id_length'] = 5; + // Show thread subject in page title? + $config['thread_subject_in_title'] = false; + // Page footer $config['footer'][] = 'All trademarks, copyrights, comments, and images on this page are owned by and are the responsibility of their respective parties.'; @@ -696,6 +707,8 @@ $config['error']['noboard'] = _('Invalid board!'); $config['error']['nonexistant'] = _('Thread specified does not exist.'); $config['error']['locked'] = _('Thread locked. You may not reply at this time.'); + $config['error']['reply_hard_limit'] = _('Thread has reached its maximum reply limit.'); + $config['error']['image_hard_limit'] = _('Thread has reached its maximum image limit.'); $config['error']['nopost'] = _('You didn\'t make a post.'); $config['error']['flood'] = _('Flood detected; Post discarded.'); $config['error']['spam'] = _('Your request looks automated; Post discarded.'); @@ -723,6 +736,7 @@ $config['error']['captcha'] = _('You seem to have mistyped the verification.'); // Moderator errors + $config['error']['toomanyunban'] = _('You are only allowed to unban %s users at a time. You tried to unban %u users.'); $config['error']['invalid'] = _('Invalid username and/or password.'); $config['error']['notamod'] = _('You are not a mod…'); $config['error']['invalidafter'] = _('Invalid username and/or password. Your user may have been deleted or changed.'); @@ -810,6 +824,9 @@ * Mod settings * ==================== */ + + // Limit how many bans can be removed via the ban list. (Set too -1 to remove limit.) + $config['mod']['unban_limit'] = 5; // Whether or not to lock moderator sessions to the IP address that was logged in with. $config['mod']['lock_ip'] = true; @@ -900,8 +917,8 @@ $config['mod']['shadow_mesage'] = 'Moved to %s.'; // Capcode to use when posting the above message. $config['mod']['shadow_capcode'] = 'Mod'; - // Name to use when posting the above message. - $config['mod']['shadow_name'] = $config['anonymous']; + // Name to use when posting the above message. If false, the default board name will be used. If something else, that will be used. + $config['mod']['shadow_name'] = false; // Wait indefinitely when rebuilding everything $config['mod']['rebuild_timelimit'] = 0; @@ -912,6 +929,9 @@ // Edit raw HTML in posts by default $config['mod']['raw_html_default'] = false; + // Automatically dismiss all reports regarding a thread when it is locked + $config['mod']['dismiss_reports_on_lock'] = true; + // Probably best not to change these: if (!defined('JANITOR')) { define('JANITOR', 0, true); @@ -1028,6 +1048,9 @@ $config['mod']['createusers'] = ADMIN; // View the moderation log $config['mod']['modlog'] = ADMIN; + // View relevant moderation log entries on IP address pages (ie. ban history, etc.) + // Warning: Can be pretty resource exhaustive if your mod logs are huge. + $config['mod']['modlog_ip'] = MOD; // Create a PM (viewing mod usernames) $config['mod']['create_pm'] = JANITOR; // Read any PM, sent to or from anybody diff --git a/inc/display.php b/inc/display.php index 9be772e4..ba55903d 100644 --- a/inc/display.php +++ b/inc/display.php @@ -118,7 +118,7 @@ function pm_snippet($body, $len=null) { // calculate strlen() so we can add "..." after if needed $strlen = mb_strlen($body); - $body = substr($body, 0, $len); + $body = mb_substr($body, 0, $len); // Re-escape the characters. return '' . utf8tohtml($body) . ($strlen > $len ? '…' : '') . ''; @@ -204,7 +204,7 @@ function truncate($body, $url, $max_lines = false, $max_chars = false) { } } else { // remove broken HTML entity at the end (if existent) - $body = preg_replace('/&[^;]+$/', '', $body); + $body = preg_replace('/&[^;]*$/', '', $body); } $body .= 'Post too long. Click here to view the full text.'; @@ -213,6 +213,25 @@ function truncate($body, $url, $max_lines = false, $max_chars = false) { return $body; } +function bidi_cleanup($str){ + # Removes all embedded RTL and LTR unicode formatting blocks in a string so that + # it can be used inside another without controlling its direction. + # More info: http://www.iamcal.com/understanding-bidirectional-text/ + # + # LRE - U+202A - 0xE2 0x80 0xAA + # RLE - U+202B - 0xE2 0x80 0xAB + # LRO - U+202D - 0xE2 0x80 0xAD + # RLO - U+202E - 0xE2 0x80 0xAE + # + # PDF - U+202C - 0xE2 0x80 0xAC + # + $explicits = '\xE2\x80\xAA|\xE2\x80\xAB|\xE2\x80\xAD|\xE2\x80\xAE'; + $pdf = '\xE2\x80\xAC'; + + $str = preg_replace("!(?$explicits)|(?$pdf)!", '', $str); + return $str; +} + function secure_link_confirm($text, $title, $confirm_message, $href) { global $config; diff --git a/inc/filters.php b/inc/filters.php index 0b5eb3c1..524d37cf 100644 --- a/inc/filters.php +++ b/inc/filters.php @@ -81,7 +81,7 @@ class Filter { else $all_boards = false; - $query = prepare("INSERT INTO `bans` VALUES (NULL, :ip, :mod, :set, :expires, :reason, :board)"); + $query = prepare("INSERT INTO `bans` VALUES (NULL, :ip, :mod, :set, :expires, :reason, :board, 0)"); $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']); $query->bindValue(':mod', -1); $query->bindValue(':set', time()); diff --git a/inc/functions.php b/inc/functions.php index 5cf539ce..fe1e254c 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -13,6 +13,7 @@ require_once 'inc/display.php'; require_once 'inc/template.php'; require_once 'inc/database.php'; require_once 'inc/events.php'; +require_once 'inc/api.php'; require_once 'inc/lib/gettext/gettext.inc'; // the user is not currently logged in as a moderator @@ -78,7 +79,7 @@ function loadConfig() { if ($config['debug']) { if (!isset($debug)) { - $debug = array('sql' => array(), 'purge' => array(), 'cached' => array()); + $debug = array('sql' => array(), 'purge' => array(), 'cached' => array(), 'write' => array()); $debug['start'] = microtime(true); } } @@ -239,12 +240,12 @@ function create_antibot($board, $thread = null) { return _create_antibot($board, $thread); } -function rebuildThemes($action) { +function rebuildThemes($action, $board = false) { // List themes $query = query("SELECT `theme` FROM `theme_settings` WHERE `name` IS NULL AND `value` IS NULL") or error(db_error()); while ($theme = $query->fetch()) { - rebuildTheme($theme['theme'], $action); + rebuildTheme($theme['theme'], $action, $board); } } @@ -261,7 +262,7 @@ function loadThemeConfig($_theme) { return $theme; } -function rebuildTheme($theme, $action) { +function rebuildTheme($theme, $action, $board = false) { global $config, $_theme; $_theme = $theme; @@ -270,7 +271,7 @@ function rebuildTheme($theme, $action) { if (file_exists($config['dir']['themes'] . '/' . $_theme . '/theme.php')) { require_once $config['dir']['themes'] . '/' . $_theme . '/theme.php'; - $theme['build_function']($action, themeSettings($_theme)); + $theme['build_function']($action, themeSettings($_theme), $board); } } @@ -328,11 +329,19 @@ function setupBoard($array) { } function openBoard($uri) { + $board = getBoardInfo($uri); + if ($board) { + setupBoard($board); + return true; + } + return false; +} + +function getBoardInfo($uri) { global $config; if ($config['cache']['enabled'] && ($board = cache::get('board_' . $uri))) { - setupBoard($board); - return true; + return $board; } $query = prepare("SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1"); @@ -342,27 +351,16 @@ function openBoard($uri) { if ($board = $query->fetch()) { if ($config['cache']['enabled']) cache::set('board_' . $uri, $board); - setupBoard($board); - return true; + return $board; } return false; } function boardTitle($uri) { - global $config; - if ($config['cache']['enabled'] && ($board = cache::get('board_' . $uri))) { + $board = getBoardInfo($uri); + if ($board) return $board['title']; - } - - $query = prepare("SELECT `title` FROM `boards` WHERE `uri` = :uri LIMIT 1"); - $query->bindValue(':uri', $uri); - $query->execute() or error(db_error($query)); - - if ($title = $query->fetch()) { - return $title['title']; - } - return false; } @@ -395,7 +393,7 @@ function purge($uri) { } function file_write($path, $data, $simple = false, $skip_purge = false) { - global $config; + global $config, $debug; if (preg_match('/^remote:\/\/(.+)\:(.+)$/', $path, $m)) { if (isset($config['remote'][$m[1]])) { @@ -422,7 +420,7 @@ function file_write($path, $data, $simple = false, $skip_purge = false) { error('Unable to truncate file: ' . $path); // Write data - if (fwrite($fp, $data) === false) + if (($bytes = fwrite($fp, $data)) === false) error('Unable to write to file: ' . $path); // Unlock @@ -448,6 +446,10 @@ function file_write($path, $data, $simple = false, $skip_purge = false) { purge($path); } + if ($config['debug']) { + $debug['write'][] = $path . ': ' . $bytes . ' bytes'; + } + event('write', $path); } @@ -578,6 +580,12 @@ function ago($timestamp) { function displayBan($ban) { global $config; + if (!$ban['seen']) { + $query = prepare("UPDATE `bans` SET `seen` = 1 WHERE `id` = :id"); + $query->bindValue(':id', $ban['id'], PDO::PARAM_INT); + $query->execute() or error(db_error($query)); + } + $ban['ip'] = $_SERVER['REMOTE_ADDR']; // Show banned page and exit @@ -604,12 +612,12 @@ function checkBan($board = 0) { if (event('check-ban', $board)) return true; - $query = prepare("SELECT `set`, `expires`, `reason`, `board`, `bans`.`id` FROM `bans` WHERE (`board` IS NULL OR `board` = :board) AND `ip` = :ip ORDER BY `expires` IS NULL DESC, `expires` DESC, `expires` DESC LIMIT 1"); + $query = prepare("SELECT `set`, `expires`, `reason`, `board`, `seen`, `bans`.`id` FROM `bans` WHERE (`board` IS NULL OR `board` = :board) AND `ip` = :ip ORDER BY `expires` IS NULL DESC, `expires` DESC, `expires` DESC LIMIT 1"); $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']); $query->bindValue(':board', $board); $query->execute() or error(db_error($query)); if ($query->rowCount() < 1 && $config['ban_range']) { - $query = prepare("SELECT `set`, `expires`, `reason`, `board`, `bans`.`id` FROM `bans` WHERE (`board` IS NULL OR `board` = :board) AND :ip LIKE REPLACE(REPLACE(`ip`, '%', '!%'), '*', '%') ESCAPE '!' ORDER BY `expires` IS NULL DESC, `expires` DESC LIMIT 1"); + $query = prepare("SELECT `set`, `expires`, `reason`, `board`, `seen`, `bans`.`id` FROM `bans` WHERE (`board` IS NULL OR `board` = :board) AND :ip LIKE REPLACE(REPLACE(`ip`, '%', '!%'), '*', '%') ESCAPE '!' ORDER BY `expires` IS NULL DESC, `expires` DESC LIMIT 1"); $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']); $query->bindValue(':board', $board); $query->execute() or error(db_error($query)); @@ -617,7 +625,7 @@ function checkBan($board = 0) { if ($query->rowCount() < 1 && $config['ban_cidr'] && !isIPv6()) { // my most insane SQL query yet - $query = prepare("SELECT `set`, `expires`, `reason`, `board`, `bans`.`id` FROM `bans` WHERE (`board` IS NULL OR `board` = :board) + $query = prepare("SELECT `set`, `expires`, `reason`, `board`, `seen`, `bans`.`id` FROM `bans` WHERE (`board` IS NULL OR `board` = :board) AND ( `ip` REGEXP '^(\[0-9]+\.\[0-9]+\.\[0-9]+\.\[0-9]+\)\/(\[0-9]+)$' AND @@ -634,15 +642,29 @@ function checkBan($board = 0) { if ($ban = $query->fetch()) { if ($ban['expires'] && $ban['expires'] < time()) { // Ban expired - $query = prepare("DELETE FROM `bans` WHERE `id` = :id LIMIT 1"); + $query = prepare("DELETE FROM `bans` WHERE `id` = :id"); $query->bindValue(':id', $ban['id'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); + if ($config['require_ban_view'] && !$ban['seen']) { + displayBan($ban); + } + return; } displayBan($ban); } + + // I'm not sure where else to put this. It doesn't really matter where; it just needs to be called every now and then to keep the ban list tidy. + purge_bans(); +} + +// No reason to keep expired bans in the database (except those that haven't been viewed yet) +function purge_bans() { + $query = prepare("DELETE FROM `bans` WHERE `expires` IS NOT NULL AND `expires` < :time AND `seen` = 1"); + $query->bindValue(':time', time()); + $query->execute() or error(db_error($query)); } function threadLocked($id) { @@ -725,13 +747,13 @@ function post(array $post) { $query->bindValue(':password', $post['password']); $query->bindValue(':ip', isset($post['ip']) ? $post['ip'] : $_SERVER['REMOTE_ADDR']); - if ($post['op'] && $post['mod'] && $post['sticky']) { + if ($post['op'] && $post['mod'] && isset($post['sticky']) && $post['sticky']) { $query->bindValue(':sticky', 1, PDO::PARAM_INT); } else { $query->bindValue(':sticky', 0, PDO::PARAM_INT); } - if ($post['op'] && $post['mod'] && $post['locked']) { + if ($post['op'] && $post['mod'] && isset($post['locked']) && $post['locked']) { $query->bindValue(':locked', 1, PDO::PARAM_INT); } else { $query->bindValue(':locked', 0, PDO::PARAM_INT); @@ -967,6 +989,8 @@ function index($page, $mod=false) { if ($query->rowcount() < 1 && $page > 1) return false; + + $threads = array(); while ($th = $query->fetch()) { $thread = new Thread( $th['id'], $th['subject'], $th['email'], $th['name'], $th['trip'], $th['capcode'], $th['body'], $th['time'], $th['thumb'], @@ -986,12 +1010,8 @@ function index($page, $mod=false) { $replies = array_reverse($posts->fetchAll(PDO::FETCH_ASSOC)); if (count($replies) == ($th['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview'])) { - $count = prepare(sprintf("SELECT COUNT(`id`) as `num` FROM `posts_%s` WHERE `thread` = :thread UNION ALL SELECT COUNT(`id`) FROM `posts_%s` WHERE `file` IS NOT NULL AND `thread` = :thread", $board['uri'], $board['uri'])); - $count->bindValue(':thread', $th['id'], PDO::PARAM_INT); - $count->execute() or error(db_error($count)); - $count = $count->fetchAll(PDO::FETCH_COLUMN); - - $omitted = array('post_count' => $count[0], 'image_count' => $count[1]); + $count = numPosts($th['id']); + $omitted = array('post_count' => $count['replies'], 'image_count' => $count['images']); } else { $omitted = false; } @@ -1019,7 +1039,8 @@ function index($page, $mod=false) { $thread->omitted = $omitted['post_count'] - ($th['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']); $thread->omitted_images = $omitted['image_count'] - $num_images; } - + + $threads[] = $thread; $body .= $thread->build(true); } @@ -1028,7 +1049,8 @@ function index($page, $mod=false) { 'body' => $body, 'post_url' => $config['post_url'], 'config' => $config, - 'boardlist' => createBoardlist($mod) + 'boardlist' => createBoardlist($mod), + 'threads' => $threads ); } @@ -1134,14 +1156,19 @@ function checkRobot($body) { return false; } +// Returns an associative array with 'replies' and 'images' keys function numPosts($id) { global $board; - $query = prepare(sprintf("SELECT COUNT(*) as `count` FROM `posts_%s` WHERE `thread` = :thread", $board['uri'])); + $query = prepare(sprintf("SELECT COUNT(*) as `num` FROM `posts_%s` WHERE `thread` = :thread UNION ALL SELECT COUNT(*) FROM `posts_%s` WHERE `file` IS NOT NULL AND `thread` = :thread", $board['uri'], $board['uri'])); $query->bindValue(':thread', $id, PDO::PARAM_INT); $query->execute() or error(db_error($query)); - $result = $query->fetch(); - return $result['count']; + $num_posts = $query->fetch(); + $num_posts = $num_posts['num']; + $num_images = $query->fetch(); + $num_images = $num_images['num']; + + return array('replies' => $num_posts, 'images' => $num_images); } function muteTime() { @@ -1213,6 +1240,9 @@ function buildIndex() { $pages = getPages(); $antibot = create_antibot($board['uri']); + $api = new Api(); + $catalog = array(); + $page = 1; while ($page <= $config['max_pages'] && $content = index($page)) { $filename = $board['dir'] . ($page == 1 ? $config['file_index'] : sprintf($config['file_page'], $page)); @@ -1225,6 +1255,14 @@ function buildIndex() { $content['antibot'] = $antibot; file_write($filename, Element('index.html', $content)); + + // json api + $threads = $content['threads']; + $json = json_encode($api->translatePage($threads)); + $jsonFilename = $board['dir'] . ($page-1) . ".json"; // pages should start from 0 + file_write($jsonFilename, $json); + + $catalog[$page-1] = $threads; $page++; } @@ -1232,8 +1270,16 @@ function buildIndex() { for (;$page<=$config['max_pages'];$page++) { $filename = $board['dir'] . ($page==1 ? $config['file_index'] : sprintf($config['file_page'], $page)); file_unlink($filename); + + $jsonFilename = $board['dir'] . ($page-1) . ".json"; + file_unlink($jsonFilename); } } + + // json api catalog + $json = json_encode($api->translateCatalog($catalog)); + $jsonFilename = $board['dir'] . "catalog.json"; + file_write($jsonFilename, $json); } function buildJavascript() { @@ -1246,6 +1292,12 @@ function buildJavascript() { 'uri' => addslashes((!empty($uri) ? $config['uri_stylesheets'] : '') . $uri)); } + // Check if we have translation for the javascripts; if yes, we add it to additional javascripts + list($pure_locale) = explode(".", $config['locale']); + if (file_exists ($jsloc = "inc/locale/".$pure_locale."/LC_MESSAGES/javascript.js")) { + array_unshift($config['additional_javascript'], $jsloc); + } + $script = Element('main.js', array( 'config' => $config, 'stylesheets' => $stylesheets @@ -1365,8 +1417,8 @@ function unicodify($body) { // En and em- dashes are rendered exactly the same in // most monospace fonts (they look the same in code // editors). - $body = str_replace('--', '–', $body); // en dash $body = str_replace('---', '—', $body); // em dash + $body = str_replace('--', '–', $body); // en dash return $body; } @@ -1494,7 +1546,7 @@ function markup(&$body, $track_cites = false) { } function utf8tohtml($utf8) { - return mb_encode_numericentity(htmlspecialchars($utf8, ENT_NOQUOTES, 'UTF-8'), array(0x80, 0xffff, 0, 0xffff), 'UTF-8'); + return htmlspecialchars($utf8, ENT_NOQUOTES, 'UTF-8'); } function buildThread($id, $return=false, $mod=false) { @@ -1535,8 +1587,9 @@ function buildThread($id, $return=false, $mod=false) { error($config['error']['nonexistant']); $body = Element('thread.html', array( - 'board'=>$board, - 'body'=>$thread->build(), + 'board' => $board, + 'thread' => $thread, + 'body' => $thread->build(), 'config' => $config, 'id' => $id, 'mod' => $mod, @@ -1549,6 +1602,12 @@ function buildThread($id, $return=false, $mod=false) { return $body; file_write($board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], $id), $body); + + // json api + $api = new Api(); + $json = json_encode($api->translateThread($thread)); + $jsonFilename = $board['dir'] . $config['dir']['res'] . $id . ".json"; + file_write($jsonFilename, $json); } function rrmdir($dir) { diff --git a/inc/lib/Twig/Extensions/Extension/Tinyboard.php b/inc/lib/Twig/Extensions/Extension/Tinyboard.php index 0a128e7b..61cf9fc9 100644 --- a/inc/lib/Twig/Extensions/Extension/Tinyboard.php +++ b/inc/lib/Twig/Extensions/Extension/Tinyboard.php @@ -25,6 +25,7 @@ class Twig_Extensions_Extension_Tinyboard extends Twig_Extension 'until' => new Twig_Filter_Function('until'), 'split' => new Twig_Filter_Function('twig_split_filter'), 'push' => new Twig_Filter_Function('twig_push_filter'), + 'bidi_cleanup' => new Twig_Filter_Function('bidi_cleanup'), 'addslashes' => new Twig_Filter_Function('addslashes') ); } @@ -57,8 +58,7 @@ class Twig_Extensions_Extension_Tinyboard extends Twig_Extension } function twig_timezone_function() { - // there's probably a much easier way of doing this - return sprintf("%s%02d", ($hr = (int)floor(($tz = date('Z')) / 3600)) > 0 ? '+' : '-', abs($hr)) . ':' . sprintf("%02d", (($tz / 3600) - $hr) * 60); + return 'Z'; } function twig_split_filter($str, $delim) { @@ -75,7 +75,7 @@ function twig_remove_whitespace_filter($data) { } function twig_date_filter($date, $format) { - return strftime($format, $date); + return gmstrftime($format, $date); } function twig_hasPermission_filter($mod, $permission, $board = null) { diff --git a/inc/locale/pl_PL/LC_MESSAGES/javascript.js b/inc/locale/pl_PL/LC_MESSAGES/javascript.js new file mode 100644 index 00000000..44857b98 --- /dev/null +++ b/inc/locale/pl_PL/LC_MESSAGES/javascript.js @@ -0,0 +1 @@ +l10n = {"Submit":"Wy\u015blij","Quick reply":"Szybka odpowied\u017a","Posting mode: Replying to >>{0}<\/small>":"Tryb postowania: Odpowied\u017a na >>{0}<\/small>","Return":"Powr\u00f3t","Click reply to view.":"Kliknij Odpowied\u017a aby zobaczy\u0107.","Click to expand":"Kliknij aby rozwin\u0105\u0107","Hide expanded replies":"Schowaj rozwini\u0119te odpowiedzi","Mon":"pon","Tue":"wto","Wed":"\u015bro","Thu":"czw","Fri":"pi\u0105","Sat":"sob","Sun":"nie","Show locked threads":"Poka\u017c zablokowane tematy","Hide locked threads":"Schowaj zablokowane tematy","Forced anonymity":"Wymuszona anonimowo\u015b\u0107","enabled":"w\u0142\u0105czona","disabled":"wy\u0142\u0105czona","Password":"Has\u0142o","Delete file only":"Usu\u0144 tylko plik","File":"Plik","Delete":"Usu\u0144","Reason":"Pow\u00f3d","Report":"Zg\u0142oszenie"}; \ No newline at end of file diff --git a/inc/locale/pl_PL/LC_MESSAGES/javascript.po b/inc/locale/pl_PL/LC_MESSAGES/javascript.po new file mode 100644 index 00000000..3c16c8d7 --- /dev/null +++ b/inc/locale/pl_PL/LC_MESSAGES/javascript.po @@ -0,0 +1,121 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-07-18 16:31-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../../../../js/quick-reply.js:20 ../../../../js/quick-reply.js:21 +msgid "Submit" +msgstr "Wyślij" + +#: ../../../../js/quick-reply.js:30 ../../../../js/quick-reply.js:31 +msgid "Quick reply" +msgstr "Szybka odpowiedź" + +#: ../../../../js/quick-reply.js:32 ../../../../js/quick-reply.js:33 +msgid "Posting mode: Replying to >>{0}" +msgstr "Tryb postowania: Odpowiedź na >>{0}" + +#: ../../../../js/quick-reply.js:32 ../../../../js/quick-reply.js:33 +msgid "Return" +msgstr "Powrót" + +#: ../../../../js/expand.js:20 +msgid "Click reply to view." +msgstr "Kliknij Odpowiedź aby zobaczyć." + +#: ../../../../js/expand.js:20 +msgid "Click to expand" +msgstr "Kliknij aby rozwinąć" + +#: ../../../../js/expand.js:41 +msgid "Hide expanded replies" +msgstr "Schowaj rozwinięte odpowiedzi" + +#: ../../../../js/local-time.js:40 +msgid "Mon" +msgstr "pon" + +#: ../../../../js/local-time.js:40 +msgid "Tue" +msgstr "wto" + +#: ../../../../js/local-time.js:40 +msgid "Wed" +msgstr "śro" + +#: ../../../../js/local-time.js:40 +msgid "Thu" +msgstr "czw" + +#: ../../../../js/local-time.js:40 +msgid "Fri" +msgstr "pią" + +#: ../../../../js/local-time.js:40 +msgid "Sat" +msgstr "sob" + +#: ../../../../js/local-time.js:40 +msgid "Sun" +msgstr "nie" + +#: ../../../../js/toggle-locked-threads.js:39 +#: ../../../../js/toggle-locked-threads.js:54 +msgid "Show locked threads" +msgstr "Pokaż zablokowane tematy" + +#: ../../../../js/toggle-locked-threads.js:39 +#: ../../../../js/toggle-locked-threads.js:54 +msgid "Hide locked threads" +msgstr "Schowaj zablokowane tematy" + +#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65 +#: ../../../../js/forced-anon.js:69 +msgid "Forced anonymity" +msgstr "Wymuszona anonimowość" + +#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65 +msgid "enabled" +msgstr "włączona" + +#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:69 +msgid "disabled" +msgstr "wyłączona" + +#: ../../../../js/quick-post-controls.js:27 +msgid "Password" +msgstr "Hasło" + +#: ../../../../js/quick-post-controls.js:29 +msgid "Delete file only" +msgstr "Usuń tylko plik" + +#: ../../../../js/quick-post-controls.js:30 +msgid "File" +msgstr "Plik" + +#: ../../../../js/quick-post-controls.js:31 +msgid "Delete" +msgstr "Usuń" + +#: ../../../../js/quick-post-controls.js:35 +msgid "Reason" +msgstr "Powód" + +#: ../../../../js/quick-post-controls.js:37 +msgid "Report" +msgstr "Zgłoszenie" diff --git a/inc/locale/pl_PL/LC_MESSAGES/tinyboard.mo b/inc/locale/pl_PL/LC_MESSAGES/tinyboard.mo index 98f2ab5c..ac57873e 100644 Binary files a/inc/locale/pl_PL/LC_MESSAGES/tinyboard.mo and b/inc/locale/pl_PL/LC_MESSAGES/tinyboard.mo differ diff --git a/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po b/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po index 374278df..9bc9eece 100644 --- a/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po +++ b/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po @@ -1,31 +1,38 @@ -# Polish Tinyboard Translation -# Copyright (C) 2011 Marcin Łabanowski -# Ten plik jest wydany na takiej samej licencji co paczka PACKAGE. -# Marcin Łabanowski (2011) +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy msgid "" msgstr "" -"Project-Id-Version: 0.9.6-dev-6\n" -"Report-Msgid-Bugs-To: marcin@6irc.net\n" -"POT-Creation-Date: 2012-12-18 04:43+0100\n" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-07-18 16:31-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" -"Language-Team: POLISH \n" -"Language: Polish\n" +"Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +#. There is no previous page. #: /var/www/html/Tinyboard/inc/functions.php:958 #: /var/www/html/Tinyboard/inc/functions.php:972 #: ../../../../inc/functions.php:1041 ../../../../inc/functions.php:1055 +#: ../../../../inc/functions.php:1039 ../../../../inc/functions.php:1053 +#: ../../../../inc/functions.php:1068 ../../../../inc/functions.php:1082 msgid "Previous" msgstr "Wstecz" +#. There is no next page. #: /var/www/html/Tinyboard/inc/functions.php:977 #: /var/www/html/Tinyboard/inc/functions.php:986 #: ../../../../inc/functions.php:1060 ../../../../inc/functions.php:1069 +#: ../../../../inc/functions.php:1058 ../../../../inc/functions.php:1067 +#: ../../../../inc/functions.php:1087 ../../../../inc/functions.php:1096 msgid "Next" msgstr "Dalej" @@ -62,171 +69,216 @@ msgstr "Odpowiedz" msgid "Quick Reply" msgstr "Szybka odpowiedź" +#. +#. * ==================== +#. * Error messages +#. * ==================== +#. +#. Error messages #: /var/www/html/Tinyboard/inc/config.php:600 ../../../../inc/config.php:638 +#: ../../../../inc/config.php:692 ../../../../inc/config.php:698 msgid "Lurk some more before posting." msgstr "Nie postuj pierwszego dnia." #: /var/www/html/Tinyboard/inc/config.php:601 ../../../../inc/config.php:639 +#: ../../../../inc/config.php:693 ../../../../inc/config.php:699 msgid "You look like a bot." msgstr "Wyglądasz jak bot." #: /var/www/html/Tinyboard/inc/config.php:602 ../../../../inc/config.php:640 +#: ../../../../inc/config.php:694 ../../../../inc/config.php:700 msgid "Your browser sent an invalid or no HTTP referer." msgstr "" "Twoja przeglądarka przesłała niepoprawny, bądź nie przesłała informacji o " "odsyłaczu w nagłówku" #: /var/www/html/Tinyboard/inc/config.php:603 ../../../../inc/config.php:641 +#: ../../../../inc/config.php:695 ../../../../inc/config.php:701 #, php-format msgid "The %s field was too long." msgstr "Pole %s jest za długie" #: /var/www/html/Tinyboard/inc/config.php:604 ../../../../inc/config.php:642 +#: ../../../../inc/config.php:696 ../../../../inc/config.php:702 msgid "The body was too long." msgstr "Zawartość jest za długa." #: /var/www/html/Tinyboard/inc/config.php:605 ../../../../inc/config.php:643 +#: ../../../../inc/config.php:697 ../../../../inc/config.php:703 msgid "The body was too short or empty." msgstr "Zawartość jest za krótka, bądź pusta." #: /var/www/html/Tinyboard/inc/config.php:606 ../../../../inc/config.php:644 +#: ../../../../inc/config.php:698 ../../../../inc/config.php:704 msgid "You must upload an image." msgstr "Musisz wysłać obrazek." #: /var/www/html/Tinyboard/inc/config.php:607 ../../../../inc/config.php:645 +#: ../../../../inc/config.php:699 ../../../../inc/config.php:705 msgid "The server failed to handle your upload." msgstr "Nie udało się obsłużyć twojego pliku." #: /var/www/html/Tinyboard/inc/config.php:608 ../../../../inc/config.php:646 +#: ../../../../inc/config.php:700 ../../../../inc/config.php:706 msgid "Unsupported image format." msgstr "Niewspierany format obrazka." #: /var/www/html/Tinyboard/inc/config.php:609 ../../../../inc/config.php:647 +#: ../../../../inc/config.php:701 ../../../../inc/config.php:707 msgid "Invalid board!" msgstr "Niepoprawny board!" #: /var/www/html/Tinyboard/inc/config.php:610 ../../../../inc/config.php:648 +#: ../../../../inc/config.php:702 ../../../../inc/config.php:708 msgid "Thread specified does not exist." msgstr "Wybrany wątek nie istnieje." #: /var/www/html/Tinyboard/inc/config.php:611 ../../../../inc/config.php:649 +#: ../../../../inc/config.php:703 ../../../../inc/config.php:709 msgid "Thread locked. You may not reply at this time." msgstr "Wątek jest zablokowany. Nie możesz w nim teraz postować." #: /var/www/html/Tinyboard/inc/config.php:612 ../../../../inc/config.php:650 +#: ../../../../inc/config.php:706 ../../../../inc/config.php:712 msgid "You didn't make a post." msgstr "Nie zrobiłeś posta." #: /var/www/html/Tinyboard/inc/config.php:613 ../../../../inc/config.php:651 +#: ../../../../inc/config.php:707 ../../../../inc/config.php:713 msgid "Flood detected; Post discarded." msgstr "Wykryto flood; Post odrzucony." #: /var/www/html/Tinyboard/inc/config.php:614 ../../../../inc/config.php:652 +#: ../../../../inc/config.php:708 ../../../../inc/config.php:714 msgid "Your request looks automated; Post discarded." msgstr "Twoje żądanie wygląda na zautomatyzowane; Post odrzucony." #: /var/www/html/Tinyboard/inc/config.php:615 ../../../../inc/config.php:653 +#: ../../../../inc/config.php:709 ../../../../inc/config.php:715 msgid "Unoriginal content!" msgstr "Nieoryginalna treść!" #: /var/www/html/Tinyboard/inc/config.php:616 ../../../../inc/config.php:654 +#: ../../../../inc/config.php:710 ../../../../inc/config.php:716 #, php-format msgid "Unoriginal content! You have been muted for %d seconds." msgstr "Nieoryginalna treść! Zostałeś zagłuszony na %d sekund." #: /var/www/html/Tinyboard/inc/config.php:617 ../../../../inc/config.php:655 +#: ../../../../inc/config.php:711 ../../../../inc/config.php:717 #, php-format msgid "You are muted! Expires in %d seconds." msgstr "Jesteś zagłuszony! Wygasa w ciągu %d sekund." #: /var/www/html/Tinyboard/inc/config.php:618 ../../../../inc/config.php:656 +#: ../../../../inc/config.php:712 ../../../../inc/config.php:718 #, php-format msgid "Your IP address is listed in %s." msgstr "Twój adres IP jest na liście %s." #: /var/www/html/Tinyboard/inc/config.php:619 ../../../../inc/config.php:657 +#: ../../../../inc/config.php:713 ../../../../inc/config.php:719 msgid "Too many links; flood detected." msgstr "Zbyt dużo linków; wykryto flood." #: /var/www/html/Tinyboard/inc/config.php:620 ../../../../inc/config.php:658 +#: ../../../../inc/config.php:714 ../../../../inc/config.php:720 msgid "Too many cites; post discarded." msgstr "Zbyt dużo cytatów; post odrzucony." #: /var/www/html/Tinyboard/inc/config.php:621 ../../../../inc/config.php:659 +#: ../../../../inc/config.php:715 ../../../../inc/config.php:721 msgid "Too many cross-board links; post discarded." msgstr "Zbyt dużo linków między boardami; post odrzucony." #: /var/www/html/Tinyboard/inc/config.php:622 ../../../../inc/config.php:660 +#: ../../../../inc/config.php:716 ../../../../inc/config.php:722 msgid "You didn't select anything to delete." msgstr "Nie wybrano nic do usunięcia." #: /var/www/html/Tinyboard/inc/config.php:623 ../../../../inc/config.php:661 +#: ../../../../inc/config.php:717 ../../../../inc/config.php:723 msgid "You didn't select anything to report." msgstr "Nie wybrano nic do zgłoszenia." #: /var/www/html/Tinyboard/inc/config.php:624 ../../../../inc/config.php:662 +#: ../../../../inc/config.php:718 ../../../../inc/config.php:724 msgid "You can't report that many posts at once." msgstr "Nie możesz raportować tyle postów na raz." #: /var/www/html/Tinyboard/inc/config.php:625 ../../../../inc/config.php:663 +#: ../../../../inc/config.php:719 ../../../../inc/config.php:725 msgid "Wrong password…" msgstr "Niepoprawne hasło" #: /var/www/html/Tinyboard/inc/config.php:626 ../../../../inc/config.php:664 +#: ../../../../inc/config.php:720 ../../../../inc/config.php:726 msgid "Invalid image." msgstr "Niepoprawny obrazek." #: /var/www/html/Tinyboard/inc/config.php:627 ../../../../inc/config.php:665 +#: ../../../../inc/config.php:721 ../../../../inc/config.php:727 msgid "Unknown file extension." msgstr "Nieznane rozszerzenie pliku." #: /var/www/html/Tinyboard/inc/config.php:628 ../../../../inc/config.php:666 +#: ../../../../inc/config.php:722 ../../../../inc/config.php:728 msgid "Maximum file size: %maxsz% bytes
Your file's size: %filesz% bytes" msgstr "" "Maksymalny rozmiar pliku: %maxsz% bajtów
Rozmiar twojego pliku: %filesz% " "bajtów" #: /var/www/html/Tinyboard/inc/config.php:629 ../../../../inc/config.php:667 +#: ../../../../inc/config.php:723 ../../../../inc/config.php:729 msgid "The file was too big." msgstr "Plik jest za duży." #: /var/www/html/Tinyboard/inc/config.php:630 ../../../../inc/config.php:668 +#: ../../../../inc/config.php:724 ../../../../inc/config.php:730 msgid "Invalid archive!" msgstr "Niepoprawne archiwum!" #: /var/www/html/Tinyboard/inc/config.php:631 ../../../../inc/config.php:669 +#: ../../../../inc/config.php:725 ../../../../inc/config.php:731 #, php-format msgid "That file already exists!" msgstr "Ten plik już istnieje!" #: /var/www/html/Tinyboard/inc/config.php:632 ../../../../inc/config.php:670 +#: ../../../../inc/config.php:727 ../../../../inc/config.php:733 #, php-format msgid "You'll have to wait another %s before deleting that." msgstr "Musisz poczekać kolejne %s przed usunięciem tego." #: /var/www/html/Tinyboard/inc/config.php:633 ../../../../inc/config.php:671 +#: ../../../../inc/config.php:728 ../../../../inc/config.php:734 msgid "MIME type detection XSS exploit (IE) detected; post discarded." msgstr "" "Wykryto próbę wykorzystania luki wykrywania typu MIME (XSS w IE); post " "odrzucony" #: /var/www/html/Tinyboard/inc/config.php:634 ../../../../inc/config.php:672 +#: ../../../../inc/config.php:729 ../../../../inc/config.php:735 msgid "Couldn't make sense of the URL of the video you tried to embed." msgstr "Nie można było zrozumieć URL-a wideo, którego próbowano zapostować." #: /var/www/html/Tinyboard/inc/config.php:635 ../../../../inc/config.php:673 +#: ../../../../inc/config.php:730 ../../../../inc/config.php:736 msgid "You seem to have mistyped the verification." msgstr "Wygląda na to, że przepisano źle weryfikację." #: /var/www/html/Tinyboard/inc/config.php:638 ../../../../inc/config.php:676 +#: ../../../../inc/config.php:734 ../../../../inc/config.php:740 msgid "Invalid username and/or password." msgstr "Błędna nazwa użytkownika, bądź hasło" #: /var/www/html/Tinyboard/inc/config.php:639 ../../../../inc/config.php:677 +#: ../../../../inc/config.php:735 ../../../../inc/config.php:741 msgid "You are not a mod…" msgstr "Nie jesteś moderatorem" #: /var/www/html/Tinyboard/inc/config.php:640 ../../../../inc/config.php:678 +#: ../../../../inc/config.php:736 ../../../../inc/config.php:742 msgid "" "Invalid username and/or password. Your user may have been deleted or changed." msgstr "" @@ -234,46 +286,56 @@ msgstr "" "albo zmienione." #: /var/www/html/Tinyboard/inc/config.php:641 ../../../../inc/config.php:679 +#: ../../../../inc/config.php:737 ../../../../inc/config.php:743 msgid "Invalid/malformed cookies." msgstr "Niepoprawne/zmodyfikowane pliki cookie." #: /var/www/html/Tinyboard/inc/config.php:642 ../../../../inc/config.php:680 +#: ../../../../inc/config.php:738 ../../../../inc/config.php:744 msgid "Your browser didn't submit an input when it should have." msgstr "Twoja przeglądarka nie wysłała pola, kiedy powinna." #: /var/www/html/Tinyboard/inc/config.php:643 ../../../../inc/config.php:681 +#: ../../../../inc/config.php:739 ../../../../inc/config.php:745 #, php-format msgid "The %s field is required." msgstr "Pole %s jest wymagane." #: /var/www/html/Tinyboard/inc/config.php:644 ../../../../inc/config.php:682 +#: ../../../../inc/config.php:740 ../../../../inc/config.php:746 #, php-format msgid "The %s field was invalid." msgstr "Pole %s jest niepoprawne." #: /var/www/html/Tinyboard/inc/config.php:645 ../../../../inc/config.php:683 +#: ../../../../inc/config.php:741 ../../../../inc/config.php:747 #, php-format msgid "There is already a %s board." msgstr "Już istnieje board %s" #: /var/www/html/Tinyboard/inc/config.php:646 ../../../../inc/config.php:684 +#: ../../../../inc/config.php:742 ../../../../inc/config.php:748 msgid "You don't have permission to do that." msgstr "Nie masz uprawnień do wykonania tej czynności." #: /var/www/html/Tinyboard/inc/config.php:647 ../../../../inc/config.php:685 +#: ../../../../inc/config.php:743 ../../../../inc/config.php:749 msgid "That post doesn't exist…" msgstr "Ten post nie istnieje..." #: /var/www/html/Tinyboard/inc/config.php:648 ../../../../inc/config.php:686 +#: ../../../../inc/config.php:744 ../../../../inc/config.php:750 msgid "Page not found." msgstr "Strona nie znaleziona." #: /var/www/html/Tinyboard/inc/config.php:649 ../../../../inc/config.php:687 +#: ../../../../inc/config.php:745 ../../../../inc/config.php:751 #, php-format msgid "That mod already exists!" msgstr "Ten moderator już istnieje!" #: /var/www/html/Tinyboard/inc/config.php:650 ../../../../inc/config.php:688 +#: ../../../../inc/config.php:746 ../../../../inc/config.php:752 msgid "That theme doesn't exist!" msgstr "Ten dodatek nie istnieje!" @@ -331,7 +393,7 @@ msgid "Go back" msgstr "Wróć" #: /var/www/html/Tinyboard/inc/display.php:97 ../../../../inc/display.php:91 -#: ../../../../inc/mod/pages.php:59 +#: ../../../../inc/mod/pages.php:59 ../../../../inc/mod/pages.php:62 msgid "Login" msgstr "Logowanie" @@ -343,10 +405,12 @@ msgstr "" "Post za długi. Kliknij tutaj aby zobaczyć pełnego posta." +#. line 5 #: /var/www/html/Tinyboard/inc/display.php:272 #: /var/www/html/Tinyboard/inc/display.php:365 #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:27 #: ../../../../templates/cache/a8/a6/1022091d3402e085395b12e6279a.php:27 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:27 msgid "Delete" msgstr "Usuń" @@ -382,6 +446,7 @@ msgstr "Usuń plik" #: /var/www/html/Tinyboard/inc/display.php:292 #: /var/www/html/Tinyboard/inc/display.php:408 +#: ../../../../inc/mod/pages.php:1080 ../../../../inc/mod/pages.php:1105 msgid "Edit post" msgstr "Edytuj post" @@ -413,21 +478,27 @@ msgstr "Zablokuj wątek" msgid "Move thread to another board" msgstr "Przenieś wątek na inny board" +#. line 11 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:48 #: /var/www/html/Tinyboard/mod.php:667 /var/www/html/Tinyboard/mod.php:750 #: /var/www/html/Tinyboard/mod.php:833 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:55 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:55 msgid "Name" msgstr "Nazwa" +#. line 21 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:62 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:76 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:76 msgid "Email" msgstr "E-mail" +#. line 34 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:96 #: /var/www/html/Tinyboard/mod.php:753 /var/www/html/Tinyboard/mod.php:839 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:95 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:116 msgid "Subject" msgstr "Temat" @@ -435,71 +506,347 @@ msgstr "Temat" #: /var/www/html/Tinyboard/templates/cache/96/13/d13c7abb8d82989e547dc9be1787.php:119 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:112 #: ../../../../templates/cache/cf/0c/61af144f478f5c035cb3a2799e48.php:117 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:119 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:100 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:133 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:172 msgid "Spoiler Image" msgstr "Schowaj obrazek" +#. line 45 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:119 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:121 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:145 msgid "Comment" msgstr "Komentarz" +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 +#. line 61 +#. line 73 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:133 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:142 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:191 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:217 msgid "Verification" msgstr "Weryfikacja" +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 +#. line 3 +#. line 87 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:149 #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:22 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:165 #: ../../../../templates/cache/a8/a6/1022091d3402e085395b12e6279a.php:22 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:22 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:250 msgid "File" msgstr "Plik" +#. line 97 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:163 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:183 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:268 msgid "Embed" msgstr "Osadź" +#. line 109 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:179 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:206 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:291 msgid "Flags" msgstr "Flagi" +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 +#. line 113 +#. line 114 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:188 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:191 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:215 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:218 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:300 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:303 msgid "Sticky" msgstr "Przyklejony" +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 +#. line 117 +#. line 118 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:200 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:203 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:227 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:230 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:312 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:315 msgid "Lock" msgstr "Zablokowany" +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 +#. line 121 +#. line 122 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:212 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:215 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:239 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:242 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:324 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:327 msgid "Raw HTML" msgstr "Czysty HTML" +#. line 129 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:230 #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:23 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:257 #: ../../../../templates/cache/a8/a6/1022091d3402e085395b12e6279a.php:23 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:23 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:342 msgid "Password" msgstr "Hasło" +#. line 134 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:236 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:266 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:351 msgid "(For file deletion.)" msgstr "(do usuwania postów)" #: /var/www/html/Tinyboard/templates/cache/96/13/d13c7abb8d82989e547dc9be1787.php:107 #: ../../../../templates/cache/cf/0c/61af144f478f5c035cb3a2799e48.php:105 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:107 msgid "File:" msgstr "Plik:" @@ -518,11 +865,15 @@ msgstr "Odśwież" #: /var/www/html/Tinyboard/templates/cache/96/13/d13c7abb8d82989e547dc9be1787.php:478 #: ../../../../templates/cache/cf/0c/61af144f478f5c035cb3a2799e48.php:415 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:461 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:472 msgid "Reply" msgstr "Odpowiedź" #: /var/www/html/Tinyboard/templates/cache/96/13/d13c7abb8d82989e547dc9be1787.php:511 #: ../../../../templates/cache/cf/0c/61af144f478f5c035cb3a2799e48.php:442 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:488 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:499 msgid "1 post" msgid_plural "%count% posts" msgstr[0] "1 post" @@ -531,11 +882,15 @@ msgstr[2] "%count% postów" #: /var/www/html/Tinyboard/templates/cache/96/13/d13c7abb8d82989e547dc9be1787.php:517 #: ../../../../templates/cache/cf/0c/61af144f478f5c035cb3a2799e48.php:448 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:494 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:505 msgid "and" msgstr "oraz" #: /var/www/html/Tinyboard/templates/cache/96/13/d13c7abb8d82989e547dc9be1787.php:528 #: ../../../../templates/cache/cf/0c/61af144f478f5c035cb3a2799e48.php:459 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:505 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:516 msgid "1 image reply" msgid_plural "%count% image replies" msgstr[0] "1 obrazek" @@ -544,6 +899,8 @@ msgstr[2] "%count% obrazków" #: /var/www/html/Tinyboard/templates/cache/96/13/d13c7abb8d82989e547dc9be1787.php:533 #: ../../../../templates/cache/cf/0c/61af144f478f5c035cb3a2799e48.php:464 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:510 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:521 msgid "omitted. Click reply to view." msgstr "pominięte. Kliknij Odpowiedź aby zobaczyć." @@ -552,11 +909,20 @@ msgstr "pominięte. Kliknij Odpowiedź aby zobaczyć." #: /var/www/html/Tinyboard/templates/cache/0b/22/d0c24fb343dd5fe77600d77dcc1b.php:159 #: ../../../../templates/cache/82/20/1c3352a2eb8f4503c0f7634bca15.php:169 #: ../../../../templates/cache/7a/d3/9236b821893e6bc57b16919988fd.php:169 +#: ../../../../templates/cache/f5/e3/343716327c6183713f70a3fb57f1.php:121 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:98 +#: ../../../../templates/cache/62/8c/21348d46377c3e1b3f8c476ba376.php:62 +#: ../../../../templates/cache/f5/e3/343716327c6183713f70a3fb57f1.php:131 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:115 msgid "Return to dashboard" msgstr "Powróć na tablicę" +#. line 27 +#. line 31 #: /var/www/html/Tinyboard/templates/cache/0b/22/d0c24fb343dd5fe77600d77dcc1b.php:165 #: ../../../../templates/cache/82/20/1c3352a2eb8f4503c0f7634bca15.php:177 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:106 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:123 msgid "Posting mode: Reply" msgstr "Tryb postowania: Odpowiedź" @@ -564,22 +930,32 @@ msgstr "Tryb postowania: Odpowiedź" #: /var/www/html/Tinyboard/templates/cache/0b/22/d0c24fb343dd5fe77600d77dcc1b.php:210 #: ../../../../templates/cache/82/20/1c3352a2eb8f4503c0f7634bca15.php:180 #: ../../../../templates/cache/82/20/1c3352a2eb8f4503c0f7634bca15.php:222 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:109 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:155 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:126 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:172 msgid "Return" msgstr "Powrót" +#. line 2 #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:19 #: ../../../../templates/cache/a8/a6/1022091d3402e085395b12e6279a.php:19 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:19 msgid "Delete Post" msgstr "Usuń post" +#. line 8 #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:32 #: /var/www/html/Tinyboard/mod.php:1801 #: ../../../../templates/cache/a8/a6/1022091d3402e085395b12e6279a.php:32 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:32 msgid "Reason" msgstr "Powód" +#. line 10 #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:36 #: ../../../../templates/cache/a8/a6/1022091d3402e085395b12e6279a.php:36 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:36 msgid "Report" msgstr "Zgłoszenie" @@ -597,22 +973,26 @@ msgid "PM Inbox" msgstr "Wiadomości prywatne" #: /var/www/html/Tinyboard/mod.php:136 /var/www/html/Tinyboard/mod.php:874 -#: ../../../../inc/mod/pages.php:376 +#: ../../../../inc/mod/pages.php:376 ../../../../inc/mod/pages.php:393 +#: ../../../../inc/mod/pages.php:406 msgid "News" msgstr "Aktualności" #: /var/www/html/Tinyboard/mod.php:141 /var/www/html/Tinyboard/mod.php:1614 -#: ../../../../inc/mod/pages.php:1557 +#: ../../../../inc/mod/pages.php:1557 ../../../../inc/mod/pages.php:1657 +#: ../../../../inc/mod/pages.php:1682 msgid "Report queue" msgstr "Kolejka zgłoszeń" #: /var/www/html/Tinyboard/mod.php:144 /var/www/html/Tinyboard/mod.php:1882 -#: ../../../../inc/mod/pages.php:664 +#: ../../../../inc/mod/pages.php:664 ../../../../inc/mod/pages.php:705 +#: ../../../../inc/mod/pages.php:721 msgid "Ban list" msgstr "Lista banów" #: /var/www/html/Tinyboard/mod.php:147 /var/www/html/Tinyboard/mod.php:1288 -#: ../../../../inc/mod/pages.php:1271 +#: ../../../../inc/mod/pages.php:1271 ../../../../inc/mod/pages.php:1369 +#: ../../../../inc/mod/pages.php:1394 msgid "Manage users" msgstr "Zarządzaj użytkownikami" @@ -622,6 +1002,8 @@ msgstr "Zmień swoje hasło" #: /var/www/html/Tinyboard/mod.php:152 /var/www/html/Tinyboard/mod.php:477 #: ../../../../inc/mod/pages.php:416 ../../../../inc/mod/pages.php:443 +#: ../../../../inc/mod/pages.php:433 ../../../../inc/mod/pages.php:460 +#: ../../../../inc/mod/pages.php:446 ../../../../inc/mod/pages.php:473 msgid "Moderation log" msgstr "Log moderacji" @@ -638,7 +1020,8 @@ msgid "Show configuration" msgstr "Pokaż konfigurację" #: /var/www/html/Tinyboard/mod.php:165 /var/www/html/Tinyboard/mod.php:709 -#: ../../../../inc/mod/pages.php:1739 +#: ../../../../inc/mod/pages.php:1739 ../../../../inc/mod/pages.php:1805 +#: ../../../../inc/mod/pages.php:1830 msgid "Manage themes" msgstr "Zarządzaj dodatkami" @@ -660,6 +1043,7 @@ msgstr "" "gwiazdki (*) jako znak wieloznaczny." #: /var/www/html/Tinyboard/mod.php:180 ../../../../inc/mod/pages.php:106 +#: ../../../../inc/mod/pages.php:110 msgid "Could not find current version! (Check .installed)" msgstr "Nie można znaleźć obecnej wersji! (Sprawdź .installed)" @@ -668,6 +1052,7 @@ msgid "Logout" msgstr "Wyloguj" #: /var/www/html/Tinyboard/mod.php:245 ../../../../inc/mod/pages.php:147 +#: ../../../../inc/mod/pages.php:162 msgid "Dashboard" msgstr "Tablica" @@ -692,10 +1077,12 @@ msgid "Action" msgstr "Akcja" #: /var/www/html/Tinyboard/mod.php:528 ../../../../inc/mod/pages.php:1723 +#: ../../../../inc/mod/pages.php:1789 ../../../../inc/mod/pages.php:1814 msgid "Themes directory doesn't exist!" msgstr "Katalog dodatków (themes) nie istnieje!" #: /var/www/html/Tinyboard/mod.php:530 ../../../../inc/mod/pages.php:1725 +#: ../../../../inc/mod/pages.php:1791 ../../../../inc/mod/pages.php:1816 msgid "Cannot open themes directory; check permissions." msgstr "Nie można otworzyć katalogu dodatków (themes); sprawdź uprawnienia." @@ -728,7 +1115,9 @@ msgid "Install" msgstr "Instaluj" #: /var/www/html/Tinyboard/mod.php:693 ../../../../inc/mod/pages.php:1467 -#: ../../../../inc/mod/pages.php:1471 +#: ../../../../inc/mod/pages.php:1471 ../../../../inc/mod/pages.php:1567 +#: ../../../../inc/mod/pages.php:1571 ../../../../inc/mod/pages.php:1592 +#: ../../../../inc/mod/pages.php:1596 msgid "Rebuild" msgstr "Przebuduj" @@ -749,6 +1138,7 @@ msgid "Post to noticeboard" msgstr "Postuj na tablicy ogłoszeń" #: /var/www/html/Tinyboard/mod.php:792 ../../../../inc/mod/pages.php:316 +#: ../../../../inc/mod/pages.php:333 ../../../../inc/mod/pages.php:346 msgid "Noticeboard" msgstr "Tablica ogłoszeń" @@ -818,10 +1208,12 @@ msgid "Configuration" msgstr "Konfiguracja" #: /var/www/html/Tinyboard/mod.php:2174 ../../../../inc/mod/pages.php:255 +#: ../../../../inc/mod/pages.php:272 ../../../../inc/mod/pages.php:285 msgid "Couldn't open board after creation." msgstr "Nie można otworzyć boardu po utworzeniu." #: /var/www/html/Tinyboard/mod.php:2678 ../../../../inc/mod/pages.php:759 +#: ../../../../inc/mod/pages.php:800 ../../../../inc/mod/pages.php:823 msgid "Target and source board are the same." msgstr "Docelowy i źródłowy board są takie same." @@ -829,73 +1221,137 @@ msgstr "Docelowy i źródłowy board są takie same." msgid "No board to move to; there is only one." msgstr "Nie ma boardu na który można to przenieść; istnieje tylko jeden." -#: ../../../../inc/config.php:689 +#: ../../../../inc/config.php:689 ../../../../inc/config.php:747 +#: ../../../../inc/config.php:753 msgid "Invalid security token! Please go back and try again." msgstr "Niepoprawny token bezpieczeństwa! Proszę cofnąć i spróbować ponownie." -#: ../../../../inc/mod/pages.php:63 +#: ../../../../inc/mod/pages.php:63 ../../../../inc/mod/pages.php:66 msgid "Confirm action" msgstr "Potwierdź akcję" -#: ../../../../inc/mod/pages.php:222 +#: ../../../../inc/mod/pages.php:222 ../../../../inc/mod/pages.php:239 +#: ../../../../inc/mod/pages.php:252 msgid "Edit board" msgstr "Edytuj board" -#: ../../../../inc/mod/pages.php:270 +#: ../../../../inc/mod/pages.php:270 ../../../../inc/mod/pages.php:287 +#: ../../../../inc/mod/pages.php:300 msgid "New board" msgstr "Nowy board" -#: ../../../../inc/mod/pages.php:586 +#: ../../../../inc/mod/pages.php:586 ../../../../inc/mod/pages.php:612 +#: ../../../../inc/mod/pages.php:628 msgid "IP" msgstr "adres IP" #: ../../../../inc/mod/pages.php:596 ../../../../inc/mod/pages.php:985 +#: ../../../../inc/mod/pages.php:622 ../../../../inc/mod/pages.php:1028 +#: ../../../../inc/mod/pages.php:638 ../../../../inc/mod/pages.php:1053 msgid "New ban" msgstr "Nowy ban" -#: ../../../../inc/mod/pages.php:919 +#: ../../../../inc/mod/pages.php:919 ../../../../inc/mod/pages.php:962 +#: ../../../../inc/mod/pages.php:987 msgid "Impossible to move thread; there is only one board." msgstr "Nie można przenieść wątku; istnieje tylko jeden board." -#: ../../../../inc/mod/pages.php:923 +#: ../../../../inc/mod/pages.php:923 ../../../../inc/mod/pages.php:966 +#: ../../../../inc/mod/pages.php:991 msgid "Move thread" msgstr "Przenieś wątek" #: ../../../../inc/mod/pages.php:1209 ../../../../inc/mod/pages.php:1258 +#: ../../../../inc/mod/pages.php:1307 ../../../../inc/mod/pages.php:1356 +#: ../../../../inc/mod/pages.php:1332 ../../../../inc/mod/pages.php:1381 msgid "Edit user" msgstr "Edytuj użytkownika" +#. deleted? #: ../../../../inc/mod/pages.php:1333 ../../../../inc/mod/pages.php:1405 +#: ../../../../inc/mod/pages.php:1431 ../../../../inc/mod/pages.php:1503 +#: ../../../../inc/mod/pages.php:1456 ../../../../inc/mod/pages.php:1528 msgid "New PM for" msgstr "Nowe PW dla" -#: ../../../../inc/mod/pages.php:1337 +#: ../../../../inc/mod/pages.php:1337 ../../../../inc/mod/pages.php:1435 +#: ../../../../inc/mod/pages.php:1460 msgid "Private message" msgstr "Prywatna wiadomość" -#: ../../../../inc/mod/pages.php:1358 +#: ../../../../inc/mod/pages.php:1358 ../../../../inc/mod/pages.php:1456 +#: ../../../../inc/mod/pages.php:1481 msgid "PM inbox" msgstr "Odebrane PW" -#: ../../../../inc/mod/pages.php:1679 +#: ../../../../inc/mod/pages.php:1679 ../../../../inc/mod/pages.php:1779 +#: ../../../../inc/mod/pages.php:1804 msgid "Config editor" msgstr "Edytor konfiguracji" -#: ../../../../inc/mod/pages.php:1713 +#: ../../../../inc/mod/pages.php:1713 ../../../../inc/mod/pages.php:1945 +#: ../../../../inc/mod/pages.php:1970 msgid "Debug: Anti-spam" msgstr "Debug: Antyspam" -#: ../../../../inc/mod/pages.php:1801 +#: ../../../../inc/mod/pages.php:1801 ../../../../inc/mod/pages.php:1867 +#: ../../../../inc/mod/pages.php:1892 #, php-format msgid "Installed theme: %s" msgstr "Zainstalowano dodatek: %s" -#: ../../../../inc/mod/pages.php:1811 +#: ../../../../inc/mod/pages.php:1811 ../../../../inc/mod/pages.php:1878 +#: ../../../../inc/mod/pages.php:1903 #, php-format msgid "Configuring theme: %s" msgstr "Konfigurowanie dodatku: %s" -#: ../../../../inc/mod/pages.php:1839 +#: ../../../../inc/mod/pages.php:1839 ../../../../inc/mod/pages.php:1906 +#: ../../../../inc/mod/pages.php:1931 #, php-format msgid "Rebuilt theme: %s" msgstr "Przebudowano dodatek: %s" + +#: ../../../../inc/lib/gettext/examples/pigs_dropin.php:77 +msgid "" +"This is how the story goes.\n" +"\n" +msgstr "" + +#: ../../../../inc/config.php:704 ../../../../inc/config.php:710 +msgid "Thread has reached its maximum reply limit." +msgstr "Ten temat osiągnął swój maksymalny limit odpowiedzi." + +#: ../../../../inc/config.php:705 ../../../../inc/config.php:711 +msgid "Thread has reached its maximum image limit." +msgstr "Ten temat osiągnął swój maksymalny limit obrazków." + +#: ../../../../inc/config.php:726 ../../../../inc/config.php:732 +#, php-format +msgid "That file already exists in this thread!" +msgstr "Ten plik już istnieje w tym temacie!" + +#. Moderator errors +#: ../../../../inc/config.php:733 ../../../../inc/config.php:739 +#, php-format +msgid "" +"You are only allowed to unban %s users at a time. You tried to unban %u " +"users." +msgstr "" +"Możesz odbanować tylko %s użytkowników na raz. Próbowałeś odbanować %u users." + +#: ../../../../inc/mod/pages.php:1969 ../../../../inc/mod/pages.php:1994 +msgid "Debug: Recent posts" +msgstr "Debug: Ostatnie posty" + +#: ../../../../inc/mod/pages.php:1993 ../../../../inc/mod/pages.php:2018 +msgid "Debug: SQL" +msgstr "Debug: SQL" + +#. line 28 +#: ../../../../templates/cache/4b/3e/915cc5ac5fe144c331207c656528.php:104 +msgid "1 reply" +msgid_plural "%count% replies" +msgstr[0] "1 odpowiedź" +msgstr[1] "%count% odpowiedzi" +msgstr[2] "%count% odpowiedzi" diff --git a/inc/locale/pt_BR/LC_MESSAGES/tinyboard.mo b/inc/locale/pt_BR/LC_MESSAGES/tinyboard.mo new file mode 100644 index 00000000..3bb6778b Binary files /dev/null and b/inc/locale/pt_BR/LC_MESSAGES/tinyboard.mo differ diff --git a/inc/locale/pt_BR/LC_MESSAGES/tinyboard.po b/inc/locale/pt_BR/LC_MESSAGES/tinyboard.po new file mode 100644 index 00000000..c2ad38a2 --- /dev/null +++ b/inc/locale/pt_BR/LC_MESSAGES/tinyboard.po @@ -0,0 +1,844 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-21 11:29-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural==(n != 1);n" + +#: ../../inc/lib/gettext/examples/pigs_dropin.php:77 +msgid "" +"This is how the story goes.\n" +"\n" +msgstr "Era uma vez\n\n" + +#: ../../inc/functions.php:1046 ../../inc/functions.php:1060 +msgid "Previous" +msgstr "Anterior" + +#: ../../inc/functions.php:1065 ../../inc/functions.php:1074 +msgid "Next" +msgstr "Proximo" + +#: ../../inc/display.php:91 ../../inc/mod/pages.php:62 +msgid "Login" +msgstr "Login" + +#: ../../inc/config.php:687 +msgid "Lurk some more before posting." +msgstr "Lurke mais antes de postar." + +#: ../../inc/config.php:688 +msgid "You look like a bot." +msgstr "Você não parece humano." + +#: ../../inc/config.php:689 +msgid "Your browser sent an invalid or no HTTP referer." +msgstr "Seu browser enviou um referial HTTP inválido ou não enviou o referencial." + +#: ../../inc/config.php:690 +#, php-format +msgid "The %s field was too long." +msgstr "O campo %s é longo demais." + +#: ../../inc/config.php:691 +msgid "The body was too long." +msgstr "O corpo do texto é longo demais." + +#: ../../inc/config.php:692 +msgid "The body was too short or empty." +msgstr "O corpo do texto é pequeno demais ou inexistente." + +#: ../../inc/config.php:693 +msgid "You must upload an image." +msgstr "Você deve fazer upload de uma imagem." + +#: ../../inc/config.php:694 +msgid "The server failed to handle your upload." +msgstr "O servidor não conseguiu lidar com seu upload." + +#: ../../inc/config.php:695 +msgid "Unsupported image format." +msgstr "Tipo de imagem não aceito." + +#: ../../inc/config.php:696 +msgid "Invalid board!" +msgstr "Board inválida!" + +#: ../../inc/config.php:697 +msgid "Thread specified does not exist." +msgstr "O tópico especificado não existe.." + +#: ../../inc/config.php:698 +msgid "Thread locked. You may not reply at this time." +msgstr "Tópico trancado, você não pode postar." + +#: ../../inc/config.php:699 +msgid "You didn't make a post." +msgstr "Você não escreveu uma mensagem." + +#: ../../inc/config.php:700 +msgid "Flood detected; Post discarded." +msgstr "Flood detectado; Sua mensagem foi descartada." + +#: ../../inc/config.php:701 +msgid "Your request looks automated; Post discarded." +msgstr "Sua requisição parece automatizada; Mensagem descartada." + +#: ../../inc/config.php:702 +msgid "Unoriginal content!" +msgstr "Conteudo não original!" + +#: ../../inc/config.php:703 +#, php-format +msgid "Unoriginal content! You have been muted for %d seconds." +msgstr "Conteudo não original! Você está impedido de postar por %d segundos." + +#: ../../inc/config.php:704 +#, php-format +msgid "You are muted! Expires in %d seconds." +msgstr "Você está impedido de postar! Expira em %d segundos." + +#: ../../inc/config.php:705 +#, php-format +msgid "Your IP address is listed in %s." +msgstr "Seu IP está listado em %s." + +#: ../../inc/config.php:706 +msgid "Too many links; flood detected." +msgstr "Links demais; Flood detectado." + +#: ../../inc/config.php:707 +msgid "Too many cites; post discarded." +msgstr "Citações demais; Post descartado." + +#: ../../inc/config.php:708 +msgid "Too many cross-board links; post discarded." +msgstr "Links entre boards demais; Post descartado." + +#: ../../inc/config.php:709 +msgid "You didn't select anything to delete." +msgstr "Você não selecionou nada para deletar." + +#: ../../inc/config.php:710 +msgid "You didn't select anything to report." +msgstr "Você não selecionou nada para denunciar." + +#: ../../inc/config.php:711 +msgid "You can't report that many posts at once." +msgstr "Você não pode denunciar tantas mensagens ao mesmo tempo." + +#: ../../inc/config.php:712 +msgid "Wrong password…" +msgstr "Senha incorreta…" + +#: ../../inc/config.php:713 +msgid "Invalid image." +msgstr "Imagem inválida." + +#: ../../inc/config.php:714 +msgid "Unknown file extension." +msgstr "Extenção de arquivo desconhecida." + +#: ../../inc/config.php:715 +msgid "Maximum file size: %maxsz% bytes
Your file's size: %filesz% bytes" +msgstr "Tamanho maximo de arquivos: %maxsz% bytes
O tamanho do seu arquivo: %filesz% bytes" + +#: ../../inc/config.php:716 +msgid "The file was too big." +msgstr "Seu arquivo é grande demais." + +#: ../../inc/config.php:717 +msgid "Invalid archive!" +msgstr "Arquivo inválido!" + +#: ../../inc/config.php:718 +#, php-format +msgid "That file already exists!" +msgstr "O arquivo já existe!" + +#: ../../inc/config.php:719 +#, php-format +msgid "That file already exists in this thread!" +msgstr "O arquivo já existe neste tópico!" + +#: ../../inc/config.php:720 +#, php-format +msgid "You'll have to wait another %s before deleting that." +msgstr "Você terá que esperar %s segundos antes de deletar isso." + +#: ../../inc/config.php:721 +msgid "MIME type detection XSS exploit (IE) detected; post discarded." +msgstr "Exploit XSS do tipo MIME (IE) detectado; mensagem descartada." + +#: ../../inc/config.php:722 +msgid "Couldn't make sense of the URL of the video you tried to embed." +msgstr "Não consegui processar a URL do video que você tentou integrar" + +#: ../../inc/config.php:723 +msgid "You seem to have mistyped the verification." +msgstr "Você errou o codigo de verificação." + +#: ../../inc/config.php:726 +msgid "Invalid username and/or password." +msgstr "Login e/ou senha inválido(s)." + +#: ../../inc/config.php:727 +msgid "You are not a mod…" +msgstr "Você não é mod…" + +#: ../../inc/config.php:728 +msgid "" +"Invalid username and/or password. Your user may have been deleted or changed." +msgstr "Login e/ou senha inválido(s). Seu login deve ter sido mudado ou removido." + +#: ../../inc/config.php:729 +msgid "Invalid/malformed cookies." +msgstr "Cookies inválidos ou mal formados." + +#: ../../inc/config.php:730 +msgid "Your browser didn't submit an input when it should have." +msgstr "Seu browser não enviou uma entrada quando ele deveria." + +#: ../../inc/config.php:731 +#, php-format +msgid "The %s field is required." +msgstr "O campo %s é necessário." + +#: ../../inc/config.php:732 +#, php-format +msgid "The %s field was invalid." +msgstr "O campo %s é inválido." + +#: ../../inc/config.php:733 +#, php-format +msgid "There is already a %s board." +msgstr "A board %s já existe." + +#: ../../inc/config.php:734 +msgid "You don't have permission to do that." +msgstr "Você não tem permissão para fazer isso." + +#: ../../inc/config.php:735 +msgid "That post doesn't exist…" +msgstr "Este post já existe…" + +#: ../../inc/config.php:736 +msgid "Page not found." +msgstr "Pagina não encontrada." + +#: ../../inc/config.php:737 +#, php-format +msgid "That mod already exists!" +msgstr "Este mod já existe!" + +#: ../../inc/config.php:738 +msgid "That theme doesn't exist!" +msgstr "Este tema não existe!" + +#: ../../inc/config.php:739 +msgid "Invalid security token! Please go back and try again." +msgstr "Token de segurança inválido! Retorne e tente de novo." + +#: ../../inc/mod/pages.php:66 +msgid "Confirm action" +msgstr "Confirmar ação" + +#: ../../inc/mod/pages.php:110 +msgid "Could not find current version! (Check .installed)" +msgstr "Não foi possivel encontrar a versão atual! (Cheque o .installed)" + +#: ../../inc/mod/pages.php:151 +msgid "Dashboard" +msgstr "Dashboard" + +#: ../../inc/mod/pages.php:228 +msgid "Edit board" +msgstr "Editar board" + +#: ../../inc/mod/pages.php:261 +msgid "Couldn't open board after creation." +msgstr "Não foi possivel abrir a board após a criação." + +#: ../../inc/mod/pages.php:276 +msgid "New board" +msgstr "Nova board" + +#: ../../inc/mod/pages.php:322 +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:96 +msgid "Noticeboard" +msgstr "Quadro de noticias" + +#: ../../inc/mod/pages.php:382 +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:166 +msgid "News" +msgstr "Noticias" + +#: ../../inc/mod/pages.php:422 ../../inc/mod/pages.php:449 +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:255 +msgid "Moderation log" +msgstr "Log da moderação" + +#: ../../inc/mod/pages.php:592 +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:247 +#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:65 +msgid "IP" +msgstr "IP" + +#: ../../inc/mod/pages.php:602 ../../inc/mod/pages.php:993 +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:377 +msgid "New ban" +msgstr "Nova expulsão" + +#: ../../inc/mod/pages.php:670 +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:224 +msgid "Ban list" +msgstr "Lista de expulsões" + +#: ../../inc/mod/pages.php:765 +msgid "Target and source board are the same." +msgstr "Board alvo e fonte são as mesmas." + +#: ../../inc/mod/pages.php:927 +msgid "Impossible to move thread; there is only one board." +msgstr "Impossivel de mover o tópico; Só existe uma board." + +#: ../../inc/mod/pages.php:931 +msgid "Move thread" +msgstr "Mover tópico" + +#: ../../inc/mod/pages.php:1045 +msgid "Edit post" +msgstr "Editar mensagem" + +#: ../../inc/mod/pages.php:1271 ../../inc/mod/pages.php:1320 +msgid "Edit user" +msgstr "Editar usuário" + +#: ../../inc/mod/pages.php:1333 +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:232 +msgid "Manage users" +msgstr "Administrar usuários" + +#: ../../inc/mod/pages.php:1395 ../../inc/mod/pages.php:1467 +msgid "New PM for" +msgstr "Nova MP para" + +#: ../../inc/mod/pages.php:1399 +msgid "Private message" +msgstr "Mensagem pessoal" + +#: ../../inc/mod/pages.php:1420 +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:171 +msgid "PM inbox" +msgstr "Entrada de MP" + +#: ../../inc/mod/pages.php:1531 ../../inc/mod/pages.php:1535 +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:263 +msgid "Rebuild" +msgstr "Reconstruir" + +#: ../../inc/mod/pages.php:1621 +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:207 +msgid "Report queue" +msgstr "Fila de denuncias" + +#: ../../inc/mod/pages.php:1743 +msgid "Config editor" +msgstr "Editor de configurações" + +#: ../../inc/mod/pages.php:1753 +msgid "Themes directory doesn't exist!" +msgstr "Diretório de temas não existe!" + +#: ../../inc/mod/pages.php:1755 +msgid "Cannot open themes directory; check permissions." +msgstr "Não é possivel abrir diretorio de temas; reveja suas permissões." + +#: ../../inc/mod/pages.php:1769 +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:247 +msgid "Manage themes" +msgstr "Administrar temas" + +#: ../../inc/mod/pages.php:1831 +#, php-format +msgid "Installed theme: %s" +msgstr "Tema instalado: %s" + +#: ../../inc/mod/pages.php:1841 +#, php-format +msgid "Configuring theme: %s" +msgstr "Configurando tema: %s" + +#: ../../inc/mod/pages.php:1869 +#, php-format +msgid "Rebuilt theme: %s" +msgstr "Reconstruir tema: %s" + +#: ../../inc/mod/pages.php:1908 +msgid "Debug: Anti-spam" +msgstr "Debug: Anti-spam" + +#: ../../inc/mod/pages.php:1932 +msgid "Debug: Recent posts" +msgstr "Debug: Mensagens recentes" + +#: ../../inc/mod/pages.php:1956 +msgid "Debug: SQL" +msgstr "" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:19 +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:29 +msgid "Boards" +msgstr "Boards" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:57 +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:183 +msgid "edit" +msgstr "editar" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:74 +msgid "Create new board" +msgstr "Criar nova board" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:84 +msgid "Messages" +msgstr "Mensagens" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:120 +#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:98 +#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:125 +msgid "no subject" +msgstr "sem assunto" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:161 +msgid "View all noticeboard entries" +msgstr "Ver todas as noticias do quadro de noticias" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:192 +msgid "Administration" +msgstr "Administração" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:239 +msgid "Change password" +msgstr "Mudar senha" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:271 +msgid "Configuration" +msgstr "Configuração" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:282 +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:293 +msgid "Search" +msgstr "Procurar" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:289 +msgid "Phrase:" +msgstr "Frase:" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:297 +msgid "" +"(Search is case-insensitive, and based on keywords. To match exact phrases, " +"use \"quotes\". Use an asterisk (*) for wildcard.)" +msgstr "" +"(A procura não diferencia maiúsculas de minusculas, e baseia-se em palavras chave. para procurar por frases exatas, " +"use \"quotes\". Utilize um asterisco (*) como coringa.)" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:309 +msgid "Debug" +msgstr "Debug" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:313 +msgid "Anti-spam" +msgstr "Anti-spam" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:316 +msgid "Recent posts" +msgstr "Mensagens recentes" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:322 +msgid "SQL" +msgstr "SQL" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:360 +msgid "User account" +msgstr "Conta de usuário" + +#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:365 +msgid "Logout" +msgstr "Sair" + +#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:21 +#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:21 +msgid "New post" +msgstr "Nova mensagem" + +#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:27 +#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:31 +#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:36 +#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:27 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:55 +msgid "Name" +msgstr "Nome" + +#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:36 +#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:63 +#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:53 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:98 +msgid "Subject" +msgstr "Assunto" + +#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:42 +#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:69 +msgid "Body" +msgstr "Mensagem" + +#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:49 +msgid "Post to noticeboard" +msgstr "Postar no quadro de notícias" + +#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:73 +#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:100 +msgid "delete" +msgstr "deletar" + +#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:106 +#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:133 +msgid "by" +msgstr "por" + +#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:118 +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:112 +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:344 +msgid "deleted?" +msgstr "deletado?" + +#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:125 +#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:136 +msgid "at" +msgstr "em" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:74 +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:169 +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:331 +msgid "Staff" +msgstr "Equipe" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:77 +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:179 +msgid "Note" +msgstr "Nota" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:80 +msgid "Date" +msgstr "Data" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:86 +msgid "Actions" +msgstr "Ações" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:142 +msgid "remove" +msgstr "remover" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:189 +msgid "New note" +msgstr "Nova nota" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:226 +msgid "Status" +msgstr "Situação" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:233 +msgid "Expired" +msgstr "Expirado" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:238 +msgid "Active" +msgstr "Ativo" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:256 +#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:32 +#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:30 +#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:90 +msgid "Reason" +msgstr "Razão" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:269 +msgid "no reason" +msgstr "sem razão especificada" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:278 +#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:20 +#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:142 +msgid "Board" +msgstr "Board" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:291 +#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:150 +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:83 +msgid "all boards" +msgstr "todas as boards" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:300 +msgid "Set" +msgstr "Configurar" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:309 +msgid "Expires" +msgstr "Expira em" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:322 +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:137 +msgid "never" +msgstr "nunca" + +#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:357 +msgid "Remove ban" +msgstr "Remover expulsão" + +#: ../../templates/cache/72/55/0d64283f30702de83ecfcb71f86a.php:25 +msgid "There are no reports." +msgstr "Não há denúncias no momento." + +#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:19 +msgid "Delete Post" +msgstr "Deletar Mensagem" + +#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:22 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:218 +msgid "File" +msgstr "Arquivo" + +#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:23 +#: ../../templates/cache/04/54/656aa217f895c90eae78024fa060.php:41 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:310 +msgid "Password" +msgstr "Senha" + +#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:27 +msgid "Delete" +msgstr "Deletar" + +#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:36 +msgid "Report" +msgstr "Denunciar" + +#: ../../templates/cache/04/54/656aa217f895c90eae78024fa060.php:28 +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:23 +msgid "Username" +msgstr "Usuário" + +#: ../../templates/cache/04/54/656aa217f895c90eae78024fa060.php:52 +msgid "Continue" +msgstr "Prosseguir" + +#: ../../templates/cache/f5/e3/343716327c6183713f70a3fb57f1.php:94 +#: ../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:175 +#: ../../templates/cache/62/8c/21348d46377c3e1b3f8c476ba376.php:63 +msgid "Return to dashboard" +msgstr "Voltar à dashboard" + +#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:36 +msgid "Report date" +msgstr "Data da denúncia" + +#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:45 +msgid "Reported by" +msgstr "Denunciado por" + +#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:63 +msgid "Discard abuse report" +msgstr "Descartar denúncia desnecessária" + +#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:80 +msgid "Discard all abuse reports by this IP address" +msgstr "Descartar todas denúncias desnecessárias deste IP" + +#: ../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:183 +msgid "Posting mode: Reply" +msgstr "Modo de postagem: Resposta" + +#: ../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:186 +#: ../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:232 +msgid "Return" +msgstr "Voltar" + +#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:76 +msgid "Post news entry" +msgstr "Postar nova notícia" + +#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:66 +msgid "(or subnet)" +msgstr "(ou subnet)" + +#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:80 +msgid "hidden" +msgstr "oculto" + +#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:107 +msgid "Message" +msgstr "Mensagem" + +#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:117 +msgid "public; attached to post" +msgstr "público; anexado à mensagem" + +#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:133 +msgid "Length" +msgstr "Tamanho" + +#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:192 +msgid "New Ban" +msgstr "Nova Expulsão" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:20 +msgid "ID" +msgstr "ID" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:26 +msgid "Type" +msgstr "Tipo" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:35 +msgid "Last action" +msgstr "Ultima ação" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:61 +msgid "Janitor" +msgstr "Faxineiro" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:64 +msgid "Mod" +msgstr "Moderador" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:67 +msgid "Admin" +msgstr "Administrador" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:78 +msgid "none" +msgstr "nenhum" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:153 +msgid "Promote" +msgstr "Promover" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:163 +msgid "Demote" +msgstr "Rebaixar" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:173 +msgid "log" +msgstr "registro" + +#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:193 +msgid "PM" +msgstr "MP" + +#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:105 +msgid "File:" +msgstr "Arquivo:" + +#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:117 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:129 +msgid "Spoiler Image" +msgstr "Imagem Spoiler" + +#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:463 +msgid "Reply" +msgstr "Responder" + +#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:490 +msgid "1 post" +msgid_plural "%count% posts" +msgstr[0] "1 mensagem" +msgstr[1] "%count% mensagens" + +#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:496 +msgid "and" +msgstr "e" + +#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:507 +msgid "1 image reply" +msgid_plural "%count% image replies" +msgstr[0] "1 resposta com imagem" +msgstr[1] "%count% respostas com imagem" + +#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:512 +msgid "omitted. Click reply to view." +msgstr "omitidas. Clique em responder para visualizar." + +#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:40 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:76 +msgid "Email" +msgstr "E-mail" + +#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:62 +msgid "Update" +msgstr "Atualizar" + +#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:69 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:138 +msgid "Comment" +msgstr "Comentar" + +#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:89 +msgid "Currently editing raw HTML." +msgstr "Editando em HTML puro." + +#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:96 +msgid "Edit markup instead?" +msgstr "Editar markup em vez disso?" + +#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:105 +msgid "Edit raw HTML instead?" +msgstr "Editar em HTML puro em vez disso?" + +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:111 +msgid "Submit" +msgstr "Enviar" + +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:159 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:185 +msgid "Verification" +msgstr "Verification" + +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:236 +msgid "Embed" +msgstr "Inserir" + +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:259 +msgid "Flags" +msgstr "Sinalizações" + +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:268 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:271 +msgid "Sticky" +msgstr "Fixar" + +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:280 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:283 +msgid "Lock" +msgstr "Trancar" + +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:292 +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:295 +msgid "Raw HTML" +msgstr "HTML Puro" + +#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:319 +msgid "(For file deletion.)" +msgstr "(Para excluir arquivos)" diff --git a/inc/mod/auth.php b/inc/mod/auth.php index 8fb01ecb..173190ab 100644 --- a/inc/mod/auth.php +++ b/inc/mod/auth.php @@ -98,8 +98,10 @@ if (isset($_COOKIE[$config['cookies']['mod']])) { // Should be username:hash:salt $cookie = explode(':', $_COOKIE[$config['cookies']['mod']]); if (count($cookie) != 3) { + // Malformed cookies destroyCookies(); - error($config['error']['malformed']); + mod_login(); + exit; } $query = prepare("SELECT `id`, `type`, `boards`, `password` FROM `mods` WHERE `username` = :username LIMIT 1"); @@ -111,7 +113,8 @@ if (isset($_COOKIE[$config['cookies']['mod']])) { if ($cookie[1] !== mkhash($cookie[0], $user['password'], $cookie[2])) { // Malformed cookies destroyCookies(); - error($config['error']['malformed']); + mod_login(); + exit; } $mod = array( @@ -125,7 +128,7 @@ if (isset($_COOKIE[$config['cookies']['mod']])) { function create_pm_header() { global $mod, $config; - if ($config['cache']['enabled'] && ($header = cache::get('pm_unread_' . $mod['id'])) !== false) { + if ($config['cache']['enabled'] && ($header = cache::get('pm_unread_' . $mod['id'])) != false) { if ($header === true) return false; diff --git a/inc/mod/ban.php b/inc/mod/ban.php index 9c93d70e..cfc2636f 100644 --- a/inc/mod/ban.php +++ b/inc/mod/ban.php @@ -56,7 +56,7 @@ function parse_time($str) { function ban($mask, $reason, $length, $board) { global $mod, $pdo; - $query = prepare("INSERT INTO `bans` VALUES (NULL, :ip, :mod, :time, :expires, :reason, :board)"); + $query = prepare("INSERT INTO `bans` VALUES (NULL, :ip, :mod, :time, :expires, :reason, :board, 0)"); $query->bindValue(':ip', $mask); $query->bindValue(':mod', $mod['id']); $query->bindValue(':time', time()); @@ -80,16 +80,25 @@ function ban($mask, $reason, $length, $board) { modLog('Created a new ' . ($length > 0 ? preg_replace('/^(\d+) (\w+?)s?$/', '$1-$2', until($length)) : 'permanent') . - ' ban (#' . $pdo->lastInsertId() . ') for ' . + ' ban on ' . + ($board ? '/' . $board . '/' : 'all boards') . + ' for ' . (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask" : utf8tohtml($mask)) . + ' (#' . $pdo->lastInsertId() . ')' . ' with ' . ($reason ? 'reason: ' . utf8tohtml($reason) . '' : 'no reason')); } -function unban($id) { +function unban($id) { + $query = prepare("SELECT `ip` FROM `bans` WHERE `id` = :id"); + $query->bindValue(':id', $id); + $query->execute() or error(db_error($query)); + $mask = $query->fetchColumn(); + $query = prepare("DELETE FROM `bans` WHERE `id` = :id"); $query->bindValue(':id', $id); $query->execute() or error(db_error($query)); - modLog("Removed ban #{$id}"); + if ($mask) + modLog("Removed ban #{$id} for " . (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask" : utf8tohtml($mask))); } diff --git a/inc/mod/pages.php b/inc/mod/pages.php index 9ccdcb77..12ad1e92 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -92,7 +92,7 @@ function mod_dashboard() { } } - if (!$config['cache']['enabled'] || ($args['unread_pms'] = cache::get('pm_unreadcount_' . $mod['id'])) === false) { + if (!$config['cache']['enabled'] || ($args['unread_pms'] = cache::get('pm_unreadcount_' . $mod['id'])) == false) { $query = prepare('SELECT COUNT(*) FROM `pms` WHERE `to` = :id AND `unread` = 1'); $query->bindValue(':id', $mod['id']); $query->execute() or error(db_error($query)); @@ -114,26 +114,37 @@ function mod_dashboard() { } else { $ctx = stream_context_create(array('http' => array('timeout' => 5))); if ($code = @file_get_contents('http://tinyboard.org/version.txt', 0, $ctx)) { - eval($code); - if (preg_match('/v(\d+)\.(\d)\.(\d+)(-dev.+)?$/', $config['version'], $matches)) { - $current = array( - 'massive' => (int) $matches[1], - 'major' => (int) $matches[2], - 'minor' => (int) $matches[3] + $ver = strtok($code, "\n"); + + if (preg_match('@^// v(\d+)\.(\d+)\.(\d+)\s*?$@', $ver, $matches)) { + $latest = array( + 'massive' => $matches[1], + 'major' => $matches[2], + 'minor' => $matches[3] ); - if (isset($m[4])) { - // Development versions are always ahead in the versioning numbers - $current['minor'] --; - } - // Check if it's newer - if (!( $latest['massive'] > $current['massive'] || - $latest['major'] > $current['major'] || - ($latest['massive'] == $current['massive'] && - $latest['major'] == $current['major'] && - $latest['minor'] > $current['minor'] - ))) + if (preg_match('/v(\d+)\.(\d)\.(\d+)(-dev.+)?$/', $config['version'], $matches)) { + $current = array( + 'massive' => (int) $matches[1], + 'major' => (int) $matches[2], + 'minor' => (int) $matches[3] + ); + if (isset($m[4])) { + // Development versions are always ahead in the versioning numbers + $current['minor'] --; + } + // Check if it's newer + if (!( $latest['massive'] > $current['massive'] || + $latest['major'] > $current['major'] || + ($latest['massive'] == $current['massive'] && + $latest['major'] == $current['major'] && + $latest['minor'] > $current['minor'] + ))) + $latest = false; + } else { $latest = false; + } } else { + // Couldn't get latest version $latest = false; } } else { @@ -206,6 +217,19 @@ function mod_edit_board($boardName) { $query = prepare('DELETE FROM `antispam` WHERE `board` = :board'); $query->bindValue(':board', $board['uri']); $query->execute() or error(db_error($query)); + + // Remove board from users/permissions table + $query = query('SELECT `id`,`boards` FROM `mods`') or error(db_error()); + while ($user = $query->fetch(PDO::FETCH_ASSOC)) { + $user_boards = explode(',', $user['boards']); + if (in_array($board['uri'], $user_boards)) { + unset($user_boards[array_search($board['uri'], $user_boards)]); + $_query = prepare('UPDATE `mods` SET `boards` = :boards WHERE `id` = :id'); + $_query->bindValue(':boards', implode(',', $user_boards)); + $_query->bindValue(':id', $user['id']); + $_query->execute() or error(db_error($_query)); + } + } } else { $query = prepare('UPDATE `boards` SET `title` = :title, `subtitle` = :subtitle WHERE `uri` = :uri'); $query->bindValue(':uri', $board['uri']); @@ -589,6 +613,15 @@ function mod_page_ip($ip) { $args['notes'] = $query->fetchAll(PDO::FETCH_ASSOC); } + if (hasPermission($config['mod']['modlog_ip'])) { + $query = prepare("SELECT `username`, `mod`, `ip`, `board`, `time`, `text` FROM `modlogs` LEFT JOIN `mods` ON `mod` = `mods`.`id` WHERE `text` LIKE :search ORDER BY `time` DESC LIMIT 20"); + $query->bindValue(':search', '%' . $ip . '%'); + $query->execute() or error(db_error($query)); + $args['logs'] = $query->fetchAll(PDO::FETCH_ASSOC); + } else { + $args['logs'] = array(); + } + mod_page(sprintf('%s: %s', _('IP'), $ip), 'mod/view_ip.html', $args, $args['hostname']); } @@ -631,7 +664,8 @@ function mod_bans($page_no = 1) { if (preg_match('/^ban_(\d+)$/', $name, $match)) $unban[] = $match[1]; } - + if (isset($config['mod']['unban_limit'])){ + if (count($unban) <= $config['mod']['unban_limit'] || $config['mod']['unban_limit'] == -1){ if (!empty($unban)) { query('DELETE FROM `bans` WHERE `id` = ' . implode(' OR `id` = ', $unban)) or error(db_error()); @@ -639,7 +673,21 @@ function mod_bans($page_no = 1) { modLog("Removed ban #{$id}"); } } + } else { + error(sprintf($config['error']['toomanyunban'], $config['mod']['unban_limit'], count($unban) )); + } + } else { + + if (!empty($unban)) { + query('DELETE FROM `bans` WHERE `id` = ' . implode(' OR `id` = ', $unban)) or error(db_error()); + + foreach ($unban as $id) { + modLog("Removed ban #{$id}"); + } + } + + } header('Location: ?/bans', true, $config['redirect_http']); } @@ -690,6 +738,13 @@ function mod_lock($board, $unlock, $post) { buildIndex(); } + if ($config['mod']['dismiss_reports_on_lock']) { + $query = prepare('DELETE FROM `reports` WHERE `board` = :board AND `post` = :id'); + $query->bindValue(':board', $board); + $query->bindValue(':id', $post); + $query->execute() or error(db_error($query)); + } + header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); if ($unlock) @@ -871,8 +926,10 @@ function mod_move($originBoard, $postID) { modLog("Moved thread #${postID} to " . sprintf($config['board_abbreviation'], $targetBoard) . " (#${newID})", $originBoard); - // build new hread + // build new thread buildThread($newID); + + clean(); buildIndex(); // trigger themes @@ -892,7 +949,7 @@ function mod_move($originBoard, $postID) { 'mod' => true, 'subject' => '', 'email' => '', - 'name' => $config['mod']['shadow_name'], + 'name' => (!$config['mod']['shadow_name'] ? $config['anonymous'] : $config['mod']['shadow_name']), 'capcode' => $config['mod']['shadow_capcode'], 'trip' => '', 'password' => '', @@ -1834,6 +1891,7 @@ function mod_theme_configure($theme_name) { 'result' => $result, 'message' => $message, )); + return; } $settings = themeSettings($theme_name); diff --git a/install.php b/install.php index 1447c723..42fbb15d 100644 --- a/install.php +++ b/install.php @@ -1,7 +1,7 @@ vichan-devel-4.0.1'); require 'inc/functions.php'; @@ -227,6 +227,9 @@ if (file_exists($config['has_installed'])) { query(sprintf("CREATE INDEX `thread_id` ON `posts_%s` (`thread`, `id`)", $_board['uri'])) or error(db_error()); query(sprintf("ALTER TABLE `posts_%s` DROP INDEX `thread`", $_board['uri'])) or error(db_error()); } + case 'v0.9.6-dev-7': + case 'v0.9.6-dev-7 + vichan-devel-4.0-gold': + query("ALTER TABLE `bans` ADD `seen` BOOLEAN NOT NULL") or error(db_error()); case false: // Update version number file_write($config['has_installed'], VERSION); diff --git a/install.sql b/install.sql index 811811e2..04896681 100644 --- a/install.sql +++ b/install.sql @@ -51,6 +51,7 @@ CREATE TABLE IF NOT EXISTS `bans` ( `expires` int(11) DEFAULT NULL, `reason` text, `board` varchar(120) DEFAULT NULL, + `seen` tinyint(1) NOT NULL, PRIMARY KEY (`id`), FULLTEXT KEY `ip` (`ip`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; diff --git a/js/auto-reload.js b/js/auto-reload.js index c0c63056..5d96146a 100644 --- a/js/auto-reload.js +++ b/js/auto-reload.js @@ -16,6 +16,9 @@ $(document).ready(function(){ if($('div.banner').length == 0) return; // not index + + if($(".post.op").size() != 1) + return; //not thread page var poll_interval; diff --git a/js/expand.js b/js/expand.js index 15408813..6371f92c 100644 --- a/js/expand.js +++ b/js/expand.js @@ -1,5 +1,5 @@ /* - *expand.js + * expand.js * https://github.com/savetheinternet/Tinyboard/blob/master/js/expand.js * * Released under the MIT license @@ -17,7 +17,7 @@ $(document).ready(function(){ $('div.post.op span.omitted').each(function() { $(this) - .html($(this).text().replace(/Click reply to view\.|Kliknij Odpowiedź aby zobaczyć\./, 'Click to expand.')) + .html($(this).text().replace(_("Click reply to view."), ''+_("Click to expand")+'.')) .find('a').click(function() { var thread = $(this).parent().parent().parent(); var id = thread.attr('id').replace(/^thread_/, ''); @@ -35,9 +35,10 @@ $(document).ready(function(){ } last_expanded = $(this); + $(document).trigger('new_post', this); } }); - $('Hide expanded replies.') + $('' + _('Hide expanded replies') + '.') .insertAfter(thread.find('span.omitted').css('display', 'none')) .click(function() { thread.find('.expanded').remove(); diff --git a/js/forced-anon.js b/js/forced-anon.js index 3dbf0dfc..6ae43882 100644 --- a/js/forced-anon.js +++ b/js/forced-anon.js @@ -56,17 +56,17 @@ $(document).ready(function() { forced_anon = localStorage['forcedanon'] ? true : false; $('hr:first').before(''); - $('div#forced-anon a').text('Forced anonymity (' + (forced_anon ? 'enabled' : 'disabled') + ')'); + $('div#forced-anon a').text(_('Forced anonymity')+' (' + (forced_anon ? _('enabled') : _('disabled')) + ')'); $('div#forced-anon a').click(function() { forced_anon = !forced_anon; if(forced_anon) { - $('div#forced-anon a').text('Forced anonymity (enabled)'); + $('div#forced-anon a').text(_('Forced anonymity')+' ('+_('enabled')+')'); localStorage.forcedanon = true; enable_fa(); } else { - $('div#forced-anon a').text('Forced anonymity (disabled)'); + $('div#forced-anon a').text(_('Forced anonymity')+' ('+_('disabled')+')'); delete localStorage.forcedanon; disable_fa(); } diff --git a/js/inline-expanding.js b/js/inline-expanding.js index f6714d7f..7c9923fa 100644 --- a/js/inline-expanding.js +++ b/js/inline-expanding.js @@ -6,42 +6,50 @@ * Copyright (c) 2012 Michael Save * * Usage: + * $config['additional_javascript'][] = 'js/jquery.min.js'; * $config['additional_javascript'][] = 'js/inline-expanding.js'; * */ onready(function(){ - var link = document.getElementsByTagName('a'); + var inline_expand_post = function() { + var link = this.getElementsByTagName('a'); - for(var i = 0; i < link.length; i++) { - if(typeof link[i] == "object" && link[i].childNodes[0].src && link[i].className != 'file') { - link[i].childNodes[0].style.maxWidth = '95%'; - link[i].childNodes[0].style.maxHeight = '95%'; - link[i].onclick = function(e) { - if(e.which == 2) { - return true; - } - if(!this.tag) { - this.tag = this.childNodes[0].src; - this.childNodes[0].src = this.href; - this.childNodes[0].style.width = 'auto'; - this.childNodes[0].style.height = 'auto'; - this.childNodes[0].style.opacity = '0.4'; - this.childNodes[0].style.filter = 'alpha(opacity=40)'; - this.childNodes[0].onload = function() { - this.style.opacity = '1'; - this.style.filter = ''; + for(var i = 0; i < link.length; i++) { + if(typeof link[i] == "object" && typeof link[i].childNodes[0] !== 'undefined' && link[i].childNodes[0].src && link[i].className != 'file') { + link[i].childNodes[0].style.maxWidth = '95%'; + link[i].onclick = function(e) { + if(e.which == 2) { + return true; + } + if(!this.tag) { + this.tag = this.childNodes[0].src; + this.childNodes[0].src = this.href; + this.childNodes[0].style.width = 'auto'; + this.childNodes[0].style.height = 'auto'; + this.childNodes[0].style.opacity = '0.4'; + this.childNodes[0].style.filter = 'alpha(opacity=40)'; + this.childNodes[0].onload = function() { + this.style.opacity = '1'; + this.style.filter = ''; + } + } else { + this.childNodes[0].src = this.tag; + this.childNodes[0].style.width = 'auto'; + this.childNodes[0].style.height = 'auto'; + this.tag = ''; } - } else { - this.childNodes[0].src = this.tag; - this.childNodes[0].style.width = 'auto'; - this.childNodes[0].style.height = 'auto'; - this.tag = ''; + return false; } - return false; } - } } + + $('div[id^="thread_"]').each(inline_expand_post); + + // allow to work with auto-reload.js, etc. + $(document).bind('new_post', function(e, post) { + inline_expand_post.call(post); + }); }); diff --git a/js/local-time.js b/js/local-time.js index b92cc5be..a4e2fb51 100644 --- a/js/local-time.js +++ b/js/local-time.js @@ -6,6 +6,7 @@ * Copyright (c) 2012 Michael Save * * Usage: + * $config['additional_javascript'][] = 'js/jquery.min.js'; * $config['additional_javascript'][] = 'js/local-time.js'; * */ @@ -21,23 +22,32 @@ onready(function(){ var zeropad = function(num, count) { return [Math.pow(10, count - num.toString().length), num].join('').substr(1); }; + + var do_localtime = function(elem) { + var times = elem.getElementsByTagName('time'); - var times = document.getElementsByTagName('time'); - - for(var i = 0; i < times.length; i++) { - if(!times[i].innerHTML.match(/^\d+\/\d+\/\d+ \(\w+\) \d+:\d+:\d+$/)) - continue; - - var t = iso8601(times[i].getAttribute('datetime')); + for(var i = 0; i < times.length; i++) { + if(typeof times[i].getAttribute('data-local') == 'undefined') + continue; + var t = iso8601(times[i].getAttribute('datetime')); - times[i].innerHTML = - // date - zeropad(t.getMonth() + 1, 2) + "/" + zeropad(t.getDate(), 2) + "/" + t.getFullYear().toString().substring(2) + - " (" + ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][t.getDay()] + ") " + - // time - zeropad(t.getHours(), 2) + ":" + zeropad(t.getMinutes(), 2) + ":" + zeropad(t.getSeconds(), 2); + times[i].setAttribute('data-local', 'true'); + times[i].innerHTML = + // date + zeropad(t.getMonth() + 1, 2) + "/" + zeropad(t.getDate(), 2) + "/" + t.getFullYear().toString().substring(2) + + " (" + [_("Sun"), _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")][t.getDay()] + ") " + + // time + zeropad(t.getHours(), 2) + ":" + zeropad(t.getMinutes(), 2) + ":" + zeropad(t.getSeconds(), 2); + }; }; + + do_localtime(document); + + // allow to work with auto-reload.js, etc. + $(document).bind('new_post', function(e, post) { + do_localtime(post); + }); }); diff --git a/js/post-hider.js b/js/post-hider.js index 5cb740a5..742c21bc 100644 --- a/js/post-hider.js +++ b/js/post-hider.js @@ -1,45 +1,53 @@ -function phGetCookieName(id) { - return "ph_hide_" + id; +function phGetCookieName(board, id) { + return "ph_hide_" + board + "_" + id; } -function phPostHidden(id) { - return (localStorage.getItem(phGetCookieName(id)) != null); +function phPostHidden(board, id) { + return (localStorage.getItem(phGetCookieName(board, id)) != null); } -function phPostToggle(id) { - if(phPostHidden(id)) { localStorage.removeItem(phGetCookieName(id)); } - else { localStorage.setItem(phGetCookieName(id),"yes"); } +function phPostToggle(board, id) { + if(phPostHidden(board, id)) { localStorage.removeItem(phGetCookieName(board, id)); } + else { localStorage.setItem(phGetCookieName(board, id),"yes"); } } -function phGetInnerText(id) { - if(phPostHidden(id)) { return "[+]"; } - else { return "[-]"; } +function phGetInnerText(board, id) { + if(phPostHidden(board, id)) { return "[+]"; } + else { return "[–]"; } } function phGetOpID(element) { return Number(element.children("div.post.op").children("p.intro").children("a.post_no.p2").text()); } +function phGetOpBoard(element) { + return element.data("board"); +} function phPostHandle(element) { var id = phGetOpID(element); + var board = phGetOpBoard(element); var preplies = element.children("div.post.reply"); var pbody = element.children("div.post.op").children("div.body"); var pimage = element.children("a:first").children("img"); var pbutton = element.children("div.post.op").children("p.intro").children("a.posthider"); var pomitted = element.children("div.post.op").children("span.omitted"); - if(phPostHidden(id)) { element.addClass("thread-hidden"); pomitted.hide(); preplies.hide(); pbody.hide(); pimage.hide(); pbutton.text("[+]"); } - else { element.removeClass("thread-hidden"); pomitted.show(); preplies.show(); pbody.show(); pimage.show(); pbutton.text("[-]"); } + if(phPostHidden(board, id)) { element.addClass("thread-hidden"); pomitted.hide(); preplies.hide(); pbody.hide(); pimage.hide(); pbutton.text("[+]"); } + else { element.removeClass("thread-hidden"); pomitted.show(); preplies.show(); pbody.show(); pimage.show(); pbutton.text("[–]"); } +} + +function phHandleThread(index, element) { + // Get thread ID. + var pin = $(this).children("div.post.op").children("p.intro"); + var tid = phGetOpID($(this)); + if(tid != NaN) { + $("[?]").insertAfter(pin.children('a:last')).click(function(e) { + var eO = $(e.target); + var par = eO.parent().parent().parent(); + phPostToggle(phGetOpBoard(par), phGetOpID(par)); + phPostHandle(par); + return false; + }); + phPostHandle($(this)); + } } $(document).ready(function(){ - $('div[id^="thread"]').each(function(index, element){ - // Get thread ID. - var pin = $(this).children("div.post.op").children("p.intro"); - var tid = phGetOpID($(this)); - if(tid != NaN) { - $("[?]").insertAfter(pin.children('a:last')).click(function(e) { - var eO = $(e.target); - var par = eO.parent().parent().parent(); - phPostToggle(phGetOpID(par)); - phPostHandle(par); - return false; - }); - phPostHandle($(this)); - } - }); + if (active_page != "thread") { + $('form[name="postcontrols"] > div[id^="thread"]').each(phHandleThread); + } }); diff --git a/js/post-hover.js b/js/post-hover.js index 2f25540b..48f0ed96 100644 --- a/js/post-hover.js +++ b/js/post-hover.js @@ -20,6 +20,8 @@ onready(function(){ if(id = $link.text().match(/^>>(\d+)$/)) { id = id[1]; + } else { + return; } var $post = false; diff --git a/js/quick-post-controls.js b/js/quick-post-controls.js index 0c164bbb..c28f874f 100644 --- a/js/quick-post-controls.js +++ b/js/quick-post-controls.js @@ -24,17 +24,17 @@ $(document).ready(function(){ '' + - ': ' + + ': ' + '' + - '' + - '' + - ' ' + + '' + + '' + + ' ' + '
' + - ': ' + + ': ' + '' + - ' ' + + ' ' + '' + ''); post_form diff --git a/js/quick-reply.js b/js/quick-reply.js index ee59e805..bee204b7 100644 --- a/js/quick-reply.js +++ b/js/quick-reply.js @@ -12,12 +12,13 @@ * */ +if (active_page == 'index') { $(document).ready(function(){ if($('div.banner').length != 0) return; // not index txt_new_topic = $('form[name=post] input[type=submit]').val(); - txt_new_reply = txt_new_topic == 'Submit' ? txt_new_topic : 'Reply'; + txt_new_reply = txt_new_topic == _('Submit') ? txt_new_topic : new_reply_string; undo_quick_reply = function() { $('div.banner').remove(); @@ -26,10 +27,10 @@ $(document).ready(function(){ } $('div.post.op').each(function() { - var id = $(this).children('p.intro').children('a.post_no:eq(2)').text(); - $('[Quick Reply]').insertAfter($(this).children('p.intro').children('a:last')).click(function() { + var id = $(this).children('p.intro').children('a.post_no:eq(1)').text(); + $('['+_("Quick reply")+']').insertAfter($(this).children('p.intro').children('a:last')).click(function() { $('div.banner').remove(); - $('') + $('') .insertBefore('form[name=post]'); $('form[name=post] input[type=submit]').val(txt_new_reply); @@ -43,4 +44,4 @@ $(document).ready(function(){ }); }); }); - +} diff --git a/js/show-backlinks.js b/js/show-backlinks.js index e6e17e4f..4ead494b 100644 --- a/js/show-backlinks.js +++ b/js/show-backlinks.js @@ -46,5 +46,9 @@ onready(function(){ }; $('div.post.reply').each(showBackLinks); + + $(document).bind('new_post', function(e, post) { + showBackLinks.call(post); + }); }); diff --git a/js/smartphone-spoiler.js b/js/smartphone-spoiler.js index 67b9c789..ee904b54 100644 --- a/js/smartphone-spoiler.js +++ b/js/smartphone-spoiler.js @@ -13,12 +13,21 @@ onready(function(){ if(device_type == 'mobile') { - var spoilers = document.getElementsByClassName('spoiler'); - for(var i = 0; i < spoilers.length; i++) { - spoilers[i].onmousedown = function() { - this.style.color = 'white'; - }; - } + var fix_spoilers = function(where) { + var spoilers = where.getElementsByClassName('spoiler'); + for(var i = 0; i < spoilers.length; i++) { + spoilers[i].onmousedown = function() { + this.style.color = 'white'; + }; + } + }; + fix_spoilers(document); + + // allow to work with auto-reload.js, etc. + $(document).bind('new_post', function(e, post) { + fix_spoilers(post); + }); + } }); diff --git a/js/toggle-locked-threads.js b/js/toggle-locked-threads.js index 50c44eda..1d517a4d 100644 --- a/js/toggle-locked-threads.js +++ b/js/toggle-locked-threads.js @@ -36,7 +36,7 @@ $(document).ready(function(){ $('hr:first').before(''); $('div#toggle-locked-threads a') - .text((hide_locked_threads ? 'Show' : 'Hide') + ' locked threads') + .text(hide_locked_threads ? _('Show locked threads') : _('Hide locked threads')) .click(function() { hide_locked_threads = !hide_locked_threads; if (hide_locked_threads) { @@ -51,7 +51,7 @@ $(document).ready(function(){ delete localStorage.hidelockedthreads; } - $(this).text((hide_locked_threads ? 'Show' : 'Hide') + ' locked threads') + $(this).text(hide_locked_threads ? _('Show locked threads') : _('Hide locked threads')) }); if (hide_locked_threads) { diff --git a/mod.php b/mod.php index c0614754..e76f1f01 100644 --- a/mod.php +++ b/mod.php @@ -5,8 +5,8 @@ */ require 'inc/functions.php'; -require 'inc/mod/auth.php'; require 'inc/mod/pages.php'; +require 'inc/mod/auth.php'; // Fix for magic quotes if (get_magic_quotes_gpc()) { @@ -45,7 +45,7 @@ $pages = array( '/news/(\d+)' => 'news', // view news '/news/delete/(\d+)' => 'news_delete', // delete from news - '/edit/(\w+)' => 'edit_board', // edit board details + '/edit/([\w+.]+)' => 'edit_board', // edit board details '/new-board' => 'new_board', // create a new board '/rebuild' => 'rebuild', // rebuild static files @@ -103,9 +103,9 @@ if (isset($config['mod']['custom_pages'])) { $new_pages = array(); foreach ($pages as $key => $callback) { - if (preg_match('/^secure /', $callback)) + if (is_string($callback) && preg_match('/^secure /', $callback)) $key .= '(/(?P[a-f0-9]{8}))?'; - $new_pages[@$key[0] == '!' ? $key : "!^$key$!"] = $callback; + $new_pages[@$key[0] == '!' ? $key : '!^' . $key . '(?:&[^&=]+=[^&]*)*$!'] = $callback; } $pages = $new_pages; @@ -113,7 +113,7 @@ foreach ($pages as $uri => $handler) { if (preg_match($uri, $query, $matches)) { $matches = array_slice($matches, 1); - if (preg_match('/^secure(_POST)? /', $handler, $m)) { + if (is_string($handler) && preg_match('/^secure(_POST)? /', $handler, $m)) { $secure_post_only = isset($m[1]); if (!$secure_post_only || $_SERVER['REQUEST_METHOD'] == 'POST') { $token = isset($matches['token']) ? $matches['token'] : (isset($_POST['token']) ? $_POST['token'] : false); diff --git a/post.php b/post.php index 56091040..2825b40b 100644 --- a/post.php +++ b/post.php @@ -80,6 +80,7 @@ if (isset($_POST['delete'])) { $is_mod = isset($_POST['mod']) && $_POST['mod']; $root = $is_mod ? $config['root'] . $config['file_mod'] . '?/' : $config['root']; + if (!$is_mod) header('X-Associated-Content: "' . $root . $board['dir'] . $config['file_index'] . '"'); header('Location: ' . $root . $board['dir'] . $config['file_index'], true, $config['redirect_http']); } elseif (isset($_POST['report'])) { @@ -137,6 +138,7 @@ if (isset($_POST['delete'])) { $is_mod = isset($_POST['mod']) && $_POST['mod']; $root = $is_mod ? $config['root'] . $config['file_mod'] . '?/' : $config['root']; + if (!$is_mod) header('X-Associated-Content: "' . $root . $board['dir'] . $config['file_index'] . '"'); header('Location: ' . $root . $board['dir'] . $config['file_index'], true, $config['redirect_http']); } elseif (isset($_POST['post'])) { @@ -308,13 +310,21 @@ if (isset($_POST['delete'])) { } } - // Check if thread is locked - // but allow mods to post - if (!$post['op'] && !hasPermission($config['mod']['postinlocked'], $board['uri'])) { - if ($thread['locked']) + if (!$post['op']) { + // Check if thread is locked + // but allow mods to post + if ($thread['locked'] && !hasPermission($config['mod']['postinlocked'], $board['uri'])) error($config['error']['locked']); + + $numposts = numPosts($post['thread']); + + if ($config['reply_hard_limit'] != 0 && $config['reply_hard_limit'] <= $numposts['replies']) + error($config['error']['reply_hard_limit']); + + if ($post['has_file'] && $config['image_hard_limit'] != 0 && $config['image_hard_limit'] <= $numposts['images']) + error($config['error']['image_hard_limit']); } - + if ($post['has_file']) { $size = $_FILES['file']['size']; if ($size > $config['max_filesize']) @@ -625,10 +635,6 @@ if (isset($_POST['delete'])) { incrementSpamHash($post['antispam_hash']); } - if (isset($post['antispam_hash'])) { - incrementSpamHash($post['antispam_hash']); - } - if (isset($post['tracked_cites'])) { foreach ($post['tracked_cites'] as $cite) { $query = prepare('INSERT INTO `cites` VALUES (:board, :post, :target_board, :target)'); @@ -642,7 +648,7 @@ if (isset($_POST['delete'])) { buildThread($post['op'] ? $id : $post['thread']); - if (!$post['op'] && strtolower($post['email']) != 'sage' && !$thread['sage'] && ($config['reply_limit'] == 0 || numPosts($post['thread']) < $config['reply_limit'])) { + if (!$post['op'] && strtolower($post['email']) != 'sage' && !$thread['sage'] && ($config['reply_limit'] == 0 || $numposts['replies']+1 < $config['reply_limit'])) { bumpThread($post['thread']); } @@ -679,7 +685,13 @@ if (isset($_POST['delete'])) { _syslog(LOG_INFO, 'New post: /' . $board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], $post['op'] ? $id : $post['thread']) . (!$post['op'] ? '#' . $id : '')); - rebuildThemes('post'); + if (!$post['mod']) header('X-Associated-Content: "' . $redirect . '"'); + + if ($post['op']) + rebuildThemes('post-thread', $board['uri']); + else + rebuildThemes('post', $board['uri']); + header('Location: ' . $redirect, true, $config['redirect_http']); } else { if (!file_exists($config['has_installed'])) { diff --git a/stylesheets/gentoochan.css b/stylesheets/gentoochan.css new file mode 100644 index 00000000..8213eb26 --- /dev/null +++ b/stylesheets/gentoochan.css @@ -0,0 +1,67 @@ +body { + background: #0E0E0E url(data:image/gif;base64,R0lGODlhGAAMAKEEAOXl5ebm5vDw8PHx8SH+EUNyZWF0ZWQgd2l0aCBHSU1QACwAAAAAGAAMAAACRpQiY6cLa146MyY1EJQKjG81lNGRUPOIkgMJHtquBgIO7xwvpbrpduUSuXq8ntEC0bBEylYitdDAdM1ViaobkgKgZwyDLAAAOw==) repeat 0 0!important; + color: #000; +} +a:link, a:visited, p.intro a.email span.name { + -webkit-transition: all ease-in 0.3s; + -moz-transition: all ease-in 0.3s; + color: rgba(0, 0, 0, 0.6); + text-decoration:none !important; +} +a:link:hover { + -moz-transition: all ease-in 0.5s; + text-shadow: 0px 0px 2px #000; +} +a.post_no { + color: #fff; +} +.boardlist { + color: #ccc; +} +div.post.reply, input, textarea { + background: rgba(0, 0, 0, 0.1)!important; + border: 1px solid rgba(0, 0, 0, 0.2)!important; + border-radius: 2px !important; +} +div.post.reply.highlighted { + background: #f0c0b0; + border-color: #d9bfb7; +} +div.post.reply p.body a { + color: navy; +} +p.intro span.subject { + color: #000; +} +form table tr th { + background: #EA8; +} +div.ban h2 { + background: #FCA; + color: inherit; +} +div.ban { + border-color: #000; +} +div.ban p { + color: black; +} +div.pages { + background: #F0E0D6; + border-color: #D9BFB7; +} +div.pages a.selected { + color: #800; +} +hr { + border-color: rgba(0, 0, 0, 0.2); +} +div.boardlist { + color: rgba(0, 0, 0, 0.2); +} +div.boardlist a { + color: #000; +} +table.modlog tr th { + background: #EA8; +} diff --git a/templates/banned.html b/templates/banned.html index e912c1a9..e7b626f6 100644 --- a/templates/banned.html +++ b/templates/banned.html @@ -1,9 +1,17 @@ {% filter remove_whitespace %} {# Automatically removes unnecessary whitespace #}
-

{% trans %}You are banned! ;_;{% endtrans %}

+ {% if ban.expires and time() >= ban.expires %} +

{% trans %}You were banned! ;_;{% endtrans %}

+ {% else %} +

{% trans %}You are banned! ;_;{% endtrans %}

+ {% endif %}

- {% trans %}You have been banned from{% endtrans %} + {% if ban.expires and time() >= ban.expires %} + {% trans %}You were banned from{% endtrans %} + {% else %} + {% trans %}You have been banned from{% endtrans %} + {% endif %} {% if ban.board %} {{ config.board_abbreviation|sprintf(ban.board) }} {% else %} @@ -23,7 +31,9 @@

{% trans %}Your ban was filed on{% endtrans %} {{ ban.set|date(config.ban_date) }} {% trans %}and{% endtrans %} - {% if ban.expires %} + {% if ban.expires and time() >= ban.expires %} + {% trans %} has since expired. Refresh the page to continue.{% endtrans %} + {% elseif ban.expires %} {% trans %}expires{% endtrans %} {{ ban.expires|until }} {% trans %}from now, which is on{% endtrans %} {{ ban.expires|date(config.ban_date) }} diff --git a/templates/boardlist.html b/templates/boardlist.html new file mode 100644 index 00000000..62646845 --- /dev/null +++ b/templates/boardlist.html @@ -0,0 +1 @@ +I'm your overboard boardlist. You can put here anything and I reside in templates/boardlist.html diff --git a/templates/index.html b/templates/index.html index eaed3666..451ca8b1 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,9 +1,21 @@ - {% include 'header.html' %} - {{ board.url }} - {{ board.name }} + + + + {% include 'header.html' %} + {{ board.url }} - {{ board.title|e }} {{ boardlist.top }} @@ -20,7 +32,11 @@ {% include 'attention_bar.html' %} - {% include 'post_form.html' %} + {% if not no_post_form %} + {% include 'post_form.html' %} + {% else %} + {% include 'boardlist.html' %} + {% endif %} {% if config.blotter %}


{{ config.blotter }}
{% endif %}
diff --git a/templates/main.js b/templates/main.js index b0a96393..31c0254a 100644 --- a/templates/main.js +++ b/templates/main.js @@ -1,5 +1,27 @@ {% raw %} +/* gettext-compatible _ function, example of usage: + * + * > // Loading pl_PL.json here (containing polish translation strings generated by tools/i18n_compile.php) + * > alert(_("Hello!")); + * Witaj! + */ +function _(s) { + return (typeof l10n != 'undefined' && typeof l10n[s] != 'undefined') ? l10n[s] : s; +} + +/* printf-like formatting function, example of usage: + * + * > alert(fmt("There are {0} birds on {1} trees", [3,4])); + * There are 3 birds on 4 trees + * > // Loading pl_PL.json here (containing polish translation strings generated by tools/locale_compile.php) + * > alert(fmt(_("{0} users"), [3])); + * 3 uzytkownikow + */ +function fmt(s,a) { + return s.replace(/\{([0-9]+)\}/g, function(x) { return a[x[1]]; }); +} + var saved = {}; @@ -105,7 +127,7 @@ function generatePassword() { function dopost(form) { if (form.elements['name']) { - localStorage.name = form.elements['name'].value.replace(/ ##.+$/, ''); + localStorage.name = form.elements['name'].value.replace(/( |^)## .+$/, ''); } if (form.elements['email'] && form.elements['email'].value != 'sage') { localStorage.email = form.elements['email'].value; diff --git a/templates/mod/ban_list.html b/templates/mod/ban_list.html index 2edb9cdf..f8826ade 100644 --- a/templates/mod/ban_list.html +++ b/templates/mod/ban_list.html @@ -10,6 +10,7 @@ {% trans 'Set' %} {% trans 'Duration' %} {% trans 'Expires' %} + {% trans 'Seen' %} {% trans 'Staff' %} {% for ban in bans %} @@ -58,6 +59,13 @@ {% endif %} {% endif %} + + {% if ban.seen %} + {% trans 'Yes' %} + {% else %} + {% trans 'No' %} + {% endif %} + {% if ban.username %} {% if mod|hasPermission(config.mod.view_banstaff) %} diff --git a/templates/mod/dashboard.html b/templates/mod/dashboard.html index 2f0b03ad..e54b3cd3 100644 --- a/templates/mod/dashboard.html +++ b/templates/mod/dashboard.html @@ -101,6 +101,7 @@ +{#
{% trans 'Search' %} @@ -115,6 +116,7 @@
+#} {% if config.debug %}
diff --git a/templates/mod/view_ip.html b/templates/mod/view_ip.html index c49880ae..e2dad7af 100644 --- a/templates/mod/view_ip.html +++ b/templates/mod/view_ip.html @@ -136,6 +136,16 @@ {% endif %} + + {% trans 'Seen' %} + + {% if ban.seen %} + {% trans 'Yes' %} + {% else %} + {% trans 'No' %} + {% endif %} + + {% trans 'Staff' %} @@ -161,3 +171,43 @@ {% include 'mod/ban_form.html' %}
{% endif %} + +{% if logs|count > 0 %} +
+ History + + + + + + + + {% for log in logs %} + + + + + + + {% endfor %} +
{% trans 'Staff' %}{% trans 'Time' %}{% trans 'Board' %}{% trans 'Action' %}
+ {% if log.username %} + {{ log.username|e }} + {% elseif log.mod == -1 %} + system + {% else %} + {% trans 'deleted?' %} + {% endif %} + + {{ log.time|ago }} + + {% if log.board %} + {{ config.board_abbreviation|sprintf(log.board) }} + {% else %} + - + {% endif %} + + {{ log.text }} +
+
+{% endif %} diff --git a/templates/page.html b/templates/page.html index 6e7a8a18..07eea62e 100644 --- a/templates/page.html +++ b/templates/page.html @@ -1,8 +1,8 @@ - {% include 'header.html' %} + {% include 'header.html' %} {{ title }} diff --git a/templates/post_form.html b/templates/post_form.html index 01b642d3..64451fb9 100755 --- a/templates/post_form.html +++ b/templates/post_form.html @@ -24,24 +24,22 @@ {{ antibot.html() }} + {% if not (not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri))) %} + {% if config.spoiler_images %} {% endif %} + {% endif %} {% endif %} - - {% if not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri)) %} + {% if not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri)) %} + {% trans %}Subject{% endtrans %} {{ antibot.html() }} - {% else %} - {% trans %}Submit{% endtrans %} - {{ antibot.html() }} - - - {% endif %} {% if config.spoiler_images %} {% endif %} + {% endif %} {% trans %}Comment{% endtrans %} @@ -50,6 +48,11 @@ {{ antibot.html() }} + {% if not (not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri))) %} + {% if not (not config.field_disable_email or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri))) %} + {% if config.spoiler_images %} {% endif %} + {% endif %} + {% endif %} {% if config.recaptcha %} @@ -59,7 +62,7 @@ {{ antibot.html() }} - + {{ antibot.html() }} diff --git a/templates/post_reply.html b/templates/post_reply.html index 73ff2c15..450f8246 100644 --- a/templates/post_reply.html +++ b/templates/post_reply.html @@ -7,14 +7,14 @@