1
0
mirror of https://github.com/vichan-devel/vichan.git synced 2024-12-01 10:37:18 +01:00

SWITCH TO 5.0; MERGE VICHAN

This commit is contained in:
8chan 2014-05-14 16:09:04 +00:00
commit c26e339a77
377 changed files with 4942 additions and 1709 deletions

View File

@ -1,11 +0,0 @@
<?php
require_once 'inc/functions.php';
checkBan();
$text = isset($_POST['text']) ? $_POST['text'] : '';
if(strlen($text)>0 && !preg_match('/a href/', $text)) {
file_put_contents("attentionbar.txt",htmlspecialchars($text));
if(strlen($_SERVER['HTTP_REFERER'])>0) { header('Location: ' . $_SERVER['HTTP_REFERER']); }
else { header('Location: /'); }
} else print(file_get_contents("attentionbar.txt"));
return;
?>

View File

@ -1 +0,0 @@
- * ( Pasek Atencji ) * -

View File

@ -26,12 +26,6 @@ class Api {
'trip' => 'trip', 'trip' => 'trip',
'capcode' => 'capcode', 'capcode' => 'capcode',
'time' => 'time', 'time' => 'time',
'thumbheight' => 'tn_w',
'thumbwidth' => 'tn_h',
'fileheight' => 'w',
'filewidth' => 'h',
'filesize' => 'fsize',
'filename' => 'filename',
'omitted' => 'omitted_posts', 'omitted' => 'omitted_posts',
'omitted_images' => 'omitted_images', 'omitted_images' => 'omitted_images',
'replies' => 'replies', 'replies' => 'replies',
@ -46,6 +40,15 @@ class Api {
'bump' => 'last_modified' 'bump' => 'last_modified'
); );
$this->fileFields = array(
'thumbheight' => 'tn_w',
'thumbwidth' => 'tn_h',
'height' => 'w',
'width' => 'h',
'size' => 'fsize',
'file' => 'filename',
);
if (isset($config['api']['extra_fields']) && gettype($config['api']['extra_fields']) == 'array'){ if (isset($config['api']['extra_fields']) && gettype($config['api']['extra_fields']) == 'array'){
$this->postFields = array_merge($this->postFields, $config['api']['extra_fields']); $this->postFields = array_merge($this->postFields, $config['api']['extra_fields']);
} }
@ -67,31 +70,27 @@ class Api {
'last_modified' => 1 'last_modified' => 1
); );
private function translatePost($post, $threadsPage = false) { private function translateFields($fields, $object, &$apiPost) {
$apiPost = array();
$fields = $threadsPage ? $this->threadsPageFields : $this->postFields;
foreach ($fields as $local => $translated) { foreach ($fields as $local => $translated) {
if (!isset($post->$local)) if (!isset($object->$local))
continue; continue;
$toInt = isset(self::$ints[$translated]); $toInt = isset(self::$ints[$translated]);
$val = $post->$local; $val = $object->$local;
if ($val !== null && $val !== '') { if ($val !== null && $val !== '') {
$apiPost[$translated] = $toInt ? (int) $val : $val; $apiPost[$translated] = $toInt ? (int) $val : $val;
} }
} }
}
private function translatePost($post, $threadsPage = false) {
$apiPost = array();
$fields = $threadsPage ? $this->threadsPageFields : $this->postFields;
$this->translateFields($fields, $post, $apiPost);
if ($threadsPage) return $apiPost; if ($threadsPage) return $apiPost;
if (isset($post->filename)) {
$dotPos = strrpos($post->filename, '.');
$apiPost['filename'] = substr($post->filename, 0, $dotPos);
$apiPost['ext'] = substr($post->filename, $dotPos);
$dotPos = strrpos($post->file, '.');
$apiPost['tim'] = substr($post->file, 0, $dotPos);
}
// Handle country field // Handle country field
if (isset($post->body_nomarkup) && $this->config['country_flags']) { if (isset($post->body_nomarkup) && $this->config['country_flags']) {
$modifiers = extract_modifiers($post->body_nomarkup); $modifiers = extract_modifiers($post->body_nomarkup);
@ -104,6 +103,18 @@ class Api {
} }
} }
// Handle files
// Note: 4chan only supports one file, so only the first file is taken into account for 4chan-compatible API.
if (isset($post->files) && $post->files && !$threadsPage) {
$file = $post->files[0];
$this->translateFields($this->fileFields, $file, $apiPost);
$dotPos = strrpos($file->file, '.');
$apiPost['filename'] = substr($file->file, 0, $dotPos);
$apiPost['ext'] = substr($file->file, $dotPos);
$dotPos = strrpos($file->file, '.');
$apiPost['tim'] = substr($file->file, 0, $dotPos);
}
return $apiPost; return $apiPost;
} }

View File

@ -270,7 +270,6 @@
'recaptcha_challenge_field', 'recaptcha_challenge_field',
'recaptcha_response_field', 'recaptcha_response_field',
'spoiler', 'spoiler',
'quick-reply',
'page', 'page',
'file_url', 'file_url',
'json_response', 'json_response',
@ -451,6 +450,8 @@
// Maximum filename length to display (the rest can be viewed upon mouseover). // Maximum filename length to display (the rest can be viewed upon mouseover).
$config['max_filename_display'] = 30; $config['max_filename_display'] = 30;
// Allow users to delete their own posts?
$config['allow_delete'] = true;
// How long after posting should you have to wait before being able to delete that post? (In seconds.) // How long after posting should you have to wait before being able to delete that post? (In seconds.)
$config['delete_time'] = 10; $config['delete_time'] = 10;
// Reply limit (stops bumping thread when this is reached). // Reply limit (stops bumping thread when this is reached).
@ -607,6 +608,17 @@
* Image settings * Image settings
* ==================== * ====================
*/ */
// Maximum number of images allowed. Increasing this number enabled multi image.
// If you make it more than 1, make sure to enable the below script for the post form to change.
// $config['additional_javascript'][] = 'js/multi_image.js';
$config['max_images'] = 1;
// Method to use for determing the max filesize.
// "split" means that your max filesize is split between the images. For example, if your max filesize
// is 2MB, the filesizes of all files must add up to 2MB for it to work.
// "each" means that each file can be 2MB, so if your max_images is 3, each post could contain 6MB of
// images. "split" is recommended.
$config['multiimage_method'] = 'split';
// For resizing, maximum thumbnail dimensions. // For resizing, maximum thumbnail dimensions.
$config['thumb_width'] = 255; $config['thumb_width'] = 255;
@ -628,22 +640,22 @@
/* /*
* Thumbnailing method: * Thumbnailing method:
* *
* 'gd' PHP GD (default). Only handles the most basic image formats (GIF, JPEG, PNG). * 'gd' PHP GD (default). Only handles the most basic image formats (GIF, JPEG, PNG).
* GD is a prerequisite for Tinyboard no matter what method you choose. * GD is a prerequisite for Tinyboard no matter what method you choose.
* *
* 'imagick' PHP's ImageMagick bindings. Fast and efficient, supporting many image formats. * 'imagick' PHP's ImageMagick bindings. Fast and efficient, supporting many image formats.
* A few minor bugs. http://pecl.php.net/package/imagick * A few minor bugs. http://pecl.php.net/package/imagick
* *
* 'convert' The command line version of ImageMagick (`convert`). Fixes most of the bugs in * 'convert' The command line version of ImageMagick (`convert`). Fixes most of the bugs in
* PHP Imagick. `convert` produces the best still thumbnails and is highly recommended. * PHP Imagick. `convert` produces the best still thumbnails and is highly recommended.
* *
* 'gm' GraphicsMagick (`gm`) is a fork of ImageMagick with many improvements. It is more * 'gm' GraphicsMagick (`gm`) is a fork of ImageMagick with many improvements. It is more
* efficient and gets thumbnailing done using fewer resources. * efficient and gets thumbnailing done using fewer resources.
* *
* 'convert+gifscale' * 'convert+gifscale'
* OR 'gm+gifsicle' Same as above, with the exception of using `gifsicle` (command line application) * OR 'gm+gifsicle' Same as above, with the exception of using `gifsicle` (command line application)
* instead of `convert` for resizing GIFs. It's faster and resulting animated * instead of `convert` for resizing GIFs. It's faster and resulting animated
* thumbnails have less artifacts than if resized with ImageMagick. * thumbnails have less artifacts than if resized with ImageMagick.
*/ */
$config['thumb_method'] = 'gd'; $config['thumb_method'] = 'gd';
// $config['thumb_method'] = 'convert'; // $config['thumb_method'] = 'convert';
@ -693,7 +705,7 @@
// An alternative function for generating image filenames, instead of the default UNIX timestamp. // An alternative function for generating image filenames, instead of the default UNIX timestamp.
// $config['filename_func'] = function($post) { // $config['filename_func'] = function($post) {
// return sprintf("%s", time() . substr(microtime(), 2, 3)); // return sprintf("%s", time() . substr(microtime(), 2, 3));
// }; // };
// Thumbnail to use for the non-image file uploads. // Thumbnail to use for the non-image file uploads.
@ -730,8 +742,12 @@
// Display the file's original filename. // Display the file's original filename.
$config['show_filename'] = true; $config['show_filename'] = true;
// Display image identification links using regex.info/exif, TinEye and Google Images. // Display image identification links using ImgOps, regex.info/exif and Google Images.
$config['image_identification'] = false; $config['image_identification'] = false;
// Which of the identification links to display. Only works if $config['image_identification'] is true.
$config['image_identification_imgops'] = true;
$config['image_identification_exif'] = true;
$config['image_identification_google'] = true;
// Number of posts in a "View Last X Posts" page // Number of posts in a "View Last X Posts" page
$config['noko50_count'] = 50; $config['noko50_count'] = 50;
@ -763,11 +779,6 @@
// Number of reports you can create at once. // Number of reports you can create at once.
$config['report_limit'] = 3; $config['report_limit'] = 3;
// Attention Whoring Bar
// REMEMBER TO CHMOD attentionbar.txt PROPERLY
// Oh, and add jQuery in additional_javascript.
$config['attention_bar'] = false;
// Allow unfiltered HTML in board subtitle. This is useful for placing icons and links. // Allow unfiltered HTML in board subtitle. This is useful for placing icons and links.
$config['allow_subtitle_html'] = false; $config['allow_subtitle_html'] = false;
@ -928,12 +939,6 @@
// Minify Javascript using http://code.google.com/p/minify/. // Minify Javascript using http://code.google.com/p/minify/.
$config['minify_js'] = false; $config['minify_js'] = false;
// Allows js/quick-reply-old.js to work. This could make your imageboard more vulnerable to flood attacks.
$config['quick_reply'] = false;
// Show "SAGE!" next to sage posts
$config['show_sages'] = false;
/* /*
* ==================== * ====================
* Video embedding * Video embedding
@ -948,27 +953,27 @@
$config['embedding'] = array( $config['embedding'] = array(
array( array(
'/^https?:\/\/(\w+\.)?youtube\.com\/watch\?v=([a-zA-Z0-9\-_]{10,11})(&.+)?$/i', '/^https?:\/\/(\w+\.)?youtube\.com\/watch\?v=([a-zA-Z0-9\-_]{10,11})(&.+)?$/i',
'<iframe style="float: left;margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%" frameborder="0" id="ytplayer" type="text/html" src="https://www.youtube.com/embed/$2"></iframe>' '<iframe style="float: left;margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%" frameborder="0" id="ytplayer" type="text/html" src="http://www.youtube.com/embed/$2"></iframe>'
), ),
array( array(
'/^https?:\/\/(\w+\.)?vimeo\.com\/(\d{2,10})(\?.+)?$/i', '/^https?:\/\/(\w+\.)?vimeo\.com\/(\d{2,10})(\?.+)?$/i',
'<object style="float: left;margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=$2&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed src="https://vimeo.com/moogaloop.swf?clip_id=$2&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="%%tb_width%%" height="%%tb_height%%"></embed></object>' '<object style="float: left;margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=$2&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=$2&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="%%tb_width%%" height="%%tb_height%%"></embed></object>'
), ),
array( array(
'/^https?:\/\/(\w+\.)?dailymotion\.com\/video\/([a-zA-Z0-9]{2,10})(_.+)?$/i', '/^https?:\/\/(\w+\.)?dailymotion\.com\/video\/([a-zA-Z0-9]{2,10})(_.+)?$/i',
'<object style="float: left;margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%"><param name="movie" value="http://www.dailymotion.com/swf/video/$2"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><param name="wmode" value="transparent"></param><embed type="application/x-shockwave-flash" src="https://www.dailymotion.com/swf/video/$2" width="%%tb_width%%" height="%%tb_height%%" wmode="transparent" allowfullscreen="true" allowscriptaccess="always"></embed></object>' '<object style="float: left;margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%"><param name="movie" value="http://www.dailymotion.com/swf/video/$2"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><param name="wmode" value="transparent"></param><embed type="application/x-shockwave-flash" src="http://www.dailymotion.com/swf/video/$2" width="%%tb_width%%" height="%%tb_height%%" wmode="transparent" allowfullscreen="true" allowscriptaccess="always"></embed></object>'
), ),
array( array(
'/^https?:\/\/(\w+\.)?metacafe\.com\/watch\/(\d+)\/([a-zA-Z0-9_\-.]+)\/(\?.+)?$/i', '/^https?:\/\/(\w+\.)?metacafe\.com\/watch\/(\d+)\/([a-zA-Z0-9_\-.]+)\/(\?.+)?$/i',
'<div style="float:left;margin:10px 20px;width:%%tb_width%%px;height:%%tb_height%%px"><embed flashVars="playerVars=showStats=no|autoPlay=no" src="https://www.metacafe.com/fplayer/$2/$3.swf" width="%%tb_width%%" height="%%tb_height%%" wmode="transparent" allowFullScreen="true" allowScriptAccess="always" name="Metacafe_$2" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed></div>' '<div style="float:left;margin:10px 20px;width:%%tb_width%%px;height:%%tb_height%%px"><embed flashVars="playerVars=showStats=no|autoPlay=no" src="http://www.metacafe.com/fplayer/$2/$3.swf" width="%%tb_width%%" height="%%tb_height%%" wmode="transparent" allowFullScreen="true" allowScriptAccess="always" name="Metacafe_$2" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed></div>'
), ),
array( array(
'/^https?:\/\/video\.google\.com\/videoplay\?docid=(\d+)([&#](.+)?)?$/i', '/^https?:\/\/video\.google\.com\/videoplay\?docid=(\d+)([&#](.+)?)?$/i',
'<embed src="https://video.google.com/googleplayer.swf?docid=$1&hl=en&fs=true" style="width:%%tb_width%%px;height:%%tb_height%%px;float:left;margin:10px 20px" allowFullScreen="true" allowScriptAccess="always" type="application/x-shockwave-flash"></embed>' '<embed src="http://video.google.com/googleplayer.swf?docid=$1&hl=en&fs=true" style="width:%%tb_width%%px;height:%%tb_height%%px;float:left;margin:10px 20px" allowFullScreen="true" allowScriptAccess="always" type="application/x-shockwave-flash"></embed>'
), ),
array( array(
'/^https?:\/\/(\w+\.)?vocaroo\.com\/i\/([a-zA-Z0-9]{2,15})$/i', '/^https?:\/\/(\w+\.)?vocaroo\.com\/i\/([a-zA-Z0-9]{2,15})$/i',
'<object style="float: left;margin: 10px 20px;" width="148" height="44"><param name="movie" value="https://vocaroo.com/player.swf?playMediaID=$2&autoplay=0"></param><param name="wmode" value="transparent"></param><embed src="https://vocaroo.com/player.swf?playMediaID=$2&autoplay=0" width="148" height="44" wmode="transparent" type="application/x-shockwave-flash"></embed></object>' '<object style="float: left;margin: 10px 20px;" width="148" height="44"><param name="movie" value="http://vocaroo.com/player.swf?playMediaID=$2&autoplay=0"></param><param name="wmode" value="transparent"></param><embed src="http://vocaroo.com/player.swf?playMediaID=$2&autoplay=0" width="148" height="44" wmode="transparent" type="application/x-shockwave-flash"></embed></object>'
) )
); );
@ -989,6 +994,7 @@
$config['error']['toolong_body'] = _('The body was too long.'); $config['error']['toolong_body'] = _('The body was too long.');
$config['error']['tooshort_body'] = _('The body was too short or empty.'); $config['error']['tooshort_body'] = _('The body was too short or empty.');
$config['error']['noimage'] = _('You must upload an image.'); $config['error']['noimage'] = _('You must upload an image.');
$config['error']['toomanyimages'] = _('You have attempted to upload too many images!');
$config['error']['nomove'] = _('The server failed to handle your upload.'); $config['error']['nomove'] = _('The server failed to handle your upload.');
$config['error']['fileext'] = _('Unsupported image format.'); $config['error']['fileext'] = _('Unsupported image format.');
$config['error']['noboard'] = _('Invalid board!'); $config['error']['noboard'] = _('Invalid board!');
@ -1099,9 +1105,9 @@
// Static images. These can be URLs OR base64 (data URI scheme). These are only used if // Static images. These can be URLs OR base64 (data URI scheme). These are only used if
// $config['font_awesome'] is false (default). // $config['font_awesome'] is false (default).
// $config['image_sticky'] = 'static/sticky.gif'; // $config['image_sticky'] = 'static/sticky.png';
// $config['image_locked'] = 'static/locked.gif'; // $config['image_locked'] = 'static/locked.gif';
// $config['image_bumplocked'] = 'static/sage.gif'. // $config['image_bumplocked'] = 'static/sage.png'.
// If you want to put images and other dynamic-static stuff on another (preferably cookieless) domain. // If you want to put images and other dynamic-static stuff on another (preferably cookieless) domain.
// This will override $config['root'] and $config['dir']['...'] directives. "%s" will get replaced with // This will override $config['root'] and $config['dir']['...'] directives. "%s" will get replaced with
@ -1396,16 +1402,14 @@
$config['mod']['debug_sql'] = DISABLED; $config['mod']['debug_sql'] = DISABLED;
// Look through all cache values for debugging when APC is enabled (?/debug/apc) // Look through all cache values for debugging when APC is enabled (?/debug/apc)
$config['mod']['debug_apc'] = ADMIN; $config['mod']['debug_apc'] = ADMIN;
// Look through debug information for recent posts (?/debug/recent)
$config['mod']['debug_recent'] = ADMIN;
// Look through debug information for the antispam system (?/debug/antispam)
$config['mod']['debug_antispam'] = ADMIN;
// Edit the current configuration (via web interface) // Edit the current configuration (via web interface)
$config['mod']['edit_config'] = ADMIN; $config['mod']['edit_config'] = ADMIN;
// View ban appeals // View ban appeals
$config['mod']['view_ban_appeals'] = MOD; $config['mod']['view_ban_appeals'] = MOD;
// Accept and deny ban appeals // Accept and deny ban appeals
$config['mod']['ban_appeals'] = MOD; $config['mod']['ban_appeals'] = MOD;
// View the recent posts page
$config['mod']['recent'] = MOD;
// Config editor permissions // Config editor permissions
$config['mod']['config'] = array(); $config['mod']['config'] = array();
@ -1440,6 +1444,9 @@
// 'db', // 'db',
// ); // );
// Allow OP to remove arbitrary posts in his thread
$config['user_moderation'] = false;
/* /*
* ==================== * ====================
* Public post search * Public post search
@ -1451,16 +1458,16 @@
$config['search']['enable'] = false; $config['search']['enable'] = false;
// Maximal number of queries per IP address per minutes // Maximal number of queries per IP address per minutes
$config['search']['queries_per_minutes'] = Array(15, 2); $config['search']['queries_per_minutes'] = Array(15, 2);
// Global maximal number of queries per minutes // Global maximal number of queries per minutes
$config['search']['queries_per_minutes_all'] = Array(50, 2); $config['search']['queries_per_minutes_all'] = Array(50, 2);
// Limit of search results // Limit of search results
$config['search']['search_limit'] = 100; $config['search']['search_limit'] = 100;
// Boards for searching // Boards for searching
//$config['search']['boards'] = array('a', 'b', 'c', 'd', 'e'); //$config['search']['boards'] = array('a', 'b', 'c', 'd', 'e');
/* /*
* ==================== * ====================

View File

@ -96,7 +96,7 @@ function error($message, $priority = true, $debug_stuff = false) {
// Return the bad request header, necessary for AJAX posts // Return the bad request header, necessary for AJAX posts
// czaks: is it really so? the ajax errors only work when this is commented out // czaks: is it really so? the ajax errors only work when this is commented out
// better yet use it when ajax is disabled // better yet use it when ajax is disabled
if (!isset ($_POST['json_response'])) { if (!isset ($_POST['json_response'])) {
header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request'); header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request');
} }
@ -340,6 +340,9 @@ class Post {
foreach ($post as $key => $value) { foreach ($post as $key => $value) {
$this->{$key} = $value; $this->{$key} = $value;
} }
if (isset($this->files))
$this->files = json_decode($this->files);
$this->subject = utf8tohtml($this->subject); $this->subject = utf8tohtml($this->subject);
$this->name = utf8tohtml($this->name); $this->name = utf8tohtml($this->name);
@ -370,64 +373,11 @@ class Post {
return $this->root . $board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], $this->thread) . '#' . $pre . $this->id; return $this->root . $board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], $this->thread) . '#' . $pre . $this->id;
} }
public function postControls() {
global $board, $config;
$built = '';
if ($this->mod) {
// Mod controls (on posts)
// Delete
if (hasPermission($config['mod']['delete'], $board['uri'], $this->mod))
$built .= ' ' . secure_link_confirm($config['mod']['link_delete'], 'Delete', 'Are you sure you want to delete this?', $board['dir'] . 'delete/' . $this->id);
// Delete all posts by IP
if (hasPermission($config['mod']['deletebyip'], $board['uri'], $this->mod))
$built .= ' ' . secure_link_confirm($config['mod']['link_deletebyip'], 'Delete all posts by IP', 'Are you sure you want to delete all posts by this IP address?', $board['dir'] . 'deletebyip/' . $this->id);
// Delete all posts by IP (global)
if (hasPermission($config['mod']['deletebyip_global'], $board['uri'], $this->mod))
$built .= ' ' . secure_link_confirm($config['mod']['link_deletebyip_global'], 'Delete all posts by IP across all boards', 'Are you sure you want to delete all posts by this IP address, across all boards?', $board['dir'] . 'deletebyip/' . $this->id . '/global');
// Ban
if (hasPermission($config['mod']['ban'], $board['uri'], $this->mod))
$built .= ' <a title="'._('Ban').'" href="?/' . $board['dir'] . 'ban/' . $this->id . '">' . $config['mod']['link_ban'] . '</a>';
// Ban & Delete
if (hasPermission($config['mod']['bandelete'], $board['uri'], $this->mod))
$built .= ' <a title="'._('Ban & Delete').'" href="?/' . $board['dir'] . 'ban&amp;delete/' . $this->id . '">' . $config['mod']['link_bandelete'] . '</a>';
// Delete file (keep post)
if (!empty($this->file) && hasPermission($config['mod']['deletefile'], $board['uri'], $this->mod))
$built .= ' ' . secure_link_confirm($config['mod']['link_deletefile'], _('Delete file'), _('Are you sure you want to delete this file?'), $board['dir'] . 'deletefile/' . $this->id);
// Spoiler file (keep post)
if (!empty($this->file) && $this->file != "deleted" && $this->file != null && $this->thumb != 'spoiler' && hasPermission($config['mod']['spoilerimage'], $board['uri'], $this->mod) && $config['spoiler_images'])
$built .= ' ' . secure_link_confirm($config['mod']['link_spoilerimage'], _('Spoiler File'), _('Are you sure you want to spoiler this file?'), $board['uri'] . '/spoiler/' . $this->id);
// Move post
if (hasPermission($config['mod']['move'], $board['uri'], $this->mod) && $config['move_replies'])
$built .= ' <a title="'._('Move reply to another board').'" href="?/' . $board['uri'] . '/move_reply/' . $this->id . '">' . $config['mod']['link_move'] . '</a>';
// Edit post
if (hasPermission($config['mod']['editpost'], $board['uri'], $this->mod))
$built .= ' <a title="'._('Edit post').'" href="?/' . $board['dir'] . 'edit' . ($config['mod']['raw_html_default'] ? '_raw' : '') . '/' . $this->id . '">' . $config['mod']['link_editpost'] . '</a>';
if (!empty($built))
$built = '<span class="controls">' . $built . '</span>';
}
return $built;
}
public function ratio() {
return fraction($this->filewidth, $this->fileheight, ':');
}
public function build($index=false) { public function build($index=false) {
global $board, $config; global $board, $config;
return Element('post_reply.html', array('config' => $config, 'board' => $board, 'post' => &$this, 'index' => $index)); return Element('post_reply.html', array('config' => $config, 'board' => $board, 'post' => &$this, 'index' => $index, 'mod' => $this->mod));
} }
}; };
@ -441,6 +391,9 @@ class Thread {
$this->{$key} = $value; $this->{$key} = $value;
} }
if (isset($this->files))
$this->files = json_decode($this->files);
$this->subject = utf8tohtml($this->subject); $this->subject = utf8tohtml($this->subject);
$this->name = utf8tohtml($this->name); $this->name = utf8tohtml($this->name);
$this->mod = $mod; $this->mod = $mod;
@ -479,79 +432,8 @@ class Thread {
$this->posts[] = $post; $this->posts[] = $post;
} }
public function postCount() { public function postCount() {
return count($this->posts) + $this->omitted; return count($this->posts) + $this->omitted;
} }
public function postControls() {
global $board, $config;
$built = '';
if ($this->mod) {
// Mod controls (on posts)
// Delete
if (hasPermission($config['mod']['delete'], $board['uri'], $this->mod))
$built .= ' ' . secure_link_confirm($config['mod']['link_delete'], _('Delete'), _('Are you sure you want to delete this?'), $board['dir'] . 'delete/' . $this->id);
// Delete all posts by IP
if (hasPermission($config['mod']['deletebyip'], $board['uri'], $this->mod))
$built .= ' ' . secure_link_confirm($config['mod']['link_deletebyip'], _('Delete all posts by IP'), _('Are you sure you want to delete all posts by this IP address?'), $board['dir'] . 'deletebyip/' . $this->id);
// Delete all posts by IP (global)
if (hasPermission($config['mod']['deletebyip_global'], $board['uri'], $this->mod))
$built .= ' ' . secure_link_confirm($config['mod']['link_deletebyip_global'], _('Delete all posts by IP across all boards'), _('Are you sure you want to delete all posts by this IP address, across all boards?'), $board['dir'] . 'deletebyip/' . $this->id . '/global');
// Ban
if (hasPermission($config['mod']['ban'], $board['uri'], $this->mod))
$built .= ' <a title="'._('Ban').'" href="?/' . $board['dir'] . 'ban/' . $this->id . '">' . $config['mod']['link_ban'] . '</a>';
// Ban & Delete
if (hasPermission($config['mod']['bandelete'], $board['uri'], $this->mod))
$built .= ' <a title="'._('Ban & Delete').'" href="?/' . $board['dir'] . 'ban&amp;delete/' . $this->id . '">' . $config['mod']['link_bandelete'] . '</a>';
// Delete file (keep post)
if (!empty($this->file) && $this->file != 'deleted' && hasPermission($config['mod']['deletefile'], $board['uri'], $this->mod))
$built .= ' ' . secure_link_confirm($config['mod']['link_deletefile'], _('Delete file'), _('Are you sure you want to delete this file?'), $board['dir'] . 'deletefile/' . $this->id);
// Spoiler file (keep post)
if (!empty($this->file) && $this->file != "deleted" && $this->file != null && $this->thumb != 'spoiler' && hasPermission($config['mod']['spoilerimage'], $board['uri'], $this->mod) && $config['spoiler_images'])
$built .= ' ' . secure_link_confirm($config['mod']['link_spoilerimage'], _('Spoiler File'), _('Are you sure you want to spoiler this file?'), $board['uri'] . '/spoiler/' . $this->id);
// Sticky
if (hasPermission($config['mod']['sticky'], $board['uri'], $this->mod))
if ($this->sticky)
$built .= ' <a title="'._('Make thread not sticky').'" href="?/' . secure_link($board['dir'] . 'unsticky/' . $this->id) . '">' . $config['mod']['link_desticky'] . '</a>';
else
$built .= ' <a title="'._('Make thread sticky').'" href="?/' . secure_link($board['dir'] . 'sticky/' . $this->id) . '">' . $config['mod']['link_sticky'] . '</a>';
if (hasPermission($config['mod']['bumplock'], $board['uri'], $this->mod))
if ($this->sage)
$built .= ' <a title="'._('Allow thread to be bumped').'" href="?/' . secure_link($board['dir'] . 'bumpunlock/' . $this->id) . '">' . $config['mod']['link_bumpunlock'] . '</a>';
else
$built .= ' <a title="'._('Prevent thread from being bumped').'" href="?/' . secure_link($board['dir'] . 'bumplock/' . $this->id) . '">' . $config['mod']['link_bumplock'] . '</a>';
// Lock
if (hasPermission($config['mod']['lock'], $board['uri'], $this->mod))
if ($this->locked)
$built .= ' <a title="'._('Unlock thread').'" href="?/' . secure_link($board['dir'] . 'unlock/' . $this->id) . '">' . $config['mod']['link_unlock'] . '</a>';
else
$built .= ' <a title="'._('Lock thread').'" href="?/' . secure_link($board['dir'] . 'lock/' . $this->id) . '">' . $config['mod']['link_lock'] . '</a>';
if (hasPermission($config['mod']['move'], $board['uri'], $this->mod))
$built .= ' <a title="'._('Move thread to another board').'" href="?/' . $board['dir'] . 'move/' . $this->id . '">' . $config['mod']['link_move'] . '</a>';
// Edit post
if (hasPermission($config['mod']['editpost'], $board['uri'], $this->mod))
$built .= ' <a title="'._('Edit post').'" href="?/' . $board['dir'] . 'edit' . ($config['mod']['raw_html_default'] ? '_raw' : '') . '/' . $this->id . '">' . $config['mod']['link_editpost'] . '</a>';
if (!empty($built))
$built = '<span class="controls op">' . $built . '</span>';
}
return $built;
}
public function ratio() {
return fraction($this->filewidth, $this->fileheight, ':');
}
public function build($index=false, $isnoko50=false) { public function build($index=false, $isnoko50=false) {
global $board, $config, $debug; global $board, $config, $debug;
@ -559,7 +441,7 @@ class Thread {
event('show-thread', $this); event('show-thread', $this);
$built = Element('post_thread.html', array('config' => $config, 'board' => $board, 'post' => &$this, 'index' => $index, 'hasnoko50' => $hasnoko50, 'isnoko50' => $isnoko50)); $built = Element('post_thread.html', array('config' => $config, 'board' => $board, 'post' => &$this, 'index' => $index, 'hasnoko50' => $hasnoko50, 'isnoko50' => $isnoko50, 'mod' => $this->mod));
return $built; return $built;
} }

View File

@ -96,9 +96,9 @@ function loadConfig() {
$configstr = file_get_contents('inc/instance-config.php'); $configstr = file_get_contents('inc/instance-config.php');
if (isset($board['dir']) && file_exists($board['dir'] . '/config.php')) { if (isset($board['dir']) && file_exists($board['dir'] . '/config.php')) {
$configstr .= file_get_contents($board['dir'] . '/config.php'); $configstr .= file_get_contents($board['dir'] . '/config.php');
} }
$matches = array(); $matches = array();
preg_match_all('/[^\/*#]\$config\s*\[\s*[\'"]locale[\'"]\s*\]\s*=\s*([\'"])(.*?)\1/', $configstr, $matches); preg_match_all('/[^\/*#]\$config\s*\[\s*[\'"]locale[\'"]\s*\]\s*=\s*([\'"])(.*?)\1/', $configstr, $matches);
if ($matches && isset ($matches[2]) && $matches[2]) { if ($matches && isset ($matches[2]) && $matches[2]) {
@ -859,7 +859,7 @@ function insertFloodPost(array $post) {
function post(array $post) { function post(array $post) {
global $pdo, $board; global $pdo, $board;
$query = prepare(sprintf("INSERT INTO ``posts_%s`` VALUES ( NULL, :thread, :subject, :email, :name, :trip, :capcode, :body, :body_nomarkup, :time, :time, :thumb, :thumbwidth, :thumbheight, :file, :width, :height, :filesize, :filename, :filehash, :password, :ip, :sticky, :locked, 0, :embed)", $board['uri'])); $query = prepare(sprintf("INSERT INTO ``posts_%s`` VALUES ( NULL, :thread, :subject, :email, :name, :trip, :capcode, :body, :body_nomarkup, :time, :time, :files, :num_files, :filehash, :password, :ip, :sticky, :locked, 0, :embed)", $board['uri']));
// Basic stuff // Basic stuff
if (!empty($post['subject'])) { if (!empty($post['subject'])) {
@ -919,31 +919,12 @@ function post(array $post) {
} }
if ($post['has_file']) { if ($post['has_file']) {
$query->bindValue(':thumb', $post['thumb']); $query->bindValue(':files', json_encode($post['files']));
$query->bindValue(':thumbwidth', $post['thumbwidth'], PDO::PARAM_INT); $query->bindValue(':num_files', $post['num_files']);
$query->bindValue(':thumbheight', $post['thumbheight'], PDO::PARAM_INT);
$query->bindValue(':file', $post['file']);
if (isset($post['width'], $post['height'])) {
$query->bindValue(':width', $post['width'], PDO::PARAM_INT);
$query->bindValue(':height', $post['height'], PDO::PARAM_INT);
} else {
$query->bindValue(':width', null, PDO::PARAM_NULL);
$query->bindValue(':height', null, PDO::PARAM_NULL);
}
$query->bindValue(':filesize', $post['filesize'], PDO::PARAM_INT);
$query->bindValue(':filename', $post['filename']);
$query->bindValue(':filehash', $post['filehash']); $query->bindValue(':filehash', $post['filehash']);
} else { } else {
$query->bindValue(':thumb', null, PDO::PARAM_NULL); $query->bindValue(':files', null, PDO::PARAM_NULL);
$query->bindValue(':thumbwidth', null, PDO::PARAM_NULL); $query->bindValue(':num_files', 0);
$query->bindValue(':thumbheight', null, PDO::PARAM_NULL);
$query->bindValue(':file', null, PDO::PARAM_NULL);
$query->bindValue(':width', null, PDO::PARAM_NULL);
$query->bindValue(':height', null, PDO::PARAM_NULL);
$query->bindValue(':filesize', null, PDO::PARAM_NULL);
$query->bindValue(':filename', null, PDO::PARAM_NULL);
$query->bindValue(':filehash', null, PDO::PARAM_NULL); $query->bindValue(':filehash', null, PDO::PARAM_NULL);
} }
@ -971,33 +952,40 @@ function bumpThread($id) {
} }
// Remove file from post // Remove file from post
function deleteFile($id, $remove_entirely_if_already=true) { function deleteFile($id, $remove_entirely_if_already=true, $file=null) {
global $board, $config; global $board, $config;
$query = prepare(sprintf("SELECT `thread`,`thumb`,`file` FROM ``posts_%s`` WHERE `id` = :id LIMIT 1", $board['uri'])); $query = prepare(sprintf("SELECT `thread`, `files`, `num_files` FROM ``posts_%s`` WHERE `id` = :id LIMIT 1", $board['uri']));
$query->bindValue(':id', $id, PDO::PARAM_INT); $query->bindValue(':id', $id, PDO::PARAM_INT);
$query->execute() or error(db_error($query)); $query->execute() or error(db_error($query));
if (!$post = $query->fetch(PDO::FETCH_ASSOC)) if (!$post = $query->fetch(PDO::FETCH_ASSOC))
error($config['error']['invalidpost']); error($config['error']['invalidpost']);
$files = json_decode($post['files']);
$file_to_delete = $file !== false ? $files[(int)$file] : (object)array('file' => false);
if ($post['file'] == 'deleted' && !$post['thread']) if ($files[0]->file == 'deleted' && $post['num_files'] == 1 && !$post['thread'])
return; // Can't delete OP's image completely. return; // Can't delete OP's image completely.
$query = prepare(sprintf("UPDATE ``posts_%s`` SET `thumb` = NULL, `thumbwidth` = NULL, `thumbheight` = NULL, `filewidth` = NULL, `fileheight` = NULL, `filesize` = NULL, `filename` = NULL, `filehash` = NULL, `file` = :file WHERE `id` = :id", $board['uri'])); $query = prepare(sprintf("UPDATE ``posts_%s`` SET `files` = :file WHERE `id` = :id", $board['uri']));
if ($post['file'] == 'deleted' && $remove_entirely_if_already) { if (($file && $file_to_delete->file == 'deleted') && $remove_entirely_if_already) {
// Already deleted; remove file fully // Already deleted; remove file fully
$query->bindValue(':file', null, PDO::PARAM_NULL); $files[$file] = null;
} else { } else {
// Delete thumbnail foreach ($files as $i => $f) {
file_unlink($board['dir'] . $config['dir']['thumb'] . $post['thumb']); if (($file !== false && $i == $file) || $file === null) {
// Delete thumbnail
file_unlink($board['dir'] . $config['dir']['thumb'] . $f->thumb);
unset($files[$i]->thumb);
// Delete file // Delete file
file_unlink($board['dir'] . $config['dir']['img'] . $post['file']); file_unlink($board['dir'] . $config['dir']['img'] . $f->file);
$files[$i]->file = 'deleted';
// Set file to 'deleted' }
$query->bindValue(':file', 'deleted', PDO::PARAM_INT); }
} }
$query->bindValue(':file', json_encode($files), PDO::PARAM_STR);
$query->bindValue(':id', $id, PDO::PARAM_INT); $query->bindValue(':id', $id, PDO::PARAM_INT);
$query->execute() or error(db_error($query)); $query->execute() or error(db_error($query));
@ -1035,7 +1023,7 @@ function deletePost($id, $error_if_doesnt_exist=true, $rebuild_after=true) {
global $board, $config; global $board, $config;
// Select post and replies (if thread) in one query // Select post and replies (if thread) in one query
$query = prepare(sprintf("SELECT `id`,`thread`,`thumb`,`file` FROM ``posts_%s`` WHERE `id` = :id OR `thread` = :id", $board['uri'])); $query = prepare(sprintf("SELECT `id`,`thread`,`files` FROM ``posts_%s`` WHERE `id` = :id OR `thread` = :id", $board['uri']));
$query->bindValue(':id', $id, PDO::PARAM_INT); $query->bindValue(':id', $id, PDO::PARAM_INT);
$query->execute() or error(db_error($query)); $query->execute() or error(db_error($query));
@ -1065,13 +1053,14 @@ function deletePost($id, $error_if_doesnt_exist=true, $rebuild_after=true) {
// Rebuild thread // Rebuild thread
$rebuild = &$post['thread']; $rebuild = &$post['thread'];
} }
if ($post['thumb']) { if ($post['files']) {
// Delete thumbnail
file_unlink($board['dir'] . $config['dir']['thumb'] . $post['thumb']);
}
if ($post['file']) {
// Delete file // Delete file
file_unlink($board['dir'] . $config['dir']['img'] . $post['file']); foreach (json_decode($post['files']) as $i => $f) {
if ($f->file !== 'deleted') {
file_unlink($board['dir'] . $config['dir']['img'] . $f->file);
file_unlink($board['dir'] . $config['dir']['thumb'] . $f->thumb);
}
}
} }
$ids[] = (int)$post['id']; $ids[] = (int)$post['id'];
@ -1188,8 +1177,8 @@ function index($page, $mod=false) {
$num_images = 0; $num_images = 0;
foreach ($replies as $po) { foreach ($replies as $po) {
if ($po['file']) if ($po['num_files'])
$num_images++; $num_images+=$po['num_files'];
$thread->add(new Post($po, $mod ? '?/' : $config['root'], $mod)); $thread->add(new Post($po, $mod ? '?/' : $config['root'], $mod));
} }
@ -1212,7 +1201,7 @@ function index($page, $mod=false) {
'post_url' => $config['post_url'], 'post_url' => $config['post_url'],
'config' => $config, 'config' => $config,
'boardlist' => createBoardlist($mod), 'boardlist' => createBoardlist($mod),
'threads' => $threads 'threads' => $threads,
); );
} }
@ -1347,7 +1336,7 @@ function checkRobot($body) {
// Returns an associative array with 'replies' and 'images' keys // Returns an associative array with 'replies' and 'images' keys
function numPosts($id) { function numPosts($id) {
global $board; global $board;
$query = prepare(sprintf("SELECT COUNT(*) AS `replies`, COUNT(NULLIF(`file`, 0)) AS `images` FROM ``posts_%s`` WHERE `thread` = :thread", $board['uri'], $board['uri'])); $query = prepare(sprintf("SELECT COUNT(*) AS `replies`, SUM(`num_files`) AS `images` FROM ``posts_%s`` WHERE `thread` = :thread", $board['uri'], $board['uri']));
$query->bindValue(':thread', $id, PDO::PARAM_INT); $query->bindValue(':thread', $id, PDO::PARAM_INT);
$query->execute() or error(db_error($query)); $query->execute() or error(db_error($query));
@ -1897,7 +1886,7 @@ function markup(&$body, $track_cites = false) {
} }
// replace tabs with 8 spaces // replace tabs with 8 spaces
$body = str_replace("\t", ' ', $body); $body = str_replace("\t", ' ', $body);
return $tracked_cites; return $tracked_cites;
} }
@ -2044,8 +2033,8 @@ function buildThread50($id, $return = false, $mod = false, $thread = null, $anti
if (!isset($thread)) { if (!isset($thread)) {
$thread = new Thread($post, $mod ? '?/' : $config['root'], $mod); $thread = new Thread($post, $mod ? '?/' : $config['root'], $mod);
} else { } else {
if ($post['file']) if ($post['files'])
$num_images++; $num_images += $post['num_files'];
$thread->add(new Post($post, $mod ? '?/' : $config['root'], $mod)); $thread->add(new Post($post, $mod ? '?/' : $config['root'], $mod));
} }
@ -2077,8 +2066,8 @@ function buildThread50($id, $return = false, $mod = false, $thread = null, $anti
foreach ($allPosts as $index => $post) { foreach ($allPosts as $index => $post) {
if ($index == count($allPosts)-count($thread->posts)) if ($index == count($allPosts)-count($thread->posts))
break; break;
if ($post->file) if ($post->files)
$thread->omitted_images++; $thread->omitted_images += $post->num_files;
} }
} }
@ -2224,13 +2213,15 @@ function getPostByHashInThread($hash, $thread) {
} }
function undoImage(array $post) { function undoImage(array $post) {
if (!$post['has_file']) if (!$post['has_file'] || !isset($post['files']))
return; return;
if (isset($post['file_path'])) foreach ($post['files'] as $key => $file) {
file_unlink($post['file_path']); if (isset($file['file_path']))
if (isset($post['thumb_path'])) file_unlink($file['file_path']);
file_unlink($post['thumb_path']); if (isset($file['thumb_path']))
file_unlink($file['thumb_path']);
}
} }
function rDNS($ip_addr) { function rDNS($ip_addr) {

View File

@ -13,6 +13,7 @@ class Twig_Extensions_Extension_Tinyboard extends Twig_Extension
new Twig_SimpleFilter('filesize', 'format_bytes'), new Twig_SimpleFilter('filesize', 'format_bytes'),
new Twig_SimpleFilter('truncate', 'twig_truncate_filter'), new Twig_SimpleFilter('truncate', 'twig_truncate_filter'),
new Twig_SimpleFilter('truncate_body', 'truncate'), new Twig_SimpleFilter('truncate_body', 'truncate'),
new Twig_SimpleFilter('truncate_filename', 'twig_filename_truncate_filter'),
new Twig_SimpleFilter('extension', 'twig_extension_filter'), new Twig_SimpleFilter('extension', 'twig_extension_filter'),
new Twig_SimpleFilter('sprintf', 'sprintf'), new Twig_SimpleFilter('sprintf', 'sprintf'),
new Twig_SimpleFilter('capcode', 'capcode'), new Twig_SimpleFilter('capcode', 'capcode'),
@ -25,7 +26,7 @@ class Twig_Extensions_Extension_Tinyboard extends Twig_Extension
new Twig_SimpleFilter('until', 'until'), new Twig_SimpleFilter('until', 'until'),
new Twig_SimpleFilter('push', 'twig_push_filter'), new Twig_SimpleFilter('push', 'twig_push_filter'),
new Twig_SimpleFilter('bidi_cleanup', 'bidi_cleanup'), new Twig_SimpleFilter('bidi_cleanup', 'bidi_cleanup'),
new Twig_SimpleFilter('addslashes', 'addslashes') new Twig_SimpleFilter('addslashes', 'addslashes'),
); );
} }
@ -42,6 +43,9 @@ class Twig_Extensions_Extension_Tinyboard extends Twig_Extension
new Twig_SimpleFunction('timezone', 'twig_timezone_function'), new Twig_SimpleFunction('timezone', 'twig_timezone_function'),
new Twig_SimpleFunction('hiddenInputs', 'hiddenInputs'), new Twig_SimpleFunction('hiddenInputs', 'hiddenInputs'),
new Twig_SimpleFunction('hiddenInputsHash', 'hiddenInputsHash'), new Twig_SimpleFunction('hiddenInputsHash', 'hiddenInputsHash'),
new Twig_SimpleFunction('ratio', 'twig_ratio_function'),
new Twig_SimpleFunction('secure_link_confirm', 'twig_secure_link_confirm'),
new Twig_SimpleFunction('secure_link', 'twig_secure_link')
); );
} }
@ -100,3 +104,30 @@ function twig_truncate_filter($value, $length = 30, $preserve = false, $separato
return $value; return $value;
} }
function twig_filename_truncate_filter($value, $length = 30, $separator = '&hellip;') {
if (mb_strlen($value) > $length) {
$value = strrev($value);
$array = array_reverse(explode(".", $value, 2));
$array = array_map("strrev", $array);
$filename = &$array[0];
$extension = isset($array[1]) ? $array[1] : false;
$filename = mb_substr($filename, 0, $length - ($extension ? mb_strlen($extension) + 1 : 0)) . $separator;
return implode(".", $array);
}
return $value;
}
function twig_ratio_function($w, $h) {
return fraction($w, $h, ':');
}
function twig_secure_link_confirm($text, $title, $confirm_message, $href) {
global $config;
return '<a onclick="if (event.which==2) return true;if (confirm(\'' . htmlentities(addslashes($confirm_message)) . '\')) document.location=\'?/' . htmlspecialchars(addslashes($href . '/' . make_secure_link_token($href))) . '\';return false;" title="' . htmlentities($title) . '" href="?/' . $href . '">' . $text . '</a>';
}
function twig_secure_link($href) {
return $href . '/' . make_secure_link_token($href);
}

View File

@ -7,14 +7,14 @@
* </code> * </code>
* *
* This is a modified port of jsmin.c. Improvements: * This is a modified port of jsmin.c. Improvements:
* *
* Does not choke on some regexp literals containing quote characters. E.g. /'/ * Does not choke on some regexp literals containing quote characters. E.g. /'/
* *
* Spaces are preserved after some add/sub operators, so they are not mistakenly * Spaces are preserved after some add/sub operators, so they are not mistakenly
* converted to post-inc/dec. E.g. a + ++b -> a+ ++b * converted to post-inc/dec. E.g. a + ++b -> a+ ++b
* *
* Preserves multi-line comments that begin with /*! * Preserves multi-line comments that begin with /*!
* *
* PHP 5 or higher is required. * PHP 5 or higher is required.
* *
* Permission is hereby granted to use this version of the library under the * Permission is hereby granted to use this version of the library under the
@ -69,6 +69,7 @@ class JSMin {
protected $lookAhead = null; protected $lookAhead = null;
protected $output = ''; protected $output = '';
protected $lastByteOut = ''; protected $lastByteOut = '';
protected $keptComment = '';
/** /**
* Minify Javascript. * Minify Javascript.
@ -116,8 +117,8 @@ class JSMin {
// determine next command // determine next command
$command = self::ACTION_KEEP_A; // default $command = self::ACTION_KEEP_A; // default
if ($this->a === ' ') { if ($this->a === ' ') {
if (($this->lastByteOut === '+' || $this->lastByteOut === '-') if (($this->lastByteOut === '+' || $this->lastByteOut === '-')
&& ($this->b === $this->lastByteOut)) { && ($this->b === $this->lastByteOut)) {
// Don't delete this space. If we do, the addition/subtraction // Don't delete this space. If we do, the addition/subtraction
// could be parsed as a post-increment // could be parsed as a post-increment
} elseif (! $this->isAlphaNum($this->b)) { } elseif (! $this->isAlphaNum($this->b)) {
@ -126,16 +127,17 @@ class JSMin {
} elseif ($this->a === "\n") { } elseif ($this->a === "\n") {
if ($this->b === ' ') { if ($this->b === ' ') {
$command = self::ACTION_DELETE_A_B; $command = self::ACTION_DELETE_A_B;
// in case of mbstring.func_overload & 2, must check for null b,
// otherwise mb_strpos will give WARNING // in case of mbstring.func_overload & 2, must check for null b,
// otherwise mb_strpos will give WARNING
} elseif ($this->b === null } elseif ($this->b === null
|| (false === strpos('{[(+-', $this->b) || (false === strpos('{[(+-!~', $this->b)
&& ! $this->isAlphaNum($this->b))) { && ! $this->isAlphaNum($this->b))) {
$command = self::ACTION_DELETE_A; $command = self::ACTION_DELETE_A;
} }
} elseif (! $this->isAlphaNum($this->a)) { } elseif (! $this->isAlphaNum($this->a)) {
if ($this->b === ' ' if ($this->b === ' '
|| ($this->b === "\n" || ($this->b === "\n"
&& (false === strpos('}])+-"\'', $this->a)))) { && (false === strpos('}])+-"\'', $this->a)))) {
$command = self::ACTION_DELETE_A_B; $command = self::ACTION_DELETE_A_B;
} }
@ -160,7 +162,8 @@ class JSMin {
*/ */
protected function action($command) protected function action($command)
{ {
if ($command === self::ACTION_DELETE_A_B // make sure we don't compress "a + ++b" to "a+++b", etc.
if ($command === self::ACTION_DELETE_A_B
&& $this->b === ' ' && $this->b === ' '
&& ($this->a === '+' || $this->a === '-')) { && ($this->a === '+' || $this->a === '-')) {
// Note: we're at an addition/substraction operator; the inputIndex // Note: we're at an addition/substraction operator; the inputIndex
@ -170,58 +173,88 @@ class JSMin {
$command = self::ACTION_KEEP_A; $command = self::ACTION_KEEP_A;
} }
} }
switch ($command) { switch ($command) {
case self::ACTION_KEEP_A: case self::ACTION_KEEP_A: // 1
$this->output .= $this->a; $this->output .= $this->a;
if ($this->keptComment) {
$this->output = rtrim($this->output, "\n");
$this->output .= $this->keptComment;
$this->keptComment = '';
}
$this->lastByteOut = $this->a; $this->lastByteOut = $this->a;
// fallthrough // fallthrough intentional
case self::ACTION_DELETE_A: case self::ACTION_DELETE_A: // 2
$this->a = $this->b; $this->a = $this->b;
if ($this->a === "'" || $this->a === '"') { // string literal if ($this->a === "'" || $this->a === '"') { // string literal
$str = $this->a; // in case needed for exception $str = $this->a; // in case needed for exception
while (true) { for(;;) {
$this->output .= $this->a; $this->output .= $this->a;
$this->lastByteOut = $this->a; $this->lastByteOut = $this->a;
$this->a = $this->get(); $this->a = $this->get();
if ($this->a === $this->b) { // end quote if ($this->a === $this->b) { // end quote
break; break;
} }
if (ord($this->a) <= self::ORD_LF) { if ($this->isEOF($this->a)) {
$byte = $this->inputIndex - 1;
throw new JSMin_UnterminatedStringException( throw new JSMin_UnterminatedStringException(
"JSMin: Unterminated String at byte " "JSMin: Unterminated String at byte {$byte}: {$str}");
. $this->inputIndex . ": {$str}");
} }
$str .= $this->a; $str .= $this->a;
if ($this->a === '\\') { if ($this->a === '\\') {
$this->output .= $this->a; $this->output .= $this->a;
$this->lastByteOut = $this->a; $this->lastByteOut = $this->a;
$this->a = $this->get(); $this->a = $this->get();
$str .= $this->a; $str .= $this->a;
} }
} }
} }
// fallthrough
case self::ACTION_DELETE_A_B: // fallthrough intentional
case self::ACTION_DELETE_A_B: // 3
$this->b = $this->next(); $this->b = $this->next();
if ($this->b === '/' && $this->isRegexpLiteral()) { // RegExp literal if ($this->b === '/' && $this->isRegexpLiteral()) {
$this->output .= $this->a . $this->b; $this->output .= $this->a . $this->b;
$pattern = '/'; // in case needed for exception $pattern = '/'; // keep entire pattern in case we need to report it in the exception
while (true) { for(;;) {
$this->a = $this->get(); $this->a = $this->get();
$pattern .= $this->a; $pattern .= $this->a;
if ($this->a === '[') {
for(;;) {
$this->output .= $this->a;
$this->a = $this->get();
$pattern .= $this->a;
if ($this->a === ']') {
break;
}
if ($this->a === '\\') {
$this->output .= $this->a;
$this->a = $this->get();
$pattern .= $this->a;
}
if ($this->isEOF($this->a)) {
throw new JSMin_UnterminatedRegExpException(
"JSMin: Unterminated set in RegExp at byte "
. $this->inputIndex .": {$pattern}");
}
}
}
if ($this->a === '/') { // end pattern if ($this->a === '/') { // end pattern
break; // while (true) break; // while (true)
} elseif ($this->a === '\\') { } elseif ($this->a === '\\') {
$this->output .= $this->a; $this->output .= $this->a;
$this->a = $this->get(); $this->a = $this->get();
$pattern .= $this->a; $pattern .= $this->a;
} elseif (ord($this->a) <= self::ORD_LF) { } elseif ($this->isEOF($this->a)) {
$byte = $this->inputIndex - 1;
throw new JSMin_UnterminatedRegExpException( throw new JSMin_UnterminatedRegExpException(
"JSMin: Unterminated RegExp at byte " "JSMin: Unterminated RegExp at byte {$byte}: {$pattern}");
. $this->inputIndex .": {$pattern}");
} }
$this->output .= $this->a; $this->output .= $this->a;
$this->lastByteOut = $this->a; $this->lastByteOut = $this->a;
@ -237,31 +270,43 @@ class JSMin {
*/ */
protected function isRegexpLiteral() protected function isRegexpLiteral()
{ {
if (false !== strpos("\n{;(,=:[!&|?", $this->a)) { // we aren't dividing if (false !== strpos("(,=:[!&|?+-~*{;", $this->a)) {
// we obviously aren't dividing
return true; return true;
} }
if (' ' === $this->a) {
$length = strlen($this->output); // we have to check for a preceding keyword, and we don't need to pattern
if ($length < 2) { // weird edge case // match over the whole output.
return true; $recentOutput = substr($this->output, -10);
// check if return/typeof directly precede a pattern without a space
foreach (array('return', 'typeof') as $keyword) {
if ($this->a !== substr($keyword, -1)) {
// certainly wasn't keyword
continue;
} }
// you can't divide a keyword if (preg_match("~(^|[\\s\\S])" . substr($keyword, 0, -1) . "$~", $recentOutput, $m)) {
if (preg_match('/(?:case|else|in|return|typeof)$/', $this->output, $m)) { if ($m[1] === '' || !$this->isAlphaNum($m[1])) {
if ($this->output === $m[0]) { // odd but could happen
return true;
}
// make sure it's a keyword, not end of an identifier
$charBeforeKeyword = substr($this->output, $length - strlen($m[0]) - 1, 1);
if (! $this->isAlphaNum($charBeforeKeyword)) {
return true; return true;
} }
} }
} }
// check all keywords
if ($this->a === ' ' || $this->a === "\n") {
if (preg_match('~(^|[\\s\\S])(?:case|else|in|return|typeof)$~', $recentOutput, $m)) {
if ($m[1] === '' || !$this->isAlphaNum($m[1])) {
return true;
}
}
}
return false; return false;
} }
/** /**
* Get next char. Convert ctrl char to space. * Return the next character from stdin. Watch out for lookahead. If the character is a control character,
* translate it to a space or linefeed.
* *
* @return string * @return string
*/ */
@ -270,24 +315,36 @@ class JSMin {
$c = $this->lookAhead; $c = $this->lookAhead;
$this->lookAhead = null; $this->lookAhead = null;
if ($c === null) { if ($c === null) {
// getc(stdin)
if ($this->inputIndex < $this->inputLength) { if ($this->inputIndex < $this->inputLength) {
$c = $this->input[$this->inputIndex]; $c = $this->input[$this->inputIndex];
$this->inputIndex += 1; $this->inputIndex += 1;
} else { } else {
return null; $c = null;
} }
} }
if ($c === "\r" || $c === "\n") { if (ord($c) >= self::ORD_SPACE || $c === "\n" || $c === null) {
return $c;
}
if ($c === "\r") {
return "\n"; return "\n";
} }
if (ord($c) < self::ORD_SPACE) { // control char return ' ';
return ' ';
}
return $c;
} }
/** /**
* Get next char. If is ctrl character, translate to a space or newline. * Does $a indicate end of input?
*
* @param string $a
* @return bool
*/
protected function isEOF($a)
{
return ord($a) <= self::ORD_LF;
}
/**
* Get next char (without getting it). If is ctrl character, translate to a space or newline.
* *
* @return string * @return string
*/ */
@ -298,7 +355,7 @@ class JSMin {
} }
/** /**
* Is $c a letter, digit, underscore, dollar sign, escape, or non-ASCII? * Return true if the character is a letter, digit, underscore, dollar sign, or non-ASCII character.
* *
* @param string $c * @param string $c
* *
@ -306,77 +363,84 @@ class JSMin {
*/ */
protected function isAlphaNum($c) protected function isAlphaNum($c)
{ {
return (preg_match('/^[0-9a-zA-Z_\\$\\\\]$/', $c) || ord($c) > 126); return (preg_match('/^[a-z0-9A-Z_\\$\\\\]$/', $c) || ord($c) > 126);
} }
/** /**
* @return string * Consume a single line comment from input (possibly retaining it)
*/ */
protected function singleLineComment() protected function consumeSingleLineComment()
{ {
$comment = ''; $comment = '';
while (true) { while (true) {
$get = $this->get(); $get = $this->get();
$comment .= $get; $comment .= $get;
if (ord($get) <= self::ORD_LF) { // EOL reached if (ord($get) <= self::ORD_LF) { // end of line reached
// if IE conditional comment // if IE conditional comment
if (preg_match('/^\\/@(?:cc_on|if|elif|else|end)\\b/', $comment)) { if (preg_match('/^\\/@(?:cc_on|if|elif|else|end)\\b/', $comment)) {
return "/{$comment}"; $this->keptComment .= "/{$comment}";
} }
return $get; return;
} }
} }
} }
/** /**
* @return string * Consume a multiple line comment from input (possibly retaining it)
*
* @throws JSMin_UnterminatedCommentException * @throws JSMin_UnterminatedCommentException
*/ */
protected function multipleLineComment() protected function consumeMultipleLineComment()
{ {
$this->get(); $this->get();
$comment = ''; $comment = '';
while (true) { for(;;) {
$get = $this->get(); $get = $this->get();
if ($get === '*') { if ($get === '*') {
if ($this->peek() === '/') { // end of comment reached if ($this->peek() === '/') { // end of comment reached
$this->get(); $this->get();
// if comment preserved by YUI Compressor
if (0 === strpos($comment, '!')) { if (0 === strpos($comment, '!')) {
return "\n/*!" . substr($comment, 1) . "*/\n"; // preserved by YUI Compressor
if (!$this->keptComment) {
// don't prepend a newline if two comments right after one another
$this->keptComment = "\n";
}
$this->keptComment .= "/*!" . substr($comment, 1) . "*/\n";
} else if (preg_match('/^@(?:cc_on|if|elif|else|end)\\b/', $comment)) {
// IE conditional
$this->keptComment .= "/*{$comment}*/";
} }
// if IE conditional comment return;
if (preg_match('/^@(?:cc_on|if|elif|else|end)\\b/', $comment)) {
return "/*{$comment}*/";
}
return ' ';
} }
} elseif ($get === null) { } elseif ($get === null) {
throw new JSMin_UnterminatedCommentException( throw new JSMin_UnterminatedCommentException(
"JSMin: Unterminated comment at byte " "JSMin: Unterminated comment at byte {$this->inputIndex}: /*{$comment}");
. $this->inputIndex . ": /*{$comment}");
} }
$comment .= $get; $comment .= $get;
} }
} }
/** /**
* Get the next character, skipping over comments. * Get the next character, skipping over comments. Some comments may be preserved.
* Some comments may be preserved.
* *
* @return string * @return string
*/ */
protected function next() protected function next()
{ {
$get = $this->get(); $get = $this->get();
if ($get !== '/') { if ($get === '/') {
return $get; switch ($this->peek()) {
} case '/':
switch ($this->peek()) { $this->consumeSingleLineComment();
case '/': return $this->singleLineComment(); $get = "\n";
case '*': return $this->multipleLineComment(); break;
default: return $get; case '*':
$this->consumeMultipleLineComment();
$get = ' ';
break;
}
} }
return $get;
} }
} }

View File

@ -3,11 +3,6 @@
* Class Minify * Class Minify
* @package Minify * @package Minify
*/ */
/**
* Minify_Source
*/
require_once 'Minify/Source.php';
/** /**
* Minify - Combines, minifies, and caches JavaScript and CSS files on demand. * Minify - Combines, minifies, and caches JavaScript and CSS files on demand.
@ -29,7 +24,7 @@ require_once 'Minify/Source.php';
*/ */
class Minify { class Minify {
const VERSION = '2.1.5'; const VERSION = '2.2.0';
const TYPE_CSS = 'text/css'; const TYPE_CSS = 'text/css';
const TYPE_HTML = 'text/html'; const TYPE_HTML = 'text/html';
// there is some debate over the ideal JS Content-Type, but this is the // there is some debate over the ideal JS Content-Type, but this is the
@ -85,7 +80,6 @@ class Minify {
public static function setCache($cache = '', $fileLocking = true) public static function setCache($cache = '', $fileLocking = true)
{ {
if (is_string($cache)) { if (is_string($cache)) {
require_once 'Minify/Cache/File.php';
self::$_cache = new Minify_Cache_File($cache, $fileLocking); self::$_cache = new Minify_Cache_File($cache, $fileLocking);
} else { } else {
self::$_cache = $cache; self::$_cache = $cache;
@ -161,9 +155,11 @@ class Minify {
* *
* @param array $options controller/serve options * @param array $options controller/serve options
* *
* @return mixed null, or, if the 'quiet' option is set to true, an array * @return null|array if the 'quiet' option is set to true, an array
* with keys "success" (bool), "statusCode" (int), "content" (string), and * with keys "success" (bool), "statusCode" (int), "content" (string), and
* "headers" (array). * "headers" (array).
*
* @throws Exception
*/ */
public static function serve($controller, $options = array()) public static function serve($controller, $options = array())
{ {
@ -174,10 +170,6 @@ class Minify {
if (is_string($controller)) { if (is_string($controller)) {
// make $controller into object // make $controller into object
$class = 'Minify_Controller_' . $controller; $class = 'Minify_Controller_' . $controller;
if (! class_exists($class, false)) {
require_once "Minify/Controller/"
. str_replace('_', '/', $controller) . ".php";
}
$controller = new $class(); $controller = new $class();
/* @var Minify_Controller_Base $controller */ /* @var Minify_Controller_Base $controller */
} }
@ -219,8 +211,7 @@ class Minify {
$contentEncoding = self::$_options['encodeMethod']; $contentEncoding = self::$_options['encodeMethod'];
} else { } else {
// sniff request header // sniff request header
require_once 'HTTP/Encoder.php'; // depending on what the client accepts, $contentEncoding may be
// depending on what the client accepts, $contentEncoding may be
// 'x-gzip' while our internal encodeMethod is 'gzip'. Calling // 'x-gzip' while our internal encodeMethod is 'gzip'. Calling
// getAcceptedEncoding(false, false) leaves out compress and deflate as options. // getAcceptedEncoding(false, false) leaves out compress and deflate as options.
list(self::$_options['encodeMethod'], $contentEncoding) = HTTP_Encoder::getAcceptedEncoding(false, false); list(self::$_options['encodeMethod'], $contentEncoding) = HTTP_Encoder::getAcceptedEncoding(false, false);
@ -231,7 +222,6 @@ class Minify {
} }
// check client cache // check client cache
require_once 'HTTP/ConditionalGet.php';
$cgOptions = array( $cgOptions = array(
'lastModifiedTime' => self::$_options['lastModifiedTime'] 'lastModifiedTime' => self::$_options['lastModifiedTime']
,'isPublic' => self::$_options['isPublic'] ,'isPublic' => self::$_options['isPublic']
@ -300,7 +290,7 @@ class Minify {
throw $e; throw $e;
} }
self::$_cache->store($cacheId, $content); self::$_cache->store($cacheId, $content);
if (function_exists('gzencode')) { if (function_exists('gzencode') && self::$_options['encodeMethod']) {
self::$_cache->store($cacheId . '.gz', gzencode($content, self::$_options['encodeLevel'])); self::$_cache->store($cacheId . '.gz', gzencode($content, self::$_options['encodeLevel']));
} }
} }
@ -451,7 +441,7 @@ class Minify {
/** /**
* Set up sources to use Minify_Lines * Set up sources to use Minify_Lines
* *
* @param array $sources Minify_Source instances * @param Minify_Source[] $sources Minify_Source instances
*/ */
protected static function _setupDebug($sources) protected static function _setupDebug($sources)
{ {
@ -468,6 +458,8 @@ class Minify {
* Combines sources and minifies the result. * Combines sources and minifies the result.
* *
* @return string * @return string
*
* @throws Exception
*/ */
protected static function _combineMinify() protected static function _combineMinify()
{ {
@ -526,7 +518,6 @@ class Minify {
$imploded = implode($implodeSeparator, $groupToProcessTogether); $imploded = implode($implodeSeparator, $groupToProcessTogether);
$groupToProcessTogether = array(); $groupToProcessTogether = array();
if ($lastMinifier) { if ($lastMinifier) {
self::$_controller->loadMinifier($lastMinifier);
try { try {
$content[] = call_user_func($lastMinifier, $imploded, $lastOptions); $content[] = call_user_func($lastMinifier, $imploded, $lastOptions);
} catch (Exception $e) { } catch (Exception $e) {
@ -574,7 +565,7 @@ class Minify {
{ {
$name = preg_replace('/[^a-zA-Z0-9\\.=_,]/', '', self::$_controller->selectionId); $name = preg_replace('/[^a-zA-Z0-9\\.=_,]/', '', self::$_controller->selectionId);
$name = preg_replace('/\\.+/', '.', $name); $name = preg_replace('/\\.+/', '.', $name);
$name = substr($name, 0, 200 - 34 - strlen($prefix)); $name = substr($name, 0, 100 - 34 - strlen($prefix));
$md5 = md5(serialize(array( $md5 = md5(serialize(array(
Minify_Source::getDigest(self::$_controller->sources) Minify_Source::getDigest(self::$_controller->sources)
,self::$_options['minifiers'] ,self::$_options['minifiers']

View File

@ -4,8 +4,6 @@
* @package Minify * @package Minify
*/ */
require_once 'Minify/Source.php';
/** /**
* Maintain a single last modification time for a group of Minify sources to * Maintain a single last modification time for a group of Minify sources to
* allow use of far off Expires headers in Minify. * allow use of far off Expires headers in Minify.

View File

@ -56,6 +56,7 @@ class Minify_CSS {
public static function minify($css, $options = array()) public static function minify($css, $options = array())
{ {
$options = array_merge(array( $options = array_merge(array(
'compress' => true,
'removeCharsets' => true, 'removeCharsets' => true,
'preserveComments' => true, 'preserveComments' => true,
'currentDir' => null, 'currentDir' => null,
@ -67,21 +68,20 @@ class Minify_CSS {
if ($options['removeCharsets']) { if ($options['removeCharsets']) {
$css = preg_replace('/@charset[^;]+;\\s*/', '', $css); $css = preg_replace('/@charset[^;]+;\\s*/', '', $css);
} }
require_once 'Minify/CSS/Compressor.php'; if ($options['compress']) {
if (! $options['preserveComments']) { if (! $options['preserveComments']) {
$css = Minify_CSS_Compressor::process($css, $options); $css = Minify_CSS_Compressor::process($css, $options);
} else { } else {
require_once 'Minify/CommentPreserver.php'; $css = Minify_CommentPreserver::process(
$css = Minify_CommentPreserver::process( $css
$css ,array('Minify_CSS_Compressor', 'process')
,array('Minify_CSS_Compressor', 'process') ,array($options)
,array($options) );
); }
} }
if (! $options['currentDir'] && ! $options['prependRelativePath']) { if (! $options['currentDir'] && ! $options['prependRelativePath']) {
return $css; return $css;
} }
require_once 'Minify/CSS/UriRewriter.php';
if ($options['currentDir']) { if ($options['currentDir']) {
return Minify_CSS_UriRewriter::rewrite( return Minify_CSS_UriRewriter::rewrite(
$css $css

View File

@ -70,7 +70,7 @@ class Minify_CSS_UriRewriter {
// rewrite // rewrite
$css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/' $css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/'
,array(self::$className, '_processUriCB'), $css); ,array(self::$className, '_processUriCB'), $css);
$css = preg_replace_callback('/url\\(\\s*([^\\)\\s]+)\\s*\\)/' $css = preg_replace_callback('/url\\(\\s*([\'"](.*?)[\'"]|[^\\)\\s]+)\\s*\\)/'
,array(self::$className, '_processUriCB'), $css); ,array(self::$className, '_processUriCB'), $css);
return $css; return $css;
@ -94,7 +94,7 @@ class Minify_CSS_UriRewriter {
// append // append
$css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/' $css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/'
,array(self::$className, '_processUriCB'), $css); ,array(self::$className, '_processUriCB'), $css);
$css = preg_replace_callback('/url\\(\\s*([^\\)\\s]+)\\s*\\)/' $css = preg_replace_callback('/url\\(\\s*([\'"](.*?)[\'"]|[^\\)\\s]+)\\s*\\)/'
,array(self::$className, '_processUriCB'), $css); ,array(self::$className, '_processUriCB'), $css);
self::$_prependPath = null; self::$_prependPath = null;
@ -282,11 +282,8 @@ class Minify_CSS_UriRewriter {
? $m[1] ? $m[1]
: substr($m[1], 1, strlen($m[1]) - 2); : substr($m[1], 1, strlen($m[1]) - 2);
} }
// analyze URI // if not root/scheme relative and not starts with scheme
if ('/' !== $uri[0] // root-relative if (!preg_match('~^(/|[a-z]+\:)~', $uri)) {
&& false === strpos($uri, '//') // protocol (non-data)
&& 0 !== strpos($uri, 'data:') // data protocol
) {
// URI is file-relative: rewrite depending on options // URI is file-relative: rewrite depending on options
if (self::$_prependPath === null) { if (self::$_prependPath === null) {
$uri = self::rewriteRelative($uri, self::$_currentDir, self::$_docRoot, self::$_symlinks); $uri = self::rewriteRelative($uri, self::$_currentDir, self::$_docRoot, self::$_symlinks);

View File

@ -98,6 +98,9 @@ class Minify_Cache_File {
{ {
if ($this->_locking) { if ($this->_locking) {
$fp = fopen($this->_path . '/' . $id, 'rb'); $fp = fopen($this->_path . '/' . $id, 'rb');
if (!$fp) {
return false;
}
flock($fp, LOCK_SH); flock($fp, LOCK_SH);
$ret = stream_get_contents($fp); $ret = stream_get_contents($fp);
flock($fp, LOCK_UN); flock($fp, LOCK_UN);
@ -186,7 +189,6 @@ class Minify_Cache_File {
*/ */
protected function _log($msg) protected function _log($msg)
{ {
require_once 'Minify/Logger.php';
Minify_Logger::log($msg); Minify_Logger::log($msg);
} }

View File

@ -78,33 +78,6 @@ abstract class Minify_Controller_Base {
return $ret; return $ret;
} }
/**
* Load any code necessary to execute the given minifier callback.
*
* The controller is responsible for loading minification code on demand
* via this method. This built-in function will only load classes for
* static method callbacks where the class isn't already defined. It uses
* the PEAR convention, so, given array('Jimmy_Minifier', 'minCss'), this
* function will include 'Jimmy/Minifier.php'.
*
* If you need code loaded on demand and this doesn't suit you, you'll need
* to override this function in your subclass.
* @see Minify_Controller_Page::loadMinifier()
*
* @param callback $minifierCallback callback of minifier function
*
* @return null
*/
public function loadMinifier($minifierCallback)
{
if (is_array($minifierCallback)
&& is_string($minifierCallback[0])
&& !class_exists($minifierCallback[0], false)) {
require str_replace('_', '/', $minifierCallback[0]) . '.php';
}
}
/** /**
* Is a user-given file within an allowable directory, existing, * Is a user-given file within an allowable directory, existing,
* and having an extension js/css/html/txt ? * and having an extension js/css/html/txt ?
@ -244,7 +217,6 @@ abstract class Minify_Controller_Base {
* @return null * @return null
*/ */
public function log($msg) { public function log($msg) {
require_once 'Minify/Logger.php';
Minify_Logger::log($msg); Minify_Logger::log($msg);
} }
} }

View File

@ -4,8 +4,6 @@
* @package Minify * @package Minify
*/ */
require_once 'Minify/Controller/Base.php';
/** /**
* Controller class for minifying a set of files * Controller class for minifying a set of files
* *

View File

@ -4,8 +4,6 @@
* @package Minify * @package Minify
*/ */
require_once 'Minify/Controller/Base.php';
/** /**
* Controller class for serving predetermined groups of minimized sets, selected * Controller class for serving predetermined groups of minimized sets, selected
* by PATH_INFO * by PATH_INFO

View File

@ -4,8 +4,6 @@
* @package Minify * @package Minify
*/ */
require_once 'Minify/Controller/Base.php';
/** /**
* Controller class for requests to /min/index.php * Controller class for requests to /min/index.php
* *
@ -22,6 +20,13 @@ class Minify_Controller_MinApp extends Minify_Controller_Base {
* @return array Minify options * @return array Minify options
*/ */
public function setupSources($options) { public function setupSources($options) {
// PHP insecure by default: realpath() and other FS functions can't handle null bytes.
foreach (array('g', 'b', 'f') as $key) {
if (isset($_GET[$key])) {
$_GET[$key] = str_replace("\x00", '', (string)$_GET[$key]);
}
}
// filter controller options // filter controller options
$cOptions = array_merge( $cOptions = array_merge(
array( array(
@ -36,7 +41,6 @@ class Minify_Controller_MinApp extends Minify_Controller_Base {
$sources = array(); $sources = array();
$this->selectionId = ''; $this->selectionId = '';
$firstMissingResource = null; $firstMissingResource = null;
if (isset($_GET['g'])) { if (isset($_GET['g'])) {
// add group(s) // add group(s)
$this->selectionId .= 'g=' . $_GET['g']; $this->selectionId .= 'g=' . $_GET['g'];
@ -195,9 +199,12 @@ class Minify_Controller_MinApp extends Minify_Controller_Base {
protected function _getFileSource($file, $cOptions) protected function _getFileSource($file, $cOptions)
{ {
$spec['filepath'] = $file; $spec['filepath'] = $file;
if ($cOptions['noMinPattern'] if ($cOptions['noMinPattern'] && preg_match($cOptions['noMinPattern'], basename($file))) {
&& preg_match($cOptions['noMinPattern'], basename($file))) { if (preg_match('~\.css$~i', $file)) {
$spec['minifier'] = ''; $spec['minifyOptions']['compress'] = false;
} else {
$spec['minifier'] = '';
}
} }
return new Minify_Source($spec); return new Minify_Source($spec);
} }

View File

@ -4,8 +4,6 @@
* @package Minify * @package Minify
*/ */
require_once 'Minify/Controller/Base.php';
/** /**
* Controller class for serving a single HTML page * Controller class for serving a single HTML page
* *
@ -59,7 +57,6 @@ class Minify_Controller_Page extends Minify_Controller_Base {
'cssMinifier' => array('Minify_CSS', 'minify') 'cssMinifier' => array('Minify_CSS', 'minify')
,'jsMinifier' => array('JSMin', 'minify') ,'jsMinifier' => array('JSMin', 'minify')
); );
$this->_loadCssJsMinifiers = true;
unset($options['minifyAll']); unset($options['minifyAll']);
} }
$this->sources[] = new Minify_Source($sourceSpec); $this->sources[] = new Minify_Source($sourceSpec);
@ -67,21 +64,5 @@ class Minify_Controller_Page extends Minify_Controller_Base {
$options['contentType'] = Minify::TYPE_HTML; $options['contentType'] = Minify::TYPE_HTML;
return $options; return $options;
} }
protected $_loadCssJsMinifiers = false;
/**
* @see Minify_Controller_Base::loadMinifier()
*/
public function loadMinifier($minifierCallback)
{
if ($this->_loadCssJsMinifiers) {
// Minify will not call for these so we must manually load
// them when Minify/HTML.php is called for.
require_once 'Minify/CSS.php';
require_once 'JSMin.php';
}
parent::loadMinifier($minifierCallback); // load Minify/HTML.php
}
} }

View File

@ -4,8 +4,6 @@
* @package Minify * @package Minify
*/ */
require_once 'Minify/Controller/Base.php';
/** /**
* Controller class for emulating version 1 of minify.php (mostly a proof-of-concept) * Controller class for emulating version 1 of minify.php (mostly a proof-of-concept)
* *
@ -26,6 +24,11 @@ class Minify_Controller_Version1 extends Minify_Controller_Base {
* *
*/ */
public function setupSources($options) { public function setupSources($options) {
// PHP insecure by default: realpath() and other FS functions can't handle null bytes.
if (isset($_GET['files'])) {
$_GET['files'] = str_replace("\x00", '', (string)$_GET['files']);
}
self::_setupDefines(); self::_setupDefines();
if (MINIFY_USE_CACHE) { if (MINIFY_USE_CACHE) {
$cacheDir = defined('MINIFY_CACHE_DIR') $cacheDir = defined('MINIFY_CACHE_DIR')
@ -51,8 +54,7 @@ class Minify_Controller_Version1 extends Minify_Controller_Base {
) { ) {
return $options; return $options;
} }
$extension = $m[1];
$files = explode(',', $_GET['files']); $files = explode(',', $_GET['files']);
if (count($files) > MINIFY_MAX_FILES) { if (count($files) > MINIFY_MAX_FILES) {
return $options; return $options;
@ -63,7 +65,6 @@ class Minify_Controller_Version1 extends Minify_Controller_Base {
. DIRECTORY_SEPARATOR; . DIRECTORY_SEPARATOR;
$prependAbsPaths = $_SERVER['DOCUMENT_ROOT']; $prependAbsPaths = $_SERVER['DOCUMENT_ROOT'];
$sources = array();
$goodFiles = array(); $goodFiles = array();
$hasBadSource = false; $hasBadSource = false;

View File

@ -1,22 +1,26 @@
<?php <?php
/** /**
* Class Minify_HTML * Class Minify_HTML
* @package Minify * @package Minify
*/ */
/** /**
* Compress HTML * Compress HTML
* *
* This is a heavy regex-based removal of whitespace, unnecessary comments and * This is a heavy regex-based removal of whitespace, unnecessary comments and
* tokens. IE conditional comments are preserved. There are also options to have * tokens. IE conditional comments are preserved. There are also options to have
* STYLE and SCRIPT blocks compressed by callback functions. * STYLE and SCRIPT blocks compressed by callback functions.
* *
* A test suite is available. * A test suite is available.
* *
* @package Minify * @package Minify
* @author Stephen Clay <steve@mrclay.org> * @author Stephen Clay <steve@mrclay.org>
*/ */
class Minify_HTML { class Minify_HTML {
/**
* @var boolean
*/
protected $_jsCleanComments = true;
/** /**
* "Minify" an HTML page * "Minify" an HTML page
@ -27,21 +31,21 @@ class Minify_HTML {
* *
* 'cssMinifier' : (optional) callback function to process content of STYLE * 'cssMinifier' : (optional) callback function to process content of STYLE
* elements. * elements.
* *
* 'jsMinifier' : (optional) callback function to process content of SCRIPT * 'jsMinifier' : (optional) callback function to process content of SCRIPT
* elements. Note: the type attribute is ignored. * elements. Note: the type attribute is ignored.
* *
* 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
* unset, minify will sniff for an XHTML doctype. * unset, minify will sniff for an XHTML doctype.
* *
* @return string * @return string
*/ */
public static function minify($html, $options = array()) { public static function minify($html, $options = array()) {
$min = new Minify_HTML($html, $options); $min = new self($html, $options);
return $min->process(); return $min->process();
} }
/** /**
* Create a minifier object * Create a minifier object
* *
@ -51,14 +55,14 @@ class Minify_HTML {
* *
* 'cssMinifier' : (optional) callback function to process content of STYLE * 'cssMinifier' : (optional) callback function to process content of STYLE
* elements. * elements.
* *
* 'jsMinifier' : (optional) callback function to process content of SCRIPT * 'jsMinifier' : (optional) callback function to process content of SCRIPT
* elements. Note: the type attribute is ignored. * elements. Note: the type attribute is ignored.
* *
* 'jsCleanComments' : (optional) whether to remove HTML comments beginning and end of script block
*
* 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
* unset, minify will sniff for an XHTML doctype. * unset, minify will sniff for an XHTML doctype.
*
* @return null
*/ */
public function __construct($html, $options = array()) public function __construct($html, $options = array())
{ {
@ -72,9 +76,12 @@ class Minify_HTML {
if (isset($options['jsMinifier'])) { if (isset($options['jsMinifier'])) {
$this->_jsMinifier = $options['jsMinifier']; $this->_jsMinifier = $options['jsMinifier'];
} }
if (isset($options['jsCleanComments'])) {
$this->_jsCleanComments = (bool)$options['jsCleanComments'];
}
} }
/** /**
* Minify the markeup given in the constructor * Minify the markeup given in the constructor
* *
@ -124,7 +131,7 @@ class Minify_HTML {
// remove ws around block/undisplayed elements // remove ws around block/undisplayed elements
$this->_html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body' $this->_html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body'
.'|caption|center|cite|col(?:group)?|dd|dir|div|dl|dt|fieldset|form' .'|caption|center|col(?:group)?|dd|dir|div|dl|dt|fieldset|form'
.'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta' .'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta'
.'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)' .'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)'
.'|ul)\\b[^>]*>)/i', '$1', $this->_html); .'|ul)\\b[^>]*>)/i', '$1', $this->_html);
@ -213,17 +220,19 @@ class Minify_HTML {
// whitespace surrounding? preserve at least one space // whitespace surrounding? preserve at least one space
$ws1 = ($m[1] === '') ? '' : ' '; $ws1 = ($m[1] === '') ? '' : ' ';
$ws2 = ($m[4] === '') ? '' : ' '; $ws2 = ($m[4] === '') ? '' : ' ';
// remove HTML comments (and ending "//" if present) // remove HTML comments (and ending "//" if present)
$js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/', '', $js); if ($this->_jsCleanComments) {
$js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/', '', $js);
}
// remove CDATA section markers // remove CDATA section markers
$js = $this->_removeCdata($js); $js = $this->_removeCdata($js);
// minify // minify
$minifier = $this->_jsMinifier $minifier = $this->_jsMinifier
? $this->_jsMinifier ? $this->_jsMinifier
: 'trim'; : 'trim';
$js = call_user_func($minifier, $js); $js = call_user_func($minifier, $js);
return $this->_reservePlace($this->_needsCdata($js) return $this->_reservePlace($this->_needsCdata($js)

View File

@ -15,10 +15,10 @@ class Minify_HTML_Helper {
public $minAppUri = '/min'; public $minAppUri = '/min';
public $groupsConfigFile = ''; public $groupsConfigFile = '';
/* /**
* Get an HTML-escaped Minify URI for a group or set of files * Get an HTML-escaped Minify URI for a group or set of files
* *
* @param mixed $keyOrFiles a group key or array of filepaths/URIs * @param string|array $keyOrFiles a group key or array of filepaths/URIs
* @param array $opts options: * @param array $opts options:
* 'farExpires' : (default true) append a modified timestamp for cache revving * 'farExpires' : (default true) append a modified timestamp for cache revving
* 'debug' : (default false) append debug flag * 'debug' : (default false) append debug flag
@ -51,8 +51,12 @@ class Minify_HTML_Helper {
return htmlspecialchars($uri, ENT_QUOTES, $opts['charset']); return htmlspecialchars($uri, ENT_QUOTES, $opts['charset']);
} }
/* /**
* Get non-HTML-escaped URI to minify the specified files * Get non-HTML-escaped URI to minify the specified files
*
* @param bool $farExpires
* @param bool $debug
* @return string
*/ */
public function getRawUri($farExpires = true, $debug = false) public function getRawUri($farExpires = true, $debug = false)
{ {
@ -74,6 +78,12 @@ class Minify_HTML_Helper {
return $path; return $path;
} }
/**
* Set the files that will comprise the URI we're building
*
* @param array $files
* @param bool $checkLastModified
*/
public function setFiles($files, $checkLastModified = true) public function setFiles($files, $checkLastModified = true)
{ {
$this->_groupKey = null; $this->_groupKey = null;
@ -94,6 +104,12 @@ class Minify_HTML_Helper {
$this->_filePaths = $files; $this->_filePaths = $files;
} }
/**
* Set the group of files that will comprise the URI we're building
*
* @param string $key
* @param bool $checkLastModified
*/
public function setGroup($key, $checkLastModified = true) public function setGroup($key, $checkLastModified = true)
{ {
$this->_groupKey = $key; $this->_groupKey = $key;
@ -103,13 +119,23 @@ class Minify_HTML_Helper {
} }
if (is_file($this->groupsConfigFile)) { if (is_file($this->groupsConfigFile)) {
$gc = (require $this->groupsConfigFile); $gc = (require $this->groupsConfigFile);
if (isset($gc[$key])) { $keys = explode(',', $key);
$this->_lastModified = self::getLastModified($gc[$key]); foreach ($keys as $key) {
if (isset($gc[$key])) {
$this->_lastModified = self::getLastModified($gc[$key], $this->_lastModified);
}
} }
} }
} }
} }
/**
* Get the max(lastModified) of all files
*
* @param array|string $sources
* @param int $lastModified
* @return int
*/
public static function getLastModified($sources, $lastModified = 0) public static function getLastModified($sources, $lastModified = 0)
{ {
$max = $lastModified; $max = $lastModified;
@ -142,13 +168,19 @@ class Minify_HTML_Helper {
* @return mixed a common char or '' if any do not match * @return mixed a common char or '' if any do not match
*/ */
protected static function _getCommonCharAtPos($arr, $pos) { protected static function _getCommonCharAtPos($arr, $pos) {
$l = count($arr); if (!isset($arr[0][$pos])) {
return '';
}
$c = $arr[0][$pos]; $c = $arr[0][$pos];
if ($c === '' || $l === 1) $l = count($arr);
if ($l === 1) {
return $c; return $c;
for ($i = 1; $i < $l; ++$i) }
if ($arr[$i][$pos] !== $c) for ($i = 1; $i < $l; ++$i) {
if ($arr[$i][$pos] !== $c) {
return ''; return '';
}
}
return $c; return $c;
} }
@ -157,11 +189,11 @@ class Minify_HTML_Helper {
* *
* @param array $paths root-relative URIs of files * @param array $paths root-relative URIs of files
* @param string $minRoot root-relative URI of the "min" application * @param string $minRoot root-relative URI of the "min" application
* @return string
*/ */
protected static function _getShortestUri($paths, $minRoot = '/min/') { protected static function _getShortestUri($paths, $minRoot = '/min/') {
$pos = 0; $pos = 0;
$base = ''; $base = '';
$c;
while (true) { while (true) {
$c = self::_getCommonCharAtPos($paths, $pos); $c = self::_getCommonCharAtPos($paths, $pos);
if ($c === '') { if ($c === '') {

View File

@ -14,13 +14,68 @@
* @todo can use a stream wrapper to unit test this? * @todo can use a stream wrapper to unit test this?
*/ */
class Minify_JS_ClosureCompiler { class Minify_JS_ClosureCompiler {
const URL = 'http://closure-compiler.appspot.com/compile';
/** /**
* Minify Javascript code via HTTP request to the Closure Compiler API * @var string The option key for the maximum POST byte size
*/
const OPTION_MAX_BYTES = 'maxBytes';
/**
* @var string The option key for additional params. @see __construct
*/
const OPTION_ADDITIONAL_OPTIONS = 'additionalParams';
/**
* @var string The option key for the fallback Minifier
*/
const OPTION_FALLBACK_FUNCTION = 'fallbackFunc';
/**
* @var string The option key for the service URL
*/
const OPTION_COMPILER_URL = 'compilerUrl';
/**
* @var int The default maximum POST byte size according to https://developers.google.com/closure/compiler/docs/api-ref
*/
const DEFAULT_MAX_BYTES = 200000;
/**
* @var string[] $DEFAULT_OPTIONS The default options to pass to the compiler service
*
* @note This would be a constant if PHP allowed it
*/
private static $DEFAULT_OPTIONS = array(
'output_format' => 'text',
'compilation_level' => 'SIMPLE_OPTIMIZATIONS'
);
/**
* @var string $url URL of compiler server. defaults to Google's
*/
protected $serviceUrl = 'http://closure-compiler.appspot.com/compile';
/**
* @var int $maxBytes The maximum JS size that can be sent to the compiler server in bytes
*/
protected $maxBytes = self::DEFAULT_MAX_BYTES;
/**
* @var string[] $additionalOptions Additional options to pass to the compiler service
*/
protected $additionalOptions = array();
/**
* @var callable Function to minify JS if service fails. Default is JSMin
*/
protected $fallbackMinifier = array('JSMin', 'minify');
/**
* Minify JavaScript code via HTTP request to a Closure Compiler API
* *
* @param string $js input code * @param string $js input code
* @param array $options unused at this point * @param array $options Options passed to __construct(). @see __construct
*
* @return string * @return string
*/ */
public static function minify($js, array $options = array()) public static function minify($js, array $options = array())
@ -30,63 +85,101 @@ class Minify_JS_ClosureCompiler {
} }
/** /**
* @param array $options Options with keys available below:
* *
* @param array $options * fallbackFunc : (callable) function to minify if service unavailable. Default is JSMin.
* *
* fallbackFunc : default array($this, 'fallback'); * compilerUrl : (string) URL to closure compiler server
*
* maxBytes : (int) The maximum amount of bytes to be sent as js_code in the POST request.
* Defaults to 200000.
*
* additionalParams : (string[]) Additional parameters to pass to the compiler server. Can be anything named
* in https://developers.google.com/closure/compiler/docs/api-ref except for js_code and
* output_info
*/ */
public function __construct(array $options = array()) public function __construct(array $options = array())
{ {
$this->_fallbackFunc = isset($options['fallbackMinifier']) if (isset($options[self::OPTION_FALLBACK_FUNCTION])) {
? $options['fallbackMinifier'] $this->fallbackMinifier = $options[self::OPTION_FALLBACK_FUNCTION];
: array($this, '_fallback'); }
if (isset($options[self::OPTION_COMPILER_URL])) {
$this->serviceUrl = $options[self::OPTION_COMPILER_URL];
}
if (isset($options[self::OPTION_ADDITIONAL_OPTIONS]) && is_array($options[self::OPTION_ADDITIONAL_OPTIONS])) {
$this->additionalOptions = $options[self::OPTION_ADDITIONAL_OPTIONS];
}
if (isset($options[self::OPTION_MAX_BYTES])) {
$this->maxBytes = (int) $options[self::OPTION_MAX_BYTES];
}
} }
/**
* Call the service to perform the minification
*
* @param string $js JavaScript code
* @return string
* @throws Minify_JS_ClosureCompiler_Exception
*/
public function min($js) public function min($js)
{ {
$postBody = $this->_buildPostBody($js); $postBody = $this->buildPostBody($js);
$bytes = (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2))
? mb_strlen($postBody, '8bit') if ($this->maxBytes > 0) {
: strlen($postBody); $bytes = (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2))
if ($bytes > 200000) { ? mb_strlen($postBody, '8bit')
throw new Minify_JS_ClosureCompiler_Exception( : strlen($postBody);
'POST content larger than 200000 bytes' if ($bytes > $this->maxBytes) {
); throw new Minify_JS_ClosureCompiler_Exception(
'POST content larger than ' . $this->maxBytes . ' bytes'
);
}
} }
$response = $this->_getResponse($postBody);
$response = $this->getResponse($postBody);
if (preg_match('/^Error\(\d\d?\):/', $response)) { if (preg_match('/^Error\(\d\d?\):/', $response)) {
if (is_callable($this->_fallbackFunc)) { if (is_callable($this->fallbackMinifier)) {
// use fallback
$response = "/* Received errors from Closure Compiler API:\n$response" $response = "/* Received errors from Closure Compiler API:\n$response"
. "\n(Using fallback minifier)\n*/\n"; . "\n(Using fallback minifier)\n*/\n";
$response .= call_user_func($this->_fallbackFunc, $js); $response .= call_user_func($this->fallbackMinifier, $js);
} else { } else {
throw new Minify_JS_ClosureCompiler_Exception($response); throw new Minify_JS_ClosureCompiler_Exception($response);
} }
} }
if ($response === '') { if ($response === '') {
$errors = $this->_getResponse($this->_buildPostBody($js, true)); $errors = $this->getResponse($this->buildPostBody($js, true));
throw new Minify_JS_ClosureCompiler_Exception($errors); throw new Minify_JS_ClosureCompiler_Exception($errors);
} }
return $response; return $response;
} }
protected $_fallbackFunc = null;
protected function _getResponse($postBody) /**
* Get the response for a given POST body
*
* @param string $postBody
* @return string
* @throws Minify_JS_ClosureCompiler_Exception
*/
protected function getResponse($postBody)
{ {
$allowUrlFopen = preg_match('/1|yes|on|true/i', ini_get('allow_url_fopen')); $allowUrlFopen = preg_match('/1|yes|on|true/i', ini_get('allow_url_fopen'));
if ($allowUrlFopen) { if ($allowUrlFopen) {
$contents = file_get_contents(self::URL, false, stream_context_create(array( $contents = file_get_contents($this->serviceUrl, false, stream_context_create(array(
'http' => array( 'http' => array(
'method' => 'POST', 'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded', 'header' => "Content-type: application/x-www-form-urlencoded\r\nConnection: close\r\n",
'content' => $postBody, 'content' => $postBody,
'max_redirects' => 0, 'max_redirects' => 0,
'timeout' => 15, 'timeout' => 15,
) )
))); )));
} elseif (defined('CURLOPT_POST')) { } elseif (defined('CURLOPT_POST')) {
$ch = curl_init(self::URL); $ch = curl_init($this->serviceUrl);
curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded'));
@ -100,33 +193,37 @@ class Minify_JS_ClosureCompiler {
"Could not make HTTP request: allow_url_open is false and cURL not available" "Could not make HTTP request: allow_url_open is false and cURL not available"
); );
} }
if (false === $contents) { if (false === $contents) {
throw new Minify_JS_ClosureCompiler_Exception( throw new Minify_JS_ClosureCompiler_Exception(
"No HTTP response from server" "No HTTP response from server"
); );
} }
return trim($contents); return trim($contents);
} }
protected function _buildPostBody($js, $returnErrors = false)
{
return http_build_query(array(
'js_code' => $js,
'output_info' => ($returnErrors ? 'errors' : 'compiled_code'),
'output_format' => 'text',
'compilation_level' => 'SIMPLE_OPTIMIZATIONS'
), null, '&');
}
/** /**
* Default fallback function if CC API fails * Build a POST request body
* @param string $js *
* @param string $js JavaScript code
* @param bool $returnErrors
* @return string * @return string
*/ */
protected function _fallback($js) protected function buildPostBody($js, $returnErrors = false)
{ {
require_once 'JSMin.php'; return http_build_query(
return JSMin::minify($js); array_merge(
self::$DEFAULT_OPTIONS,
$this->additionalOptions,
array(
'js_code' => $js,
'output_info' => ($returnErrors ? 'errors' : 'compiled_code')
)
),
null,
'&'
);
} }
} }

View File

@ -55,7 +55,11 @@ class Minify_Lines {
$newLines = array(); $newLines = array();
while (null !== ($line = array_shift($lines))) { while (null !== ($line = array_shift($lines))) {
if (('' !== $id) && (0 == $i % 50)) { if (('' !== $id) && (0 == $i % 50)) {
array_push($newLines, '', "/* {$id} */", ''); if ($inComment) {
array_push($newLines, '', "/* {$id} *|", '');
} else {
array_push($newLines, '', "/* {$id} */", '');
}
} }
++$i; ++$i;
$newLines[] = self::_addNote($line, $i, $inComment, $padTo); $newLines[] = self::_addNote($line, $i, $inComment, $padTo);
@ -65,7 +69,6 @@ class Minify_Lines {
// check for desired URI rewriting // check for desired URI rewriting
if (isset($options['currentDir'])) { if (isset($options['currentDir'])) {
require_once 'Minify/CSS/UriRewriter.php';
Minify_CSS_UriRewriter::$debugText = ''; Minify_CSS_UriRewriter::$debugText = '';
$content = Minify_CSS_UriRewriter::rewrite( $content = Minify_CSS_UriRewriter::rewrite(
$content $content
@ -93,6 +96,9 @@ class Minify_Lines {
*/ */
private static function _eolInComment($line, $inComment) private static function _eolInComment($line, $inComment)
{ {
// crude way to avoid things like // */
$line = preg_replace('~//.*?(\\*/|/\\*).*~', '', $line);
while (strlen($line)) { while (strlen($line)) {
$search = $inComment $search = $inComment
? '*/' ? '*/'

View File

@ -13,14 +13,17 @@
* Java environment. * Java environment.
* *
* <code> * <code>
* Minify_YUICompressor::$jarFile = '/path/to/yuicompressor-2.3.5.jar'; * Minify_YUICompressor::$jarFile = '/path/to/yuicompressor-2.4.6.jar';
* Minify_YUICompressor::$tempDir = '/tmp'; * Minify_YUICompressor::$tempDir = '/tmp';
* $code = Minify_YUICompressor::minifyJs( * $code = Minify_YUICompressor::minifyJs(
* $code * $code
* ,array('nomunge' => true, 'line-break' => 1000) * ,array('nomunge' => true, 'line-break' => 1000)
* ); * );
* </code> * </code>
* *
* Note: In case you run out stack (default is 512k), you may increase stack size in $options:
* array('stack-size' => '2048k')
*
* @todo unit tests, $options docs * @todo unit tests, $options docs
* *
* @package Minify * @package Minify
@ -87,7 +90,7 @@ class Minify_YUICompressor {
{ {
self::_prepare(); self::_prepare();
if (! ($tmpFile = tempnam(self::$tempDir, 'yuic_'))) { if (! ($tmpFile = tempnam(self::$tempDir, 'yuic_'))) {
throw new Exception('Minify_YUICompressor : could not create temp file.'); throw new Exception('Minify_YUICompressor : could not create temp file in "'.self::$tempDir.'".');
} }
file_put_contents($tmpFile, $content); file_put_contents($tmpFile, $content);
exec(self::_getCmd($options, $type, $tmpFile), $output, $result_code); exec(self::_getCmd($options, $type, $tmpFile), $output, $result_code);
@ -108,10 +111,15 @@ class Minify_YUICompressor {
,'nomunge' => false ,'nomunge' => false
,'preserve-semi' => false ,'preserve-semi' => false
,'disable-optimizations' => false ,'disable-optimizations' => false
,'stack-size' => ''
) )
,$userOptions ,$userOptions
); );
$cmd = self::$javaExecutable . ' -jar ' . escapeshellarg(self::$jarFile) $cmd = self::$javaExecutable
. (!empty($o['stack-size'])
? ' -Xss' . $o['stack-size']
: '')
. ' -jar ' . escapeshellarg(self::$jarFile)
. " --type {$type}" . " --type {$type}"
. (preg_match('/^[\\da-zA-Z0-9\\-]+$/', $o['charset']) . (preg_match('/^[\\da-zA-Z0-9\\-]+$/', $o['charset'])
? " --charset {$o['charset']}" ? " --charset {$o['charset']}"
@ -134,8 +142,8 @@ class Minify_YUICompressor {
if (! is_file(self::$jarFile)) { if (! is_file(self::$jarFile)) {
throw new Exception('Minify_YUICompressor : $jarFile('.self::$jarFile.') is not a valid file.'); throw new Exception('Minify_YUICompressor : $jarFile('.self::$jarFile.') is not a valid file.');
} }
if (! is_executable(self::$jarFile)) { if (! is_readable(self::$jarFile)) {
throw new Exception('Minify_YUICompressor : $jarFile('.self::$jarFile.') is not executable.'); throw new Exception('Minify_YUICompressor : $jarFile('.self::$jarFile.') is not readable.');
} }
if (! is_dir(self::$tempDir)) { if (! is_dir(self::$tempDir)) {
throw new Exception('Minify_YUICompressor : $tempDir('.self::$tempDir.') is not a valid direcotry.'); throw new Exception('Minify_YUICompressor : $tempDir('.self::$tempDir.') is not a valid direcotry.');

View File

@ -2,6 +2,9 @@
namespace MrClay; namespace MrClay;
use MrClay\Cli\Arg;
use InvalidArgumentException;
/** /**
* Forms a front controller for a console app, handling and validating arguments (options) * Forms a front controller for a console app, handling and validating arguments (options)
* *
@ -51,7 +54,7 @@ class Cli {
public $isHelpRequest = false; public $isHelpRequest = false;
/** /**
* @var array of Cli\Arg * @var Arg[]
*/ */
protected $_args = array(); protected $_args = array();
@ -80,8 +83,8 @@ class Cli {
} }
/** /**
* @param Cli\Arg|string $letter * @param Arg|string $letter
* @return Cli\Arg * @return Arg
*/ */
public function addOptionalArg($letter) public function addOptionalArg($letter)
{ {
@ -89,8 +92,8 @@ class Cli {
} }
/** /**
* @param Cli\Arg|string $letter * @param Arg|string $letter
* @return Cli\Arg * @return Arg
*/ */
public function addRequiredArg($letter) public function addRequiredArg($letter)
{ {
@ -100,17 +103,17 @@ class Cli {
/** /**
* @param string $letter * @param string $letter
* @param bool $required * @param bool $required
* @param Cli\Arg|null $arg * @param Arg|null $arg
* @return Cli\Arg * @return Arg
* @throws \InvalidArgumentException * @throws InvalidArgumentException
*/ */
public function addArgument($letter, $required, Cli\Arg $arg = null) public function addArgument($letter, $required, Arg $arg = null)
{ {
if (! preg_match('/^[a-zA-Z]$/', $letter)) { if (! preg_match('/^[a-zA-Z]$/', $letter)) {
throw new \InvalidArgumentException('$letter must be in [a-zA-z]'); throw new InvalidArgumentException('$letter must be in [a-zA-Z]');
} }
if (! $arg) { if (! $arg) {
$arg = new Cli\Arg($required); $arg = new Arg($required);
} }
$this->_args[$letter] = $arg; $this->_args[$letter] = $arg;
return $arg; return $arg;
@ -118,7 +121,7 @@ class Cli {
/** /**
* @param string $letter * @param string $letter
* @return Cli\Arg|null * @return Arg|null
*/ */
public function getArgument($letter) public function getArgument($letter)
{ {
@ -143,7 +146,7 @@ class Cli {
$lettersUsed = ''; $lettersUsed = '';
foreach ($this->_args as $letter => $arg) { foreach ($this->_args as $letter => $arg) {
/* @var Cli\Arg $arg */ /* @var Arg $arg */
$options .= $letter; $options .= $letter;
$lettersUsed .= $letter; $lettersUsed .= $letter;
@ -159,7 +162,7 @@ class Cli {
$this->debug['getopt_return'] = $o; $this->debug['getopt_return'] = $o;
foreach ($this->_args as $letter => $arg) { foreach ($this->_args as $letter => $arg) {
/* @var Cli\Arg $arg */ /* @var Arg $arg */
$this->values[$letter] = false; $this->values[$letter] = false;
if (isset($o[$letter])) { if (isset($o[$letter])) {
if (is_bool($o[$letter])) { if (is_bool($o[$letter])) {
@ -295,7 +298,7 @@ class Cli {
{ {
$r = "\n"; $r = "\n";
foreach ($this->_args as $letter => $arg) { foreach ($this->_args as $letter => $arg) {
/* @var Cli\Arg $arg */ /* @var Arg $arg */
$desc = $arg->getDescription(); $desc = $arg->getDescription();
$flag = " -$letter "; $flag = " -$letter ";
if ($arg->mayHaveValue) { if ($arg->mayHaveValue) {

View File

@ -2,6 +2,8 @@
namespace MrClay\Cli; namespace MrClay\Cli;
use BadMethodCallException;
/** /**
* An argument for a CLI app. This specifies the argument, what values it expects and * An argument for a CLI app. This specifies the argument, what values it expects and
* how it's treated during validation. * how it's treated during validation.
@ -150,7 +152,7 @@ class Arg {
* @param string $name * @param string $name
* @param array $args * @param array $args
* @return Arg * @return Arg
* @throws \BadMethodCallException * @throws BadMethodCallException
*/ */
public function __call($name, array $args = array()) public function __call($name, array $args = array())
{ {
@ -160,7 +162,7 @@ class Arg {
$this->spec['mustHaveValue'] = true; $this->spec['mustHaveValue'] = true;
} }
} else { } else {
throw new \BadMethodCallException('Method does not exist'); throw new BadMethodCallException('Method does not exist');
} }
return $this; return $this;
} }

View File

@ -5,43 +5,43 @@
function postHandler($post) { function postHandler($post) {
global $board, $config; global $board, $config;
if ($post->has_file && $post->extension == 'webm') { if ($post->has_file) foreach ($post->files as &$file) if ($file->extension == 'webm') {
require_once dirname(__FILE__) . '/videodata.php'; require_once dirname(__FILE__) . '/videodata.php';
$videoDetails = videoData($post->file_path); $videoDetails = videoData($file->file_path);
if (!isset($videoDetails['container']) || $videoDetails['container'] != 'webm') return "not a WebM file"; if (!isset($videoDetails['container']) || $videoDetails['container'] != 'webm') return "not a WebM file";
// Set thumbnail // Set thumbnail
$thumbName = $board['dir'] . $config['dir']['thumb'] . $post->file_id . '.webm'; $thumbName = $board['dir'] . $config['dir']['thumb'] . $file->file_id . '.webm';
if ($config['spoiler_images'] && isset($_POST['spoiler'])) { if ($config['spoiler_images'] && isset($_POST['spoiler'])) {
// Use spoiler thumbnail // Use spoiler thumbnail
$post->thumb = 'spoiler'; $file->thumb = 'spoiler';
$size = @getimagesize($config['spoiler_image']); $size = @getimagesize($config['spoiler_image']);
$post->thumbwidth = $size[0]; $file->thumbwidth = $size[0];
$post->thumbheight = $size[1]; $file->thumbheight = $size[1];
} elseif (isset($videoDetails['frame']) && $thumbFile = fopen($thumbName, 'wb')) { } elseif (isset($videoDetails['frame']) && $thumbFile = fopen($thumbName, 'wb')) {
// Use single frame from video as pseudo-thumbnail // Use single frame from video as pseudo-thumbnail
fwrite($thumbFile, $videoDetails['frame']); fwrite($thumbFile, $videoDetails['frame']);
fclose($thumbFile); fclose($thumbFile);
$post->thumb = $post->file_id . '.webm'; $file->thumb = $file->file_id . '.webm';
} else { } else {
// Fall back to file thumbnail // Fall back to file thumbnail
$post->thumb = 'file'; $file->thumb = 'file';
} }
unset($videoDetails['frame']); unset($videoDetails['frame']);
// Set width and height // Set width and height
if (isset($videoDetails['width']) && isset($videoDetails['height'])) { if (isset($videoDetails['width']) && isset($videoDetails['height'])) {
$post->width = $videoDetails['width']; $file->width = $videoDetails['width'];
$post->height = $videoDetails['height']; $file->height = $videoDetails['height'];
if ($post->thumb != 'file' && $post->thumb != 'spoiler') { if ($file->thumb != 'file' && $file->thumb != 'spoiler') {
$thumbMaxWidth = $post->op ? $config['thumb_op_width'] : $config['thumb_width']; $thumbMaxWidth = $post->op ? $config['thumb_op_width'] : $config['thumb_width'];
$thumbMaxHeight = $post->op ? $config['thumb_op_height'] : $config['thumb_height']; $thumbMaxHeight = $post->op ? $config['thumb_op_height'] : $config['thumb_height'];
if ($videoDetails['width'] > $thumbMaxWidth || $videoDetails['height'] > $thumbMaxHeight) { if ($videoDetails['width'] > $thumbMaxWidth || $videoDetails['height'] > $thumbMaxHeight) {
$post->thumbwidth = min($thumbMaxWidth, intval(round($videoDetails['width'] * $thumbMaxHeight / $videoDetails['height']))); $file->thumbwidth = min($thumbMaxWidth, intval(round($videoDetails['width'] * $thumbMaxHeight / $videoDetails['height'])));
$post->thumbheight = min($thumbMaxHeight, intval(round($videoDetails['height'] * $thumbMaxWidth / $videoDetails['width']))); $file->thumbheight = min($thumbMaxHeight, intval(round($videoDetails['height'] * $thumbMaxWidth / $videoDetails['width'])));
} else { } else {
$post->thumbwidth = $videoDetails['width']; $file->thumbwidth = $videoDetails['width'];
$post->thumbheight = $videoDetails['height']; $file->thumbheight = $videoDetails['height'];
} }
} }
} }

View File

@ -1 +1 @@
l10n = {"Style: ":"Stilo:","File":"Dosiero","hide":"ka\u015di","show":"malka\u015di","Show locked threads":"Vidigi fermitajn fadenojn","Hide locked threads":"Ka\u015di fermitajn fadenojn","URL":"URL","Select":"Elekti","Remote":"Dista","Embed":"Enmeti","Oekaki":"Oekaki","hidden":"ka\u015dita","Show images":"Vidigi bildojn","Hide images":"Ka\u015di bildojn","Password":"Pasvorto","Delete file only":"Forvi\u015di nur la dosieron","Delete":"Forvi\u015di","Reason":"Kialo","Report":"Raporti","Click reply to view.":"Klaku respondi por vidi.","Click to expand":"Klaku por grandigi","Hide expanded replies":"Ka\u015di grandigitajn respondojn","Brush size":"Penika grandeco","Set text":"Fiksi tekston","Clear":"Vi\u015di","Save":"Konservi","Load":"\u015car\u011di","Toggle eraser":"Baskuli vi\u015dilon","Get color":"Preni koloron","Fill":"Plenumi","Use oekaki instead of file?":"\u0108u uzi oekaki-on anstata\u016d dosieron?","Edit in oekaki":"Redakti en oekaki","Enter some text":"Entajpu tekston","Enter font or leave empty":"Enigu tiparon a\u016d lasu malplena","Forced anonymity":"Perforta anonimeco","enabled":"ebligita","disabled":"malebligita","Sun":"Dim","Mon":"Lun","Tue":"Mar","Wed":"Mer","Thu":"\u0134a\u016d","Fri":"Ven","Sat":"Sab","Catalog":"Katalogo","Submit":"Sendi","Quick reply":"Rapida respondo","Posting mode: Replying to <small>&gt;&gt;{0}<\/small>":"Afi\u015dtipo: Respondo al <small>&gt;&gt;{0}<\/small>","Return":"Reiri","Expand all images":"Grandigi \u0109iujn bildojn","Hello!":"Saluton!","{0} users":"{0} uzantoj","(hide threads from this board)":"(ka\u015di fadenojn de \u0109i tiu tabulo)","(show threads from this board)":"(vidigi fadenojn de \u0109i tiu tabulo)","No more threads to display":"Neniom plu fadenoj por vidigi","Loading...":"\u015car\u011danta...","Save as original filename":"Konservi kiel originala dosiernomo","Reported post(s).":"Raportita(j) afi\u015do(j)","An unknown error occured!":"Nekonata eraro okazis!","Something went wrong... An unknown error occured!":"Io mal\u011dustis...Nekonata eraro okazis!","Working...":"Laborado...","Posting... (#%)":"Afi\u015dando... (#%)","Posted...":"Afi\u015dita...","An unknown error occured when posting!":"Nekonata eraro okazis dum afi\u015dando!","Posting...":"Afi\u015dando...","Upload URL":"Al\u015duti URL","Spoiler Image":"Ka\u015di Bildon","Comment":"Komento","Quick Reply":"Rapida Respondo","Stop watching this thread":"\u0108esi de gvati \u0109i tiun fadenon","Watch this thread":"Gvati \u0109i tiun fadenon","Unpin this board":"Malfiksi \u0109i tiun tabulon","Pin this board":"Fiksi \u0109i tiun tabulon","Stop watching this board":"\u0108esi de gvati \u0109i tiun tabulon","Watch this board":"Gvati \u0109i tiun tabulon","Click on any image on this site to load it into oekaki applet":"Klaku je iu ajn bildo en \u0109i tiu retejo por \u015dar\u011digi \u011din al aplika\u0135o oekaki","Sunday":"Diman\u0109o","Monday":"Lundo","Tuesday":"Mardo","Wednesday":"Merkredo","Thursday":"\u0134a\u016ddo","Friday":"Vendredo","Saturday":"Sabato","January":"Januaro","February":"Februaro","March":"Marto","April":"Aprilo","May":"Majo","June":"Junio","July":"Julio","August":"A\u016dgusto","September":"Septembro","October":"Oktobro","November":"Novembro","December":"Decembro","Jan":"Jan","Feb":"Feb","Mar":"Mar","Apr":"Apr","Jun":"Jun","Jul":"Jul","Aug":"A\u016dg","Sep":"Sep","Oct":"Okt","Nov":"Nov","Dec":"Dec","AM":"AM","PM":"PM","am":"am","pm":"pm","Your browser does not support HTML5 video.":"Via retumilo ne subtenas HTML5 videon.","[play once]":"[ludi unufoje]","[loop]":"[ludi da\u016dre]","WebM Settings":"WebM Opcioj","Expand videos inline":"Grandigi videojn interne","Play videos on hover":"Ludi videojn en \u015dvebi","Default volume":"Defa\u016dlta la\u016dteco","Tree view":"Arba vido"}; l10n = {"Style: ":"Stilo:","File":"Dosiero","hide":"ka\u015di","show":"malka\u015di","Show locked threads":"Vidigi fermitajn fadenojn","Hide locked threads":"Ka\u015di fermitajn fadenojn","URL":"URL","Select":"Elekti","Remote":"Dista","Embed":"Enmeti","Oekaki":"Oekaki","hidden":"ka\u015dita","Show images":"Vidigi bildojn","Hide images":"Ka\u015di bildojn","Password":"Pasvorto","Delete file only":"Forvi\u015di nur la dosieron","Delete":"Forvi\u015di","Reason":"Kialo","Report":"Raporti","Click reply to view.":"Klaku je respondi por vidi.","Click to expand":"Klaku por grandigi","Hide expanded replies":"Ka\u015di grandigitajn respondojn","Brush size":"Penika grandeco","Set text":"Fiksi tekston","Clear":"Vi\u015di","Save":"Konservi","Load":"\u015car\u011di","Toggle eraser":"Baskuli vi\u015dilon","Get color":"Preni koloron","Fill":"Plenumi","Use oekaki instead of file?":"\u0108u uzi oekaki-on anstata\u016d dosieron?","Edit in oekaki":"Redakti en oekaki","Enter some text":"Entajpu tekston","Enter font or leave empty":"Enigu tiparon a\u016d lasu malplena","Forced anonymity":"Perforta anonimeco","enabled":"ebligita","disabled":"malebligita","Sun":"Dim","Mon":"Lun","Tue":"Mar","Wed":"Mer","Thu":"\u0134a\u016d","Fri":"Ven","Sat":"Sab","Catalog":"Katalogo","Submit":"Sendi","Quick reply":"Rapida respondo","Posting mode: Replying to <small>&gt;&gt;{0}<\/small>":"Afi\u015dtipo: Respondo al <small>&gt;&gt;{0}<\/small>","Return":"Reiri","Expand all images":"Grandigi \u0109iujn bildojn","Hello!":"Saluton!","{0} users":"{0} uzantoj","(hide threads from this board)":"(ka\u015di fadenojn de \u0109i tiu tabulo)","(show threads from this board)":"(vidigi fadenojn de \u0109i tiu tabulo)","No more threads to display":"Neniom plu fadenoj por vidigi","Loading...":"\u015car\u011danta...","Save as original filename":"Konservi kiel originala dosiernomo","Reported post(s).":"Raportita(j) afi\u015do(j)","An unknown error occured!":"Nekonata eraro okazis!","Something went wrong... An unknown error occured!":"Io mal\u011dustis...Nekonata eraro okazis!","Working...":"Laborado...","Posting... (#%)":"Afi\u015dando... (#%)","Posted...":"Afi\u015dita...","An unknown error occured when posting!":"Nekonata eraro okazis dum afi\u015dando!","Posting...":"Afi\u015dando...","Upload URL":"Al\u015duti URL","Spoiler Image":"Ka\u015di Bildon","Comment":"Komento","Quick Reply":"Rapida Respondo","Stop watching this thread":"\u0108esi de gvati \u0109i tiun fadenon","Watch this thread":"Gvati \u0109i tiun fadenon","Unpin this board":"Malfiksi \u0109i tiun tabulon","Pin this board":"Fiksi \u0109i tiun tabulon","Stop watching this board":"\u0108esi de gvati \u0109i tiun tabulon","Watch this board":"Gvati \u0109i tiun tabulon","Click on any image on this site to load it into oekaki applet":"Klaku je iu ajn bildo en \u0109i tiu retejo por \u015dar\u011digi \u011din al aplika\u0135o oekaki","Sunday":"Diman\u0109o","Monday":"Lundo","Tuesday":"Mardo","Wednesday":"Merkredo","Thursday":"\u0134a\u016ddo","Friday":"Vendredo","Saturday":"Sabato","January":"Januaro","February":"Februaro","March":"Marto","April":"Aprilo","May":"Majo","June":"Junio","July":"Julio","August":"A\u016dgusto","September":"Septembro","October":"Oktobro","November":"Novembro","December":"Decembro","Jan":"Jan","Feb":"Feb","Mar":"Mar","Apr":"Apr","Jun":"Jun","Jul":"Jul","Aug":"A\u016dg","Sep":"Sep","Oct":"Okt","Nov":"Nov","Dec":"Dec","AM":"AM","PM":"PM","am":"am","pm":"pm","Your browser does not support HTML5 video.":"Via retumilo ne subtenas HTML5 videon.","[play once]":"[ludi unufoje]","[loop]":"[ludi da\u016dre]","WebM Settings":"WebM Opcioj","Expand videos inline":"Grandigi videojn interne","Play videos on hover":"Ludi videojn en \u015dvebi","Default volume":"Defa\u016dlta la\u016dteco","Tree view":"Arba vido"};

View File

@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: vichan\n" "Project-Id-Version: vichan\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-04-21 21:04+0200\n" "POT-Creation-Date: 2014-04-21 21:04+0200\n"
"PO-Revision-Date: 2014-04-24 04:27+0000\n" "PO-Revision-Date: 2014-05-05 18:55+0000\n"
"Last-Translator: neniu <katnoj1@gmail.com>\n" "Last-Translator: neniu <katnoj1@gmail.com>\n"
"Language-Team: Esperanto (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/eo/)\n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/eo/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -116,7 +116,7 @@ msgstr "Raporti"
#: ../../../../js/expand.js:20 ../../../../js/expand.js:22 #: ../../../../js/expand.js:20 ../../../../js/expand.js:22
msgid "Click reply to view." msgid "Click reply to view."
msgstr "Klaku respondi por vidi." msgstr "Klaku je respondi por vidi."
#: ../../../../js/expand.js:20 ../../../../js/expand.js:22 #: ../../../../js/expand.js:20 ../../../../js/expand.js:22
msgid "Click to expand" msgid "Click to expand"

View File

@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: vichan\n" "Project-Id-Version: vichan\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-04-21 21:04+0200\n" "POT-Creation-Date: 2014-04-21 21:04+0200\n"
"PO-Revision-Date: 2014-04-30 18:20+0000\n" "PO-Revision-Date: 2014-05-05 18:49+0000\n"
"Last-Translator: neniu <katnoj1@gmail.com>\n" "Last-Translator: neniu <katnoj1@gmail.com>\n"
"Language-Team: Esperanto (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/eo/)\n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/eo/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -536,13 +536,13 @@ msgstr "Vi devos esperi %s antaŭ vi povos forviŝi tion."
#: ../../../../inc/config.php:997 ../../../../inc/config.php:999 #: ../../../../inc/config.php:997 ../../../../inc/config.php:999
#: ../../../../inc/config.php:1001 ../../../../inc/config.php:1017 #: ../../../../inc/config.php:1001 ../../../../inc/config.php:1017
msgid "MIME type detection XSS exploit (IE) detected; post discarded." msgid "MIME type detection XSS exploit (IE) detected; post discarded."
msgstr "MIME-tipo percepto XSS exploit (IE) perceptita; afiŝon forigita." msgstr "MIME-tipo detection XSS exploit (IE) perceptita; afiŝon forigita."
#: ../../../../inc/config.php:902 ../../../../inc/config.php:1007 #: ../../../../inc/config.php:902 ../../../../inc/config.php:1007
#: ../../../../inc/config.php:998 ../../../../inc/config.php:1000 #: ../../../../inc/config.php:998 ../../../../inc/config.php:1000
#: ../../../../inc/config.php:1002 ../../../../inc/config.php:1018 #: ../../../../inc/config.php:1002 ../../../../inc/config.php:1018
msgid "Couldn't make sense of the URL of the video you tried to embed." msgid "Couldn't make sense of the URL of the video you tried to embed."
msgstr "Maleblis kompreni la URL-on de la videon vi provis enmeti." msgstr "Maleblis kompreni la URL-on de la videon kiun vi provis enmeti."
#: ../../../../inc/config.php:903 ../../../../inc/config.php:1008 #: ../../../../inc/config.php:903 ../../../../inc/config.php:1008
#: ../../../../inc/config.php:999 ../../../../inc/config.php:1001 #: ../../../../inc/config.php:999 ../../../../inc/config.php:1001
@ -590,7 +590,7 @@ msgstr "Malvalidaj/misformitaj cookie-oj."
#: ../../../../inc/config.php:1007 ../../../../inc/config.php:1009 #: ../../../../inc/config.php:1007 ../../../../inc/config.php:1009
#: ../../../../inc/config.php:1011 ../../../../inc/config.php:1027 #: ../../../../inc/config.php:1011 ../../../../inc/config.php:1027
msgid "Your browser didn't submit an input when it should have." msgid "Your browser didn't submit an input when it should have."
msgstr "Via retumilo ne faris enigon kiam enigo farendis." msgstr "Via retumilo ne faris enigon kiam ĝi devis."
#: ../../../../inc/config.php:912 ../../../../inc/config.php:1017 #: ../../../../inc/config.php:912 ../../../../inc/config.php:1017
#: ../../../../inc/config.php:1008 ../../../../inc/config.php:1010 #: ../../../../inc/config.php:1008 ../../../../inc/config.php:1010

View File

@ -1 +1 @@
l10n = []; l10n = {"Style: ":"Tyyli:","File":"Tiedosto","hide":"piilota","show":"n\u00e4yt\u00e4","Show locked threads":"N\u00e4yt\u00e4 lukitut langat","Hide locked threads":"Piilota lukitut langat","URL":"URL","Select":"Valitse","Remote":"Et\u00e4","Embed":"Upote","Oekaki":"Oekaki","hidden":"piilotettu","Show images":"N\u00e4yt\u00e4 kuvat","Hide images":"Piiloita kuvat","Password":"Salasana","Delete file only":"Poista vain tiedosto","Delete":"Poista","Reason":"Syy","Report":"Raportoi","Click reply to view.":"Paina vastaa n\u00e4ytt\u00e4\u00e4ksesi.","Click to expand":"Paina laajentaaksesi","Hide expanded replies":"Piiloita laajennetut vastaukset","Brush size":"Sudin koko","Set text":"Aseta teksti\u00e4","Clear":"Pyyhi","Save":"Tallenna","Load":"Lataa","Toggle eraser":"K\u00e4yt\u00e4 kumia","Get color":"Poimi v\u00e4ri","Fill":"T\u00e4yt\u00e4","Use oekaki instead of file?":"K\u00e4yt\u00e4 oekakia tekstin sijasta?","Edit in oekaki":"Muokkaa oekakissa","Enter some text":"Kirjoita teksti\u00e4","Enter font or leave empty":"Anna fontti tai j\u00e4t\u00e4 tyhj\u00e4ksi","Forced anonymity":"Pakotettu anonyymiys","enabled":"k\u00e4yt\u00f6ss\u00e4","disabled":"ei k\u00e4yt\u00f6ss\u00e4","Sun":"Sun","Mon":"Maa","Tue":"Tii","Wed":"Kes","Thu":"Tor","Fri":"Per","Sat":"Lau","Catalog":"Katalogi","Submit":"L\u00e4het\u00e4","Quick reply":"Pikavastaus","Posting mode: Replying to <small>&gt;&gt;{0}<\/small>":"Vastaustila: Vastataan <small>&gt;&gt;{0}<\/small>","Return":"Palaa","Expand all images":"Laajenna kaikki kuvat","Hello!":"Hei!","{0} users":"{0} k\u00e4ytt\u00e4j\u00e4\u00e4","(hide threads from this board)":"(piiloita langat t\u00e4lt\u00e4 laudalta)","(show threads from this board)":"(n\u00e4yt\u00e4 langat t\u00e4lt\u00e4 laudalta)","No more threads to display":"Ei enemp\u00e4\u00e4 lankoja n\u00e4ytett\u00e4v\u00e4ksi","Loading...":"Lataa...","Save as original filename":"Tallenna alkuper\u00e4isell\u00e4 nimell\u00e4","Reported post(s).":"Raportoitua viesti(\u00e4)","An unknown error occured!":"Tuntematon virhe tapahtui!","Something went wrong... An unknown error occured!":"Jokin meni pieleen...Tuntematon virhe tapahtui!","Working...":"Suoritan...","Posting... (#%)":"Postataan... (#%)","Posted...":"Postattu...","An unknown error occured when posting!":"Tuntematon virhe tapahtui postatessa!","Posting...":"Postataan...","Upload URL":"Ladattavan URL","Spoiler Image":"Piilokuva","Comment":"Viesti","Quick Reply":"Pikavastaus","Stop watching this thread":"Lopeta t\u00e4m\u00e4n langan seuraaminen","Watch this thread":"Seuraa t\u00e4t\u00e4 lankaa","Unpin this board":"Poista t\u00e4m\u00e4n laudan nastoitus","Pin this board":"Nastoita t\u00e4m\u00e4 lauta","Stop watching this board":"Lopeta laudan seuraaminen","Watch this board":"Seuraa t\u00e4t\u00e4 lautaa","Click on any image on this site to load it into oekaki applet":"Paina mit\u00e4 tahansa kuvaa t\u00e4ll\u00e4 sivulla ladataksesi sen oekaki ohjelmaan","Sunday":"Sunnuntai","Monday":"Maanantai","Tuesday":"Tiistai","Wednesday":"Keskiviikko","Thursday":"Torstai","Friday":"Perjantai","Saturday":"Lauantai","January":"Tammikuu","February":"Helmikuu","March":"Maaliskuu","April":"Huhtikuu","May":"Toukokuu","June":"Kes\u00e4kuu","July":"Hein\u00e4kuu","August":"Elokuu","September":"Syyskuu","October":"Lokakuu","November":"Marraskuu","December":"Joulukuu","Jan":"Tammi","Feb":"Helmi","Mar":"Maalis","Apr":"Huhti","Jun":"Kes\u00e4","Jul":"Hein\u00e4","Aug":"Elo","Sep":"Syys","Oct":"Loka","Nov":"Marras","Dec":"JoulunJoulu","AM":"AP","PM":"IP","am":"ap","pm":"ip","Your browser does not support HTML5 video.":"Selaimesi ei tue HTML5 videota.","[play once]":"[toista kerran]","[loop]":"[silmukka]","WebM Settings":"WebM-asetukset","Expand videos inline":"Laajenna videot sivun sis\u00e4ll\u00e4","Play videos on hover":"Toista videot hoveroitaessa","Default volume":"Oletus volyymi","Tree view":"Puun\u00e4kym\u00e4"};

View File

@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# #
# Translators: # Translators:
# Alrahambra <juho.mikkonen@europe.com>, 2014
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vichan\n" "Project-Id-Version: vichan\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-04-20 00:49+0200\n" "POT-Creation-Date: 2014-04-21 21:04+0200\n"
"PO-Revision-Date: 2014-04-19 22:53+0000\n" "PO-Revision-Date: 2014-05-04 14:54+0000\n"
"Last-Translator: czaks <marcin@6irc.net>\n" "Last-Translator: Alrahambra <juho.mikkonen@europe.com>\n"
"Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/fi_FI/)\n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/fi_FI/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -19,22 +20,22 @@ msgstr ""
#: ../../../../js/style-select.js:40 ../../../../js/style-select.js:41 #: ../../../../js/style-select.js:40 ../../../../js/style-select.js:41
msgid "Style: " msgid "Style: "
msgstr "" msgstr "Tyyli:"
#: ../../../../js/hide-images.js:50 ../../../../js/upload-selection.js:51 #: ../../../../js/hide-images.js:50 ../../../../js/upload-selection.js:51
#: ../../../../js/quick-post-controls.js:30 ../../../../js/hide-images.js:51 #: ../../../../js/quick-post-controls.js:30 ../../../../js/hide-images.js:51
#: ../../../../js/quick-post-controls.js:32 #: ../../../../js/quick-post-controls.js:32
#: ../../../../js/upload-selection.js:61 #: ../../../../js/upload-selection.js:61
msgid "File" msgid "File"
msgstr "" msgstr "Tiedosto"
#: ../../../../js/hide-images.js:50 ../../../../js/hide-images.js:51 #: ../../../../js/hide-images.js:50 ../../../../js/hide-images.js:51
msgid "hide" msgid "hide"
msgstr "" msgstr "piilota"
#: ../../../../js/hide-images.js:56 ../../../../js/hide-images.js:57 #: ../../../../js/hide-images.js:56 ../../../../js/hide-images.js:57
msgid "show" msgid "show"
msgstr "" msgstr "näytä"
#: ../../../../js/toggle-locked-threads.js:39 #: ../../../../js/toggle-locked-threads.js:39
#: ../../../../js/toggle-locked-threads.js:54 #: ../../../../js/toggle-locked-threads.js:54
@ -43,7 +44,7 @@ msgstr ""
#: ../../../../js/toggle-locked-threads.js:41 #: ../../../../js/toggle-locked-threads.js:41
#: ../../../../js/toggle-locked-threads.js:56 #: ../../../../js/toggle-locked-threads.js:56
msgid "Show locked threads" msgid "Show locked threads"
msgstr "" msgstr "Näytä lukitut langat"
#: ../../../../js/toggle-locked-threads.js:39 #: ../../../../js/toggle-locked-threads.js:39
#: ../../../../js/toggle-locked-threads.js:54 #: ../../../../js/toggle-locked-threads.js:54
@ -52,126 +53,126 @@ msgstr ""
#: ../../../../js/toggle-locked-threads.js:41 #: ../../../../js/toggle-locked-threads.js:41
#: ../../../../js/toggle-locked-threads.js:56 #: ../../../../js/toggle-locked-threads.js:56
msgid "Hide locked threads" msgid "Hide locked threads"
msgstr "" msgstr "Piilota lukitut langat"
#: ../../../../js/upload-selection.js:32 ../../../../js/upload-selection.js:45 #: ../../../../js/upload-selection.js:32 ../../../../js/upload-selection.js:45
msgid "URL" msgid "URL"
msgstr "" msgstr "URL"
#: ../../../../js/upload-selection.js:50 ../../../../js/upload-selection.js:60 #: ../../../../js/upload-selection.js:50 ../../../../js/upload-selection.js:60
msgid "Select" msgid "Select"
msgstr "" msgstr "Valitse"
#: ../../../../js/upload-selection.js:53 ../../../../js/upload-selection.js:63 #: ../../../../js/upload-selection.js:53 ../../../../js/upload-selection.js:63
msgid "Remote" msgid "Remote"
msgstr "" msgstr "Etä"
#: ../../../../js/upload-selection.js:56 ../../../../js/upload-selection.js:66 #: ../../../../js/upload-selection.js:56 ../../../../js/upload-selection.js:66
msgid "Embed" msgid "Embed"
msgstr "" msgstr "Upote"
#: ../../../../js/upload-selection.js:59 ../../../../js/upload-selection.js:69 #: ../../../../js/upload-selection.js:59 ../../../../js/upload-selection.js:69
msgid "Oekaki" msgid "Oekaki"
msgstr "" msgstr "Oekaki"
#: ../../../../js/toggle-images.js:41 ../../../../js/toggle-images.js:42 #: ../../../../js/toggle-images.js:41 ../../../../js/toggle-images.js:42
msgid "hidden" msgid "hidden"
msgstr "" msgstr "piilotettu"
#: ../../../../js/toggle-images.js:57 ../../../../js/toggle-images.js:70 #: ../../../../js/toggle-images.js:57 ../../../../js/toggle-images.js:70
#: ../../../../js/toggle-images.js:58 ../../../../js/toggle-images.js:71 #: ../../../../js/toggle-images.js:58 ../../../../js/toggle-images.js:71
msgid "Show images" msgid "Show images"
msgstr "" msgstr "Näytä kuvat"
#: ../../../../js/toggle-images.js:57 ../../../../js/toggle-images.js:70 #: ../../../../js/toggle-images.js:57 ../../../../js/toggle-images.js:70
#: ../../../../js/toggle-images.js:58 ../../../../js/toggle-images.js:71 #: ../../../../js/toggle-images.js:58 ../../../../js/toggle-images.js:71
msgid "Hide images" msgid "Hide images"
msgstr "" msgstr "Piiloita kuvat"
#: ../../../../js/quick-post-controls.js:27 #: ../../../../js/quick-post-controls.js:27
#: ../../../../js/quick-post-controls.js:29 #: ../../../../js/quick-post-controls.js:29
msgid "Password" msgid "Password"
msgstr "" msgstr "Salasana"
#: ../../../../js/quick-post-controls.js:29 #: ../../../../js/quick-post-controls.js:29
#: ../../../../js/quick-post-controls.js:31 #: ../../../../js/quick-post-controls.js:31
msgid "Delete file only" msgid "Delete file only"
msgstr "" msgstr "Poista vain tiedosto"
#: ../../../../js/quick-post-controls.js:31 #: ../../../../js/quick-post-controls.js:31
#: ../../../../js/quick-post-controls.js:33 #: ../../../../js/quick-post-controls.js:33
msgid "Delete" msgid "Delete"
msgstr "" msgstr "Poista"
#: ../../../../js/quick-post-controls.js:35 #: ../../../../js/quick-post-controls.js:35
#: ../../../../js/quick-post-controls.js:37 #: ../../../../js/quick-post-controls.js:37
msgid "Reason" msgid "Reason"
msgstr "" msgstr "Syy"
#: ../../../../js/quick-post-controls.js:37 #: ../../../../js/quick-post-controls.js:37
#: ../../../../js/quick-post-controls.js:39 #: ../../../../js/quick-post-controls.js:39
msgid "Report" msgid "Report"
msgstr "" msgstr "Raportoi"
#: ../../../../js/expand.js:20 ../../../../js/expand.js:22 #: ../../../../js/expand.js:20 ../../../../js/expand.js:22
msgid "Click reply to view." msgid "Click reply to view."
msgstr "" msgstr "Paina vastaa näyttääksesi."
#: ../../../../js/expand.js:20 ../../../../js/expand.js:22 #: ../../../../js/expand.js:20 ../../../../js/expand.js:22
msgid "Click to expand" msgid "Click to expand"
msgstr "" msgstr "Paina laajentaaksesi"
#: ../../../../js/expand.js:44 ../../../../js/expand.js:46 #: ../../../../js/expand.js:44 ../../../../js/expand.js:46
msgid "Hide expanded replies" msgid "Hide expanded replies"
msgstr "" msgstr "Piiloita laajennetut vastaukset"
#: ../../../../js/oekaki.js:10 #: ../../../../js/oekaki.js:10
msgid "Brush size" msgid "Brush size"
msgstr "" msgstr "Sudin koko"
#: ../../../../js/oekaki.js:10 #: ../../../../js/oekaki.js:10
msgid "Set text" msgid "Set text"
msgstr "" msgstr "Aseta tekstiä"
#: ../../../../js/oekaki.js:10 #: ../../../../js/oekaki.js:10
msgid "Clear" msgid "Clear"
msgstr "" msgstr "Pyyhi"
#: ../../../../js/oekaki.js:10 #: ../../../../js/oekaki.js:10
msgid "Save" msgid "Save"
msgstr "" msgstr "Tallenna"
#: ../../../../js/oekaki.js:10 #: ../../../../js/oekaki.js:10
msgid "Load" msgid "Load"
msgstr "" msgstr "Lataa"
#: ../../../../js/oekaki.js:11 #: ../../../../js/oekaki.js:11
msgid "Toggle eraser" msgid "Toggle eraser"
msgstr "" msgstr "Käytä kumia"
#: ../../../../js/oekaki.js:11 #: ../../../../js/oekaki.js:11
msgid "Get color" msgid "Get color"
msgstr "" msgstr "Poimi väri"
#: ../../../../js/oekaki.js:11 #: ../../../../js/oekaki.js:11
msgid "Fill" msgid "Fill"
msgstr "" msgstr "Täytä"
#: ../../../../js/oekaki.js:12 #: ../../../../js/oekaki.js:12
msgid "Use oekaki instead of file?" msgid "Use oekaki instead of file?"
msgstr "" msgstr "Käytä oekakia tekstin sijasta?"
#: ../../../../js/oekaki.js:21 #: ../../../../js/oekaki.js:21
msgid "Edit in oekaki" msgid "Edit in oekaki"
msgstr "" msgstr "Muokkaa oekakissa"
#: ../../../../js/oekaki.js:152 #: ../../../../js/oekaki.js:152
msgid "Enter some text" msgid "Enter some text"
msgstr "" msgstr "Kirjoita tekstiä"
#: ../../../../js/oekaki.js:153 #: ../../../../js/oekaki.js:153
msgid "Enter font or leave empty" msgid "Enter font or leave empty"
msgstr "" msgstr "Anna fontti tai jätä tyhjäksi"
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65 #: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65
#: ../../../../js/forced-anon.js:69 ../../../../js/forced-anon.js:60 #: ../../../../js/forced-anon.js:69 ../../../../js/forced-anon.js:60
@ -179,190 +180,190 @@ msgstr ""
#: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:67 #: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:67
#: ../../../../js/forced-anon.js:71 #: ../../../../js/forced-anon.js:71
msgid "Forced anonymity" msgid "Forced anonymity"
msgstr "" msgstr "Pakotettu anonyymiys"
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65 #: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65
#: ../../../../js/forced-anon.js:60 ../../../../js/forced-anon.js:66 #: ../../../../js/forced-anon.js:60 ../../../../js/forced-anon.js:66
#: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:67 #: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:67
msgid "enabled" msgid "enabled"
msgstr "" msgstr "käytössä"
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:69 #: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:69
#: ../../../../js/forced-anon.js:60 ../../../../js/forced-anon.js:70 #: ../../../../js/forced-anon.js:60 ../../../../js/forced-anon.js:70
#: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:71 #: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:71
msgid "disabled" msgid "disabled"
msgstr "" msgstr "ei käytössä"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Sun" msgid "Sun"
msgstr "" msgstr "Sun"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Mon" msgid "Mon"
msgstr "" msgstr "Maa"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Tue" msgid "Tue"
msgstr "" msgstr "Tii"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Wed" msgid "Wed"
msgstr "" msgstr "Kes"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Thu" msgid "Thu"
msgstr "" msgstr "Tor"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Fri" msgid "Fri"
msgstr "" msgstr "Per"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Sat" msgid "Sat"
msgstr "" msgstr "Lau"
#: ../../../../js/catalog-link.js:21 ../../../../js/catalog-link.js:32 #: ../../../../js/catalog-link.js:21 ../../../../js/catalog-link.js:32
#: ../../../../js/catalog-link.js:40 ../../../../js/catalog-link.js:33 #: ../../../../js/catalog-link.js:40 ../../../../js/catalog-link.js:33
#: ../../../../js/catalog-link.js:44 ../../../../js/catalog-link.js:52 #: ../../../../js/catalog-link.js:44 ../../../../js/catalog-link.js:52
msgid "Catalog" msgid "Catalog"
msgstr "" msgstr "Katalogi"
#: ../../../../js/quick-reply.js:21 ../../../../js/quick-reply-old.js:21 #: ../../../../js/quick-reply.js:21 ../../../../js/quick-reply-old.js:21
#: ../../../../js/quick-reply-old.js:23 #: ../../../../js/quick-reply-old.js:23
msgid "Submit" msgid "Submit"
msgstr "" msgstr "Lähetä"
#: ../../../../js/quick-reply.js:31 ../../../../js/quick-reply-old.js:31 #: ../../../../js/quick-reply.js:31 ../../../../js/quick-reply-old.js:31
#: ../../../../js/quick-reply-old.js:33 #: ../../../../js/quick-reply-old.js:33
msgid "Quick reply" msgid "Quick reply"
msgstr "" msgstr "Pikavastaus"
#: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33 #: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33
#: ../../../../js/quick-reply-old.js:35 #: ../../../../js/quick-reply-old.js:35
#, python-brace-format #, python-brace-format
msgid "Posting mode: Replying to <small>&gt;&gt;{0}</small>" msgid "Posting mode: Replying to <small>&gt;&gt;{0}</small>"
msgstr "" msgstr "Vastaustila: Vastataan <small>&gt;&gt;{0}</small>"
#: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33 #: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33
#: ../../../../js/quick-reply-old.js:35 #: ../../../../js/quick-reply-old.js:35
msgid "Return" msgid "Return"
msgstr "" msgstr "Palaa"
#: ../../../../js/expand-all-images.js:20 #: ../../../../js/expand-all-images.js:20
#: ../../../../js/expand-all-images.js:21 #: ../../../../js/expand-all-images.js:21
#: ../../../../js/expand-all-images.js:22 #: ../../../../js/expand-all-images.js:22
msgid "Expand all images" msgid "Expand all images"
msgstr "" msgstr "Laajenna kaikki kuvat"
#: ../../../../templates/main.js:6 #: ../../../../templates/main.js:6
msgid "Hello!" msgid "Hello!"
msgstr "" msgstr "Hei!"
#: ../../../../templates/main.js:18 #: ../../../../templates/main.js:18
#, python-brace-format #, python-brace-format
msgid "{0} users" msgid "{0} users"
msgstr "" msgstr "{0} käyttäjää"
#: ../../../../templates/themes/ukko/ukko.js:28 #: ../../../../templates/themes/ukko/ukko.js:28
#: ../../../../templates/themes/ukko/ukko.js:39 #: ../../../../templates/themes/ukko/ukko.js:39
#: ../../../../templates/themes/ukko/ukko.js:29 #: ../../../../templates/themes/ukko/ukko.js:29
#: ../../../../templates/themes/ukko/ukko.js:40 #: ../../../../templates/themes/ukko/ukko.js:40
msgid "(hide threads from this board)" msgid "(hide threads from this board)"
msgstr "" msgstr "(piiloita langat tältä laudalta)"
#: ../../../../templates/themes/ukko/ukko.js:32 #: ../../../../templates/themes/ukko/ukko.js:32
#: ../../../../templates/themes/ukko/ukko.js:44 #: ../../../../templates/themes/ukko/ukko.js:44
#: ../../../../templates/themes/ukko/ukko.js:33 #: ../../../../templates/themes/ukko/ukko.js:33
#: ../../../../templates/themes/ukko/ukko.js:45 #: ../../../../templates/themes/ukko/ukko.js:45
msgid "(show threads from this board)" msgid "(show threads from this board)"
msgstr "" msgstr "(näytä langat tältä laudalta)"
#: ../../../../templates/themes/ukko/ukko.js:57 #: ../../../../templates/themes/ukko/ukko.js:57
#: ../../../../templates/themes/ukko/ukko.js:58 #: ../../../../templates/themes/ukko/ukko.js:58
msgid "No more threads to display" msgid "No more threads to display"
msgstr "" msgstr "Ei enempää lankoja näytettäväksi"
#: ../../../../templates/themes/ukko/ukko.js:79 #: ../../../../templates/themes/ukko/ukko.js:79
#: ../../../../templates/themes/ukko/ukko.js:80 #: ../../../../templates/themes/ukko/ukko.js:80
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr "Lataa..."
#: ../../../../js/download-original.js:32 #: ../../../../js/download-original.js:32
#: ../../../../js/download-original.js:33 #: ../../../../js/download-original.js:33
msgid "Save as original filename" msgid "Save as original filename"
msgstr "" msgstr "Tallenna alkuperäisellä nimellä"
#: ../../../../js/ajax-post-controls.js:43 #: ../../../../js/ajax-post-controls.js:43
msgid "Reported post(s)." msgid "Reported post(s)."
msgstr "" msgstr "Raportoitua viesti(ä)"
#: ../../../../js/ajax-post-controls.js:53 #: ../../../../js/ajax-post-controls.js:53
msgid "An unknown error occured!" msgid "An unknown error occured!"
msgstr "" msgstr "Tuntematon virhe tapahtui!"
#: ../../../../js/ajax-post-controls.js:60 #: ../../../../js/ajax-post-controls.js:60
msgid "Something went wrong... An unknown error occured!" msgid "Something went wrong... An unknown error occured!"
msgstr "" msgstr "Jokin meni pieleen...Tuntematon virhe tapahtui!"
#: ../../../../js/ajax-post-controls.js:68 #: ../../../../js/ajax-post-controls.js:68
msgid "Working..." msgid "Working..."
msgstr "" msgstr "Suoritan..."
#: ../../../../js/ajax.js:42 ../../../../js/ajax.js:45 #: ../../../../js/ajax.js:42 ../../../../js/ajax.js:45
msgid "Posting... (#%)" msgid "Posting... (#%)"
msgstr "" msgstr "Postataan... (#%)"
#: ../../../../js/ajax.js:104 ../../../../js/ajax.js:109 #: ../../../../js/ajax.js:104 ../../../../js/ajax.js:109
msgid "Posted..." msgid "Posted..."
msgstr "" msgstr "Postattu..."
#: ../../../../js/ajax.js:106 ../../../../js/ajax.js:111 #: ../../../../js/ajax.js:106 ../../../../js/ajax.js:111
msgid "An unknown error occured when posting!" msgid "An unknown error occured when posting!"
msgstr "" msgstr "Tuntematon virhe tapahtui postatessa!"
#: ../../../../js/ajax.js:130 ../../../../js/ajax.js:135 #: ../../../../js/ajax.js:130 ../../../../js/ajax.js:135
msgid "Posting..." msgid "Posting..."
msgstr "" msgstr "Postataan..."
#: ../../../../js/quick-reply.js:223 ../../../../js/quick-reply.js:224 #: ../../../../js/quick-reply.js:223 ../../../../js/quick-reply.js:224
#: ../../../../js/quick-reply.js:225 #: ../../../../js/quick-reply.js:225
msgid "Upload URL" msgid "Upload URL"
msgstr "" msgstr "Ladattavan URL"
#: ../../../../js/quick-reply.js:266 ../../../../js/quick-reply.js:267 #: ../../../../js/quick-reply.js:266 ../../../../js/quick-reply.js:267
#: ../../../../js/quick-reply.js:268 #: ../../../../js/quick-reply.js:268
msgid "Spoiler Image" msgid "Spoiler Image"
msgstr "" msgstr "Piilokuva"
#: ../../../../js/quick-reply.js:277 ../../../../js/quick-reply.js:278 #: ../../../../js/quick-reply.js:277 ../../../../js/quick-reply.js:278
#: ../../../../js/quick-reply.js:279 #: ../../../../js/quick-reply.js:279
msgid "Comment" msgid "Comment"
msgstr "" msgstr "Viesti"
#: ../../../../js/quick-reply.js:285 ../../../../js/quick-reply.js:406 #: ../../../../js/quick-reply.js:285 ../../../../js/quick-reply.js:406
#: ../../../../js/quick-reply.js:286 ../../../../js/quick-reply.js:407 #: ../../../../js/quick-reply.js:286 ../../../../js/quick-reply.js:407
#: ../../../../js/quick-reply.js:287 ../../../../js/quick-reply.js:408 #: ../../../../js/quick-reply.js:287 ../../../../js/quick-reply.js:408
msgid "Quick Reply" msgid "Quick Reply"
msgstr "" msgstr "Pikavastaus"
#: ../../../../js/watch.js:249 ../../../../js/watch.js:250 #: ../../../../js/watch.js:249 ../../../../js/watch.js:250
#: ../../../../js/watch.js:288 ../../../../js/watch.js:289 #: ../../../../js/watch.js:288 ../../../../js/watch.js:289
#: ../../../../js/watch.js:330 ../../../../js/watch.js:331 #: ../../../../js/watch.js:330 ../../../../js/watch.js:331
msgid "Stop watching this thread" msgid "Stop watching this thread"
msgstr "" msgstr "Lopeta tämän langan seuraaminen"
#: ../../../../js/watch.js:249 ../../../../js/watch.js:250 #: ../../../../js/watch.js:249 ../../../../js/watch.js:250
#: ../../../../js/watch.js:288 ../../../../js/watch.js:289 #: ../../../../js/watch.js:288 ../../../../js/watch.js:289
#: ../../../../js/watch.js:330 ../../../../js/watch.js:331 #: ../../../../js/watch.js:330 ../../../../js/watch.js:331
msgid "Watch this thread" msgid "Watch this thread"
msgstr "" msgstr "Seuraa tätä lankaa"
#: ../../../../js/watch.js:260 ../../../../js/watch.js:261 #: ../../../../js/watch.js:260 ../../../../js/watch.js:261
#: ../../../../js/watch.js:269 ../../../../js/watch.js:299 #: ../../../../js/watch.js:269 ../../../../js/watch.js:299
@ -370,7 +371,7 @@ msgstr ""
#: ../../../../js/watch.js:341 ../../../../js/watch.js:342 #: ../../../../js/watch.js:341 ../../../../js/watch.js:342
#: ../../../../js/watch.js:350 #: ../../../../js/watch.js:350
msgid "Unpin this board" msgid "Unpin this board"
msgstr "" msgstr "Poista tämän laudan nastoitus"
#: ../../../../js/watch.js:260 ../../../../js/watch.js:261 #: ../../../../js/watch.js:260 ../../../../js/watch.js:261
#: ../../../../js/watch.js:269 ../../../../js/watch.js:299 #: ../../../../js/watch.js:269 ../../../../js/watch.js:299
@ -378,7 +379,7 @@ msgstr ""
#: ../../../../js/watch.js:341 ../../../../js/watch.js:342 #: ../../../../js/watch.js:341 ../../../../js/watch.js:342
#: ../../../../js/watch.js:350 #: ../../../../js/watch.js:350
msgid "Pin this board" msgid "Pin this board"
msgstr "" msgstr "Nastoita tämä lauta"
#: ../../../../js/watch.js:262 ../../../../js/watch.js:267 #: ../../../../js/watch.js:262 ../../../../js/watch.js:267
#: ../../../../js/watch.js:268 ../../../../js/watch.js:301 #: ../../../../js/watch.js:268 ../../../../js/watch.js:301
@ -386,7 +387,7 @@ msgstr ""
#: ../../../../js/watch.js:343 ../../../../js/watch.js:348 #: ../../../../js/watch.js:343 ../../../../js/watch.js:348
#: ../../../../js/watch.js:349 #: ../../../../js/watch.js:349
msgid "Stop watching this board" msgid "Stop watching this board"
msgstr "" msgstr "Lopeta laudan seuraaminen"
#: ../../../../js/watch.js:262 ../../../../js/watch.js:267 #: ../../../../js/watch.js:262 ../../../../js/watch.js:267
#: ../../../../js/watch.js:268 ../../../../js/watch.js:301 #: ../../../../js/watch.js:268 ../../../../js/watch.js:301
@ -394,176 +395,176 @@ msgstr ""
#: ../../../../js/watch.js:343 ../../../../js/watch.js:348 #: ../../../../js/watch.js:343 ../../../../js/watch.js:348
#: ../../../../js/watch.js:349 #: ../../../../js/watch.js:349
msgid "Watch this board" msgid "Watch this board"
msgstr "" msgstr "Seuraa tätä lautaa"
#: ../../../../js/wpaint.js:113 #: ../../../../js/wpaint.js:113
msgid "Click on any image on this site to load it into oekaki applet" msgid "Click on any image on this site to load it into oekaki applet"
msgstr "" msgstr "Paina mitä tahansa kuvaa tällä sivulla ladataksesi sen oekaki ohjelmaan"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr "Sunnuntai"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Monday" msgid "Monday"
msgstr "" msgstr "Maanantai"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr "Tiistai"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr "Keskiviikko"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr "Torstai"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Friday" msgid "Friday"
msgstr "" msgstr "Perjantai"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr "Lauantai"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "January" msgid "January"
msgstr "" msgstr "Tammikuu"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "February" msgid "February"
msgstr "" msgstr "Helmikuu"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "March" msgid "March"
msgstr "" msgstr "Maaliskuu"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "April" msgid "April"
msgstr "" msgstr "Huhtikuu"
#: ../../../../js/local-time.js:31 ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:31 ../../../../js/local-time.js:32
msgid "May" msgid "May"
msgstr "" msgstr "Toukokuu"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "June" msgid "June"
msgstr "" msgstr "Kesäkuu"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "July" msgid "July"
msgstr "" msgstr "Heinäkuu"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "August" msgid "August"
msgstr "" msgstr "Elokuu"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "September" msgid "September"
msgstr "" msgstr "Syyskuu"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "October" msgid "October"
msgstr "" msgstr "Lokakuu"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "November" msgid "November"
msgstr "" msgstr "Marraskuu"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "December" msgid "December"
msgstr "" msgstr "Joulukuu"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Jan" msgid "Jan"
msgstr "" msgstr "Tammi"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Feb" msgid "Feb"
msgstr "" msgstr "Helmi"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Mar" msgid "Mar"
msgstr "" msgstr "Maalis"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Apr" msgid "Apr"
msgstr "" msgstr "Huhti"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Jun" msgid "Jun"
msgstr "" msgstr "Kesä"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Jul" msgid "Jul"
msgstr "" msgstr "Heinä"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Aug" msgid "Aug"
msgstr "" msgstr "Elo"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Sep" msgid "Sep"
msgstr "" msgstr "Syys"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Oct" msgid "Oct"
msgstr "" msgstr "Loka"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Nov" msgid "Nov"
msgstr "" msgstr "Marras"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Dec" msgid "Dec"
msgstr "" msgstr "Joulu\nJoulu"
#: ../../../../js/local-time.js:33 #: ../../../../js/local-time.js:33
msgid "AM" msgid "AM"
msgstr "" msgstr "AP"
#: ../../../../js/local-time.js:34 #: ../../../../js/local-time.js:34
msgid "PM" msgid "PM"
msgstr "" msgstr "IP"
#: ../../../../js/local-time.js:35 #: ../../../../js/local-time.js:35
msgid "am" msgid "am"
msgstr "" msgstr "ap"
#: ../../../../js/local-time.js:36 #: ../../../../js/local-time.js:36
msgid "pm" msgid "pm"
msgstr "" msgstr "ip"
#: ../../../../js/expand-video.js:45 ../../../../js/expand-video.js:48 #: ../../../../js/expand-video.js:45 ../../../../js/expand-video.js:48
msgid "Your browser does not support HTML5 video." msgid "Your browser does not support HTML5 video."
msgstr "" msgstr "Selaimesi ei tue HTML5 videota."
#: ../../../../js/expand-video.js:189 ../../../../js/expand-video.js:192 #: ../../../../js/expand-video.js:189 ../../../../js/expand-video.js:192
msgid "[play once]" msgid "[play once]"
msgstr "" msgstr "[toista kerran]"
#: ../../../../js/expand-video.js:190 ../../../../js/expand-video.js:193 #: ../../../../js/expand-video.js:190 ../../../../js/expand-video.js:193
msgid "[loop]" msgid "[loop]"
msgstr "" msgstr "[silmukka]"
#: ../../../../js/webm-settings.js:42 #: ../../../../js/webm-settings.js:42
msgid "WebM Settings" msgid "WebM Settings"
msgstr "" msgstr "WebM-asetukset"
#: ../../../../js/webm-settings.js:44 #: ../../../../js/webm-settings.js:44
msgid "Expand videos inline" msgid "Expand videos inline"
msgstr "" msgstr "Laajenna videot sivun sisällä"
#: ../../../../js/webm-settings.js:45 #: ../../../../js/webm-settings.js:45
msgid "Play videos on hover" msgid "Play videos on hover"
msgstr "" msgstr "Toista videot hoveroitaessa"
#: ../../../../js/webm-settings.js:46 #: ../../../../js/webm-settings.js:46
msgid "Default volume" msgid "Default volume"
msgstr "" msgstr "Oletus volyymi"
#: ../../../../js/treeview.js:18 #: ../../../../js/treeview.js:18
msgid "Tree view" msgid "Tree view"
msgstr "" msgstr "Puunäkymä"

File diff suppressed because it is too large Load Diff

View File

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: vichan\n" "Project-Id-Version: vichan\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-04-21 21:04+0200\n" "POT-Creation-Date: 2014-04-21 21:04+0200\n"
"PO-Revision-Date: 2014-04-21 19:05+0000\n" "PO-Revision-Date: 2014-05-02 21:08+0000\n"
"Last-Translator: czaks <marcin@6irc.net>\n" "Last-Translator: kaf <admin@cable6.net>\n"
"Language-Team: French (France) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/fr_FR/)\n" "Language-Team: French (France) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/fr_FR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -2585,12 +2585,12 @@ msgstr "Voir plus de log pour cet utilisateur."
#. line 84 #. line 84
#: ../../../../templates/cache/cf/63/151e140d85df674832f4ede3f3e7811b97d4efa91cac6086ca7e8ce65d25.php:255 #: ../../../../templates/cache/cf/63/151e140d85df674832f4ede3f3e7811b97d4efa91cac6086ca7e8ce65d25.php:255
msgid "Flag" msgid "Flag"
msgstr "" msgstr "Drapeau"
#. line 87 #. line 87
#: ../../../../templates/cache/cf/63/151e140d85df674832f4ede3f3e7811b97d4efa91cac6086ca7e8ce65d25.php:261 #: ../../../../templates/cache/cf/63/151e140d85df674832f4ede3f3e7811b97d4efa91cac6086ca7e8ce65d25.php:261
msgid "None" msgid "None"
msgstr "" msgstr "Aucun"
#. When moving a thread to another board and choosing to keep a "shadow #. When moving a thread to another board and choosing to keep a "shadow
#. thread", an automated post (with #. thread", an automated post (with

View File

@ -1 +1 @@
l10n = {"Style: ":"St\u00edlus:","File":"F\u00e1jl","hide":"elrejt","show":"mutat","Show locked threads":"Mutassa a lez\u00e1rt sz\u00e1lakat","Hide locked threads":"Rejtse el a lez\u00e1rt sz\u00e1lakat","URL":"URL","Select":"Kiv\u00e1laszt","Remote":"K\u00fcls\u0151 link","Embed":"Be\u00e1gyaz","Oekaki":"Saj\u00e1t rajz","hidden":"rejtett","Show images":"Mutassa a k\u00e9peket","Hide images":"Rejtse el a k\u00e9peket","Password":"Jelsz\u00f3","Delete file only":"Csak a f\u00e1jlt t\u00f6r\u00f6lje","Delete":"T\u00f6rl\u00e9s","Reason":"Ok","Report":"Jelent","Click reply to view.":"Kattints a v\u00e1laszra a megjelen\u00edt\u00e9shez","Click to expand":"Kattints a nagyobb m\u00e9rethez","Hide expanded replies":"Rejtse el a nagy m\u00e9ret\u0171 v\u00e1laszokat","Brush size":"Ecsetm\u00e9ret","Set text":"Sz\u00f6veg megad\u00e1sa","Clear":"T\u00f6r\u00f6l","Save":"Ment\u00e9s","Load":"Bet\u00f6lt\u00e9s","Toggle eraser":"Rad\u00edrt kapcsol","Get color":"Sz\u00ednt kiv\u00e1laszt","Fill":"KIt\u00f6lt","Use oekaki instead of file?":"Szeretn\u00e9d a rajzodat haszn\u00e1lni f\u00e1jl helyett?","Edit in oekaki":"A rajzod szerkeszt\u00e9se","Enter some text":"\u00cdrj be sz\u00f6veget","Enter font or leave empty":"Adj meg bet\u0171t\u00edpust, vagy hagyd \u00fcresen","Forced anonymity":"Er\u0151ltetett anonimit\u00e1s","enabled":"enged\u00e9lyezett","disabled":"tiltott","Sun":"Va","Mon":"H\u00e9","Tue":"Ke","Wed":"Sze","Thu":"Cs\u00fc","Fri":"P\u00e9","Sat":"Szo","Catalog":"Katal\u00f3gus","Submit":"Elk\u00fcld","Quick reply":"Gyors v\u00e1lasz","Posting mode: Replying to <small>&gt;&gt;{0}<\/small>":"Hozz\u00e1sz\u00f3l\u00e1s m\u00f3dja: V\u00e1lasz erre: <small>&gt;&gt;{0}<\/small>","Return":"Vissza","Expand all images":"\u00d6sszes k\u00e9p nagy m\u00e9ret\u0171re","Hello!":"Szia!","{0} users":"(0) felhaszn\u00e1l\u00f3","(hide threads from this board)":"(sz\u00e1lak elrejt\u00e9se err\u0151l a t\u00e1bl\u00e1r\u00f3l)","(show threads from this board)":"(sz\u00e1lak mutat\u00e1sa err\u0151l a t\u00e1bl\u00e1r\u00f3l)","No more threads to display":"Nincs t\u00f6bb megjelen\u00edtend\u0151 sz\u00e1l","Loading...":"Bet\u00f6lt\u00e9s...","Save as original filename":"Ment\u00e9s eredeti f\u00e1jln\u00e9vvel","Reported post(s).":"Jelentett hozz\u00e1sz\u00f3l\u00e1s(ok).","An unknown error occured!":"Ismeretlen hiba t\u00f6rt\u00e9nt!","Something went wrong... An unknown error occured!":"V\u00e9g\u00e9rv\u00e9nyesen... Valami elveszett!","Working...":"Feldolgoz\u00e1s...","Posting... (#%)":"K\u00fcld\u00e9s... (#%)","Posted...":"Elk\u00fcldve...","An unknown error occured when posting!":"Ismeretlen hiba t\u00f6rt\u00e9nt k\u00fcld\u00e9s k\u00f6zben!","Posting...":"K\u00fcld\u00e9s...","Upload URL":"URL Felt\u00f6lt\u00e9se","Spoiler Image":"Spoiler K\u00e9p","Comment":"Hozz\u00e1sz\u00f3l\u00e1s","Quick Reply":"Gyors v\u00e1lasz","Stop watching this thread":"Sz\u00e1l figyel\u00e9s\u00e9nek megsz\u00fcntet\u00e9se","Watch this thread":"Figyelje ezt a sz\u00e1lat","Unpin this board":"T\u00e1bla kiemel\u00e9s megsz\u00fcntet\u00e9se","Pin this board":"Emelje ki a t\u00e1bl\u00e1t","Stop watching this board":"T\u00e1bla figyel\u00e9s\u00e9nek megsz\u00fcntet\u00e9se","Watch this board":"Figyelje ezt a t\u00e1bl\u00e1t","Click on any image on this site to load it into oekaki applet":"Kattints a k\u00edv\u00e1nt k\u00e9pre ezen az oldalon a rajzprogramba bet\u00f6lt\u00e9shez","Sunday":"Vas\u00e1rnap","Monday":"H\u00e9tf\u0151","Tuesday":"Kedd","Wednesday":"Szerda","Thursday":"Cs\u00fct\u00f6rt\u00f6k","Friday":"P\u00e9ntek","Saturday":"Szombat","January":"Janu\u00e1r","February":"Febru\u00e1r","March":"M\u00e1rcius","April":"\u00c1prilis","May":"M\u00e1jus","June":"J\u00fanius","July":"J\u00falius","August":"Augusztus","September":"Szeptember","October":"Okt\u00f3ber","November":"November","December":"December","Jan":"Jan","Feb":"Feb","Mar":"M\u00e1r","Apr":"\u00c1pr","Jun":"Jun","Jul":"Jul","Aug":"Aug","Sep":"Szep","Oct":"Okt","Nov":"Nov","Dec":"Dec","AM":"D\u00e9lel\u0151tt","PM":"D\u00e9lut\u00e1n","am":"d\u00e9lel\u0151tt","pm":"d\u00e9lut\u00e1n","Your browser does not support HTML5 video.":"A b\u00f6ng\u00e9sz\u0151d nem t\u00e1mogatja a HTML5 vide\u00f3t.","[play once]":"[lej\u00e1tsz\u00e1s egyszer]","[loop]":"[ism\u00e9tl\u00e9s]","WebM Settings":"WebM be\u00e1ll\u00edt\u00e1sok","Expand videos inline":"Vide\u00f3k kinagy\u00edt\u00e1sa sz\u00e1lon bel\u00fcl","Play videos on hover":"Vide\u00f3k lej\u00e1tsz\u00e1sa ha az eg\u00e9rmutat\u00f3 f\u00f6l\u00e9j\u00fck \u00e9r","Default volume":"Alap hanger\u0151","Tree view":"Fa n\u00e9zet"}; l10n = {"Style: ":"St\u00edlus:","File":"F\u00e1jl","hide":"elrejt","show":"mutat","Show locked threads":"Mutassa a lez\u00e1rt sz\u00e1lakat","Hide locked threads":"Rejtse el a lez\u00e1rt sz\u00e1lakat","URL":"URL","Select":"Kiv\u00e1laszt","Remote":"K\u00fcls\u0151 link","Embed":"Be\u00e1gyaz","Oekaki":"Saj\u00e1t rajz","hidden":"rejtett","Show images":"Mutassa a k\u00e9peket","Hide images":"Rejtse el a k\u00e9peket","Password":"Jelsz\u00f3","Delete file only":"Csak a f\u00e1jlt t\u00f6r\u00f6lje","Delete":"T\u00f6rl\u00e9s","Reason":"Ok","Report":"Jelent","Click reply to view.":"Kattints a v\u00e1laszra a megjelen\u00edt\u00e9shez","Click to expand":"Kattints a nagyobb m\u00e9rethez","Hide expanded replies":"Rejtse el a nagy m\u00e9ret\u0171 v\u00e1laszokat","Brush size":"Ecsetm\u00e9ret","Set text":"Sz\u00f6veg megad\u00e1sa","Clear":"T\u00f6r\u00f6l","Save":"Ment\u00e9s","Load":"Bet\u00f6lt\u00e9s","Toggle eraser":"Rad\u00edrt kapcsol","Get color":"Sz\u00ednt kiv\u00e1laszt","Fill":"KIt\u00f6lt","Use oekaki instead of file?":"Szeretn\u00e9d a rajzodat haszn\u00e1lni f\u00e1jl helyett?","Edit in oekaki":"A rajzod szerkeszt\u00e9se","Enter some text":"\u00cdrj be sz\u00f6veget","Enter font or leave empty":"Adj meg bet\u0171t\u00edpust, vagy hagyd \u00fcresen","Forced anonymity":"Er\u0151ltetett anonimit\u00e1s","enabled":"enged\u00e9lyezett","disabled":"tiltott","Sun":"Va","Mon":"H\u00e9","Tue":"Ke","Wed":"Sze","Thu":"Cs\u00fc","Fri":"P\u00e9","Sat":"Szo","Catalog":"Katal\u00f3gus","Submit":"Elk\u00fcld","Quick reply":"Gyors v\u00e1lasz","Posting mode: Replying to <small>&gt;&gt;{0}<\/small>":"Hozz\u00e1sz\u00f3l\u00e1s m\u00f3dja: V\u00e1lasz erre: <small>&gt;&gt;{0}<\/small>","Return":"Vissza","Expand all images":"\u00d6sszes k\u00e9p nagy m\u00e9ret\u0171re","Hello!":"Szia!","{0} users":"(0) felhaszn\u00e1l\u00f3","(hide threads from this board)":"(sz\u00e1lak elrejt\u00e9se err\u0151l a t\u00e1bl\u00e1r\u00f3l)","(show threads from this board)":"(sz\u00e1lak mutat\u00e1sa err\u0151l a t\u00e1bl\u00e1r\u00f3l)","No more threads to display":"Nincs t\u00f6bb megjelen\u00edtend\u0151 sz\u00e1l","Loading...":"Bet\u00f6lt\u00e9s...","Save as original filename":"Ment\u00e9s eredeti f\u00e1jln\u00e9vvel","Reported post(s).":"Jelentett hozz\u00e1sz\u00f3l\u00e1s(ok).","An unknown error occured!":"Ismeretlen hiba t\u00f6rt\u00e9nt!","Something went wrong... An unknown error occured!":"V\u00e9g\u00e9rv\u00e9nyesen... Valami elveszett!","Working...":"Feldolgoz\u00e1s...","Posting... (#%)":"K\u00fcld\u00e9s... (#%)","Posted...":"Elk\u00fcldve...","An unknown error occured when posting!":"Ismeretlen hiba t\u00f6rt\u00e9nt k\u00fcld\u00e9s k\u00f6zben!","Posting...":"K\u00fcld\u00e9s...","Upload URL":"URL Felt\u00f6lt\u00e9se","Spoiler Image":"Spoiler K\u00e9p","Comment":"Hozz\u00e1sz\u00f3l\u00e1s","Quick Reply":"Gyors v\u00e1lasz","Stop watching this thread":"Sz\u00e1l figyel\u00e9s\u00e9nek megsz\u00fcntet\u00e9se","Watch this thread":"Figyelje ezt a sz\u00e1lat","Unpin this board":"T\u00e1bla kiemel\u00e9s megsz\u00fcntet\u00e9se","Pin this board":"Emelje ki a t\u00e1bl\u00e1t","Stop watching this board":"T\u00e1bla figyel\u00e9s\u00e9nek megsz\u00fcntet\u00e9se","Watch this board":"Figyelje ezt a t\u00e1bl\u00e1t","Click on any image on this site to load it into oekaki applet":"Kattints a k\u00edv\u00e1nt k\u00e9pre ezen az oldalon a rajzprogramba bet\u00f6lt\u00e9shez","Sunday":"Vas\u00e1rnap","Monday":"H\u00e9tf\u0151","Tuesday":"Kedd","Wednesday":"Szerda","Thursday":"Cs\u00fct\u00f6rt\u00f6k","Friday":"P\u00e9ntek","Saturday":"Szombat","January":"Janu\u00e1r","February":"Febru\u00e1r","March":"M\u00e1rcius","April":"\u00c1prilis","May":"M\u00e1jus","June":"J\u00fanius","July":"J\u00falius","August":"Augusztus","September":"Szeptember","October":"Okt\u00f3ber","November":"November","December":"December","Jan":"Jan","Feb":"Feb","Mar":"M\u00e1r","Apr":"\u00c1pr","Jun":"Jun","Jul":"Jul","Aug":"Aug","Sep":"Szep","Oct":"Okt","Nov":"Nov","Dec":"Dec","AM":"D\u00e9lel\u0151tt","PM":"D\u00e9lut\u00e1n","am":"d\u00e9lel\u0151tt","pm":"d\u00e9lut\u00e1n","Your browser does not support HTML5 video.":"A b\u00f6ng\u00e9sz\u0151d nem t\u00e1mogatja a HTML5 vide\u00f3t.","[play once]":"[lej\u00e1tsz\u00e1s egyszer]","[loop]":"[ism\u00e9tl\u00e9s]","WebM Settings":"WebM be\u00e1ll\u00edt\u00e1sok","Expand videos inline":"Vide\u00f3k kinagy\u00edt\u00e1sa sz\u00e1lon bel\u00fcl","Play videos on hover":"Vide\u00f3k lebeg\u0151 lej\u00e1tsz\u00e1sa ha az eg\u00e9rmutat\u00f3 f\u00f6l\u00e9j\u00fck \u00e9r","Default volume":"Alap hanger\u0151","Tree view":"Fa n\u00e9zet"};

View File

@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vichan\n" "Project-Id-Version: vichan\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-04-20 00:49+0200\n" "POT-Creation-Date: 2014-04-21 21:04+0200\n"
"PO-Revision-Date: 2014-04-20 15:00+0000\n" "PO-Revision-Date: 2014-05-07 17:41+0000\n"
"Last-Translator: cicus <mercurio@index.hu>\n" "Last-Translator: cicus <mercurio@index.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/hu_HU/)\n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/hu_HU/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -560,7 +560,7 @@ msgstr "Videók kinagyítása szálon belül"
#: ../../../../js/webm-settings.js:45 #: ../../../../js/webm-settings.js:45
msgid "Play videos on hover" msgid "Play videos on hover"
msgstr "Videók lejátszása ha az egérmutató föléjük ér" msgstr "Videók lebegő lejátszása ha az egérmutató föléjük ér"
#: ../../../../js/webm-settings.js:46 #: ../../../../js/webm-settings.js:46
msgid "Default volume" msgid "Default volume"

View File

@ -1 +1 @@
l10n = {"Style: ":"Stilius","File":"Failas","hide":"sl\u0117pti","show":"rodyti","Show locked threads":"Rodyti u\u017erakintas temas","Hide locked threads":"Pasl\u0117pti u\u017erakintas temas","Sunday":"Sekmadienis","Monday":"Pirmadienis","Tuesday":"Antradienis","Wednesday":"Tre\u010diadienis","Thursday":"Ketvirtadienis","Friday":"Penktadienis","Saturday":"\u0160e\u0161tadienis","January":"Sausis","February":"Vasaris","March":"Kovas","April":"Balandis","WebM Settings":"WebM nustatymai"}; l10n = {"Style: ":"Stilius:","File":"Failas","hide":"sl\u0117pti","show":"rodyti","Show locked threads":"Rodyti u\u017erakintas temas","Hide locked threads":"Pasl\u0117pti u\u017erakintas temas","URL":"URL","Select":"Pasirinkti","Remote":"Nutol\u0119s","Embed":"\u012eterpti","Oekaki":"Oekaki","hidden":"pasl\u0117pta","Show images":"Rodyti paveiksl\u0117lius","Hide images":"Sl\u0117pti paveiksl\u0117lius","Password":"Slapta\u017eodis","Delete file only":"Trinti tik fail\u0105","Delete":"I\u0161trinti","Reason":"Prie\u017eastis","Report":"Prane\u0161ti","Click reply to view.":"Nor\u0117damas per\u017ei\u016br\u0117ti spausk \u201eAtsakyti\u201c.","Click to expand":"I\u0161skleisti","Hide expanded replies":"Pasl\u0117pti i\u0161skleistus atsakymus","Brush size":"Teptuko dydis","Set text":"Nustatyti tekst\u0105","Clear":"I\u0161valyti","Save":"I\u0161saugoti","Load":"U\u017ekrauti","Toggle eraser":"Perjungti trintuk\u0105","Get color":"Gauti spalv\u0105","Fill":"U\u017epildyti","Use oekaki instead of file?":"Vietoj failo naudoti oekaki?","Edit in oekaki":"Redaguoti su oekaki","Enter some text":"\u012era\u0161yk k\u0105 nors","Enter font or leave empty":"\u012era\u0161yk \u0161rifto pavadinim\u0105 arba palik tu\u0161\u010di\u0105","Forced anonymity":"Priverstinis anonimi\u0161kumas","enabled":"\u012fjungta","disabled":"i\u0161jungta","Sun":"Sk","Mon":"Pr","Tue":"An","Wed":"Tr","Thu":"Kt","Fri":"Pn","Sat":"\u0160\u0161","Catalog":"Katalogas","Submit":"Patvirtinti","Quick reply":"Greitas atsakymas","Posting mode: Replying to <small>&gt;&gt;{0}<\/small>":"Ra\u0161ymo re\u017eimas: Atsakymas \u012f <small>&gt;&gt;{0}<\/small>","Return":"Gr\u012f\u017eti","Expand all images":"I\u0161skleisti visus paveiksl\u0117lius","Hello!":"Sveiks!","{0} users":"{0} vartotoj\u0173","(hide threads from this board)":"(sl\u0117pti temas i\u0161 \u0161ios lentos)","(show threads from this board)":"(rodyti temas i\u0161 \u0161ios lentos)","No more threads to display":"Daugiau tem\u0173 n\u0117ra","Loading...":"Kraunasi...","Save as original filename":"I\u0161saugoti originaliu pavadinimu","Reported post(s).":"\u012era\u0161ai apie kuriuos prane\u0161ta.","An unknown error occured!":"\u012evyko ne\u017einoma klaida!","Something went wrong... An unknown error occured!":"Ka\u017ekas blogai... \u012evyko ne\u017einoma klaida!","Working...":"Dirbama...","Posting... (#%)":"Skelbiama... (#%)","Posted...":"Paskelbta...","An unknown error occured when posting!":"Skelbiant \u012fvyko ne\u017einoma klaida!","Posting...":"Skelbiama...","Upload URL":"I\u0161siuntimo URL","Spoiler Image":"Paveiksl\u0117lis, galintis atskleisti svarbias detales","Comment":"Komentuoti","Quick Reply":"Greitas atsakymas","Stop watching this thread":"Nebesekti \u0161ios temos","Watch this thread":"Steb\u0117ti \u0161i\u0105 tem\u0105","Unpin this board":"Prisegti \u0161i\u0105 lent\u0105","Pin this board":"Atkabinti \u0161i\u0105 lent\u0105","Stop watching this board":"Nebesekti \u0161ios lentos","Watch this board":"Sekti \u0161i\u0105 lent\u0105","Click on any image on this site to load it into oekaki applet":"Spausk ant bet kurio \u0161iame puslapyje esan\u010dio paveiksl\u0117lio, kad atvertum j\u012f su oekaki program\u0117le","Sunday":"Sekmadienis","Monday":"Pirmadienis","Tuesday":"Antradienis","Wednesday":"Tre\u010diadienis","Thursday":"Ketvirtadienis","Friday":"Penktadienis","Saturday":"\u0160e\u0161tadienis","January":"Sausis","February":"Vasaris","March":"Kovas","April":"Balandis","May":"Gegu\u017e\u0117","June":"Bir\u017eelis","July":"Liepa","August":"Rugpj\u016btis","September":"Rugs\u0117jis","October":"Spalis","November":"Lapkritis","December":"Gruodis","Jan":"Sau","Feb":"Vas","Mar":"Kov","Apr":"Bal","Jun":"Bir","Jul":"Lie","Aug":"Rgp","Sep":"Rgs","Oct":"Spa","Nov":"Lap","Dec":"Gru","AM":"AM","PM":"PM","am":"am","pm":"pm","Your browser does not support HTML5 video.":"Tavo nar\u0161ykl\u0117 nepalaiko HTML5 vaizdo \u012fra\u0161\u0173.","[play once]":"[paleisti kart\u0105]","[loop]":"[leisti nepertraukiamai]","WebM Settings":"WebM nustatymai","Expand videos inline":"I\u0161skleisti vaizdo \u012fra\u0161us puslapyje","Play videos on hover":"Paleisti \u012fra\u0161\u0105 i\u0161art tik u\u017evedus pelyte","Default volume":"Numatytasis garsas","Tree view":"Med\u017eio per\u017ei\u016bra"};

View File

@ -3,14 +3,14 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# #
# Translators: # Translators:
# banginis <asesuarbanesu@gmail.com>, 2014 # Aš Esu <asesuarbanesu@gmail.com>, 2014
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vichan\n" "Project-Id-Version: vichan\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-04-20 00:49+0200\n" "POT-Creation-Date: 2014-04-21 21:04+0200\n"
"PO-Revision-Date: 2014-04-19 22:53+0000\n" "PO-Revision-Date: 2014-05-04 20:26+0000\n"
"Last-Translator: czaks <marcin@6irc.net>\n" "Last-Translator: Aš Esu <asesuarbanesu@gmail.com>\n"
"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/lt_LT/)\n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/lt_LT/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -20,7 +20,7 @@ msgstr ""
#: ../../../../js/style-select.js:40 ../../../../js/style-select.js:41 #: ../../../../js/style-select.js:40 ../../../../js/style-select.js:41
msgid "Style: " msgid "Style: "
msgstr "Stilius" msgstr "Stilius:"
#: ../../../../js/hide-images.js:50 ../../../../js/upload-selection.js:51 #: ../../../../js/hide-images.js:50 ../../../../js/upload-selection.js:51
#: ../../../../js/quick-post-controls.js:30 ../../../../js/hide-images.js:51 #: ../../../../js/quick-post-controls.js:30 ../../../../js/hide-images.js:51
@ -57,122 +57,122 @@ msgstr "Paslėpti užrakintas temas"
#: ../../../../js/upload-selection.js:32 ../../../../js/upload-selection.js:45 #: ../../../../js/upload-selection.js:32 ../../../../js/upload-selection.js:45
msgid "URL" msgid "URL"
msgstr "" msgstr "URL"
#: ../../../../js/upload-selection.js:50 ../../../../js/upload-selection.js:60 #: ../../../../js/upload-selection.js:50 ../../../../js/upload-selection.js:60
msgid "Select" msgid "Select"
msgstr "" msgstr "Pasirinkti"
#: ../../../../js/upload-selection.js:53 ../../../../js/upload-selection.js:63 #: ../../../../js/upload-selection.js:53 ../../../../js/upload-selection.js:63
msgid "Remote" msgid "Remote"
msgstr "" msgstr "Nutolęs"
#: ../../../../js/upload-selection.js:56 ../../../../js/upload-selection.js:66 #: ../../../../js/upload-selection.js:56 ../../../../js/upload-selection.js:66
msgid "Embed" msgid "Embed"
msgstr "" msgstr "Įterpti"
#: ../../../../js/upload-selection.js:59 ../../../../js/upload-selection.js:69 #: ../../../../js/upload-selection.js:59 ../../../../js/upload-selection.js:69
msgid "Oekaki" msgid "Oekaki"
msgstr "" msgstr "Oekaki"
#: ../../../../js/toggle-images.js:41 ../../../../js/toggle-images.js:42 #: ../../../../js/toggle-images.js:41 ../../../../js/toggle-images.js:42
msgid "hidden" msgid "hidden"
msgstr "" msgstr "paslėpta"
#: ../../../../js/toggle-images.js:57 ../../../../js/toggle-images.js:70 #: ../../../../js/toggle-images.js:57 ../../../../js/toggle-images.js:70
#: ../../../../js/toggle-images.js:58 ../../../../js/toggle-images.js:71 #: ../../../../js/toggle-images.js:58 ../../../../js/toggle-images.js:71
msgid "Show images" msgid "Show images"
msgstr "" msgstr "Rodyti paveikslėlius"
#: ../../../../js/toggle-images.js:57 ../../../../js/toggle-images.js:70 #: ../../../../js/toggle-images.js:57 ../../../../js/toggle-images.js:70
#: ../../../../js/toggle-images.js:58 ../../../../js/toggle-images.js:71 #: ../../../../js/toggle-images.js:58 ../../../../js/toggle-images.js:71
msgid "Hide images" msgid "Hide images"
msgstr "" msgstr "Slėpti paveikslėlius"
#: ../../../../js/quick-post-controls.js:27 #: ../../../../js/quick-post-controls.js:27
#: ../../../../js/quick-post-controls.js:29 #: ../../../../js/quick-post-controls.js:29
msgid "Password" msgid "Password"
msgstr "" msgstr "Slaptažodis"
#: ../../../../js/quick-post-controls.js:29 #: ../../../../js/quick-post-controls.js:29
#: ../../../../js/quick-post-controls.js:31 #: ../../../../js/quick-post-controls.js:31
msgid "Delete file only" msgid "Delete file only"
msgstr "" msgstr "Trinti tik failą"
#: ../../../../js/quick-post-controls.js:31 #: ../../../../js/quick-post-controls.js:31
#: ../../../../js/quick-post-controls.js:33 #: ../../../../js/quick-post-controls.js:33
msgid "Delete" msgid "Delete"
msgstr "" msgstr "Ištrinti"
#: ../../../../js/quick-post-controls.js:35 #: ../../../../js/quick-post-controls.js:35
#: ../../../../js/quick-post-controls.js:37 #: ../../../../js/quick-post-controls.js:37
msgid "Reason" msgid "Reason"
msgstr "" msgstr "Priežastis"
#: ../../../../js/quick-post-controls.js:37 #: ../../../../js/quick-post-controls.js:37
#: ../../../../js/quick-post-controls.js:39 #: ../../../../js/quick-post-controls.js:39
msgid "Report" msgid "Report"
msgstr "" msgstr "Pranešti"
#: ../../../../js/expand.js:20 ../../../../js/expand.js:22 #: ../../../../js/expand.js:20 ../../../../js/expand.js:22
msgid "Click reply to view." msgid "Click reply to view."
msgstr "" msgstr "Norėdamas peržiūrėti spausk „Atsakyti“."
#: ../../../../js/expand.js:20 ../../../../js/expand.js:22 #: ../../../../js/expand.js:20 ../../../../js/expand.js:22
msgid "Click to expand" msgid "Click to expand"
msgstr "" msgstr "Išskleisti"
#: ../../../../js/expand.js:44 ../../../../js/expand.js:46 #: ../../../../js/expand.js:44 ../../../../js/expand.js:46
msgid "Hide expanded replies" msgid "Hide expanded replies"
msgstr "" msgstr "Paslėpti išskleistus atsakymus"
#: ../../../../js/oekaki.js:10 #: ../../../../js/oekaki.js:10
msgid "Brush size" msgid "Brush size"
msgstr "" msgstr "Teptuko dydis"
#: ../../../../js/oekaki.js:10 #: ../../../../js/oekaki.js:10
msgid "Set text" msgid "Set text"
msgstr "" msgstr "Nustatyti tekstą"
#: ../../../../js/oekaki.js:10 #: ../../../../js/oekaki.js:10
msgid "Clear" msgid "Clear"
msgstr "" msgstr "Išvalyti"
#: ../../../../js/oekaki.js:10 #: ../../../../js/oekaki.js:10
msgid "Save" msgid "Save"
msgstr "" msgstr "Išsaugoti"
#: ../../../../js/oekaki.js:10 #: ../../../../js/oekaki.js:10
msgid "Load" msgid "Load"
msgstr "" msgstr "Užkrauti"
#: ../../../../js/oekaki.js:11 #: ../../../../js/oekaki.js:11
msgid "Toggle eraser" msgid "Toggle eraser"
msgstr "" msgstr "Perjungti trintuką"
#: ../../../../js/oekaki.js:11 #: ../../../../js/oekaki.js:11
msgid "Get color" msgid "Get color"
msgstr "" msgstr "Gauti spalvą"
#: ../../../../js/oekaki.js:11 #: ../../../../js/oekaki.js:11
msgid "Fill" msgid "Fill"
msgstr "" msgstr "Užpildyti"
#: ../../../../js/oekaki.js:12 #: ../../../../js/oekaki.js:12
msgid "Use oekaki instead of file?" msgid "Use oekaki instead of file?"
msgstr "" msgstr "Vietoj failo naudoti oekaki?"
#: ../../../../js/oekaki.js:21 #: ../../../../js/oekaki.js:21
msgid "Edit in oekaki" msgid "Edit in oekaki"
msgstr "" msgstr "Redaguoti su oekaki"
#: ../../../../js/oekaki.js:152 #: ../../../../js/oekaki.js:152
msgid "Enter some text" msgid "Enter some text"
msgstr "" msgstr "Įrašyk ką nors"
#: ../../../../js/oekaki.js:153 #: ../../../../js/oekaki.js:153
msgid "Enter font or leave empty" msgid "Enter font or leave empty"
msgstr "" msgstr "Įrašyk šrifto pavadinimą arba palik tuščią"
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65 #: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65
#: ../../../../js/forced-anon.js:69 ../../../../js/forced-anon.js:60 #: ../../../../js/forced-anon.js:69 ../../../../js/forced-anon.js:60
@ -180,190 +180,190 @@ msgstr ""
#: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:67 #: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:67
#: ../../../../js/forced-anon.js:71 #: ../../../../js/forced-anon.js:71
msgid "Forced anonymity" msgid "Forced anonymity"
msgstr "" msgstr "Priverstinis anonimiškumas"
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65 #: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65
#: ../../../../js/forced-anon.js:60 ../../../../js/forced-anon.js:66 #: ../../../../js/forced-anon.js:60 ../../../../js/forced-anon.js:66
#: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:67 #: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:67
msgid "enabled" msgid "enabled"
msgstr "" msgstr "įjungta"
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:69 #: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:69
#: ../../../../js/forced-anon.js:60 ../../../../js/forced-anon.js:70 #: ../../../../js/forced-anon.js:60 ../../../../js/forced-anon.js:70
#: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:71 #: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:71
msgid "disabled" msgid "disabled"
msgstr "" msgstr "išjungta"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Sun" msgid "Sun"
msgstr "" msgstr "Sk"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Mon" msgid "Mon"
msgstr "" msgstr "Pr"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Tue" msgid "Tue"
msgstr "" msgstr "An"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Wed" msgid "Wed"
msgstr "" msgstr "Tr"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Thu" msgid "Thu"
msgstr "" msgstr "Kt"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Fri" msgid "Fri"
msgstr "" msgstr "Pn"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Sat" msgid "Sat"
msgstr "" msgstr "Šš"
#: ../../../../js/catalog-link.js:21 ../../../../js/catalog-link.js:32 #: ../../../../js/catalog-link.js:21 ../../../../js/catalog-link.js:32
#: ../../../../js/catalog-link.js:40 ../../../../js/catalog-link.js:33 #: ../../../../js/catalog-link.js:40 ../../../../js/catalog-link.js:33
#: ../../../../js/catalog-link.js:44 ../../../../js/catalog-link.js:52 #: ../../../../js/catalog-link.js:44 ../../../../js/catalog-link.js:52
msgid "Catalog" msgid "Catalog"
msgstr "" msgstr "Katalogas"
#: ../../../../js/quick-reply.js:21 ../../../../js/quick-reply-old.js:21 #: ../../../../js/quick-reply.js:21 ../../../../js/quick-reply-old.js:21
#: ../../../../js/quick-reply-old.js:23 #: ../../../../js/quick-reply-old.js:23
msgid "Submit" msgid "Submit"
msgstr "" msgstr "Patvirtinti"
#: ../../../../js/quick-reply.js:31 ../../../../js/quick-reply-old.js:31 #: ../../../../js/quick-reply.js:31 ../../../../js/quick-reply-old.js:31
#: ../../../../js/quick-reply-old.js:33 #: ../../../../js/quick-reply-old.js:33
msgid "Quick reply" msgid "Quick reply"
msgstr "" msgstr "Greitas atsakymas"
#: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33 #: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33
#: ../../../../js/quick-reply-old.js:35 #: ../../../../js/quick-reply-old.js:35
#, python-brace-format #, python-brace-format
msgid "Posting mode: Replying to <small>&gt;&gt;{0}</small>" msgid "Posting mode: Replying to <small>&gt;&gt;{0}</small>"
msgstr "" msgstr "Rašymo režimas: Atsakymas į <small>&gt;&gt;{0}</small>"
#: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33 #: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33
#: ../../../../js/quick-reply-old.js:35 #: ../../../../js/quick-reply-old.js:35
msgid "Return" msgid "Return"
msgstr "" msgstr "Grįžti"
#: ../../../../js/expand-all-images.js:20 #: ../../../../js/expand-all-images.js:20
#: ../../../../js/expand-all-images.js:21 #: ../../../../js/expand-all-images.js:21
#: ../../../../js/expand-all-images.js:22 #: ../../../../js/expand-all-images.js:22
msgid "Expand all images" msgid "Expand all images"
msgstr "" msgstr "Išskleisti visus paveikslėlius"
#: ../../../../templates/main.js:6 #: ../../../../templates/main.js:6
msgid "Hello!" msgid "Hello!"
msgstr "" msgstr "Sveiks!"
#: ../../../../templates/main.js:18 #: ../../../../templates/main.js:18
#, python-brace-format #, python-brace-format
msgid "{0} users" msgid "{0} users"
msgstr "" msgstr "{0} vartotojų"
#: ../../../../templates/themes/ukko/ukko.js:28 #: ../../../../templates/themes/ukko/ukko.js:28
#: ../../../../templates/themes/ukko/ukko.js:39 #: ../../../../templates/themes/ukko/ukko.js:39
#: ../../../../templates/themes/ukko/ukko.js:29 #: ../../../../templates/themes/ukko/ukko.js:29
#: ../../../../templates/themes/ukko/ukko.js:40 #: ../../../../templates/themes/ukko/ukko.js:40
msgid "(hide threads from this board)" msgid "(hide threads from this board)"
msgstr "" msgstr "(slėpti temas iš šios lentos)"
#: ../../../../templates/themes/ukko/ukko.js:32 #: ../../../../templates/themes/ukko/ukko.js:32
#: ../../../../templates/themes/ukko/ukko.js:44 #: ../../../../templates/themes/ukko/ukko.js:44
#: ../../../../templates/themes/ukko/ukko.js:33 #: ../../../../templates/themes/ukko/ukko.js:33
#: ../../../../templates/themes/ukko/ukko.js:45 #: ../../../../templates/themes/ukko/ukko.js:45
msgid "(show threads from this board)" msgid "(show threads from this board)"
msgstr "" msgstr "(rodyti temas iš šios lentos)"
#: ../../../../templates/themes/ukko/ukko.js:57 #: ../../../../templates/themes/ukko/ukko.js:57
#: ../../../../templates/themes/ukko/ukko.js:58 #: ../../../../templates/themes/ukko/ukko.js:58
msgid "No more threads to display" msgid "No more threads to display"
msgstr "" msgstr "Daugiau temų nėra"
#: ../../../../templates/themes/ukko/ukko.js:79 #: ../../../../templates/themes/ukko/ukko.js:79
#: ../../../../templates/themes/ukko/ukko.js:80 #: ../../../../templates/themes/ukko/ukko.js:80
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr "Kraunasi..."
#: ../../../../js/download-original.js:32 #: ../../../../js/download-original.js:32
#: ../../../../js/download-original.js:33 #: ../../../../js/download-original.js:33
msgid "Save as original filename" msgid "Save as original filename"
msgstr "" msgstr "Išsaugoti originaliu pavadinimu"
#: ../../../../js/ajax-post-controls.js:43 #: ../../../../js/ajax-post-controls.js:43
msgid "Reported post(s)." msgid "Reported post(s)."
msgstr "" msgstr "Įrašai apie kuriuos pranešta."
#: ../../../../js/ajax-post-controls.js:53 #: ../../../../js/ajax-post-controls.js:53
msgid "An unknown error occured!" msgid "An unknown error occured!"
msgstr "" msgstr "Įvyko nežinoma klaida!"
#: ../../../../js/ajax-post-controls.js:60 #: ../../../../js/ajax-post-controls.js:60
msgid "Something went wrong... An unknown error occured!" msgid "Something went wrong... An unknown error occured!"
msgstr "" msgstr "Kažkas blogai... Įvyko nežinoma klaida!"
#: ../../../../js/ajax-post-controls.js:68 #: ../../../../js/ajax-post-controls.js:68
msgid "Working..." msgid "Working..."
msgstr "" msgstr "Dirbama..."
#: ../../../../js/ajax.js:42 ../../../../js/ajax.js:45 #: ../../../../js/ajax.js:42 ../../../../js/ajax.js:45
msgid "Posting... (#%)" msgid "Posting... (#%)"
msgstr "" msgstr "Skelbiama... (#%)"
#: ../../../../js/ajax.js:104 ../../../../js/ajax.js:109 #: ../../../../js/ajax.js:104 ../../../../js/ajax.js:109
msgid "Posted..." msgid "Posted..."
msgstr "" msgstr "Paskelbta..."
#: ../../../../js/ajax.js:106 ../../../../js/ajax.js:111 #: ../../../../js/ajax.js:106 ../../../../js/ajax.js:111
msgid "An unknown error occured when posting!" msgid "An unknown error occured when posting!"
msgstr "" msgstr "Skelbiant įvyko nežinoma klaida!"
#: ../../../../js/ajax.js:130 ../../../../js/ajax.js:135 #: ../../../../js/ajax.js:130 ../../../../js/ajax.js:135
msgid "Posting..." msgid "Posting..."
msgstr "" msgstr "Skelbiama..."
#: ../../../../js/quick-reply.js:223 ../../../../js/quick-reply.js:224 #: ../../../../js/quick-reply.js:223 ../../../../js/quick-reply.js:224
#: ../../../../js/quick-reply.js:225 #: ../../../../js/quick-reply.js:225
msgid "Upload URL" msgid "Upload URL"
msgstr "" msgstr "Išsiuntimo URL"
#: ../../../../js/quick-reply.js:266 ../../../../js/quick-reply.js:267 #: ../../../../js/quick-reply.js:266 ../../../../js/quick-reply.js:267
#: ../../../../js/quick-reply.js:268 #: ../../../../js/quick-reply.js:268
msgid "Spoiler Image" msgid "Spoiler Image"
msgstr "" msgstr "Paveikslėlis, galintis atskleisti svarbias detales"
#: ../../../../js/quick-reply.js:277 ../../../../js/quick-reply.js:278 #: ../../../../js/quick-reply.js:277 ../../../../js/quick-reply.js:278
#: ../../../../js/quick-reply.js:279 #: ../../../../js/quick-reply.js:279
msgid "Comment" msgid "Comment"
msgstr "" msgstr "Komentuoti"
#: ../../../../js/quick-reply.js:285 ../../../../js/quick-reply.js:406 #: ../../../../js/quick-reply.js:285 ../../../../js/quick-reply.js:406
#: ../../../../js/quick-reply.js:286 ../../../../js/quick-reply.js:407 #: ../../../../js/quick-reply.js:286 ../../../../js/quick-reply.js:407
#: ../../../../js/quick-reply.js:287 ../../../../js/quick-reply.js:408 #: ../../../../js/quick-reply.js:287 ../../../../js/quick-reply.js:408
msgid "Quick Reply" msgid "Quick Reply"
msgstr "" msgstr "Greitas atsakymas"
#: ../../../../js/watch.js:249 ../../../../js/watch.js:250 #: ../../../../js/watch.js:249 ../../../../js/watch.js:250
#: ../../../../js/watch.js:288 ../../../../js/watch.js:289 #: ../../../../js/watch.js:288 ../../../../js/watch.js:289
#: ../../../../js/watch.js:330 ../../../../js/watch.js:331 #: ../../../../js/watch.js:330 ../../../../js/watch.js:331
msgid "Stop watching this thread" msgid "Stop watching this thread"
msgstr "" msgstr "Nebesekti šios temos"
#: ../../../../js/watch.js:249 ../../../../js/watch.js:250 #: ../../../../js/watch.js:249 ../../../../js/watch.js:250
#: ../../../../js/watch.js:288 ../../../../js/watch.js:289 #: ../../../../js/watch.js:288 ../../../../js/watch.js:289
#: ../../../../js/watch.js:330 ../../../../js/watch.js:331 #: ../../../../js/watch.js:330 ../../../../js/watch.js:331
msgid "Watch this thread" msgid "Watch this thread"
msgstr "" msgstr "Stebėti šią temą"
#: ../../../../js/watch.js:260 ../../../../js/watch.js:261 #: ../../../../js/watch.js:260 ../../../../js/watch.js:261
#: ../../../../js/watch.js:269 ../../../../js/watch.js:299 #: ../../../../js/watch.js:269 ../../../../js/watch.js:299
@ -371,7 +371,7 @@ msgstr ""
#: ../../../../js/watch.js:341 ../../../../js/watch.js:342 #: ../../../../js/watch.js:341 ../../../../js/watch.js:342
#: ../../../../js/watch.js:350 #: ../../../../js/watch.js:350
msgid "Unpin this board" msgid "Unpin this board"
msgstr "" msgstr "Prisegti šią lentą"
#: ../../../../js/watch.js:260 ../../../../js/watch.js:261 #: ../../../../js/watch.js:260 ../../../../js/watch.js:261
#: ../../../../js/watch.js:269 ../../../../js/watch.js:299 #: ../../../../js/watch.js:269 ../../../../js/watch.js:299
@ -379,7 +379,7 @@ msgstr ""
#: ../../../../js/watch.js:341 ../../../../js/watch.js:342 #: ../../../../js/watch.js:341 ../../../../js/watch.js:342
#: ../../../../js/watch.js:350 #: ../../../../js/watch.js:350
msgid "Pin this board" msgid "Pin this board"
msgstr "" msgstr "Atkabinti šią lentą"
#: ../../../../js/watch.js:262 ../../../../js/watch.js:267 #: ../../../../js/watch.js:262 ../../../../js/watch.js:267
#: ../../../../js/watch.js:268 ../../../../js/watch.js:301 #: ../../../../js/watch.js:268 ../../../../js/watch.js:301
@ -387,7 +387,7 @@ msgstr ""
#: ../../../../js/watch.js:343 ../../../../js/watch.js:348 #: ../../../../js/watch.js:343 ../../../../js/watch.js:348
#: ../../../../js/watch.js:349 #: ../../../../js/watch.js:349
msgid "Stop watching this board" msgid "Stop watching this board"
msgstr "" msgstr "Nebesekti šios lentos"
#: ../../../../js/watch.js:262 ../../../../js/watch.js:267 #: ../../../../js/watch.js:262 ../../../../js/watch.js:267
#: ../../../../js/watch.js:268 ../../../../js/watch.js:301 #: ../../../../js/watch.js:268 ../../../../js/watch.js:301
@ -395,11 +395,11 @@ msgstr ""
#: ../../../../js/watch.js:343 ../../../../js/watch.js:348 #: ../../../../js/watch.js:343 ../../../../js/watch.js:348
#: ../../../../js/watch.js:349 #: ../../../../js/watch.js:349
msgid "Watch this board" msgid "Watch this board"
msgstr "" msgstr "Sekti šią lentą"
#: ../../../../js/wpaint.js:113 #: ../../../../js/wpaint.js:113
msgid "Click on any image on this site to load it into oekaki applet" msgid "Click on any image on this site to load it into oekaki applet"
msgstr "" msgstr "Spausk ant bet kurio šiame puslapyje esančio paveikslėlio, kad atvertum jį su oekaki programėle"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Sunday" msgid "Sunday"
@ -447,107 +447,107 @@ msgstr "Balandis"
#: ../../../../js/local-time.js:31 ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:31 ../../../../js/local-time.js:32
msgid "May" msgid "May"
msgstr "" msgstr "Gegužė"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "June" msgid "June"
msgstr "" msgstr "Birželis"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "July" msgid "July"
msgstr "" msgstr "Liepa"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "August" msgid "August"
msgstr "" msgstr "Rugpjūtis"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "September" msgid "September"
msgstr "" msgstr "Rugsėjis"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "October" msgid "October"
msgstr "" msgstr "Spalis"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "November" msgid "November"
msgstr "" msgstr "Lapkritis"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "December" msgid "December"
msgstr "" msgstr "Gruodis"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Jan" msgid "Jan"
msgstr "" msgstr "Sau"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Feb" msgid "Feb"
msgstr "" msgstr "Vas"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Mar" msgid "Mar"
msgstr "" msgstr "Kov"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Apr" msgid "Apr"
msgstr "" msgstr "Bal"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Jun" msgid "Jun"
msgstr "" msgstr "Bir"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Jul" msgid "Jul"
msgstr "" msgstr "Lie"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Aug" msgid "Aug"
msgstr "" msgstr "Rgp"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Sep" msgid "Sep"
msgstr "" msgstr "Rgs"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Oct" msgid "Oct"
msgstr "" msgstr "Spa"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Nov" msgid "Nov"
msgstr "" msgstr "Lap"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Dec" msgid "Dec"
msgstr "" msgstr "Gru"
#: ../../../../js/local-time.js:33 #: ../../../../js/local-time.js:33
msgid "AM" msgid "AM"
msgstr "" msgstr "AM"
#: ../../../../js/local-time.js:34 #: ../../../../js/local-time.js:34
msgid "PM" msgid "PM"
msgstr "" msgstr "PM"
#: ../../../../js/local-time.js:35 #: ../../../../js/local-time.js:35
msgid "am" msgid "am"
msgstr "" msgstr "am"
#: ../../../../js/local-time.js:36 #: ../../../../js/local-time.js:36
msgid "pm" msgid "pm"
msgstr "" msgstr "pm"
#: ../../../../js/expand-video.js:45 ../../../../js/expand-video.js:48 #: ../../../../js/expand-video.js:45 ../../../../js/expand-video.js:48
msgid "Your browser does not support HTML5 video." msgid "Your browser does not support HTML5 video."
msgstr "" msgstr "Tavo naršyklė nepalaiko HTML5 vaizdo įrašų."
#: ../../../../js/expand-video.js:189 ../../../../js/expand-video.js:192 #: ../../../../js/expand-video.js:189 ../../../../js/expand-video.js:192
msgid "[play once]" msgid "[play once]"
msgstr "" msgstr "[paleisti kartą]"
#: ../../../../js/expand-video.js:190 ../../../../js/expand-video.js:193 #: ../../../../js/expand-video.js:190 ../../../../js/expand-video.js:193
msgid "[loop]" msgid "[loop]"
msgstr "" msgstr "[leisti nepertraukiamai]"
#: ../../../../js/webm-settings.js:42 #: ../../../../js/webm-settings.js:42
msgid "WebM Settings" msgid "WebM Settings"
@ -555,16 +555,16 @@ msgstr "WebM nustatymai"
#: ../../../../js/webm-settings.js:44 #: ../../../../js/webm-settings.js:44
msgid "Expand videos inline" msgid "Expand videos inline"
msgstr "" msgstr "Išskleisti vaizdo įrašus puslapyje"
#: ../../../../js/webm-settings.js:45 #: ../../../../js/webm-settings.js:45
msgid "Play videos on hover" msgid "Play videos on hover"
msgstr "" msgstr "Paleisti įrašą išart tik užvedus pelyte"
#: ../../../../js/webm-settings.js:46 #: ../../../../js/webm-settings.js:46
msgid "Default volume" msgid "Default volume"
msgstr "" msgstr "Numatytasis garsas"
#: ../../../../js/treeview.js:18 #: ../../../../js/treeview.js:18
msgid "Tree view" msgid "Tree view"
msgstr "" msgstr "Medžio peržiūra"

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
l10n = {"Style: ":"Stils:","File":"Fails","hide":"pasl\u0113pt","show":"par\u0101d\u012bt","Show locked threads":"R\u0101d\u012bt sl\u0113gtos pavedienus","Hide locked threads":"Sl\u0113pt sl\u0113gtos pavedienus","URL":"URL","Select":"Izv\u0113l\u0113ties","hidden":"pasl\u0113pts","Show images":"R\u0101d\u012bt att\u0113lus","Hide images":"Pasl\u0113pt att\u0113lus","Password":"Parole","Delete file only":"Dz\u0113st tikai failu","Delete":"Dz\u0113st","Reason":"Iemesls","Report":"Zi\u0146ot","Click reply to view.":"Nospiest uz atbildes, lai apskat\u012btu","Click to expand":"Nospiest, lai izv\u0113rstu","Hide expanded replies":"Pasl\u0113pt izv\u0113rst\u0101s atbildes","Brush size":"Otas izm\u0113rs","Set text":"Uzst\u0101d\u012bt tekstu","Clear":"Not\u012br\u012bt","Save":"Saglab\u0101t","Load":"Iel\u0101d\u0113t","Toggle eraser":"P\u0101rsl\u0113gt dz\u0113\u0161anu","Get color":"Ieg\u016bt kr\u0101su","Fill":"Aizpild\u012bt","enabled":"iesl\u0113gts","disabled":"izsl\u0113gts"}; l10n = {"Style: ":"Stils:","File":"Fails","hide":"pasl\u0113pt","show":"par\u0101d\u012bt","Show locked threads":"R\u0101d\u012bt sl\u0113gtos pavedienus","Hide locked threads":"Sl\u0113pt sl\u0113gtos pavedienus","URL":"URL","Select":"Izv\u0113l\u0113ties","Remote":"Att\u0101lin\u0101ti","Embed":"Ieguld\u012bt","Oekaki":"Oekaki","hidden":"pasl\u0113pts","Show images":"R\u0101d\u012bt att\u0113lus","Hide images":"Pasl\u0113pt att\u0113lus","Password":"Parole","Delete file only":"Dz\u0113st tikai failu","Delete":"Dz\u0113st","Reason":"Iemesls","Report":"Zi\u0146ot","Click reply to view.":"Nospiest uz atbildes, lai apskat\u012btu","Click to expand":"Nospiest, lai izv\u0113rstu","Hide expanded replies":"Pasl\u0113pt izv\u0113rst\u0101s atbildes","Brush size":"Otas izm\u0113rs","Set text":"Uzst\u0101d\u012bt tekstu","Clear":"Not\u012br\u012bt","Save":"Saglab\u0101t","Load":"Iel\u0101d\u0113t","Toggle eraser":"P\u0101rsl\u0113gt dz\u0113\u0161anu","Get color":"Ieg\u016bt kr\u0101su","Fill":"Aizpild\u012bt","Use oekaki instead of file?":"Lietot oekaki faila viet\u0101?","Edit in oekaki":"Redi\u0123\u0113t oekaki","Enter some text":"Ierakstiet tekstu","Enter font or leave empty":"Ierakstiet fontu, vai atst\u0101jiet tuk\u0161u","Forced anonymity":"Piespiedu anonimit\u0101te","enabled":"iesl\u0113gts","disabled":"izsl\u0113gts","Sun":"SV","Mon":"PR","Tue":"OT","Wed":"TR","Thu":"CE","Fri":"PK","Sat":"SE","Catalog":"Katalogs","Submit":"Nos\u016bt\u012bt","Quick reply":"\u0100tr\u0101 atbilde","Posting mode: Replying to <small>&gt;&gt;{0}<\/small>":"Rakst\u012b\u0161anas re\u017e\u012bms: Atbilde <small>&gt;&gt;{0}<\/small>","Return":"Atgriezties","Expand all images":"Izv\u0113rst visus att\u0113lus","Hello!":"Sveicin\u0101ti!","{0} users":"{0} lietot\u0101ji","(hide threads from this board)":"(pasl\u0113pt pavedienus no \u0161\u012b d\u0113\u013ca)","(show threads from this board)":"(r\u0101d\u012bt pavedienus no \u0161\u012b d\u0113\u013ca)","No more threads to display":"Nav vair\u0101k r\u0101d\u0101mu pavedienu","Loading...":"Iel\u0101de...","Save as original filename":"Saglab\u0101t k\u0101 jaunu faila nosaukumu","Reported post(s).":"Nozi\u0146otie ieraksti.","An unknown error occured!":"Radusies nezin\u0101ma k\u013c\u016bme!","Something went wrong... An unknown error occured!":"Kaut kas nog\u0101ja greizi... radusies nezin\u0101ma k\u013c\u016bme!","Working...":"Apstr\u0101d\u0101...","Posting... (#%)":"Ieraksta... (#%)","Posted...":"Ierakst\u012bts...","An unknown error occured when posting!":"Radusies nezin\u0101ma k\u013c\u016bme ierakstot zi\u0146ojumu!","Posting...":"Ieraksta...","Upload URL":"Aug\u0161upiel\u0101d\u0113t URL","Spoiler Image":"Spoilera att\u0113ls","Comment":"Koment\u0101rs","Quick Reply":"\u0100tr\u0101 atbilde","Stop watching this thread":"P\u0101rst\u0101t uzraudz\u012bt \u0161o pavedienu","Watch this thread":"Uzraudz\u012bt \u0161o pavedienu","Unpin this board":"Atspraust d\u0113li","Pin this board":"Piespraust d\u0113li","Stop watching this board":"P\u0101rst\u0101t uzraudz\u012bt \u0161o d\u0113li","Watch this board":"Uzraudz\u012bt \u0161o d\u0113li","Click on any image on this site to load it into oekaki applet":"Uzklik\u0161\u0137iniet uz jebkura att\u0113la, lai iel\u0101d\u0113tu to oekaki s\u012bklietnotn\u0113","Sunday":"Sv\u0113tdiena","Monday":"Pirmdiena","Tuesday":"Otrdiena","Wednesday":"Tre\u0161diena","Thursday":"Ceturtdiena","Friday":"Piektdiena","Saturday":"Sestdiena","January":"Janv\u0101ris","February":"Febru\u0101ris","March":"Marts","April":"Apr\u012blis","May":"Maijs","June":"J\u016bnijs","July":"\u016blijs","August":"Augusts","September":"Septembris","October":"Oktobris","November":"Novembris","December":"Decembris","Jan":"Jan","Feb":"Feb","Mar":"Mar","Apr":"Apr","Jun":"Jun","Jul":"Jul","Aug":"Aug","Sep":"Sep","Oct":"Okt","Nov":"Nov","Dec":"Dec","AM":"AM","PM":"PM","am":"am","pm":"pm","Your browser does not support HTML5 video.":"J\u016bsu p\u0101rl\u016bks neatbalsta HTML 5 video.","[play once]":"[atsp\u0113l\u0113t vienreiz]","[loop]":"[atsp\u0113l\u0113t atk\u0101rtoti]","WebM Settings":"WebM uzst\u0101d\u012bjumi","Expand videos inline":"Izv\u0113rst video iek\u013cauti","Play videos on hover":"Atsp\u0113l\u0113t video uzbraucot","Default volume":"Noklus\u0113juma ska\u013cums","Tree view":"Koka skat\u012bjums"};

View File

@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: vichan\n" "Project-Id-Version: vichan\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-04-21 21:04+0200\n" "POT-Creation-Date: 2014-04-21 21:04+0200\n"
"PO-Revision-Date: 2014-04-30 21:37+0000\n" "PO-Revision-Date: 2014-05-07 10:56+0000\n"
"Last-Translator: diggydoc <aigryz@gmail.com>\n" "Last-Translator: diggydoc <aigryz@gmail.com>\n"
"Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/lv_LV/)\n" "Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/lv_LV/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -65,15 +65,15 @@ msgstr "Izvēlēties"
#: ../../../../js/upload-selection.js:53 ../../../../js/upload-selection.js:63 #: ../../../../js/upload-selection.js:53 ../../../../js/upload-selection.js:63
msgid "Remote" msgid "Remote"
msgstr "" msgstr "Attālināti"
#: ../../../../js/upload-selection.js:56 ../../../../js/upload-selection.js:66 #: ../../../../js/upload-selection.js:56 ../../../../js/upload-selection.js:66
msgid "Embed" msgid "Embed"
msgstr "" msgstr "Ieguldīt"
#: ../../../../js/upload-selection.js:59 ../../../../js/upload-selection.js:69 #: ../../../../js/upload-selection.js:59 ../../../../js/upload-selection.js:69
msgid "Oekaki" msgid "Oekaki"
msgstr "" msgstr "Oekaki"
#: ../../../../js/toggle-images.js:41 ../../../../js/toggle-images.js:42 #: ../../../../js/toggle-images.js:41 ../../../../js/toggle-images.js:42
msgid "hidden" msgid "hidden"
@ -160,19 +160,19 @@ msgstr "Aizpildīt"
#: ../../../../js/oekaki.js:12 #: ../../../../js/oekaki.js:12
msgid "Use oekaki instead of file?" msgid "Use oekaki instead of file?"
msgstr "" msgstr "Lietot oekaki faila vietā?"
#: ../../../../js/oekaki.js:21 #: ../../../../js/oekaki.js:21
msgid "Edit in oekaki" msgid "Edit in oekaki"
msgstr "" msgstr "Rediģēt oekaki"
#: ../../../../js/oekaki.js:152 #: ../../../../js/oekaki.js:152
msgid "Enter some text" msgid "Enter some text"
msgstr "" msgstr "Ierakstiet tekstu"
#: ../../../../js/oekaki.js:153 #: ../../../../js/oekaki.js:153
msgid "Enter font or leave empty" msgid "Enter font or leave empty"
msgstr "" msgstr "Ierakstiet fontu, vai atstājiet tukšu"
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65 #: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65
#: ../../../../js/forced-anon.js:69 ../../../../js/forced-anon.js:60 #: ../../../../js/forced-anon.js:69 ../../../../js/forced-anon.js:60
@ -180,7 +180,7 @@ msgstr ""
#: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:67 #: ../../../../js/forced-anon.js:61 ../../../../js/forced-anon.js:67
#: ../../../../js/forced-anon.js:71 #: ../../../../js/forced-anon.js:71
msgid "Forced anonymity" msgid "Forced anonymity"
msgstr "" msgstr "Piespiedu anonimitāte"
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65 #: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65
#: ../../../../js/forced-anon.js:60 ../../../../js/forced-anon.js:66 #: ../../../../js/forced-anon.js:60 ../../../../js/forced-anon.js:66
@ -197,173 +197,173 @@ msgstr "izslēgts"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Sun" msgid "Sun"
msgstr "" msgstr "SV"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Mon" msgid "Mon"
msgstr "" msgstr "PR"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Tue" msgid "Tue"
msgstr "" msgstr "OT"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Wed" msgid "Wed"
msgstr "" msgstr "TR"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Thu" msgid "Thu"
msgstr "" msgstr "CE"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Fri" msgid "Fri"
msgstr "" msgstr "PK"
#: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41 #: ../../../../js/local-time.js:40 ../../../../js/local-time.js:41
#: ../../../../js/local-time.js:30 #: ../../../../js/local-time.js:30
msgid "Sat" msgid "Sat"
msgstr "" msgstr "SE"
#: ../../../../js/catalog-link.js:21 ../../../../js/catalog-link.js:32 #: ../../../../js/catalog-link.js:21 ../../../../js/catalog-link.js:32
#: ../../../../js/catalog-link.js:40 ../../../../js/catalog-link.js:33 #: ../../../../js/catalog-link.js:40 ../../../../js/catalog-link.js:33
#: ../../../../js/catalog-link.js:44 ../../../../js/catalog-link.js:52 #: ../../../../js/catalog-link.js:44 ../../../../js/catalog-link.js:52
msgid "Catalog" msgid "Catalog"
msgstr "" msgstr "Katalogs"
#: ../../../../js/quick-reply.js:21 ../../../../js/quick-reply-old.js:21 #: ../../../../js/quick-reply.js:21 ../../../../js/quick-reply-old.js:21
#: ../../../../js/quick-reply-old.js:23 #: ../../../../js/quick-reply-old.js:23
msgid "Submit" msgid "Submit"
msgstr "" msgstr "Nosūtīt"
#: ../../../../js/quick-reply.js:31 ../../../../js/quick-reply-old.js:31 #: ../../../../js/quick-reply.js:31 ../../../../js/quick-reply-old.js:31
#: ../../../../js/quick-reply-old.js:33 #: ../../../../js/quick-reply-old.js:33
msgid "Quick reply" msgid "Quick reply"
msgstr "" msgstr "Ātrā atbilde"
#: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33 #: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33
#: ../../../../js/quick-reply-old.js:35 #: ../../../../js/quick-reply-old.js:35
#, python-brace-format #, python-brace-format
msgid "Posting mode: Replying to <small>&gt;&gt;{0}</small>" msgid "Posting mode: Replying to <small>&gt;&gt;{0}</small>"
msgstr "" msgstr "Rakstīšanas režīms: Atbilde <small>&gt;&gt;{0}</small>"
#: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33 #: ../../../../js/quick-reply.js:33 ../../../../js/quick-reply-old.js:33
#: ../../../../js/quick-reply-old.js:35 #: ../../../../js/quick-reply-old.js:35
msgid "Return" msgid "Return"
msgstr "" msgstr "Atgriezties"
#: ../../../../js/expand-all-images.js:20 #: ../../../../js/expand-all-images.js:20
#: ../../../../js/expand-all-images.js:21 #: ../../../../js/expand-all-images.js:21
#: ../../../../js/expand-all-images.js:22 #: ../../../../js/expand-all-images.js:22
msgid "Expand all images" msgid "Expand all images"
msgstr "" msgstr "Izvērst visus attēlus"
#: ../../../../templates/main.js:6 #: ../../../../templates/main.js:6
msgid "Hello!" msgid "Hello!"
msgstr "" msgstr "Sveicināti!"
#: ../../../../templates/main.js:18 #: ../../../../templates/main.js:18
#, python-brace-format #, python-brace-format
msgid "{0} users" msgid "{0} users"
msgstr "" msgstr "{0} lietotāji"
#: ../../../../templates/themes/ukko/ukko.js:28 #: ../../../../templates/themes/ukko/ukko.js:28
#: ../../../../templates/themes/ukko/ukko.js:39 #: ../../../../templates/themes/ukko/ukko.js:39
#: ../../../../templates/themes/ukko/ukko.js:29 #: ../../../../templates/themes/ukko/ukko.js:29
#: ../../../../templates/themes/ukko/ukko.js:40 #: ../../../../templates/themes/ukko/ukko.js:40
msgid "(hide threads from this board)" msgid "(hide threads from this board)"
msgstr "" msgstr "(paslēpt pavedienus no šī dēļa)"
#: ../../../../templates/themes/ukko/ukko.js:32 #: ../../../../templates/themes/ukko/ukko.js:32
#: ../../../../templates/themes/ukko/ukko.js:44 #: ../../../../templates/themes/ukko/ukko.js:44
#: ../../../../templates/themes/ukko/ukko.js:33 #: ../../../../templates/themes/ukko/ukko.js:33
#: ../../../../templates/themes/ukko/ukko.js:45 #: ../../../../templates/themes/ukko/ukko.js:45
msgid "(show threads from this board)" msgid "(show threads from this board)"
msgstr "" msgstr "(rādīt pavedienus no šī dēļa)"
#: ../../../../templates/themes/ukko/ukko.js:57 #: ../../../../templates/themes/ukko/ukko.js:57
#: ../../../../templates/themes/ukko/ukko.js:58 #: ../../../../templates/themes/ukko/ukko.js:58
msgid "No more threads to display" msgid "No more threads to display"
msgstr "" msgstr "Nav vairāk rādāmu pavedienu"
#: ../../../../templates/themes/ukko/ukko.js:79 #: ../../../../templates/themes/ukko/ukko.js:79
#: ../../../../templates/themes/ukko/ukko.js:80 #: ../../../../templates/themes/ukko/ukko.js:80
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr "Ielāde..."
#: ../../../../js/download-original.js:32 #: ../../../../js/download-original.js:32
#: ../../../../js/download-original.js:33 #: ../../../../js/download-original.js:33
msgid "Save as original filename" msgid "Save as original filename"
msgstr "" msgstr "Saglabāt kā jaunu faila nosaukumu"
#: ../../../../js/ajax-post-controls.js:43 #: ../../../../js/ajax-post-controls.js:43
msgid "Reported post(s)." msgid "Reported post(s)."
msgstr "" msgstr "Noziņotie ieraksti."
#: ../../../../js/ajax-post-controls.js:53 #: ../../../../js/ajax-post-controls.js:53
msgid "An unknown error occured!" msgid "An unknown error occured!"
msgstr "" msgstr "Radusies nezināma kļūme!"
#: ../../../../js/ajax-post-controls.js:60 #: ../../../../js/ajax-post-controls.js:60
msgid "Something went wrong... An unknown error occured!" msgid "Something went wrong... An unknown error occured!"
msgstr "" msgstr "Kaut kas nogāja greizi... radusies nezināma kļūme!"
#: ../../../../js/ajax-post-controls.js:68 #: ../../../../js/ajax-post-controls.js:68
msgid "Working..." msgid "Working..."
msgstr "" msgstr "Apstrādā..."
#: ../../../../js/ajax.js:42 ../../../../js/ajax.js:45 #: ../../../../js/ajax.js:42 ../../../../js/ajax.js:45
msgid "Posting... (#%)" msgid "Posting... (#%)"
msgstr "" msgstr "Ieraksta... (#%)"
#: ../../../../js/ajax.js:104 ../../../../js/ajax.js:109 #: ../../../../js/ajax.js:104 ../../../../js/ajax.js:109
msgid "Posted..." msgid "Posted..."
msgstr "" msgstr "Ierakstīts..."
#: ../../../../js/ajax.js:106 ../../../../js/ajax.js:111 #: ../../../../js/ajax.js:106 ../../../../js/ajax.js:111
msgid "An unknown error occured when posting!" msgid "An unknown error occured when posting!"
msgstr "" msgstr "Radusies nezināma kļūme ierakstot ziņojumu!"
#: ../../../../js/ajax.js:130 ../../../../js/ajax.js:135 #: ../../../../js/ajax.js:130 ../../../../js/ajax.js:135
msgid "Posting..." msgid "Posting..."
msgstr "" msgstr "Ieraksta..."
#: ../../../../js/quick-reply.js:223 ../../../../js/quick-reply.js:224 #: ../../../../js/quick-reply.js:223 ../../../../js/quick-reply.js:224
#: ../../../../js/quick-reply.js:225 #: ../../../../js/quick-reply.js:225
msgid "Upload URL" msgid "Upload URL"
msgstr "" msgstr "Augšupielādēt URL"
#: ../../../../js/quick-reply.js:266 ../../../../js/quick-reply.js:267 #: ../../../../js/quick-reply.js:266 ../../../../js/quick-reply.js:267
#: ../../../../js/quick-reply.js:268 #: ../../../../js/quick-reply.js:268
msgid "Spoiler Image" msgid "Spoiler Image"
msgstr "" msgstr "Spoilera attēls"
#: ../../../../js/quick-reply.js:277 ../../../../js/quick-reply.js:278 #: ../../../../js/quick-reply.js:277 ../../../../js/quick-reply.js:278
#: ../../../../js/quick-reply.js:279 #: ../../../../js/quick-reply.js:279
msgid "Comment" msgid "Comment"
msgstr "" msgstr "Komentārs"
#: ../../../../js/quick-reply.js:285 ../../../../js/quick-reply.js:406 #: ../../../../js/quick-reply.js:285 ../../../../js/quick-reply.js:406
#: ../../../../js/quick-reply.js:286 ../../../../js/quick-reply.js:407 #: ../../../../js/quick-reply.js:286 ../../../../js/quick-reply.js:407
#: ../../../../js/quick-reply.js:287 ../../../../js/quick-reply.js:408 #: ../../../../js/quick-reply.js:287 ../../../../js/quick-reply.js:408
msgid "Quick Reply" msgid "Quick Reply"
msgstr "" msgstr "Ātrā atbilde"
#: ../../../../js/watch.js:249 ../../../../js/watch.js:250 #: ../../../../js/watch.js:249 ../../../../js/watch.js:250
#: ../../../../js/watch.js:288 ../../../../js/watch.js:289 #: ../../../../js/watch.js:288 ../../../../js/watch.js:289
#: ../../../../js/watch.js:330 ../../../../js/watch.js:331 #: ../../../../js/watch.js:330 ../../../../js/watch.js:331
msgid "Stop watching this thread" msgid "Stop watching this thread"
msgstr "" msgstr "Pārstāt uzraudzīt šo pavedienu"
#: ../../../../js/watch.js:249 ../../../../js/watch.js:250 #: ../../../../js/watch.js:249 ../../../../js/watch.js:250
#: ../../../../js/watch.js:288 ../../../../js/watch.js:289 #: ../../../../js/watch.js:288 ../../../../js/watch.js:289
#: ../../../../js/watch.js:330 ../../../../js/watch.js:331 #: ../../../../js/watch.js:330 ../../../../js/watch.js:331
msgid "Watch this thread" msgid "Watch this thread"
msgstr "" msgstr "Uzraudzīt šo pavedienu"
#: ../../../../js/watch.js:260 ../../../../js/watch.js:261 #: ../../../../js/watch.js:260 ../../../../js/watch.js:261
#: ../../../../js/watch.js:269 ../../../../js/watch.js:299 #: ../../../../js/watch.js:269 ../../../../js/watch.js:299
@ -371,7 +371,7 @@ msgstr ""
#: ../../../../js/watch.js:341 ../../../../js/watch.js:342 #: ../../../../js/watch.js:341 ../../../../js/watch.js:342
#: ../../../../js/watch.js:350 #: ../../../../js/watch.js:350
msgid "Unpin this board" msgid "Unpin this board"
msgstr "" msgstr "Atspraust dēli"
#: ../../../../js/watch.js:260 ../../../../js/watch.js:261 #: ../../../../js/watch.js:260 ../../../../js/watch.js:261
#: ../../../../js/watch.js:269 ../../../../js/watch.js:299 #: ../../../../js/watch.js:269 ../../../../js/watch.js:299
@ -379,7 +379,7 @@ msgstr ""
#: ../../../../js/watch.js:341 ../../../../js/watch.js:342 #: ../../../../js/watch.js:341 ../../../../js/watch.js:342
#: ../../../../js/watch.js:350 #: ../../../../js/watch.js:350
msgid "Pin this board" msgid "Pin this board"
msgstr "" msgstr "Piespraust dēli"
#: ../../../../js/watch.js:262 ../../../../js/watch.js:267 #: ../../../../js/watch.js:262 ../../../../js/watch.js:267
#: ../../../../js/watch.js:268 ../../../../js/watch.js:301 #: ../../../../js/watch.js:268 ../../../../js/watch.js:301
@ -387,7 +387,7 @@ msgstr ""
#: ../../../../js/watch.js:343 ../../../../js/watch.js:348 #: ../../../../js/watch.js:343 ../../../../js/watch.js:348
#: ../../../../js/watch.js:349 #: ../../../../js/watch.js:349
msgid "Stop watching this board" msgid "Stop watching this board"
msgstr "" msgstr "Pārstāt uzraudzīt šo dēli"
#: ../../../../js/watch.js:262 ../../../../js/watch.js:267 #: ../../../../js/watch.js:262 ../../../../js/watch.js:267
#: ../../../../js/watch.js:268 ../../../../js/watch.js:301 #: ../../../../js/watch.js:268 ../../../../js/watch.js:301
@ -395,176 +395,176 @@ msgstr ""
#: ../../../../js/watch.js:343 ../../../../js/watch.js:348 #: ../../../../js/watch.js:343 ../../../../js/watch.js:348
#: ../../../../js/watch.js:349 #: ../../../../js/watch.js:349
msgid "Watch this board" msgid "Watch this board"
msgstr "" msgstr "Uzraudzīt šo dēli"
#: ../../../../js/wpaint.js:113 #: ../../../../js/wpaint.js:113
msgid "Click on any image on this site to load it into oekaki applet" msgid "Click on any image on this site to load it into oekaki applet"
msgstr "" msgstr "Uzklikšķiniet uz jebkura attēla, lai ielādētu to oekaki sīklietnotnē"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr "Svētdiena"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Monday" msgid "Monday"
msgstr "" msgstr "Pirmdiena"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr "Otrdiena"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr "Trešdiena"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr "Ceturtdiena"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Friday" msgid "Friday"
msgstr "" msgstr "Piektdiena"
#: ../../../../js/local-time.js:29 #: ../../../../js/local-time.js:29
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr "Sestdiena"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "January" msgid "January"
msgstr "" msgstr "Janvāris"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "February" msgid "February"
msgstr "" msgstr "Februāris"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "March" msgid "March"
msgstr "" msgstr "Marts"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "April" msgid "April"
msgstr "" msgstr "Aprīlis"
#: ../../../../js/local-time.js:31 ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:31 ../../../../js/local-time.js:32
msgid "May" msgid "May"
msgstr "" msgstr "Maijs"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "June" msgid "June"
msgstr "" msgstr "Jūnijs"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "July" msgid "July"
msgstr "" msgstr "ūlijs"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "August" msgid "August"
msgstr "" msgstr "Augusts"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "September" msgid "September"
msgstr "" msgstr "Septembris"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "October" msgid "October"
msgstr "" msgstr "Oktobris"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "November" msgid "November"
msgstr "" msgstr "Novembris"
#: ../../../../js/local-time.js:31 #: ../../../../js/local-time.js:31
msgid "December" msgid "December"
msgstr "" msgstr "Decembris"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Jan" msgid "Jan"
msgstr "" msgstr "Jan"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Feb" msgid "Feb"
msgstr "" msgstr "Feb"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Mar" msgid "Mar"
msgstr "" msgstr "Mar"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Apr" msgid "Apr"
msgstr "" msgstr "Apr"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Jun" msgid "Jun"
msgstr "" msgstr "Jun"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Jul" msgid "Jul"
msgstr "" msgstr "Jul"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Aug" msgid "Aug"
msgstr "" msgstr "Aug"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Sep" msgid "Sep"
msgstr "" msgstr "Sep"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Oct" msgid "Oct"
msgstr "" msgstr "Okt"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Nov" msgid "Nov"
msgstr "" msgstr "Nov"
#: ../../../../js/local-time.js:32 #: ../../../../js/local-time.js:32
msgid "Dec" msgid "Dec"
msgstr "" msgstr "Dec"
#: ../../../../js/local-time.js:33 #: ../../../../js/local-time.js:33
msgid "AM" msgid "AM"
msgstr "" msgstr "AM"
#: ../../../../js/local-time.js:34 #: ../../../../js/local-time.js:34
msgid "PM" msgid "PM"
msgstr "" msgstr "PM"
#: ../../../../js/local-time.js:35 #: ../../../../js/local-time.js:35
msgid "am" msgid "am"
msgstr "" msgstr "am"
#: ../../../../js/local-time.js:36 #: ../../../../js/local-time.js:36
msgid "pm" msgid "pm"
msgstr "" msgstr "pm"
#: ../../../../js/expand-video.js:45 ../../../../js/expand-video.js:48 #: ../../../../js/expand-video.js:45 ../../../../js/expand-video.js:48
msgid "Your browser does not support HTML5 video." msgid "Your browser does not support HTML5 video."
msgstr "" msgstr "Jūsu pārlūks neatbalsta HTML 5 video."
#: ../../../../js/expand-video.js:189 ../../../../js/expand-video.js:192 #: ../../../../js/expand-video.js:189 ../../../../js/expand-video.js:192
msgid "[play once]" msgid "[play once]"
msgstr "" msgstr "[atspēlēt vienreiz]"
#: ../../../../js/expand-video.js:190 ../../../../js/expand-video.js:193 #: ../../../../js/expand-video.js:190 ../../../../js/expand-video.js:193
msgid "[loop]" msgid "[loop]"
msgstr "" msgstr "[atspēlēt atkārtoti]"
#: ../../../../js/webm-settings.js:42 #: ../../../../js/webm-settings.js:42
msgid "WebM Settings" msgid "WebM Settings"
msgstr "" msgstr "WebM uzstādījumi"
#: ../../../../js/webm-settings.js:44 #: ../../../../js/webm-settings.js:44
msgid "Expand videos inline" msgid "Expand videos inline"
msgstr "" msgstr "Izvērst video iekļauti"
#: ../../../../js/webm-settings.js:45 #: ../../../../js/webm-settings.js:45
msgid "Play videos on hover" msgid "Play videos on hover"
msgstr "" msgstr "Atspēlēt video uzbraucot"
#: ../../../../js/webm-settings.js:46 #: ../../../../js/webm-settings.js:46
msgid "Default volume" msgid "Default volume"
msgstr "" msgstr "Noklusējuma skaļums"
#: ../../../../js/treeview.js:18 #: ../../../../js/treeview.js:18
msgid "Tree view" msgid "Tree view"
msgstr "" msgstr "Koka skatījums"

View File

@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# #
# Translators: # Translators:
# diggydoc <aigryz@gmail.com>, 2014
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vichan\n" "Project-Id-Version: vichan\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-04-21 21:04+0200\n" "POT-Creation-Date: 2014-04-21 21:04+0200\n"
"PO-Revision-Date: 2014-04-30 21:28+0000\n" "PO-Revision-Date: 2014-05-07 11:38+0000\n"
"Last-Translator: czaks <marcin@6irc.net>\n" "Last-Translator: diggydoc <aigryz@gmail.com>\n"
"Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/lv_LV/)\n" "Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/lv_LV/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -26,9 +27,9 @@ msgstr ""
#: ../../../../inc/functions.php:653 ../../../../inc/functions.php:670 #: ../../../../inc/functions.php:653 ../../../../inc/functions.php:670
msgid "second" msgid "second"
msgid_plural "seconds" msgid_plural "seconds"
msgstr[0] "" msgstr[0] "sekundes"
msgstr[1] "" msgstr[1] "sekunde"
msgstr[2] "" msgstr[2] "sekundes"
#: ../../../../inc/functions.php:585 ../../../../inc/functions.php:602 #: ../../../../inc/functions.php:585 ../../../../inc/functions.php:602
#: ../../../../inc/functions.php:593 ../../../../inc/functions.php:610 #: ../../../../inc/functions.php:593 ../../../../inc/functions.php:610
@ -39,9 +40,9 @@ msgstr[2] ""
#: ../../../../inc/functions.php:655 ../../../../inc/functions.php:672 #: ../../../../inc/functions.php:655 ../../../../inc/functions.php:672
msgid "minute" msgid "minute"
msgid_plural "minutes" msgid_plural "minutes"
msgstr[0] "" msgstr[0] "minūtes"
msgstr[1] "" msgstr[1] "minūte"
msgstr[2] "" msgstr[2] "minūtes"
#: ../../../../inc/functions.php:587 ../../../../inc/functions.php:604 #: ../../../../inc/functions.php:587 ../../../../inc/functions.php:604
#: ../../../../inc/functions.php:595 ../../../../inc/functions.php:612 #: ../../../../inc/functions.php:595 ../../../../inc/functions.php:612
@ -52,9 +53,9 @@ msgstr[2] ""
#: ../../../../inc/functions.php:657 ../../../../inc/functions.php:674 #: ../../../../inc/functions.php:657 ../../../../inc/functions.php:674
msgid "hour" msgid "hour"
msgid_plural "hours" msgid_plural "hours"
msgstr[0] "" msgstr[0] "stundas"
msgstr[1] "" msgstr[1] "stunda"
msgstr[2] "" msgstr[2] "stundas"
#: ../../../../inc/functions.php:589 ../../../../inc/functions.php:606 #: ../../../../inc/functions.php:589 ../../../../inc/functions.php:606
#: ../../../../inc/functions.php:597 ../../../../inc/functions.php:614 #: ../../../../inc/functions.php:597 ../../../../inc/functions.php:614
@ -65,9 +66,9 @@ msgstr[2] ""
#: ../../../../inc/functions.php:659 ../../../../inc/functions.php:676 #: ../../../../inc/functions.php:659 ../../../../inc/functions.php:676
msgid "day" msgid "day"
msgid_plural "days" msgid_plural "days"
msgstr[0] "" msgstr[0] "dienas"
msgstr[1] "" msgstr[1] "diena"
msgstr[2] "" msgstr[2] "dienas"
#: ../../../../inc/functions.php:591 ../../../../inc/functions.php:608 #: ../../../../inc/functions.php:591 ../../../../inc/functions.php:608
#: ../../../../inc/functions.php:599 ../../../../inc/functions.php:616 #: ../../../../inc/functions.php:599 ../../../../inc/functions.php:616
@ -78,9 +79,9 @@ msgstr[2] ""
#: ../../../../inc/functions.php:661 ../../../../inc/functions.php:678 #: ../../../../inc/functions.php:661 ../../../../inc/functions.php:678
msgid "week" msgid "week"
msgid_plural "weeks" msgid_plural "weeks"
msgstr[0] "" msgstr[0] "nedēļas"
msgstr[1] "" msgstr[1] "nedēļa"
msgstr[2] "" msgstr[2] "nedēļas"
#: ../../../../inc/functions.php:594 ../../../../inc/functions.php:611 #: ../../../../inc/functions.php:594 ../../../../inc/functions.php:611
#: ../../../../inc/functions.php:602 ../../../../inc/functions.php:619 #: ../../../../inc/functions.php:602 ../../../../inc/functions.php:619
@ -91,16 +92,16 @@ msgstr[2] ""
#: ../../../../inc/functions.php:664 ../../../../inc/functions.php:681 #: ../../../../inc/functions.php:664 ../../../../inc/functions.php:681
msgid "year" msgid "year"
msgid_plural "years" msgid_plural "years"
msgstr[0] "" msgstr[0] "gadi"
msgstr[1] "" msgstr[1] "gads"
msgstr[2] "" msgstr[2] "gadi"
#: ../../../../inc/functions.php:628 ../../../../inc/functions.php:670 #: ../../../../inc/functions.php:628 ../../../../inc/functions.php:670
#: ../../../../inc/functions.php:699 ../../../../inc/functions.php:702 #: ../../../../inc/functions.php:699 ../../../../inc/functions.php:702
#: ../../../../inc/functions.php:708 ../../../../inc/functions.php:722 #: ../../../../inc/functions.php:708 ../../../../inc/functions.php:722
#: ../../../../inc/functions.php:732 #: ../../../../inc/functions.php:732
msgid "Banned!" msgid "Banned!"
msgstr "" msgstr "Banots!"
#. There is no previous page. #. There is no previous page.
#: ../../../../inc/functions.php:1125 ../../../../inc/functions.php:1139 #: ../../../../inc/functions.php:1125 ../../../../inc/functions.php:1139
@ -112,7 +113,7 @@ msgstr ""
#: ../../../../inc/functions.php:1234 ../../../../inc/functions.php:1230 #: ../../../../inc/functions.php:1234 ../../../../inc/functions.php:1230
#: ../../../../inc/functions.php:1244 #: ../../../../inc/functions.php:1244
msgid "Previous" msgid "Previous"
msgstr "" msgstr "Iepriekšējais"
#. There is no next page. #. There is no next page.
#: ../../../../inc/functions.php:1144 ../../../../inc/functions.php:1153 #: ../../../../inc/functions.php:1144 ../../../../inc/functions.php:1153
@ -124,76 +125,76 @@ msgstr ""
#: ../../../../inc/functions.php:1248 ../../../../inc/functions.php:1249 #: ../../../../inc/functions.php:1248 ../../../../inc/functions.php:1249
#: ../../../../inc/functions.php:1258 #: ../../../../inc/functions.php:1258
msgid "Next" msgid "Next"
msgstr "" msgstr "Nākamais"
#: ../../../../inc/display.php:93 ../../../../inc/display.php:105 #: ../../../../inc/display.php:93 ../../../../inc/display.php:105
#: ../../../../inc/display.php:108 ../../../../inc/display.php:112 #: ../../../../inc/display.php:108 ../../../../inc/display.php:112
msgid "Error" msgid "Error"
msgstr "" msgstr "Kļūda"
#: ../../../../inc/display.php:94 ../../../../inc/display.php:106 #: ../../../../inc/display.php:94 ../../../../inc/display.php:106
#: ../../../../inc/display.php:109 ../../../../inc/display.php:113 #: ../../../../inc/display.php:109 ../../../../inc/display.php:113
msgid "An error has occured." msgid "An error has occured."
msgstr "" msgstr "Radusies nezināma kļūme!"
#: ../../../../inc/display.php:110 ../../../../inc/mod/pages.php:62 #: ../../../../inc/display.php:110 ../../../../inc/mod/pages.php:62
#: ../../../../inc/mod/pages.php:60 ../../../../inc/display.php:122 #: ../../../../inc/mod/pages.php:60 ../../../../inc/display.php:122
#: ../../../../inc/display.php:125 ../../../../inc/display.php:129 #: ../../../../inc/display.php:125 ../../../../inc/display.php:129
msgid "Login" msgid "Login"
msgstr "" msgstr "Pieteikties"
#: ../../../../inc/display.php:229 ../../../../inc/display.php:241 #: ../../../../inc/display.php:229 ../../../../inc/display.php:241
#: ../../../../inc/display.php:244 ../../../../inc/display.php:248 #: ../../../../inc/display.php:244 ../../../../inc/display.php:248
#, php-format #, php-format
msgid "Post too long. Click <a href=\"%s\">here</a> to view the full text." msgid "Post too long. Click <a href=\"%s\">here</a> to view the full text."
msgstr "" msgstr "Ieraksts pārāk garš. Klikšķiniet <a href=\"%s\">šeit</a>, lai pārskatītu pilnu tekstu."
#: ../../../../inc/display.php:368 ../../../../inc/display.php:473 #: ../../../../inc/display.php:368 ../../../../inc/display.php:473
#: ../../../../inc/display.php:385 ../../../../inc/display.php:495 #: ../../../../inc/display.php:385 ../../../../inc/display.php:495
#: ../../../../inc/display.php:388 ../../../../inc/display.php:498 #: ../../../../inc/display.php:388 ../../../../inc/display.php:498
#: ../../../../inc/display.php:392 ../../../../inc/display.php:502 #: ../../../../inc/display.php:392 ../../../../inc/display.php:502
msgid "Ban" msgid "Ban"
msgstr "" msgstr "Banot"
#: ../../../../inc/display.php:372 ../../../../inc/display.php:477 #: ../../../../inc/display.php:372 ../../../../inc/display.php:477
#: ../../../../inc/display.php:389 ../../../../inc/display.php:499 #: ../../../../inc/display.php:389 ../../../../inc/display.php:499
#: ../../../../inc/display.php:392 ../../../../inc/display.php:502 #: ../../../../inc/display.php:392 ../../../../inc/display.php:502
#: ../../../../inc/display.php:396 ../../../../inc/display.php:506 #: ../../../../inc/display.php:396 ../../../../inc/display.php:506
msgid "Ban & Delete" msgid "Ban & Delete"
msgstr "" msgstr "Banot un Dzēst"
#: ../../../../inc/display.php:376 ../../../../inc/display.php:481 #: ../../../../inc/display.php:376 ../../../../inc/display.php:481
#: ../../../../inc/display.php:393 ../../../../inc/display.php:503 #: ../../../../inc/display.php:393 ../../../../inc/display.php:503
#: ../../../../inc/display.php:396 ../../../../inc/display.php:506 #: ../../../../inc/display.php:396 ../../../../inc/display.php:506
#: ../../../../inc/display.php:400 ../../../../inc/display.php:510 #: ../../../../inc/display.php:400 ../../../../inc/display.php:510
msgid "Delete file" msgid "Delete file"
msgstr "" msgstr "Dzēst failu"
#: ../../../../inc/display.php:376 ../../../../inc/display.php:481 #: ../../../../inc/display.php:376 ../../../../inc/display.php:481
#: ../../../../inc/display.php:393 ../../../../inc/display.php:503 #: ../../../../inc/display.php:393 ../../../../inc/display.php:503
#: ../../../../inc/display.php:396 ../../../../inc/display.php:506 #: ../../../../inc/display.php:396 ../../../../inc/display.php:506
#: ../../../../inc/display.php:400 ../../../../inc/display.php:510 #: ../../../../inc/display.php:400 ../../../../inc/display.php:510
msgid "Are you sure you want to delete this file?" msgid "Are you sure you want to delete this file?"
msgstr "" msgstr "Vai esiet pārliecināti, ka vēlaties dzēst šo failu?"
#: ../../../../inc/display.php:380 ../../../../inc/display.php:485 #: ../../../../inc/display.php:380 ../../../../inc/display.php:485
#: ../../../../inc/display.php:397 ../../../../inc/display.php:507 #: ../../../../inc/display.php:397 ../../../../inc/display.php:507
#: ../../../../inc/display.php:400 ../../../../inc/display.php:510 #: ../../../../inc/display.php:400 ../../../../inc/display.php:510
#: ../../../../inc/display.php:404 ../../../../inc/display.php:514 #: ../../../../inc/display.php:404 ../../../../inc/display.php:514
msgid "Spoiler File" msgid "Spoiler File"
msgstr "" msgstr "Spoilera fails"
#: ../../../../inc/display.php:380 ../../../../inc/display.php:485 #: ../../../../inc/display.php:380 ../../../../inc/display.php:485
#: ../../../../inc/display.php:397 ../../../../inc/display.php:507 #: ../../../../inc/display.php:397 ../../../../inc/display.php:507
#: ../../../../inc/display.php:400 ../../../../inc/display.php:510 #: ../../../../inc/display.php:400 ../../../../inc/display.php:510
#: ../../../../inc/display.php:404 ../../../../inc/display.php:514 #: ../../../../inc/display.php:404 ../../../../inc/display.php:514
msgid "Are you sure you want to spoiler this file?" msgid "Are you sure you want to spoiler this file?"
msgstr "" msgstr "Vai esat pārliecināti, ka vēlieties spoilot šo failu?"
#: ../../../../inc/display.php:384 ../../../../inc/display.php:401 #: ../../../../inc/display.php:384 ../../../../inc/display.php:401
#: ../../../../inc/display.php:404 ../../../../inc/display.php:408 #: ../../../../inc/display.php:404 ../../../../inc/display.php:408
msgid "Move reply to another board" msgid "Move reply to another board"
msgstr "" msgstr "Pārvietot atbildi uz citu dēli"
#: ../../../../inc/display.php:388 ../../../../inc/display.php:512 #: ../../../../inc/display.php:388 ../../../../inc/display.php:512
#: ../../../../inc/mod/pages.php:1425 ../../../../inc/mod/pages.php:1494 #: ../../../../inc/mod/pages.php:1425 ../../../../inc/mod/pages.php:1494
@ -201,7 +202,7 @@ msgstr ""
#: ../../../../inc/display.php:408 ../../../../inc/display.php:537 #: ../../../../inc/display.php:408 ../../../../inc/display.php:537
#: ../../../../inc/display.php:412 ../../../../inc/display.php:541 #: ../../../../inc/display.php:412 ../../../../inc/display.php:541
msgid "Edit post" msgid "Edit post"
msgstr "" msgstr "Rediģēt ierakstu"
#. line 5 #. line 5
#: ../../../../inc/display.php:461 #: ../../../../inc/display.php:461
@ -210,69 +211,69 @@ msgstr ""
#: ../../../../templates/cache/17/2f/ea79f6d94768f645ed33b3f5c1a54caee235af04d24b88e34cc8c2d48583.php:36 #: ../../../../templates/cache/17/2f/ea79f6d94768f645ed33b3f5c1a54caee235af04d24b88e34cc8c2d48583.php:36
#: ../../../../inc/display.php:486 ../../../../inc/display.php:490 #: ../../../../inc/display.php:486 ../../../../inc/display.php:490
msgid "Delete" msgid "Delete"
msgstr "" msgstr "Dzēst"
#: ../../../../inc/display.php:461 ../../../../inc/display.php:483 #: ../../../../inc/display.php:461 ../../../../inc/display.php:483
#: ../../../../inc/display.php:486 ../../../../inc/display.php:490 #: ../../../../inc/display.php:486 ../../../../inc/display.php:490
msgid "Are you sure you want to delete this?" msgid "Are you sure you want to delete this?"
msgstr "" msgstr "Vai esat pārliecināti, ka vēlaties šo dzēst?"
#: ../../../../inc/display.php:465 ../../../../inc/display.php:487 #: ../../../../inc/display.php:465 ../../../../inc/display.php:487
#: ../../../../inc/display.php:490 ../../../../inc/display.php:494 #: ../../../../inc/display.php:490 ../../../../inc/display.php:494
msgid "Delete all posts by IP" msgid "Delete all posts by IP"
msgstr "" msgstr "Dzēst visus ierakstus no šīs IP"
#: ../../../../inc/display.php:465 ../../../../inc/display.php:487 #: ../../../../inc/display.php:465 ../../../../inc/display.php:487
#: ../../../../inc/display.php:490 ../../../../inc/display.php:494 #: ../../../../inc/display.php:490 ../../../../inc/display.php:494
msgid "Are you sure you want to delete all posts by this IP address?" msgid "Are you sure you want to delete all posts by this IP address?"
msgstr "" msgstr "Vai esat pārliecināti, ka vēlaties dzēst visus ierakstus no šīs IP?"
#: ../../../../inc/display.php:469 ../../../../inc/display.php:491 #: ../../../../inc/display.php:469 ../../../../inc/display.php:491
#: ../../../../inc/display.php:494 ../../../../inc/display.php:498 #: ../../../../inc/display.php:494 ../../../../inc/display.php:498
msgid "Delete all posts by IP across all boards" msgid "Delete all posts by IP across all boards"
msgstr "" msgstr "Dzēst visus ierakstus no šīs IP, visos dēļos"
#: ../../../../inc/display.php:469 ../../../../inc/display.php:491 #: ../../../../inc/display.php:469 ../../../../inc/display.php:491
#: ../../../../inc/display.php:494 ../../../../inc/display.php:498 #: ../../../../inc/display.php:494 ../../../../inc/display.php:498
msgid "" msgid ""
"Are you sure you want to delete all posts by this IP address, across all " "Are you sure you want to delete all posts by this IP address, across all "
"boards?" "boards?"
msgstr "" msgstr "Vai esat pārliecināti, ka vēlaties dzēst visus ierakstus no šīs IP, visos dēļos?"
#: ../../../../inc/display.php:490 ../../../../inc/display.php:512 #: ../../../../inc/display.php:490 ../../../../inc/display.php:512
#: ../../../../inc/display.php:515 ../../../../inc/display.php:519 #: ../../../../inc/display.php:515 ../../../../inc/display.php:519
msgid "Make thread not sticky" msgid "Make thread not sticky"
msgstr "" msgstr "Noņemt izcelšanu šim pavedienam"
#: ../../../../inc/display.php:492 ../../../../inc/display.php:514 #: ../../../../inc/display.php:492 ../../../../inc/display.php:514
#: ../../../../inc/display.php:517 ../../../../inc/display.php:521 #: ../../../../inc/display.php:517 ../../../../inc/display.php:521
msgid "Make thread sticky" msgid "Make thread sticky"
msgstr "" msgstr "Izcelt šo pavedienu"
#: ../../../../inc/display.php:496 ../../../../inc/display.php:518 #: ../../../../inc/display.php:496 ../../../../inc/display.php:518
#: ../../../../inc/display.php:521 ../../../../inc/display.php:525 #: ../../../../inc/display.php:521 ../../../../inc/display.php:525
msgid "Allow thread to be bumped" msgid "Allow thread to be bumped"
msgstr "" msgstr "Atļaut pavediena uzcelšanu"
#: ../../../../inc/display.php:498 ../../../../inc/display.php:520 #: ../../../../inc/display.php:498 ../../../../inc/display.php:520
#: ../../../../inc/display.php:523 ../../../../inc/display.php:527 #: ../../../../inc/display.php:523 ../../../../inc/display.php:527
msgid "Prevent thread from being bumped" msgid "Prevent thread from being bumped"
msgstr "" msgstr "Nepieļaut pavediena uzcelšanu"
#: ../../../../inc/display.php:503 ../../../../inc/display.php:525 #: ../../../../inc/display.php:503 ../../../../inc/display.php:525
#: ../../../../inc/display.php:528 ../../../../inc/display.php:532 #: ../../../../inc/display.php:528 ../../../../inc/display.php:532
msgid "Unlock thread" msgid "Unlock thread"
msgstr "" msgstr "Atslēgt pavedienu"
#: ../../../../inc/display.php:505 ../../../../inc/display.php:527 #: ../../../../inc/display.php:505 ../../../../inc/display.php:527
#: ../../../../inc/display.php:530 ../../../../inc/display.php:534 #: ../../../../inc/display.php:530 ../../../../inc/display.php:534
msgid "Lock thread" msgid "Lock thread"
msgstr "" msgstr "Aizslēgt pavedienu"
#: ../../../../inc/display.php:508 ../../../../inc/display.php:530 #: ../../../../inc/display.php:508 ../../../../inc/display.php:530
#: ../../../../inc/display.php:533 ../../../../inc/display.php:537 #: ../../../../inc/display.php:533 ../../../../inc/display.php:537
msgid "Move thread to another board" msgid "Move thread to another board"
msgstr "" msgstr "Pārvietot pavedienu un citu dēli"
#. How long before Tinyboard forgets about a mute? #. How long before Tinyboard forgets about a mute?
#. 2 weeks #. 2 weeks
@ -281,7 +282,7 @@ msgstr ""
#: ../../../../inc/config.php:346 ../../../../inc/config.php:473 #: ../../../../inc/config.php:346 ../../../../inc/config.php:473
#: ../../../../inc/config.php:474 ../../../../inc/config.php:475 #: ../../../../inc/config.php:474 ../../../../inc/config.php:475
msgid "You have been muted for unoriginal content." msgid "You have been muted for unoriginal content."
msgstr "" msgstr "Jūs tiekat apklusināts dēļ neorģināla satura."
#. The names on the post buttons. (On most imageboards, these are both just #. The names on the post buttons. (On most imageboards, these are both just
#. "Post"). #. "Post").
@ -291,13 +292,13 @@ msgstr ""
#: ../../../../inc/config.php:772 ../../../../inc/config.php:774 #: ../../../../inc/config.php:772 ../../../../inc/config.php:774
#: ../../../../inc/config.php:776 ../../../../inc/config.php:792 #: ../../../../inc/config.php:776 ../../../../inc/config.php:792
msgid "New Topic" msgid "New Topic"
msgstr "" msgstr "Jauna tēma"
#: ../../../../inc/config.php:678 ../../../../inc/config.php:782 #: ../../../../inc/config.php:678 ../../../../inc/config.php:782
#: ../../../../inc/config.php:773 ../../../../inc/config.php:775 #: ../../../../inc/config.php:773 ../../../../inc/config.php:775
#: ../../../../inc/config.php:777 ../../../../inc/config.php:793 #: ../../../../inc/config.php:777 ../../../../inc/config.php:793
msgid "New Reply" msgid "New Reply"
msgstr "" msgstr "Jauna atbilde"
#. Additional lines added to the footer of all pages. #. Additional lines added to the footer of all pages.
#: ../../../../inc/config.php:689 ../../../../inc/config.php:793 #: ../../../../inc/config.php:689 ../../../../inc/config.php:793

View File

@ -12,7 +12,7 @@ msgstr ""
"Project-Id-Version: vichan\n" "Project-Id-Version: vichan\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-04-21 21:04+0200\n" "POT-Creation-Date: 2014-04-21 21:04+0200\n"
"PO-Revision-Date: 2014-04-22 20:14+0000\n" "PO-Revision-Date: 2014-05-06 10:23+0000\n"
"Last-Translator: Assada <assada@mail.ua>\n" "Last-Translator: Assada <assada@mail.ua>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/ru_RU/)\n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/tinyboard-vichan-devel/language/ru_RU/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -318,7 +318,7 @@ msgstr "Все права, копирайты на этой странице п
#. Error messages #. Error messages
#: ../../../../inc/config.php:866 #: ../../../../inc/config.php:866
msgid "Lurk some more before posting." msgid "Lurk some more before posting."
msgstr "" msgstr "Луркай еще немного, прежде чем отправлять."
#. * ==================== #. * ====================
#. * Error messages #. * Error messages
@ -436,7 +436,7 @@ msgstr "Не оригинальный контент."
#: ../../../../inc/config.php:984 ../../../../inc/config.php:1000 #: ../../../../inc/config.php:984 ../../../../inc/config.php:1000
#, php-format #, php-format
msgid "Unoriginal content! You have been muted for %d seconds." msgid "Unoriginal content! You have been muted for %d seconds."
msgstr "" msgstr "Не оригинальный контент. Кляп на %d секунд."
#: ../../../../inc/config.php:885 ../../../../inc/config.php:990 #: ../../../../inc/config.php:885 ../../../../inc/config.php:990
#: ../../../../inc/config.php:981 ../../../../inc/config.php:983 #: ../../../../inc/config.php:981 ../../../../inc/config.php:983
@ -543,7 +543,7 @@ msgstr ""
#: ../../../../inc/config.php:997 ../../../../inc/config.php:999 #: ../../../../inc/config.php:997 ../../../../inc/config.php:999
#: ../../../../inc/config.php:1001 ../../../../inc/config.php:1017 #: ../../../../inc/config.php:1001 ../../../../inc/config.php:1017
msgid "MIME type detection XSS exploit (IE) detected; post discarded." msgid "MIME type detection XSS exploit (IE) detected; post discarded."
msgstr "" msgstr "Обнаружен XSS (IE). Пост отклонен."
#: ../../../../inc/config.php:902 ../../../../inc/config.php:1007 #: ../../../../inc/config.php:902 ../../../../inc/config.php:1007
#: ../../../../inc/config.php:998 ../../../../inc/config.php:1000 #: ../../../../inc/config.php:998 ../../../../inc/config.php:1000
@ -597,7 +597,7 @@ msgstr "Неверные/испорченные куки."
#: ../../../../inc/config.php:1007 ../../../../inc/config.php:1009 #: ../../../../inc/config.php:1007 ../../../../inc/config.php:1009
#: ../../../../inc/config.php:1011 ../../../../inc/config.php:1027 #: ../../../../inc/config.php:1011 ../../../../inc/config.php:1027
msgid "Your browser didn't submit an input when it should have." msgid "Your browser didn't submit an input when it should have."
msgstr "" msgstr "Твой браузер не отправляет нужных данных, а должен."
#: ../../../../inc/config.php:912 ../../../../inc/config.php:1017 #: ../../../../inc/config.php:912 ../../../../inc/config.php:1017
#: ../../../../inc/config.php:1008 ../../../../inc/config.php:1010 #: ../../../../inc/config.php:1008 ../../../../inc/config.php:1010
@ -819,7 +819,7 @@ msgstr "Ребилд"
#: ../../../../inc/mod/pages.php:2043 ../../../../inc/mod/pages.php:2179 #: ../../../../inc/mod/pages.php:2043 ../../../../inc/mod/pages.php:2179
#: ../../../../templates/cache/72/7e/271125664718133518fd942f20fb724224e100f8a0d47cb0b52f895ac12f.php:238 #: ../../../../templates/cache/72/7e/271125664718133518fd942f20fb724224e100f8a0d47cb0b52f895ac12f.php:238
msgid "Report queue" msgid "Report queue"
msgstr "" msgstr "Очередь жалоб"
#: ../../../../inc/mod/pages.php:2111 ../../../../inc/mod/pages.php:2210 #: ../../../../inc/mod/pages.php:2111 ../../../../inc/mod/pages.php:2210
#: ../../../../inc/mod/pages.php:2256 ../../../../inc/mod/pages.php:2350 #: ../../../../inc/mod/pages.php:2256 ../../../../inc/mod/pages.php:2350
@ -1078,7 +1078,7 @@ msgstr "без темы"
#: ../../../../templates/cache/1a/7f/6eb467b2d978da59cfea2fe64f8898a5fb769be35fbb2ec50691da9a3d52.php:153 #: ../../../../templates/cache/1a/7f/6eb467b2d978da59cfea2fe64f8898a5fb769be35fbb2ec50691da9a3d52.php:153
#: ../../../../templates/cache/d2/14/70c07e4c5f648cfa0d0663a1f18973ff6f6946363b45332b2627a0fcf273.php:94 #: ../../../../templates/cache/d2/14/70c07e4c5f648cfa0d0663a1f18973ff6f6946363b45332b2627a0fcf273.php:94
msgid "by" msgid "by"
msgstr "" msgstr "by"
#. line 50 #. line 50
#: ../../../../templates/cache/f3/ad/68dee281a64ebad9a5c774b53279.php:95 #: ../../../../templates/cache/f3/ad/68dee281a64ebad9a5c774b53279.php:95
@ -1086,7 +1086,7 @@ msgstr ""
#: ../../../../templates/cache/1a/7f/6eb467b2d978da59cfea2fe64f8898a5fb769be35fbb2ec50691da9a3d52.php:157 #: ../../../../templates/cache/1a/7f/6eb467b2d978da59cfea2fe64f8898a5fb769be35fbb2ec50691da9a3d52.php:157
#: ../../../../templates/cache/d2/14/70c07e4c5f648cfa0d0663a1f18973ff6f6946363b45332b2627a0fcf273.php:98 #: ../../../../templates/cache/d2/14/70c07e4c5f648cfa0d0663a1f18973ff6f6946363b45332b2627a0fcf273.php:98
msgid "at" msgid "at"
msgstr "" msgstr "на"
#. line 28 #. line 28
#. line 26 #. line 26
@ -1670,7 +1670,7 @@ msgstr "удалить"
#: ../../../../templates/cache/6a/a4/b13523024ba2660a4f8f05e0c909c55477f675db9a2620075762ac245c91.php:345 #: ../../../../templates/cache/6a/a4/b13523024ba2660a4f8f05e0c909c55477f675db9a2620075762ac245c91.php:345
#: ../../../../templates/cache/6a/a4/b13523024ba2660a4f8f05e0c909c55477f675db9a2620075762ac245c91.php:415 #: ../../../../templates/cache/6a/a4/b13523024ba2660a4f8f05e0c909c55477f675db9a2620075762ac245c91.php:415
msgid "deleted?" msgid "deleted?"
msgstr "" msgstr "удален?"
#. line 33 #. line 33
#: ../../../../templates/cache/1a/7f/6eb467b2d978da59cfea2fe64f8898a5fb769be35fbb2ec50691da9a3d52.php:91 #: ../../../../templates/cache/1a/7f/6eb467b2d978da59cfea2fe64f8898a5fb769be35fbb2ec50691da9a3d52.php:91
@ -1827,7 +1827,7 @@ msgstr "Статус"
#: ../../../../templates/cache/b1/4c/16a427b0d49ecf353c259d9fb606841783484eca9d790e766fdf0e3e9754.php:259 #: ../../../../templates/cache/b1/4c/16a427b0d49ecf353c259d9fb606841783484eca9d790e766fdf0e3e9754.php:259
#: ../../../../templates/cache/03/13/62c259daae13f7b39b689162b7cd380b2673bee7e05b90f0d34b69a01190.php:44 #: ../../../../templates/cache/03/13/62c259daae13f7b39b689162b7cd380b2673bee7e05b90f0d34b69a01190.php:44
msgid "Expired" msgid "Expired"
msgstr "" msgstr "Истекло"
#: ../../../../templates/cache/b1/4c/16a427b0d49ecf353c259d9fb606841783484eca9d790e766fdf0e3e9754.php:265 #: ../../../../templates/cache/b1/4c/16a427b0d49ecf353c259d9fb606841783484eca9d790e766fdf0e3e9754.php:265
#: ../../../../templates/cache/03/13/62c259daae13f7b39b689162b7cd380b2673bee7e05b90f0d34b69a01190.php:50 #: ../../../../templates/cache/03/13/62c259daae13f7b39b689162b7cd380b2673bee7e05b90f0d34b69a01190.php:50
@ -2013,7 +2013,7 @@ msgstr "никогда"
#: ../../../../templates/cache/03/13/62c259daae13f7b39b689162b7cd380b2673bee7e05b90f0d34b69a01190.php:159 #: ../../../../templates/cache/03/13/62c259daae13f7b39b689162b7cd380b2673bee7e05b90f0d34b69a01190.php:159
#: ../../../../templates/cache/6a/a4/b13523024ba2660a4f8f05e0c909c55477f675db9a2620075762ac245c91.php:161 #: ../../../../templates/cache/6a/a4/b13523024ba2660a4f8f05e0c909c55477f675db9a2620075762ac245c91.php:161
msgid "Seen" msgid "Seen"
msgstr "" msgstr "Замечен"
#: ../../../../templates/cache/b1/4c/16a427b0d49ecf353c259d9fb606841783484eca9d790e766fdf0e3e9754.php:375 #: ../../../../templates/cache/b1/4c/16a427b0d49ecf353c259d9fb606841783484eca9d790e766fdf0e3e9754.php:375
#: ../../../../templates/cache/ba/55/2553cc018aecf7d29a62331aec4bedc71b646817c7e4c4e7d1a885263676.php:201 #: ../../../../templates/cache/ba/55/2553cc018aecf7d29a62331aec4bedc71b646817c7e4c4e7d1a885263676.php:201
@ -2129,7 +2129,7 @@ msgstr "Новый бан"
#: ../../../../templates/cache/73/f8/5e3142a8a6f8d7e40422ff577e83b0dedf55a7cb9bc7082839b24f653545.php:25 #: ../../../../templates/cache/73/f8/5e3142a8a6f8d7e40422ff577e83b0dedf55a7cb9bc7082839b24f653545.php:25
#: ../../../../templates/cache/cb/8b/63013711213735996df92becb7bd43d753c51314cfe5433c562706333eb0.php:31 #: ../../../../templates/cache/cb/8b/63013711213735996df92becb7bd43d753c51314cfe5433c562706333eb0.php:31
msgid "Phrase:" msgid "Phrase:"
msgstr "" msgstr "Фраза:"
#: ../../../../templates/cache/73/f8/5e3142a8a6f8d7e40422ff577e83b0dedf55a7cb9bc7082839b24f653545.php:38 #: ../../../../templates/cache/73/f8/5e3142a8a6f8d7e40422ff577e83b0dedf55a7cb9bc7082839b24f653545.php:38
msgid "Posts" msgid "Posts"
@ -2137,7 +2137,7 @@ msgstr "Посты"
#: ../../../../templates/cache/73/f8/5e3142a8a6f8d7e40422ff577e83b0dedf55a7cb9bc7082839b24f653545.php:49 #: ../../../../templates/cache/73/f8/5e3142a8a6f8d7e40422ff577e83b0dedf55a7cb9bc7082839b24f653545.php:49
msgid "IP address notes" msgid "IP address notes"
msgstr "" msgstr "Заметки для IP"
#: ../../../../templates/cache/73/f8/5e3142a8a6f8d7e40422ff577e83b0dedf55a7cb9bc7082839b24f653545.php:62 #: ../../../../templates/cache/73/f8/5e3142a8a6f8d7e40422ff577e83b0dedf55a7cb9bc7082839b24f653545.php:62
msgid "Bans" msgid "Bans"
@ -2152,7 +2152,7 @@ msgstr ""
#: ../../../../templates/cache/ba/55/2553cc018aecf7d29a62331aec4bedc71b646817c7e4c4e7d1a885263676.php:25 #: ../../../../templates/cache/ba/55/2553cc018aecf7d29a62331aec4bedc71b646817c7e4c4e7d1a885263676.php:25
msgid "There are no active bans." msgid "There are no active bans."
msgstr "" msgstr "Нет активных банов."
#. line 8 #. line 8
#. line 47 #. line 47
@ -2199,20 +2199,20 @@ msgstr "Продолжить"
#. line 80 #. line 80
#: ../../../../templates/cache/03/13/62c259daae13f7b39b689162b7cd380b2673bee7e05b90f0d34b69a01190.php:210 #: ../../../../templates/cache/03/13/62c259daae13f7b39b689162b7cd380b2673bee7e05b90f0d34b69a01190.php:210
msgid "Appeal time" msgid "Appeal time"
msgstr "" msgstr "Время обжалования"
#. line 84 #. line 84
#: ../../../../templates/cache/03/13/62c259daae13f7b39b689162b7cd380b2673bee7e05b90f0d34b69a01190.php:220 #: ../../../../templates/cache/03/13/62c259daae13f7b39b689162b7cd380b2673bee7e05b90f0d34b69a01190.php:220
msgid "Appeal reason" msgid "Appeal reason"
msgstr "" msgstr "Причина обжалования"
#: ../../../../templates/cache/7d/63/b6fd83bf4ed7f6031a2b3373b997d2d40617bf98899fe672a0aae48520c5.php:31 #: ../../../../templates/cache/7d/63/b6fd83bf4ed7f6031a2b3373b997d2d40617bf98899fe672a0aae48520c5.php:31
msgid "There are no reports." msgid "There are no reports."
msgstr "" msgstr "Нет сообщений."
#: ../../../../post.php:802 ../../../../post.php:811 ../../../../post.php:825 #: ../../../../post.php:802 ../../../../post.php:811 ../../../../post.php:825
msgid "That ban doesn't exist or is not for you." msgid "That ban doesn't exist or is not for you."
msgstr "" msgstr "Этого бана нет или он не для вас."
#: ../../../../post.php:806 ../../../../post.php:815 ../../../../post.php:829 #: ../../../../post.php:806 ../../../../post.php:815 ../../../../post.php:829
msgid "You cannot appeal a ban of this length." msgid "You cannot appeal a ban of this length."
@ -2220,7 +2220,7 @@ msgstr ""
#: ../../../../post.php:813 ../../../../post.php:822 ../../../../post.php:836 #: ../../../../post.php:813 ../../../../post.php:822 ../../../../post.php:836
msgid "You cannot appeal this ban again." msgid "You cannot appeal this ban again."
msgstr "" msgstr "Ты не можешь обжаловать этот бан снова."
#: ../../../../post.php:818 ../../../../post.php:827 ../../../../post.php:841 #: ../../../../post.php:818 ../../../../post.php:827 ../../../../post.php:841
msgid "There is already a pending appeal for this ban." msgid "There is already a pending appeal for this ban."
@ -2228,11 +2228,11 @@ msgstr ""
#: ../../../../inc/image.php:24 ../../../../inc/image.php:62 #: ../../../../inc/image.php:24 ../../../../inc/image.php:62
msgid "Unsupported file format: " msgid "Unsupported file format: "
msgstr "" msgstr "Формат файла не поддерживается:"
#: ../../../../inc/image.php:282 ../../../../inc/image.php:288 #: ../../../../inc/image.php:282 ../../../../inc/image.php:288
msgid "Failed to redraw image!" msgid "Failed to redraw image!"
msgstr "" msgstr "Не удалось перерисовать изображение!"
#: ../../../../inc/image.php:324 ../../../../inc/image.php:343 #: ../../../../inc/image.php:324 ../../../../inc/image.php:343
#: ../../../../inc/image.php:368 ../../../../inc/image.php:342 #: ../../../../inc/image.php:368 ../../../../inc/image.php:342
@ -2258,11 +2258,11 @@ msgstr "Вас забанили в "
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:82 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:82
msgid "for the following reason:" msgid "for the following reason:"
msgstr "" msgstr "по следующей причине:"
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:88 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:88
msgid "for an unspecified reason." msgid "for an unspecified reason."
msgstr "" msgstr "по неопределенный причине."
#. line 32 #. line 32
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:110 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:110
@ -2281,11 +2281,11 @@ msgstr "истекает"
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:133 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:133
msgid "from now, which is on" msgid "from now, which is on"
msgstr "" msgstr "прямо сейчас, который находится на"
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:183 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:183
msgid "will not expire" msgid "will not expire"
msgstr "" msgstr "еще не истек"
#. line 78 #. line 78
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:192 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:192
@ -2300,11 +2300,11 @@ msgstr ""
#. line 95 #. line 95
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:239 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:239
msgid "You submitted an appeal for this ban on" msgid "You submitted an appeal for this ban on"
msgstr "" msgstr "Ты подал апелляцию на этот бан"
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:245 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:245
msgid "It is still pending" msgid "It is still pending"
msgstr "" msgstr "Пока не принято"
#. line 101 #. line 101
#. line 112 #. line 112
@ -2323,18 +2323,18 @@ msgstr ""
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:257 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:257
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:289 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:289
msgid "You appealed this ban on" msgid "You appealed this ban on"
msgstr "" msgstr "Ты обжаловал запрет на"
#. line 103 #. line 103
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:265 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:265
msgid "and it was denied. You may not appeal this ban again." msgid "and it was denied. You may not appeal this ban again."
msgstr "" msgstr "и отклонен. Вы не можете обжаловать это бан снова."
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:272 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:272
msgid "" msgid ""
"You have submitted the maximum number of ban appeals allowed. You may not " "You have submitted the maximum number of ban appeals allowed. You may not "
"appeal this ban again." "appeal this ban again."
msgstr "" msgstr "Ты отправил достаточное количество апелляций. Больше не нужно!"
#. line 114 #. line 114
#. line 121 #. line 121
@ -2353,7 +2353,7 @@ msgstr ""
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:297 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:297
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:318 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:318
msgid "and it was denied." msgid "and it was denied."
msgstr "" msgstr "и отклонен."
#. line 116 #. line 116
#. line 123 #. line 123
@ -2381,7 +2381,7 @@ msgstr ""
#: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:332 #: ../../../../templates/cache/b7/ae/f9663c9ca58d1e218de29e04d0fa229f6263f4e68b613ce608bc023897a2.php:332
msgid "You may appeal this ban. Please enter your reasoning below." msgid "You may appeal this ban. Please enter your reasoning below."
msgstr "" msgstr "Ты можешь обжаловать этот бан. Введи причину апелляции."
#. line 4 #. line 4
#. line 16 #. line 16
@ -2598,7 +2598,7 @@ msgstr "Показать все логи этого пользователя."
#. line 84 #. line 84
#: ../../../../templates/cache/cf/63/151e140d85df674832f4ede3f3e7811b97d4efa91cac6086ca7e8ce65d25.php:255 #: ../../../../templates/cache/cf/63/151e140d85df674832f4ede3f3e7811b97d4efa91cac6086ca7e8ce65d25.php:255
msgid "Flag" msgid "Flag"
msgstr "" msgstr "Флаг"
#. line 87 #. line 87
#: ../../../../templates/cache/cf/63/151e140d85df674832f4ede3f3e7811b97d4efa91cac6086ca7e8ce65d25.php:261 #: ../../../../templates/cache/cf/63/151e140d85df674832f4ede3f3e7811b97d4efa91cac6086ca7e8ce65d25.php:261

View File

@ -1110,13 +1110,13 @@ function mod_move_reply($originBoard, $postID) {
$post['op'] = true; $post['op'] = true;
} }
if ($post['file']) { if ($post['files']) {
$post['files'] = json_decode($post['files'], TRUE);
$post['has_file'] = true; $post['has_file'] = true;
$post['width'] = &$post['filewidth']; foreach ($post['files'] as $i => &$file) {
$post['height'] = &$post['fileheight']; $file['file_path'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $file['file'];
$file['thumb_path'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $file['thumb'];
$file_src = sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $post['file']; }
$file_thumb = sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $post['thumb'];
} else { } else {
$post['has_file'] = false; $post['has_file'] = false;
} }
@ -1131,10 +1131,12 @@ function mod_move_reply($originBoard, $postID) {
$newID = post($post); $newID = post($post);
if ($post['has_file']) { if ($post['has_file']) {
// move the image foreach ($post['files'] as $i => &$file) {
rename($file_src, sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $post['file']); // move the image
if ($post['thumb'] != 'spoiler') { //trying to move/copy the spoiler thumb raises an error rename($file['file_path'], sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $file['file']);
rename($file_thumb, sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $post['thumb']); if ($file['thumb'] != 'spoiler') { //trying to move/copy the spoiler thumb raises an error
rename($file['thumb_path'], sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $file['thumb']);
}
} }
} }
@ -1207,13 +1209,13 @@ function mod_move($originBoard, $postID) {
// indicate that the post is a thread // indicate that the post is a thread
$post['op'] = true; $post['op'] = true;
if ($post['file']) { if ($post['files']) {
$post['files'] = json_decode($post['files'], TRUE);
$post['has_file'] = true; $post['has_file'] = true;
$post['width'] = &$post['filewidth']; foreach ($post['files'] as $i => &$file) {
$post['height'] = &$post['fileheight']; $file['file_path'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $file['file'];
$file['thumb_path'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $file['thumb'];
$file_src = sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $post['file']; }
$file_thumb = sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $post['thumb'];
} else { } else {
$post['has_file'] = false; $post['has_file'] = false;
} }
@ -1229,9 +1231,11 @@ function mod_move($originBoard, $postID) {
if ($post['has_file']) { if ($post['has_file']) {
// copy image // copy image
$clone($file_src, sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $post['file']); foreach ($post['files'] as $i => &$file) {
if (!in_array($post['thumb'], array('spoiler', 'deleted', 'file'))) $clone($file['file_path'], sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $file['file']);
$clone($file_thumb, sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $post['thumb']); if (!in_array($file['thumb'], array('spoiler', 'deleted', 'file')))
$clone($file['thumb_path'], sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $file['thumb']);
}
} }
// go back to the original board to fetch replies // go back to the original board to fetch replies
@ -1247,13 +1251,13 @@ function mod_move($originBoard, $postID) {
$post['mod'] = true; $post['mod'] = true;
$post['thread'] = $newID; $post['thread'] = $newID;
if ($post['file']) { if ($post['files']) {
$post['files'] = json_decode($post['files'], TRUE);
$post['has_file'] = true; $post['has_file'] = true;
$post['width'] = &$post['filewidth']; foreach ($post['files'] as $i => &$file) {
$post['height'] = &$post['fileheight']; $file['file_path'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $file['file'];
$file['thumb_path'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $file['thumb'];
$post['file_src'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $post['file']; }
$post['file_thumb'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $post['thumb'];
} else { } else {
$post['has_file'] = false; $post['has_file'] = false;
} }
@ -1288,14 +1292,16 @@ function mod_move($originBoard, $postID) {
$post['op'] = false; $post['op'] = false;
$post['tracked_cites'] = markup($post['body'], true); $post['tracked_cites'] = markup($post['body'], true);
if ($post['has_file']) {
// copy image
foreach ($post['files'] as $i => &$file) {
$clone($file['file_path'], sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $file['file']);
$clone($file['thumb_path'], sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $file['thumb']);
}
}
// insert reply // insert reply
$newIDs[$post['id']] = $newPostID = post($post); $newIDs[$post['id']] = $newPostID = post($post);
if ($post['has_file']) {
// copy image
$clone($post['file_src'], sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $post['file']);
$clone($post['file_thumb'], sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $post['thumb']);
}
if (!empty($post['tracked_cites'])) { if (!empty($post['tracked_cites'])) {
$insert_rows = array(); $insert_rows = array();
@ -1527,7 +1533,7 @@ function mod_delete($board, $post) {
header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']);
} }
function mod_deletefile($board, $post) { function mod_deletefile($board, $post, $file) {
global $config, $mod; global $config, $mod;
if (!openBoard($board)) if (!openBoard($board))
@ -1537,7 +1543,7 @@ function mod_deletefile($board, $post) {
error($config['error']['noaccess']); error($config['error']['noaccess']);
// Delete file // Delete file
deleteFile($post); deleteFile($post, TRUE, $file);
// Record the action // Record the action
modLog("Deleted file from post #{$post}"); modLog("Deleted file from post #{$post}");
@ -1550,28 +1556,30 @@ function mod_deletefile($board, $post) {
header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']);
} }
function mod_spoiler_image($board, $post) { function mod_spoiler_image($board, $post, $file) {
global $config, $mod; global $config, $mod;
if (!openBoard($board)) if (!openBoard($board))
error($config['error']['noboard']); error($config['error']['noboard']);
if (!hasPermission($config['mod']['spoilerimage'], $board)) if (!hasPermission($config['mod']['spoilerimage'], $board))
error($config['error']['noaccess']); error($config['error']['noaccess']);
// Delete file // Delete file thumbnail
$query = prepare(sprintf("SELECT `thumb`, `thread` FROM ``posts_%s`` WHERE id = :id", $board)); $query = prepare(sprintf("SELECT `files`, `thread` FROM ``posts_%s`` WHERE id = :id", $board));
$query->bindValue(':id', $post, PDO::PARAM_INT); $query->bindValue(':id', $post, PDO::PARAM_INT);
$query->execute() or error(db_error($query)); $query->execute() or error(db_error($query));
$result = $query->fetch(PDO::FETCH_ASSOC); $result = $query->fetch(PDO::FETCH_ASSOC);
$files = json_decode($result['files']);
file_unlink($board . '/' . $config['dir']['thumb'] . $result['thumb']); file_unlink($board . '/' . $config['dir']['thumb'] . $files[$file]->thumb);
$files[$file]->thumb = 'spoiler';
$files[$file]->thumbheight = 128;
$files[$file]->thumbwidth = 128;
// Make thumbnail spoiler // Make thumbnail spoiler
$query = prepare(sprintf("UPDATE ``posts_%s`` SET `thumb` = :thumb, `thumbwidth` = :thumbwidth, `thumbheight` = :thumbheight WHERE `id` = :id", $board)); $query = prepare(sprintf("UPDATE ``posts_%s`` SET `files` = :files WHERE `id` = :id", $board));
$query->bindValue(':thumb', "spoiler"); $query->bindValue(':files', json_encode($files));
$query->bindValue(':thumbwidth', 128, PDO::PARAM_INT);
$query->bindValue(':thumbheight', 128, PDO::PARAM_INT);
$query->bindValue(':id', $post, PDO::PARAM_INT); $query->bindValue(':id', $post, PDO::PARAM_INT);
$query->execute() or error(db_error($query)); $query->execute() or error(db_error($query));
@ -1586,7 +1594,7 @@ function mod_spoiler_image($board, $post) {
// Rebuild themes // Rebuild themes
rebuildThemes('post-delete', $board); rebuildThemes('post-delete', $board);
// Redirect // Redirect
header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']);
} }
@ -2239,6 +2247,68 @@ function mod_report_dismiss($id, $all = false) {
header('Location: ?/reports', true, $config['redirect_http']); header('Location: ?/reports', true, $config['redirect_http']);
} }
function mod_recent_posts($lim) {
global $config, $mod, $pdo;
if (!hasPermission($config['mod']['recent']))
error($config['error']['noaccess']);
$limit = (is_numeric($lim))? $lim : 25;
$mod_boards = array();
$boards = listBoards();
//if not all boards
if ($mod['boards'][0]!='*') {
foreach ($boards as $board) {
if (in_array($board['uri'], $mod['boards']))
$mod_boards[] = $board;
}
} else {
$mod_boards = $boards;
}
// Manually build an SQL query
$query = 'SELECT * FROM (';
foreach ($mod_boards as $board) {
$query .= sprintf('SELECT *, %s AS `board` FROM ``posts_%s`` UNION ALL ', $pdo->quote($board['uri']), $board['uri']);
}
// Remove the last "UNION ALL" seperator and complete the query
$query = preg_replace('/UNION ALL $/', ') AS `all_posts` ORDER BY `time` DESC LIMIT ' . $limit, $query);
$query = query($query) or error(db_error());
$posts = $query->fetchAll(PDO::FETCH_ASSOC);
$body = '<h4>Viewing last '.$limit.' posts</h4>
<p>View <a href="?/recent/25"> 25 </a>|<a href="?/recent/50"> 50 </a>|<a href="?/recent/100"> 100 </a></p>
<a href="javascript:void(0)" id="erase-local-data" style="float:right; clear:both">Erase local data</a></div>';
foreach ($posts as $post) {
openBoard($post['board']);
if (!$post['thread']) {
// Still need to fix this:
$po = new Thread($post, '?/', $mod, false);
$string = $po->build(true);
$string = '<div class="post-wrapper" data-board="'.$post['board'].'"><hr/><a class="eita-link" id="eita-'.$post['board'].'-'.$post['id'].'" href="?/'.$post['board'].'/res/'.$post['id'].'.html#'.$post['id'].'">/'.$post['board'].'/'.$post['id'].'</a><br>' . $string;
} else {
$po = new Post($post, '?/', $mod);
$string = $po->build(true);
$string = '<div class="post-wrapper" data-board="'.$post['board'].'"><hr/><a class="eita-link" id="eita-'.$post['board'].'-'.$post['id'].'" href="?/'.$post['board'].'/res/'.$post['thread'].'.html#'.$post['id'].'">/'.$post['board'].'/'.$post['id'].'</a><br>' . $string;
}
$body .= $string . '</div>';
}
echo Element('page.html', array(
'config' => $config,
'mod' => $mod,
'hide_dashboard_link' => true,
'title' => _('Recent posts'),
'subtitle' => '',
'nojavascript' => false,
'is_recent_posts' => true,
'body' => $body
)
);
}
function mod_config($board_config = false) { function mod_config($board_config = false) {
global $config, $mod, $board; global $config, $mod, $board;

View File

@ -1,7 +1,7 @@
<?php <?php
// Installation/upgrade file // Installation/upgrade file
define('VERSION', '4.4.98'); define('VERSION', '4.9.90');
require 'inc/functions.php'; require 'inc/functions.php';
@ -260,7 +260,7 @@ if (file_exists($config['has_installed'])) {
$_query->execute() or error(db_error($_query)); $_query->execute() or error(db_error($_query));
} }
} }
case 'v0.9.6-dev-9': case 'v0.9.6-dev-9':
case 'v0.9.6-dev-9 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.3</a>': case 'v0.9.6-dev-9 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.3</a>':
case 'v0.9.6-dev-9 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.4-gold</a>': case 'v0.9.6-dev-9 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.4-gold</a>':
case 'v0.9.6-dev-9 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.5-gold</a>': case 'v0.9.6-dev-9 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.5-gold</a>':
@ -506,12 +506,12 @@ if (file_exists($config['has_installed'])) {
case 'v0.9.6-dev-22 + <a href="https://int.vichan.net/devel/">vichan-devel-4.4.96</a>': case 'v0.9.6-dev-22 + <a href="https://int.vichan.net/devel/">vichan-devel-4.4.96</a>':
case 'v0.9.6-dev-22 + <a href="https://int.vichan.net/devel/">vichan-devel-4.4.97</a>': case 'v0.9.6-dev-22 + <a href="https://int.vichan.net/devel/">vichan-devel-4.4.97</a>':
case '4.4.97': case '4.4.97':
if (!isset($_GET['confirm'])) { if (!isset($_GET['confirm2'])) {
$page['title'] = 'License Change'; $page['title'] = 'License Change';
$page['body'] = '<p style="text-align:center">You are upgrading to a version which uses an amended license. The licenses included with vichan distributions prior to this version (4.4.98) are still valid for those versions, but no longer apply to this and newer versions.</p>' . $page['body'] = '<p style="text-align:center">You are upgrading to a version which uses an amended license. The licenses included with vichan distributions prior to this version (4.4.98) are still valid for those versions, but no longer apply to this and newer versions.</p>' .
'<textarea style="width:700px;height:370px;margin:auto;display:block;background:white;color:black" disabled>' . htmlentities(file_get_contents('LICENSE.md')) . '</textarea> '<textarea style="width:700px;height:370px;margin:auto;display:block;background:white;color:black" disabled>' . htmlentities(file_get_contents('LICENSE.md')) . '</textarea>
<p style="text-align:center"> <p style="text-align:center">
<a href="?confirm=1">I have read and understood the agreement. Proceed to upgrading.</a> <a href="?confirm2=1">I have read and understood the agreement. Proceed to upgrading.</a>
</p>'; </p>';
file_write($config['has_installed'], '4.4.97'); file_write($config['has_installed'], '4.4.97');
@ -521,6 +521,27 @@ if (file_exists($config['has_installed'])) {
case '4.4.98-pre': case '4.4.98-pre':
if (!$twig) load_twig(); if (!$twig) load_twig();
$twig->clearCacheFiles(); $twig->clearCacheFiles();
case '4.4.98':
case '4.5.0':
if (!isset($_GET['confirm3'])) {
$page['title'] = 'Breaking change';
$page['body'] = '<p style="text-align:center">You are upgrading to the 5.0 branch of vichan. Please back up your database, because the process is irreversible. At the current time, if you want a very stable vichan experience, please use the 4.5 branch. This warning will be lifted as soon as we all agree that 5.0 branch is stable enough</p>
<p style="text-align:center">
<a href="?confirm3=1">I have read and understood the warning. Proceed to upgrading.</a>
</p>';
file_write($config['has_installed'], '4.5.0');
break;
}
foreach ($boards as &$board) {
query(sprintf('ALTER TABLE ``posts_%s`` ADD `files` text DEFAULT NULL AFTER `bump`;', $board['uri'])) or error(db_error());
query(sprintf('ALTER TABLE ``posts_%s`` ADD `num_files` int(11) DEFAULT 0 AFTER `files`;', $board['uri'])) or error(db_error());
query(sprintf('UPDATE ``posts_%s`` SET `files` = CONCAT(\'[{"file":"\',`file`,\'", "thumb":"\',`thumb`,\'", "filename":"\',`filename`,\'", "size":"\',`filesize`,\'", "width":"\',`filewidth`,\'","height":"\',`fileheight`,\'","thumbwidth":"\',`thumbwidth`,\'","thumbheight":"\',`thumbheight`,\'", "file_path":"%s\/src\/\',`filename`,\'","thumb_path":"%s\/thumb\/\',`filename`,\'"}]\') WHERE `file` IS NOT NULL', $board['uri'], $board['uri'], $board['uri'])) or error(db_error());
query(sprintf('ALTER TABLE ``posts_%s`` DROP COLUMN `thumb`, DROP COLUMN `thumbwidth`, DROP COLUMN `thumbheight`, DROP COLUMN `file`, DROP COLUMN `fileheight`, DROP COLUMN `filesize`, DROP COLUMN `filewidth`, DROP COLUMN `filename`', $board['uri'])) or error(db_error());
query(sprintf('REPAIR TABLE ``posts_%s``', $board['uri']));
}
case false: case false:
// TODO: enhance Tinyboard -> vichan upgrade path. // TODO: enhance Tinyboard -> vichan upgrade path.
query("CREATE TABLE IF NOT EXISTS ``search_queries`` ( `ip` varchar(39) NOT NULL, `time` int(11) NOT NULL, `query` text NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8;") or error(db_error()); query("CREATE TABLE IF NOT EXISTS ``search_queries`` ( `ip` varchar(39) NOT NULL, `time` int(11) NOT NULL, `query` text NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8;") or error(db_error());
@ -586,7 +607,7 @@ if ($step == 0) {
'required' => false 'required' => false
) )
); );
$tests = array( $tests = array(
array( array(
'category' => 'PHP', 'category' => 'PHP',
@ -679,6 +700,13 @@ if ($step == 0) {
'required' => false, 'required' => false,
'message' => '(Optional) `gifsicle` was not found or executable; you may not use `convert+gifsicle` for better animated GIF thumbnailing.', 'message' => '(Optional) `gifsicle` was not found or executable; you may not use `convert+gifsicle` for better animated GIF thumbnailing.',
), ),
array(
'category' => 'Image processing',
'name' => '`md5sum` (quick file hashing)',
'result' => $can_exec && shell_exec('echo "vichan" | md5sum') == "141225c362da02b5c359c45b665168de -\n",
'required' => false,
'message' => '(Optional) `md5sum` was not found or executable; file hashing for multiple images will be slower.',
),
array( array(
'category' => 'File permissions', 'category' => 'File permissions',
'name' => getcwd(), 'name' => getcwd(),
@ -833,9 +861,9 @@ if ($step == 0) {
} }
file_write($config['has_installed'], VERSION); file_write($config['has_installed'], VERSION);
if (!file_unlink(__FILE__)) { /*if (!file_unlink(__FILE__)) {
$page['body'] .= '<div class="ban"><h2>Delete install.php!</h2><p>I couldn\'t remove <strong>install.php</strong>. You will have to remove it manually.</p></div>'; $page['body'] .= '<div class="ban"><h2>Delete install.php!</h2><p>I couldn\'t remove <strong>install.php</strong>. You will have to remove it manually.</p></div>';
} }*/
} }
echo Element('page.html', $page); echo Element('page.html', $page);

View File

@ -1,8 +0,0 @@
$(document).ready(function(){
$("#attention_bar").click(function(eO){ $("#attention_bar").css("display","none");
$("#attention_bar_form").css("display","block"); });
$.get(configRoot + "attentionbar.txt", function(data) {
$("#attention_bar").html(data);
$("#attention_bar_input").val($("#attention_bar").text());
});
});

View File

@ -27,6 +27,17 @@ $(document).ready(function(){
var poll_interval; var poll_interval;
// Grab the settings
var settings = new script_settings('auto-reload');
var poll_interval_mindelay_bottom = settings.get('min_delay_bottom', 3000);
var poll_interval_mindelay_top = settings.get('min_delay_top', 10000);
var poll_interval_maxdelay = settings.get('max_delay', 600000);
var poll_interval_shortdelay = settings.get('quick_delay', 100);
// number of ms to wait before reloading
var poll_interval_delay = poll_interval_mindelay_bottom;
var end_of_page = false; var end_of_page = false;
var new_posts = 0; var new_posts = 0;
@ -45,6 +56,13 @@ $(document).ready(function(){
$(window).focus(function() { $(window).focus(function() {
window_active = true; window_active = true;
recheck_activated(); recheck_activated();
// Reset the delay if needed
if(settings.get('reset_focus', true)) {
poll_interval_delay = end_of_page
? poll_interval_mindelay_bottom
: poll_interval_mindelay_top;
}
}); });
$(window).blur(function() { $(window).blur(function() {
window_active = false; window_active = false;
@ -81,7 +99,22 @@ $(document).ready(function(){
}); });
clearTimeout(poll_interval); clearTimeout(poll_interval);
poll_interval = setTimeout(poll, end_of_page ? 3000 : 10000);
// If there are no new posts, double the delay. Otherwise set it to the min.
if(new_posts == 0) {
poll_interval_delay *= 2;
// Don't increase the delay beyond the maximum
if(poll_interval_delay > poll_interval_maxdelay) {
poll_interval_delay = poll_interval_maxdelay;
}
} else {
poll_interval_delay = end_of_page
? poll_interval_mindelay_bottom
: poll_interval_mindelay_top;
}
poll_interval = setTimeout(poll, poll_interval_delay);
}; };
$(window).scroll(function() { $(window).scroll(function() {
@ -94,10 +127,10 @@ $(document).ready(function(){
} }
clearTimeout(poll_interval); clearTimeout(poll_interval);
poll_interval = setTimeout(poll, 100); poll_interval = setTimeout(poll, poll_interval_shortdelay);
end_of_page = true; end_of_page = true;
}).trigger('scroll'); }).trigger('scroll');
poll_interval = setTimeout(poll, 3000); poll_interval = setTimeout(poll, poll_interval_delay);
}); });

64
js/catalog.js Normal file
View File

@ -0,0 +1,64 @@
if (active_page == 'catalog') $(function(){
$("#selectorzilla").change(function(){
sheit = this.value;
$("#sort-"+sheit).trigger("click");
});
$("#imgurzilla").change(function(){
sheit = this.value;
if (sheit == "small") {
old = "large";
} else {
old = "small";
}
$(".grid-li").removeClass("grid-size-"+old);
$(".grid-li").addClass("grid-size-"+sheit);
});
$('#Grid').mixitup({
onMixEnd: function(){
if(use_tooltipster) {
buildTooltipster();
}
}
});
if(use_tooltipster) {
buildTooltipster();
}
});
function buildTooltipster(){
$(".thread-image").each(function(){
subject = $(this).attr('data-subject');
name = $(this).attr('data-name');
muhdifference = $(this).attr('data-muhdifference');
last_reply = $(this).attr('data-last-reply');
last_subject = $(this).attr('data-last-subject');
last_name = $(this).attr('data-last-name');
last_difference = $(this).attr('data-last-difference');
muh_body = '<span="poster-span">';
if (subject) {
muh_body = muh_body + subject + '&nbsp;por';
} else {
muh_body = muh_body + 'Postado por';
};
muh_body = muh_body + '&nbsp;<span class="poster-name">' + name + '&nbsp;</span>' + muhdifference + '</span>';
if (last_reply) {
muh_body = muh_body + '<br><span class="last-reply-span">';
if (last_subject) {
muh_body = muh_body + last_subject + '&nbsp;por';
} else{
muh_body = muh_body + 'Última resposta por';
};
muh_body = muh_body + '&nbsp;<span class="poster-name">' + last_name + '&nbsp;</span>' + last_difference + '</span>';
}
$(this).tooltipster({
content: $(muh_body)
});
});
}

View File

@ -7,6 +7,7 @@
* Released under the MIT license * Released under the MIT license
* Copyright (c) 2012-2013 Michael Save <savetheinternet@tinyboard.org> * Copyright (c) 2012-2013 Michael Save <savetheinternet@tinyboard.org>
* Copyright (c) 2013-2014 Marcin Łabanowski <marcin@6irc.net> * Copyright (c) 2013-2014 Marcin Łabanowski <marcin@6irc.net>
* Copyright (c) 2014 sinuca <#55ch@rizon.net>
* *
* Usage: * Usage:
* $config['additional_javascript'][] = 'js/jquery.min.js'; * $config['additional_javascript'][] = 'js/jquery.min.js';
@ -25,6 +26,16 @@ onready(function(){
if (!$(this).parent()[0].dataset.expanded) if (!$(this).parent()[0].dataset.expanded)
$(this).parent().click(); $(this).parent().click();
}); });
$(this).parent().remove();
$('hr:first').before('<div id="shrink-all-images" style="text-align:right"><a class="unimportant" href="javascript:void(0)"></a></div>');
$('div#shrink-all-images a')
.text(_('Shrink all images'))
.click(function(){
$('a img.post-image').each(function() {
if ($(this).parent()[0].dataset.expanded)
$(this).parent().click();
});
$(this).parent().remove();
});
}); });
}); });

View File

@ -38,10 +38,10 @@ $(document).ready(function(){
} }
var handle_images = function() { var handle_images = function() {
var index = $(this).parents('.file').index();
var img = this; var img = this;
var fileinfo = $(this).parent().prev(); var fileinfo = $(this).parent().prev();
var id = $(this).parent().parent().find('>p.intro>a.post_no:eq(1),>div.post.op>p.intro>a.post_no:eq(1)').text(); var id = $(this).parents('div.post, div[id^="thread_"]').attr('id').split('_')[1];
var board = $(this).parents('[id^="thread_"]').data("board"); var board = $(this).parents('[id^="thread_"]').data("board");
if (!hidden_data[board]) { if (!hidden_data[board]) {
@ -51,11 +51,21 @@ $(document).ready(function(){
var replacement = $('<span>'+_('File')+' <small>(<a class="hide-image-link" href="javascript:void(0)">'+_('hide')+'</a>)</small>: </span>'); var replacement = $('<span>'+_('File')+' <small>(<a class="hide-image-link" href="javascript:void(0)">'+_('hide')+'</a>)</small>: </span>');
replacement.find('a').click(function() { replacement.find('a').click(function() {
hidden_data[board][id] = Math.round(Date.now() / 1000); if (hidden_data[board][id]) {
hidden_data[board][id]['ts'] = Math.round(Date.now() / 1000);
if (hidden_data[board][id]['index'].indexOf(index) === -1)
hidden_data[board][id]['index'].push(index);
} else {
hidden_data[board][id] = {ts: Math.round(Date.now() / 1000), index: [index]};
}
store_data(); store_data();
var show_link = $('<a class="show-image-link" href="javascript:void(0)">'+_('show')+'</a>').click(function() { var show_link = $('<a class="show-image-link" href="javascript:void(0)">'+_('show')+'</a>').click(function() {
delete hidden_data[board][id]; var i = hidden_data[board][id]['index'].indexOf(index);
if (i > -1) hidden_data[board][id]['index'].splice(i,1);
if (hidden_data[board][id]['index'].length === 0)
delete hidden_data[board][id];
store_data(); store_data();
$(img) $(img)
@ -70,6 +80,7 @@ $(document).ready(function(){
if ($(img).parent()[0].dataset.expanded == 'true') { if ($(img).parent()[0].dataset.expanded == 'true') {
$(img).parent().click(); $(img).parent().click();
} }
$(img) $(img)
.data('orig', img.src) .data('orig', img.src)
.attr('src', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==') .attr('src', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==')
@ -78,7 +89,7 @@ $(document).ready(function(){
$(this).parent().prev().contents().first().replaceWith(replacement); $(this).parent().prev().contents().first().replaceWith(replacement);
if (hidden_data[board][id]) if (hidden_data[board][id] && hidden_data[board][id]['index'].indexOf(index) !== -1)
$(this).parent().prev().find('.hide-image-link').click(); $(this).parent().prev().find('.hide-image-link').click();
}; };

View File

@ -25,6 +25,7 @@ onready(function(){
if (e.which == 2 || e.metaKey) if (e.which == 2 || e.metaKey)
return true; return true;
if (!this.dataset.src) { if (!this.dataset.src) {
this.parentNode.removeAttribute('style');
this.dataset.expanded = 'true'; this.dataset.expanded = 'true';
this.dataset.src= this.childNodes[0].src; this.dataset.src= this.childNodes[0].src;
this.dataset.width = this.childNodes[0].style.width; this.dataset.width = this.childNodes[0].style.width;
@ -39,6 +40,7 @@ onready(function(){
delete this.style.filter; delete this.style.filter;
} }
} else { } else {
this.parentNode.style.width = (parseInt(this.dataset.width)+40)+'px';
this.childNodes[0].src = this.dataset.src; this.childNodes[0].src = this.dataset.src;
this.childNodes[0].style.width = this.dataset.width; this.childNodes[0].style.width = this.dataset.width;
this.childNodes[0].style.height = this.dataset.height; this.childNodes[0].style.height = this.dataset.height;

8
js/jquery.min.js vendored

File diff suppressed because one or more lines are too long

14
js/jquery.mixitup.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
js/jquery.tooltipster.min.js vendored Normal file

File diff suppressed because one or more lines are too long

73
js/mod/recent-posts.js Normal file
View File

@ -0,0 +1,73 @@
/*
* recent-posts.js
*
* Recent posts controlling script
*
* Released under the WTFPL license
* Copyright (c) 2014 sinuca <#55ch@rizon.net>
*
* Requires jquery
* incomplete
*
*/
$(document).ready(function(){
if (!localStorage.hiddenrecentposts)
localStorage.hiddenrecentposts = '{}';
if (!localStorage.recentpostscount)
localStorage.recentpostscount = 25;
// Load data from HTML5 localStorage
var hidden_data = JSON.parse(localStorage.hiddenrecentposts);
var store_data_posts = function() {
localStorage.hiddenrecentposts = JSON.stringify(hidden_data);
}
// Delete old hidden posts (7+ days old)
for (var key in hidden_data) {
for (var id in hidden_data[key]) {
if (hidden_data[key][id] < Math.round(Date.now() / 1000) - 60 * 60 * 24 * 7) {
delete hidden_data[key][id];
store_data_posts();
}
}
}
var do_hide_posts = function() {
var data = $(this).attr('id');
var splitted = data.split('-');
var id = splitted[2];
var post_container = $(this).parent();
var board = post_container.data("board");
if (!hidden_data[board]) {
hidden_data[board] = {};
}
$('<a class="hide-post-link" href="javascript:void(0)"> Dismiss </a>')
.insertBefore(post_container.find('a.eita-link:first'))
.click(function(){
hidden_data[board][id] = Math.round(Date.now() / 1000);
store_data_posts();
post_container.closest('hr').hide();
post_container.children().hide();
});
if(hidden_data[board][id])
post_container.find('a.hide-post-link').click();
}
$('a.eita-link').each(do_hide_posts);
$('#erase-local-data').click(function(){
hidden_data = {};
store_data_posts();
$(this).html('Loading...');
location.reload();
});
});

30
js/multi-image.js Normal file
View File

@ -0,0 +1,30 @@
/*
* multi-image.js - Add support for multiple images to the post form
*
* Copyright (c) 2014 Fredrick Brennan <admin@8chan.co>
*
* Usage:
* $config['max_images'] = 3;
* $config['additional_javascript'][] = 'js/jquery.min.js';
* $config['additional_javascript'][] = 'js/multi-image.js';
*/
function multi_image() {
$('input[type=file]').after('<a href="#" class="add_image">+</a>');
$(document).on('click', 'a.add_image', function(e) {
e.preventDefault();
$('#upload_url').remove();
var images_len = $('input[type=file]').length;
if (!(images_len >= max_images)) {
$('.add_image').after('<br/><input type="file" name="file'+(images_len+1)+'" id="upload_file'+(images_len+1)+'">');
if (typeof setup_form !== 'undefined') setup_form($('form[name="post"]'));
}
})
}
if (active_page == 'thread' || active_page == 'index' && max_images > 1) {
$(document).ready(multi_image);
}

View File

@ -1 +0,0 @@
hide-threads.js

View File

@ -1,49 +0,0 @@
/*
* quick-reply.js
* https://github.com/savetheinternet/Tinyboard/blob/master/js/quick-reply.js
*
* Released under the MIT license
* Copyright (c) 2012 Michael Save <savetheinternet@tinyboard.org>
* Copyright (c) 2013-2014 Marcin Łabanowski <marcin@6irc.net>
* Copyright (c) 2013 lancee <lancee@55ch.org>
*
* Usage:
* $config['quick_reply'] = true;
* $config['additional_javascript'][] = 'js/jquery.min.js';
* $config['additional_javascript'][] = 'js/quick-reply.js';
*
*/
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 : new_reply_string;
undo_quick_reply = function() {
$('div.banner').remove();
$('form[name=post] input[type=submit]').val(txt_new_topic);
$('form[name=post] input[name=quick-reply]').remove();
}
$('div.post.op').each(function() {
var id = $(this).children('p.intro').children('a.post_no:eq(1)').text();
$('<a href="#">['+_("Quick reply")+']</a>').insertAfter($(this).children('p.intro').children('a:last')).click(function() {
$('div.banner').remove();
$('<div class="banner">'+fmt(_("Posting mode: Replying to <small>&gt;&gt;{0}</small>"), [id])+' <a class="unimportant" onclick="undo_quick_reply()" href="javascript:void(0)">['+_("Return")+']</a></div>')
.insertBefore('form[name=post]');
$('form[name=post] input[type=submit]').val(txt_new_reply);
$('<input type="hidden" name="quick-reply" value="' + id + '">').appendTo($('form[name=post]'));
$('form[name=post] textarea').select();
window.scrollTo(0, 0);
return false;
});
});
});
}

View File

@ -51,3 +51,17 @@ tb_settings['wpaint'] = {
// Canvas height // Canvas height
height: 250 height: 250
}; };
// auto-reload.js
tb_settings['auto-reload'] = {
// Minimum delay before reloading the page when at the bottom
min_delay_bottom: 3000,
// Minimum delay before reloading the page when not at the bottom
min_delay_top: 10000,
// Maximum delay before reloading the page
max_delay: 600000,
//Delay to wait before reloading when the user scrolls to the bottom
quick_delay: 100,
// Reset the delay to the minimum upon focussing the window.
reset_focus: true
};

View File

@ -23,6 +23,7 @@ $(function(){
$("#upload_file").hide(); $("#upload_file").hide();
$("#upload_url").hide(); $("#upload_url").hide();
$("#upload_embed").hide(); $("#upload_embed").hide();
$(".add_image").hide();
if (enabled_oekaki) { if (enabled_oekaki) {
if (window.oekaki.initialized) { if (window.oekaki.initialized) {
@ -35,6 +36,7 @@ $(function(){
disable_all(); disable_all();
$("#upload").show(); $("#upload").show();
$("#upload_file").show(); $("#upload_file").show();
$(".add_image").show();
}; };
enable_url = function() { enable_url = function() {

@ -1 +1 @@
Subproject commit 15bae4a9181ddb283c1cad0979c44cefd4f15a44 Subproject commit 2c272dffca0f3d7b7163bd82ba15629f54409278

View File

@ -66,6 +66,8 @@ $pages = array(
'/bans/(\d+)' => 'secure_POST bans', // ban list '/bans/(\d+)' => 'secure_POST bans', // ban list
'/ban-appeals' => 'secure_POST ban_appeals', // view ban appeals '/ban-appeals' => 'secure_POST ban_appeals', // view ban appeals
'/recent/(\d+)' => 'recent_posts', // view recent posts
'/search' => 'search_redirect', // search '/search' => 'search_redirect', // search
'/search/(posts|IP_notes|bans|log)/(.+)/(\d+)' => 'search', // search '/search/(posts|IP_notes|bans|log)/(.+)/(\d+)' => 'search', // search
'/search/(posts|IP_notes|bans|log)/(.+)' => 'search', // search '/search/(posts|IP_notes|bans|log)/(.+)' => 'search', // search
@ -75,8 +77,8 @@ $pages = array(
'/(\%b)/move_reply/(\d+)' => 'secure_POST move_reply', // move reply '/(\%b)/move_reply/(\d+)' => 'secure_POST move_reply', // move reply
'/(\%b)/edit(_raw)?/(\d+)' => 'secure_POST edit_post', // edit post '/(\%b)/edit(_raw)?/(\d+)' => 'secure_POST edit_post', // edit post
'/(\%b)/delete/(\d+)' => 'secure delete', // delete post '/(\%b)/delete/(\d+)' => 'secure delete', // delete post
'/(\%b)/deletefile/(\d+)' => 'secure deletefile', // delete file from post '/(\%b)/deletefile/(\d+)/(\d+)' => 'secure deletefile', // delete file from post
'/(\%b+)/spoiler/(\d+)' => 'secure spoiler_image', // spoiler file '/(\%b+)/spoiler/(\d+)/(\d+)' => 'secure spoiler_image', // spoiler file
'/(\%b)/deletebyip/(\d+)(/global)?' => 'secure deletebyip', // delete all posts by IP address '/(\%b)/deletebyip/(\d+)(/global)?' => 'secure deletebyip', // delete all posts by IP address
'/(\%b)/(un)?lock/(\d+)' => 'secure lock', // lock thread '/(\%b)/(un)?lock/(\d+)' => 'secure lock', // lock thread
'/(\%b)/(un)?sticky/(\d+)' => 'secure sticky', // sticky thread '/(\%b)/(un)?sticky/(\d+)' => 'secure sticky', // sticky thread

255
post.php
View File

@ -42,6 +42,10 @@ if (isset($_POST['delete'])) {
// Check if banned // Check if banned
checkBan($board['uri']); checkBan($board['uri']);
// Check if deletion enabled
if (!$config['allow_delete'])
error(_('Post deletion is not allowed!'));
if (empty($delete)) if (empty($delete))
error($config['error']['nodelete']); error($config['error']['nodelete']);
@ -52,10 +56,19 @@ if (isset($_POST['delete'])) {
$query->execute() or error(db_error($query)); $query->execute() or error(db_error($query));
if ($post = $query->fetch(PDO::FETCH_ASSOC)) { if ($post = $query->fetch(PDO::FETCH_ASSOC)) {
if ($password != '' && $post['password'] != $password) $thread = false;
if ($config['user_moderation'] && $post['thread']) {
$thread_query = prepare(sprintf("SELECT `time`,`password` FROM ``posts_%s`` WHERE `id` = :id", $board['uri']));
$thread_query->bindValue(':id', $post['thread'], PDO::PARAM_INT);
$thread_query->execute() or error(db_error($query));
$thread = $thread_query->fetch(PDO::FETCH_ASSOC);
}
if ($password != '' && $post['password'] != $password && (!$thread || $thread['password'] != $password))
error($config['error']['invalidpassword']); error($config['error']['invalidpassword']);
if ($post['time'] > time() - $config['delete_time']) { if ($post['time'] > time() - $config['delete_time'] && (!$thread || $thread['password'] != $password)) {
error(sprintf($config['error']['delete_too_soon'], until($post['time'] + $config['delete_time']))); error(sprintf($config['error']['delete_too_soon'], until($post['time'] + $config['delete_time'])));
} }
@ -88,7 +101,7 @@ if (isset($_POST['delete'])) {
echo json_encode(array('success' => true)); echo json_encode(array('success' => true));
} }
} elseif (isset($_POST['report'])) { } elseif (isset($_POST['report'])) {
if (!isset($_POST['board'], $_POST['password'], $_POST['reason'])) if (!isset($_POST['board'], $_POST['reason']))
error($config['error']['bot']); error($config['error']['bot']);
$report = array(); $report = array();
@ -151,7 +164,7 @@ if (isset($_POST['delete'])) {
if (!isset($_POST['body'], $_POST['board'])) if (!isset($_POST['body'], $_POST['board']))
error($config['error']['bot']); error($config['error']['bot']);
$post = array('board' => $_POST['board']); $post = array('board' => $_POST['board'], 'files' => array());
// Check if board exists // Check if board exists
if (!openBoard($post['board'])) if (!openBoard($post['board']))
@ -172,9 +185,6 @@ if (isset($_POST['delete'])) {
if (isset($_POST['thread'])) { if (isset($_POST['thread'])) {
$post['op'] = false; $post['op'] = false;
$post['thread'] = round($_POST['thread']); $post['thread'] = round($_POST['thread']);
} elseif ($config['quick_reply'] && isset($_POST['quick-reply'])) {
$post['op'] = false;
$post['thread'] = round($_POST['quick-reply']);
} else } else
$post['op'] = true; $post['op'] = true;
@ -183,7 +193,7 @@ if (isset($_POST['delete'])) {
error($config['error']['noboard']); error($config['error']['noboard']);
if (!(($post['op'] && $_POST['post'] == $config['button_newtopic']) || if (!(($post['op'] && $_POST['post'] == $config['button_newtopic']) ||
(!$post['op'] && $_POST['post'] == $config['button_reply']))) (!$post['op'] && $_POST['post'] == $config['button_reply'])))
error($config['error']['bot']); error($config['error']['bot']);
// Check the referrer // Check the referrer
@ -230,7 +240,7 @@ if (isset($_POST['delete'])) {
} }
if (!$post['mod']) { if (!$post['mod']) {
$post['antispam_hash'] = checkSpam(array($board['uri'], isset($post['thread']) && !($config['quick_reply'] && isset($_POST['quick-reply'])) ? $post['thread'] : ($config['try_smarter'] && isset($_POST['page']) ? 0 - (int)$_POST['page'] : null))); $post['antispam_hash'] = checkSpam(array($board['uri'], isset($post['thread']) ? $post['thread'] : ($config['try_smarter'] && isset($_POST['page']) ? 0 - (int)$_POST['page'] : null)));
if ($post['antispam_hash'] === true) if ($post['antispam_hash'] === true)
error($config['error']['spam']); error($config['error']['spam']);
} }
@ -328,26 +338,18 @@ if (isset($_POST['delete'])) {
$_FILES['file'] = array( $_FILES['file'] = array(
'name' => basename($url_without_params), 'name' => basename($url_without_params),
'tmp_name' => $post['file_tmp'], 'tmp_name' => $post['file_tmp'],
'file_tmp' => true,
'error' => 0, 'error' => 0,
'size' => filesize($post['file_tmp']) 'size' => filesize($post['file_tmp'])
); );
} }
// Check for a file
if ($post['op'] && !$config['disable_images'] && !isset($post['no_longer_require_an_image_for_op'])) {
if (!isset($_FILES['file']['tmp_name']) || $_FILES['file']['tmp_name'] == '' && $config['force_image_op'])
error($config['error']['noimage']);
}
$post['name'] = $_POST['name'] != '' ? $_POST['name'] : $config['anonymous']; $post['name'] = $_POST['name'] != '' ? $_POST['name'] : $config['anonymous'];
$post['subject'] = $_POST['subject']; $post['subject'] = $_POST['subject'];
$post['email'] = str_replace(' ', '%20', htmlspecialchars($_POST['email'])); $post['email'] = str_replace(' ', '%20', htmlspecialchars($_POST['email']));
$post['body'] = $_POST['body']; $post['body'] = $_POST['body'];
$post['password'] = $_POST['password']; $post['password'] = $_POST['password'];
$post['has_file'] = !isset($post['embed']) && !$config['disable_images'] && (($post['op'] && !isset($post['no_longer_require_an_image_for_op']) && $config['force_image_op']) || (isset($_FILES['file']) && $_FILES['file']['tmp_name'] != '')); $post['has_file'] = (!isset($post['embed']) && (($post['op'] && !isset($post['no_longer_require_an_image_for_op']) && $config['force_image_op']) || !empty($_FILES)));
if ($post['has_file'])
$post['filename'] = urldecode(get_magic_quotes_gpc() ? stripslashes($_FILES['file']['name']) : $_FILES['file']['name']);
if (!($post['has_file'] || isset($post['embed'])) || (($post['op'] && $config['force_body_op']) || (!$post['op'] && $config['force_body']))) { if (!($post['has_file'] || isset($post['embed'])) || (($post['op'] && $config['force_body_op']) || (!$post['op'] && $config['force_body']))) {
$stripped_whitespace = preg_replace('/[\s]/u', '', $post['body']); $stripped_whitespace = preg_replace('/[\s]/u', '', $post['body']);
@ -372,6 +374,22 @@ if (isset($_POST['delete'])) {
} }
if ($post['has_file']) { if ($post['has_file']) {
// Determine size sanity
$size = 0;
if ($config['multiimage_method'] == 'split') {
foreach ($_FILES as $key => $file) {
$size += $file['size'];
}
} elseif ($config['multiimage_method'] == 'each') {
foreach ($_FILES as $key => $file) {
if ($file['size'] > $size) {
$size = $file['size'];
}
}
} else {
error(_('Unrecognized file size determination method.'));
}
$size = $_FILES['file']['size']; $size = $_FILES['file']['size'];
if ($size > $config['max_filesize']) if ($size > $config['max_filesize'])
error(sprintf3($config['error']['filesize'], array( error(sprintf3($config['error']['filesize'], array(
@ -379,6 +397,7 @@ if (isset($_POST['delete'])) {
'filesz' => number_format($size), 'filesz' => number_format($size),
'maxsz' => number_format($config['max_filesize']) 'maxsz' => number_format($config['max_filesize'])
))); )));
$post['filesize'] = $size;
} }
@ -414,16 +433,39 @@ if (isset($_POST['delete'])) {
} else $noko = $config['always_noko']; } else $noko = $config['always_noko'];
if ($post['has_file']) { if ($post['has_file']) {
$post['extension'] = strtolower(mb_substr($post['filename'], mb_strrpos($post['filename'], '.') + 1)); $i = 0;
if (isset($config['filename_func'])) foreach ($_FILES as $key => $file) {
$post['file_id'] = $config['filename_func']($post); if ($file['size'] && $file['tmp_name']) {
else $file['filename'] = urldecode(get_magic_quotes_gpc() ? stripslashes($file['name']) : $file['name']);
$post['file_id'] = time() . substr(microtime(), 2, 3); $file['extension'] = strtolower(mb_substr($file['filename'], mb_strrpos($file['filename'], '.') + 1));
if (isset($config['filename_func']))
$post['file'] = $board['dir'] . $config['dir']['img'] . $post['file_id'] . '.' . $post['extension']; $file['file_id'] = $config['filename_func']($file);
$post['thumb'] = $board['dir'] . $config['dir']['thumb'] . $post['file_id'] . '.' . ($config['thumb_ext'] ? $config['thumb_ext'] : $post['extension']); else
$file['file_id'] = time() . substr(microtime(), 2, 3);
if (sizeof($_FILES) > 1)
$file['file_id'] .= "-$i";
$file['file'] = $board['dir'] . $config['dir']['img'] . $file['file_id'] . '.' . $file['extension'];
$file['thumb'] = $board['dir'] . $config['dir']['thumb'] . $file['file_id'] . '.' . ($config['thumb_ext'] ? $config['thumb_ext'] : $file['extension']);
$post['files'][] = $file;
$i++;
}
}
} }
if (empty($post['files'])) $post['has_file'] = false;
// Check for a file
if ($post['op'] && !isset($post['no_longer_require_an_image_for_op'])) {
if (!$post['has_file'] && $config['force_image_op'])
error($config['error']['noimage']);
}
// Check for too many files
if (sizeof($post['files']) > $config['max_images'])
error($config['error']['toomanyimages']);
if ($config['strip_combining_chars']) { if ($config['strip_combining_chars']) {
$post['name'] = strip_combining_chars($post['name']); $post['name'] = strip_combining_chars($post['name']);
$post['email'] = strip_combining_chars($post['email']); $post['email'] = strip_combining_chars($post['email']);
@ -480,7 +522,7 @@ if (isset($_POST['delete'])) {
$user_flag = $_POST['user_flag']; $user_flag = $_POST['user_flag'];
if (!isset($config['user_flags'][$user_flag])) if (!isset($config['user_flags'][$user_flag]))
error('Invalid flag selection!'); error(_('Invalid flag selection!'));
$flag_alt = isset($user_flag_alt) ? $user_flag_alt : $config['user_flags'][$user_flag]; $flag_alt = isset($user_flag_alt) ? $user_flag_alt : $config['user_flags'][$user_flag];
@ -510,21 +552,38 @@ if (isset($_POST['delete'])) {
if ($post['has_file']) { if ($post['has_file']) {
if (!in_array($post['extension'], $config['allowed_ext']) && !in_array($post['extension'], $config['allowed_ext_files'])) foreach ($post['files'] as $key => &$file) {
error($config['error']['unknownext']); if (!in_array($file['extension'], $config['allowed_ext']) && !in_array($file['extension'], $config['allowed_ext_files']))
error($config['error']['unknownext']);
$file['is_an_image'] = !in_array($file['extension'], $config['allowed_ext_files']);
// Truncate filename if it is too long
$file['filename'] = mb_substr($file['filename'], 0, $config['max_filename_len']);
if (!isset($filenames)) {
$filenames = escapeshellarg($file['tmp_name']);
} else {
$filenames .= (' ' . escapeshellarg($file['tmp_name']));
}
$upload = $file['tmp_name'];
if (!is_readable($upload))
error($config['error']['nomove']);
}
$is_an_image = !in_array($post['extension'], $config['allowed_ext_files']); if ($output = shell_exec_error("cat $filenames | md5sum")) {
$hash = explode(' ', $output)[0];
// Truncate filename if it is too long $post['filehash'] = $hash;
$post['filename'] = mb_substr($post['filename'], 0, $config['max_filename_len']); } elseif ($config['max_images'] === 1) {
$post['filehash'] = md5_file($upload);
$upload = $_FILES['file']['tmp_name']; } else {
$str_to_hash = '';
if (!is_readable($upload)) foreach (explode(' ', $filenames) as $i => $f) {
error($config['error']['nomove']); $str_to_hash .= file_get_contents($f);
}
$post['filehash'] = md5_file($upload); $post['filehash'] = md5($str_to_hash);
$post['filesize'] = filesize($upload); }
} }
if (!hasPermission($config['mod']['bypass_filters'], $board['uri'])) { if (!hasPermission($config['mod']['bypass_filters'], $board['uri'])) {
@ -534,7 +593,8 @@ if (isset($_POST['delete'])) {
} }
if ($post['has_file']) { if ($post['has_file']) {
if ($is_an_image && $config['ie_mime_type_detection'] !== false) { foreach ($post['files'] as $key => &$file) {
if ($file['is_an_image'] && $config['ie_mime_type_detection'] !== false) {
// Check IE MIME type detection XSS exploit // Check IE MIME type detection XSS exploit
$buffer = file_get_contents($upload, null, null, null, 255); $buffer = file_get_contents($upload, null, null, null, 255);
if (preg_match($config['ie_mime_type_detection'], $buffer)) { if (preg_match($config['ie_mime_type_detection'], $buffer)) {
@ -545,7 +605,7 @@ if (isset($_POST['delete'])) {
require_once 'inc/image.php'; require_once 'inc/image.php';
// find dimensions of an image using GD // find dimensions of an image using GD
if (!$size = @getimagesize($upload)) { if (!$size = @getimagesize($file['tmp_name'])) {
error($config['error']['invalidimg']); error($config['error']['invalidimg']);
} }
if ($size[0] > $config['max_width'] || $size[1] > $config['max_height']) { if ($size[0] > $config['max_width'] || $size[1] > $config['max_height']) {
@ -553,93 +613,93 @@ if (isset($_POST['delete'])) {
} }
if ($config['convert_auto_orient'] && ($post['extension'] == 'jpg' || $post['extension'] == 'jpeg')) { if ($config['convert_auto_orient'] && ($file['extension'] == 'jpg' || $file['extension'] == 'jpeg')) {
// The following code corrects the image orientation. // The following code corrects the image orientation.
// Currently only works with the 'convert' option selected but it could easily be expanded to work with the rest if you can be bothered. // Currently only works with the 'convert' option selected but it could easily be expanded to work with the rest if you can be bothered.
if (!($config['redraw_image'] || (($config['strip_exif'] && !$config['use_exiftool']) && ($post['extension'] == 'jpg' || $post['extension'] == 'jpeg')))) { if (!($config['redraw_image'] || (($config['strip_exif'] && !$config['use_exiftool']) && ($file['extension'] == 'jpg' || $file['extension'] == 'jpeg')))) {
if (in_array($config['thumb_method'], array('convert', 'convert+gifsicle', 'gm', 'gm+gifsicle'))) { if (in_array($config['thumb_method'], array('convert', 'convert+gifsicle', 'gm', 'gm+gifsicle'))) {
$exif = @exif_read_data($upload); $exif = @exif_read_data($file['tmp_name']);
$gm = in_array($config['thumb_method'], array('gm', 'gm+gifsicle')); $gm = in_array($config['thumb_method'], array('gm', 'gm+gifsicle'));
if (isset($exif['Orientation']) && $exif['Orientation'] != 1) { if (isset($exif['Orientation']) && $exif['Orientation'] != 1) {
if ($config['convert_manual_orient']) { if ($config['convert_manual_orient']) {
$error = shell_exec_error(($gm ? 'gm ' : '') . 'convert ' . $error = shell_exec_error(($gm ? 'gm ' : '') . 'convert ' .
escapeshellarg($upload) . ' ' . escapeshellarg($file['tmp_name']) . ' ' .
ImageConvert::jpeg_exif_orientation(false, $exif) . ' ' . ImageConvert::jpeg_exif_orientation(false, $exif) . ' ' .
($config['strip_exif'] ? '+profile "*"' : ($config['strip_exif'] ? '+profile "*"' :
($config['use_exiftool'] ? '' : '+profile "*"') ($config['use_exiftool'] ? '' : '+profile "*"')
) . ' ' . ) . ' ' .
escapeshellarg($upload)); escapeshellarg($file['tmp_name']));
if ($config['use_exiftool'] && !$config['strip_exif']) { if ($config['use_exiftool'] && !$config['strip_exif']) {
if ($exiftool_error = shell_exec_error( if ($exiftool_error = shell_exec_error(
'exiftool -overwrite_original -q -q -orientation=1 -n ' . 'exiftool -overwrite_original -q -q -orientation=1 -n ' .
escapeshellarg($upload))) escapeshellarg($file['tmp_name'])))
error('exiftool failed!', null, $exiftool_error); error(_('exiftool failed!'), null, $exiftool_error);
} else { } else {
// TODO: Find another way to remove the Orientation tag from the EXIF profile // TODO: Find another way to remove the Orientation tag from the EXIF profile
// without needing `exiftool`. // without needing `exiftool`.
} }
} else { } else {
$error = shell_exec_error(($gm ? 'gm ' : '') . 'convert ' . $error = shell_exec_error(($gm ? 'gm ' : '') . 'convert ' .
escapeshellarg($upload) . ' -auto-orient ' . escapeshellarg($upload)); escapeshellarg($file['tmp_name']) . ' -auto-orient ' . escapeshellarg($upload));
} }
if ($error) if ($error)
error('Could not auto-orient image!', null, $error); error(_('Could not auto-orient image!'), null, $error);
$size = @getimagesize($upload); $size = @getimagesize($file['tmp_name']);
if ($config['strip_exif']) if ($config['strip_exif'])
$post['exif_stripped'] = true; $file['exif_stripped'] = true;
} }
} }
} }
} }
// create image object // create image object
$image = new Image($upload, $post['extension'], $size); $image = new Image($file['tmp_name'], $file['extension'], $size);
if ($image->size->width > $config['max_width'] || $image->size->height > $config['max_height']) { if ($image->size->width > $config['max_width'] || $image->size->height > $config['max_height']) {
$image->delete(); $image->delete();
error($config['error']['maxsize']); error($config['error']['maxsize']);
} }
$post['width'] = $image->size->width; $file['width'] = $image->size->width;
$post['height'] = $image->size->height; $file['height'] = $image->size->height;
if ($config['spoiler_images'] && isset($_POST['spoiler'])) { if ($config['spoiler_images'] && isset($_POST['spoiler'])) {
$post['thumb'] = 'spoiler'; $file['thumb'] = 'spoiler';
$size = @getimagesize($config['spoiler_image']); $size = @getimagesize($config['spoiler_image']);
$post['thumbwidth'] = $size[0]; $file['thumbwidth'] = $size[0];
$post['thumbheight'] = $size[1]; $file['thumbheight'] = $size[1];
} elseif ($config['minimum_copy_resize'] && } elseif ($config['minimum_copy_resize'] &&
$image->size->width <= $config['thumb_width'] && $image->size->width <= $config['thumb_width'] &&
$image->size->height <= $config['thumb_height'] && $image->size->height <= $config['thumb_height'] &&
$post['extension'] == ($config['thumb_ext'] ? $config['thumb_ext'] : $post['extension'])) { $file['extension'] == ($config['thumb_ext'] ? $config['thumb_ext'] : $file['extension'])) {
// Copy, because there's nothing to resize // Copy, because there's nothing to resize
copy($upload, $post['thumb']); copy($file['tmp_name'], $file['thumb']);
$post['thumbwidth'] = $image->size->width; $file['thumbwidth'] = $image->size->width;
$post['thumbheight'] = $image->size->height; $file['thumbheight'] = $image->size->height;
} else { } else {
$thumb = $image->resize( $thumb = $image->resize(
$config['thumb_ext'] ? $config['thumb_ext'] : $post['extension'], $config['thumb_ext'] ? $config['thumb_ext'] : $file['extension'],
$post['op'] ? $config['thumb_op_width'] : $config['thumb_width'], $post['op'] ? $config['thumb_op_width'] : $config['thumb_width'],
$post['op'] ? $config['thumb_op_height'] : $config['thumb_height'] $post['op'] ? $config['thumb_op_height'] : $config['thumb_height']
); );
$thumb->to($post['thumb']); $thumb->to($file['thumb']);
$post['thumbwidth'] = $thumb->width; $file['thumbwidth'] = $thumb->width;
$post['thumbheight'] = $thumb->height; $file['thumbheight'] = $thumb->height;
$thumb->_destroy(); $thumb->_destroy();
} }
if ($config['redraw_image'] || (!@$post['exif_stripped'] && $config['strip_exif'] && ($post['extension'] == 'jpg' || $post['extension'] == 'jpeg'))) { if ($config['redraw_image'] || (!@$file['exif_stripped'] && $config['strip_exif'] && ($file['extension'] == 'jpg' || $file['extension'] == 'jpeg'))) {
if (!$config['redraw_image'] && $config['use_exiftool']) { if (!$config['redraw_image'] && $config['use_exiftool']) {
if($error = shell_exec_error('exiftool -overwrite_original -ignoreMinorErrors -q -q -all= ' . if($error = shell_exec_error('exiftool -overwrite_original -ignoreMinorErrors -q -q -all= ' .
escapeshellarg($upload))) escapeshellarg($file['tmp_name'])))
error('Could not strip EXIF metadata!', null, $error); error(_('Could not strip EXIF metadata!'), null, $error);
} else { } else {
$image->to($post['file']); $image->to($file['file']);
$dont_copy_file = true; $dont_copy_file = true;
} }
} }
@ -647,26 +707,25 @@ if (isset($_POST['delete'])) {
} else { } else {
// not an image // not an image
//copy($config['file_thumb'], $post['thumb']); //copy($config['file_thumb'], $post['thumb']);
$post['thumb'] = 'file'; $file['thumb'] = 'file';
$size = @getimagesize(sprintf($config['file_thumb'], $size = @getimagesize(sprintf($config['file_thumb'],
isset($config['file_icons'][$post['extension']]) ? isset($config['file_icons'][$file['extension']]) ?
$config['file_icons'][$post['extension']] : $config['file_icons']['default'])); $config['file_icons'][$file['extension']] : $config['file_icons']['default']));
$post['thumbwidth'] = $size[0]; $file['thumbwidth'] = $size[0];
$post['thumbheight'] = $size[1]; $file['thumbheight'] = $size[1];
} }
if (!isset($dont_copy_file) || !$dont_copy_file) { if (!isset($dont_copy_file) || !$dont_copy_file) {
if (isset($post['file_tmp'])) { if (isset($file['file_tmp'])) {
if (!@rename($upload, $post['file'])) if (!@rename($file['tmp_name'], $file['file']))
error($config['error']['nomove']); error($config['error']['nomove']);
chmod($post['file'], 0644); chmod($file['file'], 0644);
} elseif (!@move_uploaded_file($upload, $post['file'])) } elseif (!@move_uploaded_file($file['tmp_name'], $file['file']))
error($config['error']['nomove']); error($config['error']['nomove']);
}
} }
}
if ($post['has_file']) {
if ($config['image_reject_repost']) { if ($config['image_reject_repost']) {
if ($p = getPostByHash($post['filehash'])) { if ($p = getPostByHash($post['filehash'])) {
undoImage($post); undoImage($post);
@ -694,7 +753,7 @@ if (isset($_POST['delete'])) {
)); ));
} }
} }
} }
if (!hasPermission($config['mod']['postunoriginal'], $board['uri']) && $config['robot_enable'] && checkRobot($post['body_nomarkup'])) { if (!hasPermission($config['mod']['postunoriginal'], $board['uri']) && $config['robot_enable'] && checkRobot($post['body_nomarkup'])) {
undoImage($post); undoImage($post);
@ -707,19 +766,29 @@ if (isset($_POST['delete'])) {
// Remove board directories before inserting them into the database. // Remove board directories before inserting them into the database.
if ($post['has_file']) { if ($post['has_file']) {
$post['file_path'] = $post['file']; foreach ($post['files'] as $key => &$file) {
$post['thumb_path'] = $post['thumb']; $file['file_path'] = $file['file'];
$post['file'] = mb_substr($post['file'], mb_strlen($board['dir'] . $config['dir']['img'])); $file['thumb_path'] = $file['thumb'];
if ($is_an_image && $post['thumb'] != 'spoiler') $file['file'] = mb_substr($file['file'], mb_strlen($board['dir'] . $config['dir']['img']));
$post['thumb'] = mb_substr($post['thumb'], mb_strlen($board['dir'] . $config['dir']['thumb'])); if ($file['is_an_image'] && $file['thumb'] != 'spoiler')
$file['thumb'] = mb_substr($file['thumb'], mb_strlen($board['dir'] . $config['dir']['thumb']));
}
} }
$post = (object)$post; $post = (object)$post;
if ($error = event('post', $post)) { $post->files = array_map(function($a) { return (object)$a; }, $post->files);
$error = event('post', $post);
$post->files = array_map(function($a) { return (array)$a; }, $post->files);
if ($error) {
undoImage((array)$post); undoImage((array)$post);
error($error); error($error);
} }
$post = (array)$post; $post = (array)$post;
if ($post['files'])
$post['files'] = $post['files'];
$post['num_files'] = sizeof($post['files']);
$post['id'] = $id = post($post); $post['id'] = $id = post($post);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 B

After

Width:  |  Height:  |  Size: 59 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 643 B

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 408 B

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 604 B

After

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 591 B

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 643 B

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 600 B

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 497 B

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 B

After

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 611 B

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 506 B

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 647 B

After

Width:  |  Height:  |  Size: 538 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 403 B

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 673 B

After

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 663 B

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 589 B

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 593 B

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 585 B

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 504 B

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 497 B

After

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 320 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 457 B

After

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 675 B

After

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 486 B

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 369 B

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 611 B

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 639 B

After

Width:  |  Height:  |  Size: 500 B

Some files were not shown because too many files have changed in this diff Show More