Czterooki
11 years ago
72 changed files with 3508 additions and 429 deletions
@ -0,0 +1,123 @@ |
|||
<?php |
|||
|
|||
/* |
|||
* Copyright (c) 2010-2013 Tinyboard Development Group |
|||
*/ |
|||
|
|||
/** |
|||
* Class for generating json API compatible with 4chan API |
|||
*/ |
|||
class Api { |
|||
|
|||
/** |
|||
* Translation from local fields to fields in 4chan-style API |
|||
*/ |
|||
public static $postFields = array( |
|||
'id' => 'no', |
|||
'thread' => 'resto', |
|||
'subject' => 'sub', |
|||
'email' => 'email', |
|||
'name' => 'name', |
|||
'trip' => 'trip', |
|||
'capcode' => 'capcode', |
|||
'body' => 'com', |
|||
'time' => 'time', |
|||
'thumb' => 'thumb', // non-compatible field |
|||
'thumbx' => 'tn_w', |
|||
'thumby' => 'tn_h', |
|||
'file' => 'file', // non-compatible field |
|||
'filex' => 'w', |
|||
'filey' => 'h', |
|||
'filesize' => 'fsize', |
|||
//'filename' => 'filename', |
|||
'omitted' => 'omitted_posts', |
|||
'omitted_images' => 'omitted_images', |
|||
//'posts' => 'replies', |
|||
//'ip' => '', |
|||
'sticky' => 'sticky', |
|||
'locked' => 'locked', |
|||
//'bumplocked' => '', |
|||
//'embed' => '', |
|||
//'root' => '', |
|||
//'mod' => '', |
|||
//'hr' => '', |
|||
); |
|||
|
|||
static $ints = array( |
|||
'no' => 1, |
|||
'resto' => 1, |
|||
'time' => 1, |
|||
'tn_w' => 1, |
|||
'tn_h' => 1, |
|||
'w' => 1, |
|||
'h' => 1, |
|||
'fsize' => 1, |
|||
'omitted_posts' => 1, |
|||
'omitted_images' => 1, |
|||
'sticky' => 1, |
|||
'locked' => 1, |
|||
); |
|||
|
|||
private function translatePost($post) { |
|||
$apiPost = array(); |
|||
foreach (self::$postFields as $local => $translated) { |
|||
if (!isset($post->$local)) |
|||
continue; |
|||
|
|||
$toInt = isset(self::$ints[$translated]); |
|||
$val = $post->$local; |
|||
if ($val !== null && $val !== '') { |
|||
$apiPost[$translated] = $toInt ? (int) $val : $val; |
|||
} |
|||
} |
|||
|
|||
if (isset($post->filename)) { |
|||
$dotPos = strrpos($post->filename, '.'); |
|||
$apiPost['filename'] = substr($post->filename, 0, $dotPos); |
|||
$apiPost['ext'] = substr($post->filename, $dotPos); |
|||
} |
|||
|
|||
return $apiPost; |
|||
} |
|||
|
|||
function translateThread(Thread $thread) { |
|||
$apiPosts = array(); |
|||
$op = $this->translatePost($thread); |
|||
$op['resto'] = 0; |
|||
$apiPosts['posts'][] = $op; |
|||
|
|||
foreach ($thread->posts as $p) { |
|||
$apiPosts['posts'][] = $this->translatePost($p); |
|||
} |
|||
|
|||
return $apiPosts; |
|||
} |
|||
|
|||
function translatePage(array $threads) { |
|||
$apiPage = array(); |
|||
foreach ($threads as $thread) { |
|||
$apiPage['threads'][] = $this->translateThread($thread); |
|||
} |
|||
return $apiPage; |
|||
} |
|||
|
|||
function translateCatalogPage(array $threads) { |
|||
$apiPage = array(); |
|||
foreach ($threads as $thread) { |
|||
$ts = $this->translateThread($thread); |
|||
$apiPage['threads'][] = current($ts['posts']); |
|||
} |
|||
return $apiPage; |
|||
} |
|||
|
|||
function translateCatalog($catalog) { |
|||
$apiCatalog = array(); |
|||
foreach ($catalog as $page => $threads) { |
|||
$apiPage = $this->translateCatalogPage($threads); |
|||
$apiPage['page'] = $page; |
|||
$apiCatalog[] = $apiPage; |
|||
} |
|||
|
|||
return $apiCatalog; |
|||
} |
|||
} |
@ -0,0 +1 @@ |
|||
l10n = {"Submit":"Wy\u015blij","Quick reply":"Szybka odpowied\u017a","Posting mode: Replying to <small>>>{0}<\/small>":"Tryb postowania: Odpowied\u017a na <small>>>{0}<\/small>","Return":"Powr\u00f3t","Click reply to view.":"Kliknij Odpowied\u017a aby zobaczy\u0107.","Click to expand":"Kliknij aby rozwin\u0105\u0107","Hide expanded replies":"Schowaj rozwini\u0119te odpowiedzi","Mon":"pon","Tue":"wto","Wed":"\u015bro","Thu":"czw","Fri":"pi\u0105","Sat":"sob","Sun":"nie","Show locked threads":"Poka\u017c zablokowane tematy","Hide locked threads":"Schowaj zablokowane tematy","Forced anonymity":"Wymuszona anonimowo\u015b\u0107","enabled":"w\u0142\u0105czona","disabled":"wy\u0142\u0105czona","Password":"Has\u0142o","Delete file only":"Usu\u0144 tylko plik","File":"Plik","Delete":"Usu\u0144","Reason":"Pow\u00f3d","Report":"Zg\u0142oszenie"}; |
@ -0,0 +1,121 @@ |
|||
# SOME DESCRIPTIVE TITLE. |
|||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
|||
# This file is distributed under the same license as the PACKAGE package. |
|||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. |
|||
# |
|||
#, fuzzy |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: PACKAGE VERSION\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"POT-Creation-Date: 2013-07-18 16:31-0400\n" |
|||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
|||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
|||
"Language-Team: LANGUAGE <[email protected]>\n" |
|||
"Language: \n" |
|||
"MIME-Version: 1.0\n" |
|||
"Content-Type: text/plain; charset=UTF-8\n" |
|||
"Content-Transfer-Encoding: 8bit\n" |
|||
|
|||
#: ../../../../js/quick-reply.js:20 ../../../../js/quick-reply.js:21 |
|||
msgid "Submit" |
|||
msgstr "Wyślij" |
|||
|
|||
#: ../../../../js/quick-reply.js:30 ../../../../js/quick-reply.js:31 |
|||
msgid "Quick reply" |
|||
msgstr "Szybka odpowiedź" |
|||
|
|||
#: ../../../../js/quick-reply.js:32 ../../../../js/quick-reply.js:33 |
|||
msgid "Posting mode: Replying to <small>>>{0}</small>" |
|||
msgstr "Tryb postowania: Odpowiedź na <small>>>{0}</small>" |
|||
|
|||
#: ../../../../js/quick-reply.js:32 ../../../../js/quick-reply.js:33 |
|||
msgid "Return" |
|||
msgstr "Powrót" |
|||
|
|||
#: ../../../../js/expand.js:20 |
|||
msgid "Click reply to view." |
|||
msgstr "Kliknij Odpowiedź aby zobaczyć." |
|||
|
|||
#: ../../../../js/expand.js:20 |
|||
msgid "Click to expand" |
|||
msgstr "Kliknij aby rozwinąć" |
|||
|
|||
#: ../../../../js/expand.js:41 |
|||
msgid "Hide expanded replies" |
|||
msgstr "Schowaj rozwinięte odpowiedzi" |
|||
|
|||
#: ../../../../js/local-time.js:40 |
|||
msgid "Mon" |
|||
msgstr "pon" |
|||
|
|||
#: ../../../../js/local-time.js:40 |
|||
msgid "Tue" |
|||
msgstr "wto" |
|||
|
|||
#: ../../../../js/local-time.js:40 |
|||
msgid "Wed" |
|||
msgstr "śro" |
|||
|
|||
#: ../../../../js/local-time.js:40 |
|||
msgid "Thu" |
|||
msgstr "czw" |
|||
|
|||
#: ../../../../js/local-time.js:40 |
|||
msgid "Fri" |
|||
msgstr "pią" |
|||
|
|||
#: ../../../../js/local-time.js:40 |
|||
msgid "Sat" |
|||
msgstr "sob" |
|||
|
|||
#: ../../../../js/local-time.js:40 |
|||
msgid "Sun" |
|||
msgstr "nie" |
|||
|
|||
#: ../../../../js/toggle-locked-threads.js:39 |
|||
#: ../../../../js/toggle-locked-threads.js:54 |
|||
msgid "Show locked threads" |
|||
msgstr "Pokaż zablokowane tematy" |
|||
|
|||
#: ../../../../js/toggle-locked-threads.js:39 |
|||
#: ../../../../js/toggle-locked-threads.js:54 |
|||
msgid "Hide locked threads" |
|||
msgstr "Schowaj zablokowane tematy" |
|||
|
|||
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65 |
|||
#: ../../../../js/forced-anon.js:69 |
|||
msgid "Forced anonymity" |
|||
msgstr "Wymuszona anonimowość" |
|||
|
|||
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:65 |
|||
msgid "enabled" |
|||
msgstr "włączona" |
|||
|
|||
#: ../../../../js/forced-anon.js:59 ../../../../js/forced-anon.js:69 |
|||
msgid "disabled" |
|||
msgstr "wyłączona" |
|||
|
|||
#: ../../../../js/quick-post-controls.js:27 |
|||
msgid "Password" |
|||
msgstr "Hasło" |
|||
|
|||
#: ../../../../js/quick-post-controls.js:29 |
|||
msgid "Delete file only" |
|||
msgstr "Usuń tylko plik" |
|||
|
|||
#: ../../../../js/quick-post-controls.js:30 |
|||
msgid "File" |
|||
msgstr "Plik" |
|||
|
|||
#: ../../../../js/quick-post-controls.js:31 |
|||
msgid "Delete" |
|||
msgstr "Usuń" |
|||
|
|||
#: ../../../../js/quick-post-controls.js:35 |
|||
msgid "Reason" |
|||
msgstr "Powód" |
|||
|
|||
#: ../../../../js/quick-post-controls.js:37 |
|||
msgid "Report" |
|||
msgstr "Zgłoszenie" |
Binary file not shown.
File diff suppressed because it is too large
Binary file not shown.
@ -0,0 +1,844 @@ |
|||
# SOME DESCRIPTIVE TITLE. |
|||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
|||
# This file is distributed under the same license as the PACKAGE package. |
|||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. |
|||
# |
|||
#, fuzzy |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: PACKAGE VERSION\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"POT-Creation-Date: 2013-04-21 11:29-0400\n" |
|||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
|||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
|||
"Language-Team: LANGUAGE <[email protected]>\n" |
|||
"Language: \n" |
|||
"MIME-Version: 1.0\n" |
|||
"Content-Type: text/plain; charset=UTF-8\n" |
|||
"Content-Transfer-Encoding: 8bit\n" |
|||
"Plural-Forms: nplurals=2; plural==(n != 1);n" |
|||
|
|||
#: ../../inc/lib/gettext/examples/pigs_dropin.php:77 |
|||
msgid "" |
|||
"This is how the story goes.\n" |
|||
"\n" |
|||
msgstr "Era uma vez\n\n" |
|||
|
|||
#: ../../inc/functions.php:1046 ../../inc/functions.php:1060 |
|||
msgid "Previous" |
|||
msgstr "Anterior" |
|||
|
|||
#: ../../inc/functions.php:1065 ../../inc/functions.php:1074 |
|||
msgid "Next" |
|||
msgstr "Proximo" |
|||
|
|||
#: ../../inc/display.php:91 ../../inc/mod/pages.php:62 |
|||
msgid "Login" |
|||
msgstr "Login" |
|||
|
|||
#: ../../inc/config.php:687 |
|||
msgid "Lurk some more before posting." |
|||
msgstr "Lurke mais antes de postar." |
|||
|
|||
#: ../../inc/config.php:688 |
|||
msgid "You look like a bot." |
|||
msgstr "Você não parece humano." |
|||
|
|||
#: ../../inc/config.php:689 |
|||
msgid "Your browser sent an invalid or no HTTP referer." |
|||
msgstr "Seu browser enviou um referial HTTP inválido ou não enviou o referencial." |
|||
|
|||
#: ../../inc/config.php:690 |
|||
#, php-format |
|||
msgid "The %s field was too long." |
|||
msgstr "O campo %s é longo demais." |
|||
|
|||
#: ../../inc/config.php:691 |
|||
msgid "The body was too long." |
|||
msgstr "O corpo do texto é longo demais." |
|||
|
|||
#: ../../inc/config.php:692 |
|||
msgid "The body was too short or empty." |
|||
msgstr "O corpo do texto é pequeno demais ou inexistente." |
|||
|
|||
#: ../../inc/config.php:693 |
|||
msgid "You must upload an image." |
|||
msgstr "Você deve fazer upload de uma imagem." |
|||
|
|||
#: ../../inc/config.php:694 |
|||
msgid "The server failed to handle your upload." |
|||
msgstr "O servidor não conseguiu lidar com seu upload." |
|||
|
|||
#: ../../inc/config.php:695 |
|||
msgid "Unsupported image format." |
|||
msgstr "Tipo de imagem não aceito." |
|||
|
|||
#: ../../inc/config.php:696 |
|||
msgid "Invalid board!" |
|||
msgstr "Board inválida!" |
|||
|
|||
#: ../../inc/config.php:697 |
|||
msgid "Thread specified does not exist." |
|||
msgstr "O tópico especificado não existe.." |
|||
|
|||
#: ../../inc/config.php:698 |
|||
msgid "Thread locked. You may not reply at this time." |
|||
msgstr "Tópico trancado, você não pode postar." |
|||
|
|||
#: ../../inc/config.php:699 |
|||
msgid "You didn't make a post." |
|||
msgstr "Você não escreveu uma mensagem." |
|||
|
|||
#: ../../inc/config.php:700 |
|||
msgid "Flood detected; Post discarded." |
|||
msgstr "Flood detectado; Sua mensagem foi descartada." |
|||
|
|||
#: ../../inc/config.php:701 |
|||
msgid "Your request looks automated; Post discarded." |
|||
msgstr "Sua requisição parece automatizada; Mensagem descartada." |
|||
|
|||
#: ../../inc/config.php:702 |
|||
msgid "Unoriginal content!" |
|||
msgstr "Conteudo não original!" |
|||
|
|||
#: ../../inc/config.php:703 |
|||
#, php-format |
|||
msgid "Unoriginal content! You have been muted for %d seconds." |
|||
msgstr "Conteudo não original! Você está impedido de postar por %d segundos." |
|||
|
|||
#: ../../inc/config.php:704 |
|||
#, php-format |
|||
msgid "You are muted! Expires in %d seconds." |
|||
msgstr "Você está impedido de postar! Expira em %d segundos." |
|||
|
|||
#: ../../inc/config.php:705 |
|||
#, php-format |
|||
msgid "Your IP address is listed in %s." |
|||
msgstr "Seu IP está listado em %s." |
|||
|
|||
#: ../../inc/config.php:706 |
|||
msgid "Too many links; flood detected." |
|||
msgstr "Links demais; Flood detectado." |
|||
|
|||
#: ../../inc/config.php:707 |
|||
msgid "Too many cites; post discarded." |
|||
msgstr "Citações demais; Post descartado." |
|||
|
|||
#: ../../inc/config.php:708 |
|||
msgid "Too many cross-board links; post discarded." |
|||
msgstr "Links entre boards demais; Post descartado." |
|||
|
|||
#: ../../inc/config.php:709 |
|||
msgid "You didn't select anything to delete." |
|||
msgstr "Você não selecionou nada para deletar." |
|||
|
|||
#: ../../inc/config.php:710 |
|||
msgid "You didn't select anything to report." |
|||
msgstr "Você não selecionou nada para denunciar." |
|||
|
|||
#: ../../inc/config.php:711 |
|||
msgid "You can't report that many posts at once." |
|||
msgstr "Você não pode denunciar tantas mensagens ao mesmo tempo." |
|||
|
|||
#: ../../inc/config.php:712 |
|||
msgid "Wrong password…" |
|||
msgstr "Senha incorreta…" |
|||
|
|||
#: ../../inc/config.php:713 |
|||
msgid "Invalid image." |
|||
msgstr "Imagem inválida." |
|||
|
|||
#: ../../inc/config.php:714 |
|||
msgid "Unknown file extension." |
|||
msgstr "Extenção de arquivo desconhecida." |
|||
|
|||
#: ../../inc/config.php:715 |
|||
msgid "Maximum file size: %maxsz% bytes<br>Your file's size: %filesz% bytes" |
|||
msgstr "Tamanho maximo de arquivos: %maxsz% bytes<br>O tamanho do seu arquivo: %filesz% bytes" |
|||
|
|||
#: ../../inc/config.php:716 |
|||
msgid "The file was too big." |
|||
msgstr "Seu arquivo é grande demais." |
|||
|
|||
#: ../../inc/config.php:717 |
|||
msgid "Invalid archive!" |
|||
msgstr "Arquivo inválido!" |
|||
|
|||
#: ../../inc/config.php:718 |
|||
#, php-format |
|||
msgid "That file <a href=\"%s\">already exists</a>!" |
|||
msgstr "O arquivo <a href=\"%s\">já existe</a>!" |
|||
|
|||
#: ../../inc/config.php:719 |
|||
#, php-format |
|||
msgid "That file <a href=\"%s\">already exists</a> in this thread!" |
|||
msgstr "O arquivo <a href=\"%s\">já existe</a> neste tópico!" |
|||
|
|||
#: ../../inc/config.php:720 |
|||
#, php-format |
|||
msgid "You'll have to wait another %s before deleting that." |
|||
msgstr "Você terá que esperar %s segundos antes de deletar isso." |
|||
|
|||
#: ../../inc/config.php:721 |
|||
msgid "MIME type detection XSS exploit (IE) detected; post discarded." |
|||
msgstr "Exploit XSS do tipo MIME (IE) detectado; mensagem descartada." |
|||
|
|||
#: ../../inc/config.php:722 |
|||
msgid "Couldn't make sense of the URL of the video you tried to embed." |
|||
msgstr "Não consegui processar a URL do video que você tentou integrar" |
|||
|
|||
#: ../../inc/config.php:723 |
|||
msgid "You seem to have mistyped the verification." |
|||
msgstr "Você errou o codigo de verificação." |
|||
|
|||
#: ../../inc/config.php:726 |
|||
msgid "Invalid username and/or password." |
|||
msgstr "Login e/ou senha inválido(s)." |
|||
|
|||
#: ../../inc/config.php:727 |
|||
msgid "You are not a mod…" |
|||
msgstr "Você não é mod…" |
|||
|
|||
#: ../../inc/config.php:728 |
|||
msgid "" |
|||
"Invalid username and/or password. Your user may have been deleted or changed." |
|||
msgstr "Login e/ou senha inválido(s). Seu login deve ter sido mudado ou removido." |
|||
|
|||
#: ../../inc/config.php:729 |
|||
msgid "Invalid/malformed cookies." |
|||
msgstr "Cookies inválidos ou mal formados." |
|||
|
|||
#: ../../inc/config.php:730 |
|||
msgid "Your browser didn't submit an input when it should have." |
|||
msgstr "Seu browser não enviou uma entrada quando ele deveria." |
|||
|
|||
#: ../../inc/config.php:731 |
|||
#, php-format |
|||
msgid "The %s field is required." |
|||
msgstr "O campo %s é necessário." |
|||
|
|||
#: ../../inc/config.php:732 |
|||
#, php-format |
|||
msgid "The %s field was invalid." |
|||
msgstr "O campo %s é inválido." |
|||
|
|||
#: ../../inc/config.php:733 |
|||
#, php-format |
|||
msgid "There is already a %s board." |
|||
msgstr "A board %s já existe." |
|||
|
|||
#: ../../inc/config.php:734 |
|||
msgid "You don't have permission to do that." |
|||
msgstr "Você não tem permissão para fazer isso." |
|||
|
|||
#: ../../inc/config.php:735 |
|||
msgid "That post doesn't exist…" |
|||
msgstr "Este post já existe…" |
|||
|
|||
#: ../../inc/config.php:736 |
|||
msgid "Page not found." |
|||
msgstr "Pagina não encontrada." |
|||
|
|||
#: ../../inc/config.php:737 |
|||
#, php-format |
|||
msgid "That mod <a href=\"?/users/%d\">already exists</a>!" |
|||
msgstr "Este mod <a href=\"?/users/%d\">já existe</a>!" |
|||
|
|||
#: ../../inc/config.php:738 |
|||
msgid "That theme doesn't exist!" |
|||
msgstr "Este tema não existe!" |
|||
|
|||
#: ../../inc/config.php:739 |
|||
msgid "Invalid security token! Please go back and try again." |
|||
msgstr "Token de segurança inválido! Retorne e tente de novo." |
|||
|
|||
#: ../../inc/mod/pages.php:66 |
|||
msgid "Confirm action" |
|||
msgstr "Confirmar ação" |
|||
|
|||
#: ../../inc/mod/pages.php:110 |
|||
msgid "Could not find current version! (Check .installed)" |
|||
msgstr "Não foi possivel encontrar a versão atual! (Cheque o .installed)" |
|||
|
|||
#: ../../inc/mod/pages.php:151 |
|||
msgid "Dashboard" |
|||
msgstr "Dashboard" |
|||
|
|||
#: ../../inc/mod/pages.php:228 |
|||
msgid "Edit board" |
|||
msgstr "Editar board" |
|||
|
|||
#: ../../inc/mod/pages.php:261 |
|||
msgid "Couldn't open board after creation." |
|||
msgstr "Não foi possivel abrir a board após a criação." |
|||
|
|||
#: ../../inc/mod/pages.php:276 |
|||
msgid "New board" |
|||
msgstr "Nova board" |
|||
|
|||
#: ../../inc/mod/pages.php:322 |
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:96 |
|||
msgid "Noticeboard" |
|||
msgstr "Quadro de noticias" |
|||
|
|||
#: ../../inc/mod/pages.php:382 |
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:166 |
|||
msgid "News" |
|||
msgstr "Noticias" |
|||
|
|||
#: ../../inc/mod/pages.php:422 ../../inc/mod/pages.php:449 |
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:255 |
|||
msgid "Moderation log" |
|||
msgstr "Log da moderação" |
|||
|
|||
#: ../../inc/mod/pages.php:592 |
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:247 |
|||
#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:65 |
|||
msgid "IP" |
|||
msgstr "IP" |
|||
|
|||
#: ../../inc/mod/pages.php:602 ../../inc/mod/pages.php:993 |
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:377 |
|||
msgid "New ban" |
|||
msgstr "Nova expulsão" |
|||
|
|||
#: ../../inc/mod/pages.php:670 |
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:224 |
|||
msgid "Ban list" |
|||
msgstr "Lista de expulsões" |
|||
|
|||
#: ../../inc/mod/pages.php:765 |
|||
msgid "Target and source board are the same." |
|||
msgstr "Board alvo e fonte são as mesmas." |
|||
|
|||
#: ../../inc/mod/pages.php:927 |
|||
msgid "Impossible to move thread; there is only one board." |
|||
msgstr "Impossivel de mover o tópico; Só existe uma board." |
|||
|
|||
#: ../../inc/mod/pages.php:931 |
|||
msgid "Move thread" |
|||
msgstr "Mover tópico" |
|||
|
|||
#: ../../inc/mod/pages.php:1045 |
|||
msgid "Edit post" |
|||
msgstr "Editar mensagem" |
|||
|
|||
#: ../../inc/mod/pages.php:1271 ../../inc/mod/pages.php:1320 |
|||
msgid "Edit user" |
|||
msgstr "Editar usuário" |
|||
|
|||
#: ../../inc/mod/pages.php:1333 |
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:232 |
|||
msgid "Manage users" |
|||
msgstr "Administrar usuários" |
|||
|
|||
#: ../../inc/mod/pages.php:1395 ../../inc/mod/pages.php:1467 |
|||
msgid "New PM for" |
|||
msgstr "Nova MP para" |
|||
|
|||
#: ../../inc/mod/pages.php:1399 |
|||
msgid "Private message" |
|||
msgstr "Mensagem pessoal" |
|||
|
|||
#: ../../inc/mod/pages.php:1420 |
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:171 |
|||
msgid "PM inbox" |
|||
msgstr "Entrada de MP" |
|||
|
|||
#: ../../inc/mod/pages.php:1531 ../../inc/mod/pages.php:1535 |
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:263 |
|||
msgid "Rebuild" |
|||
msgstr "Reconstruir" |
|||
|
|||
#: ../../inc/mod/pages.php:1621 |
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:207 |
|||
msgid "Report queue" |
|||
msgstr "Fila de denuncias" |
|||
|
|||
#: ../../inc/mod/pages.php:1743 |
|||
msgid "Config editor" |
|||
msgstr "Editor de configurações" |
|||
|
|||
#: ../../inc/mod/pages.php:1753 |
|||
msgid "Themes directory doesn't exist!" |
|||
msgstr "Diretório de temas não existe!" |
|||
|
|||
#: ../../inc/mod/pages.php:1755 |
|||
msgid "Cannot open themes directory; check permissions." |
|||
msgstr "Não é possivel abrir diretorio de temas; reveja suas permissões." |
|||
|
|||
#: ../../inc/mod/pages.php:1769 |
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:247 |
|||
msgid "Manage themes" |
|||
msgstr "Administrar temas" |
|||
|
|||
#: ../../inc/mod/pages.php:1831 |
|||
#, php-format |
|||
msgid "Installed theme: %s" |
|||
msgstr "Tema instalado: %s" |
|||
|
|||
#: ../../inc/mod/pages.php:1841 |
|||
#, php-format |
|||
msgid "Configuring theme: %s" |
|||
msgstr "Configurando tema: %s" |
|||
|
|||
#: ../../inc/mod/pages.php:1869 |
|||
#, php-format |
|||
msgid "Rebuilt theme: %s" |
|||
msgstr "Reconstruir tema: %s" |
|||
|
|||
#: ../../inc/mod/pages.php:1908 |
|||
msgid "Debug: Anti-spam" |
|||
msgstr "Debug: Anti-spam" |
|||
|
|||
#: ../../inc/mod/pages.php:1932 |
|||
msgid "Debug: Recent posts" |
|||
msgstr "Debug: Mensagens recentes" |
|||
|
|||
#: ../../inc/mod/pages.php:1956 |
|||
msgid "Debug: SQL" |
|||
msgstr "" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:19 |
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:29 |
|||
msgid "Boards" |
|||
msgstr "Boards" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:57 |
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:183 |
|||
msgid "edit" |
|||
msgstr "editar" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:74 |
|||
msgid "Create new board" |
|||
msgstr "Criar nova board" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:84 |
|||
msgid "Messages" |
|||
msgstr "Mensagens" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:120 |
|||
#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:98 |
|||
#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:125 |
|||
msgid "no subject" |
|||
msgstr "sem assunto" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:161 |
|||
msgid "View all noticeboard entries" |
|||
msgstr "Ver todas as noticias do quadro de noticias" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:192 |
|||
msgid "Administration" |
|||
msgstr "Administração" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:239 |
|||
msgid "Change password" |
|||
msgstr "Mudar senha" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:271 |
|||
msgid "Configuration" |
|||
msgstr "Configuração" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:282 |
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:293 |
|||
msgid "Search" |
|||
msgstr "Procurar" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:289 |
|||
msgid "Phrase:" |
|||
msgstr "Frase:" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:297 |
|||
msgid "" |
|||
"(Search is case-insensitive, and based on keywords. To match exact phrases, " |
|||
"use \"quotes\". Use an asterisk (*) for wildcard.)" |
|||
msgstr "" |
|||
"(A procura não diferencia maiúsculas de minusculas, e baseia-se em palavras chave. para procurar por frases exatas, " |
|||
"use \"quotes\". Utilize um asterisco (*) como coringa.)" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:309 |
|||
msgid "Debug" |
|||
msgstr "Debug" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:313 |
|||
msgid "Anti-spam" |
|||
msgstr "Anti-spam" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:316 |
|||
msgid "Recent posts" |
|||
msgstr "Mensagens recentes" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:322 |
|||
msgid "SQL" |
|||
msgstr "SQL" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:360 |
|||
msgid "User account" |
|||
msgstr "Conta de usuário" |
|||
|
|||
#: ../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:365 |
|||
msgid "Logout" |
|||
msgstr "Sair" |
|||
|
|||
#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:21 |
|||
#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:21 |
|||
msgid "New post" |
|||
msgstr "Nova mensagem" |
|||
|
|||
#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:27 |
|||
#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:31 |
|||
#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:36 |
|||
#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:27 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:55 |
|||
msgid "Name" |
|||
msgstr "Nome" |
|||
|
|||
#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:36 |
|||
#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:63 |
|||
#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:53 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:98 |
|||
msgid "Subject" |
|||
msgstr "Assunto" |
|||
|
|||
#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:42 |
|||
#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:69 |
|||
msgid "Body" |
|||
msgstr "Mensagem" |
|||
|
|||
#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:49 |
|||
msgid "Post to noticeboard" |
|||
msgstr "Postar no quadro de notícias" |
|||
|
|||
#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:73 |
|||
#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:100 |
|||
msgid "delete" |
|||
msgstr "deletar" |
|||
|
|||
#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:106 |
|||
#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:133 |
|||
msgid "by" |
|||
msgstr "por" |
|||
|
|||
#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:118 |
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:112 |
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:344 |
|||
msgid "deleted?" |
|||
msgstr "deletado?" |
|||
|
|||
#: ../../templates/cache/26/6f/05ca0da8ac09e2c2216cba2b6f95.php:125 |
|||
#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:136 |
|||
msgid "at" |
|||
msgstr "em" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:74 |
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:169 |
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:331 |
|||
msgid "Staff" |
|||
msgstr "Equipe" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:77 |
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:179 |
|||
msgid "Note" |
|||
msgstr "Nota" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:80 |
|||
msgid "Date" |
|||
msgstr "Data" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:86 |
|||
msgid "Actions" |
|||
msgstr "Ações" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:142 |
|||
msgid "remove" |
|||
msgstr "remover" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:189 |
|||
msgid "New note" |
|||
msgstr "Nova nota" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:226 |
|||
msgid "Status" |
|||
msgstr "Situação" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:233 |
|||
msgid "Expired" |
|||
msgstr "Expirado" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:238 |
|||
msgid "Active" |
|||
msgstr "Ativo" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:256 |
|||
#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:32 |
|||
#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:30 |
|||
#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:90 |
|||
msgid "Reason" |
|||
msgstr "Razão" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:269 |
|||
msgid "no reason" |
|||
msgstr "sem razão especificada" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:278 |
|||
#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:20 |
|||
#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:142 |
|||
msgid "Board" |
|||
msgstr "Board" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:291 |
|||
#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:150 |
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:83 |
|||
msgid "all boards" |
|||
msgstr "todas as boards" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:300 |
|||
msgid "Set" |
|||
msgstr "Configurar" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:309 |
|||
msgid "Expires" |
|||
msgstr "Expira em" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:322 |
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:137 |
|||
msgid "never" |
|||
msgstr "nunca" |
|||
|
|||
#: ../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:357 |
|||
msgid "Remove ban" |
|||
msgstr "Remover expulsão" |
|||
|
|||
#: ../../templates/cache/72/55/0d64283f30702de83ecfcb71f86a.php:25 |
|||
msgid "There are no reports." |
|||
msgstr "Não há denúncias no momento." |
|||
|
|||
#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:19 |
|||
msgid "Delete Post" |
|||
msgstr "Deletar Mensagem" |
|||
|
|||
#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:22 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:218 |
|||
msgid "File" |
|||
msgstr "Arquivo" |
|||
|
|||
#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:23 |
|||
#: ../../templates/cache/04/54/656aa217f895c90eae78024fa060.php:41 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:310 |
|||
msgid "Password" |
|||
msgstr "Senha" |
|||
|
|||
#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:27 |
|||
msgid "Delete" |
|||
msgstr "Deletar" |
|||
|
|||
#: ../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:36 |
|||
msgid "Report" |
|||
msgstr "Denunciar" |
|||
|
|||
#: ../../templates/cache/04/54/656aa217f895c90eae78024fa060.php:28 |
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:23 |
|||
msgid "Username" |
|||
msgstr "Usuário" |
|||
|
|||
#: ../../templates/cache/04/54/656aa217f895c90eae78024fa060.php:52 |
|||
msgid "Continue" |
|||
msgstr "Prosseguir" |
|||
|
|||
#: ../../templates/cache/f5/e3/343716327c6183713f70a3fb57f1.php:94 |
|||
#: ../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:175 |
|||
#: ../../templates/cache/62/8c/21348d46377c3e1b3f8c476ba376.php:63 |
|||
msgid "Return to dashboard" |
|||
msgstr "Voltar à dashboard" |
|||
|
|||
#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:36 |
|||
msgid "Report date" |
|||
msgstr "Data da denúncia" |
|||
|
|||
#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:45 |
|||
msgid "Reported by" |
|||
msgstr "Denunciado por" |
|||
|
|||
#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:63 |
|||
msgid "Discard abuse report" |
|||
msgstr "Descartar denúncia desnecessária" |
|||
|
|||
#: ../../templates/cache/9c/7b/891291bc84f8844c30cefdb949cf.php:80 |
|||
msgid "Discard all abuse reports by this IP address" |
|||
msgstr "Descartar todas denúncias desnecessárias deste IP" |
|||
|
|||
#: ../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:183 |
|||
msgid "Posting mode: Reply" |
|||
msgstr "Modo de postagem: Resposta" |
|||
|
|||
#: ../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:186 |
|||
#: ../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:232 |
|||
msgid "Return" |
|||
msgstr "Voltar" |
|||
|
|||
#: ../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:76 |
|||
msgid "Post news entry" |
|||
msgstr "Postar nova notícia" |
|||
|
|||
#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:66 |
|||
msgid "(or subnet)" |
|||
msgstr "(ou subnet)" |
|||
|
|||
#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:80 |
|||
msgid "hidden" |
|||
msgstr "oculto" |
|||
|
|||
#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:107 |
|||
msgid "Message" |
|||
msgstr "Mensagem" |
|||
|
|||
#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:117 |
|||
msgid "public; attached to post" |
|||
msgstr "público; anexado à mensagem" |
|||
|
|||
#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:133 |
|||
msgid "Length" |
|||
msgstr "Tamanho" |
|||
|
|||
#: ../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:192 |
|||
msgid "New Ban" |
|||
msgstr "Nova Expulsão" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:20 |
|||
msgid "ID" |
|||
msgstr "ID" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:26 |
|||
msgid "Type" |
|||
msgstr "Tipo" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:35 |
|||
msgid "Last action" |
|||
msgstr "Ultima ação" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:61 |
|||
msgid "Janitor" |
|||
msgstr "Faxineiro" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:64 |
|||
msgid "Mod" |
|||
msgstr "Moderador" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:67 |
|||
msgid "Admin" |
|||
msgstr "Administrador" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:78 |
|||
msgid "none" |
|||
msgstr "nenhum" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:153 |
|||
msgid "Promote" |
|||
msgstr "Promover" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:163 |
|||
msgid "Demote" |
|||
msgstr "Rebaixar" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:173 |
|||
msgid "log" |
|||
msgstr "registro" |
|||
|
|||
#: ../../templates/cache/c5/a7/fac83da087ee6e24edaf09e01122.php:193 |
|||
msgid "PM" |
|||
msgstr "MP" |
|||
|
|||
#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:105 |
|||
msgid "File:" |
|||
msgstr "Arquivo:" |
|||
|
|||
#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:117 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:129 |
|||
msgid "Spoiler Image" |
|||
msgstr "Imagem Spoiler" |
|||
|
|||
#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:463 |
|||
msgid "Reply" |
|||
msgstr "Responder" |
|||
|
|||
#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:490 |
|||
msgid "1 post" |
|||
msgid_plural "%count% posts" |
|||
msgstr[0] "1 mensagem" |
|||
msgstr[1] "%count% mensagens" |
|||
|
|||
#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:496 |
|||
msgid "and" |
|||
msgstr "e" |
|||
|
|||
#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:507 |
|||
msgid "1 image reply" |
|||
msgid_plural "%count% image replies" |
|||
msgstr[0] "1 resposta com imagem" |
|||
msgstr[1] "%count% respostas com imagem" |
|||
|
|||
#: ../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:512 |
|||
msgid "omitted. Click reply to view." |
|||
msgstr "omitidas. Clique em responder para visualizar." |
|||
|
|||
#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:40 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:76 |
|||
msgid "Email" |
|||
msgstr "E-mail" |
|||
|
|||
#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:62 |
|||
msgid "Update" |
|||
msgstr "Atualizar" |
|||
|
|||
#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:69 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:138 |
|||
msgid "Comment" |
|||
msgstr "Comentar" |
|||
|
|||
#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:89 |
|||
msgid "Currently editing raw HTML." |
|||
msgstr "Editando em HTML puro." |
|||
|
|||
#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:96 |
|||
msgid "Edit markup instead?" |
|||
msgstr "Editar markup em vez disso?" |
|||
|
|||
#: ../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:105 |
|||
msgid "Edit raw HTML instead?" |
|||
msgstr "Editar em HTML puro em vez disso?" |
|||
|
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:111 |
|||
msgid "Submit" |
|||
msgstr "Enviar" |
|||
|
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:159 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:185 |
|||
msgid "Verification" |
|||
msgstr "Verification" |
|||
|
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:236 |
|||
msgid "Embed" |
|||
msgstr "Inserir" |
|||
|
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:259 |
|||
msgid "Flags" |
|||
msgstr "Sinalizações" |
|||
|
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:268 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:271 |
|||
msgid "Sticky" |
|||
msgstr "Fixar" |
|||
|
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:280 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:283 |
|||
msgid "Lock" |
|||
msgstr "Trancar" |
|||
|
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:292 |
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:295 |
|||
msgid "Raw HTML" |
|||
msgstr "HTML Puro" |
|||
|
|||
#: ../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:319 |
|||
msgid "(For file deletion.)" |
|||
msgstr "(Para excluir arquivos)" |
@ -1,45 +1,53 @@ |
|||
function phGetCookieName(id) { |
|||
return "ph_hide_" + id; |
|||
function phGetCookieName(board, id) { |
|||
return "ph_hide_" + board + "_" + id; |
|||
} |
|||
function phPostHidden(id) { |
|||
return (localStorage.getItem(phGetCookieName(id)) != null); |
|||
function phPostHidden(board, id) { |
|||
return (localStorage.getItem(phGetCookieName(board, id)) != null); |
|||
} |
|||
function phPostToggle(id) { |
|||
if(phPostHidden(id)) { localStorage.removeItem(phGetCookieName(id)); } |
|||
else { localStorage.setItem(phGetCookieName(id),"yes"); } |
|||
function phPostToggle(board, id) { |
|||
if(phPostHidden(board, id)) { localStorage.removeItem(phGetCookieName(board, id)); } |
|||
else { localStorage.setItem(phGetCookieName(board, id),"yes"); } |
|||
} |
|||
function phGetInnerText(id) { |
|||
if(phPostHidden(id)) { return "[+]"; } |
|||
else { return "[-]"; } |
|||
function phGetInnerText(board, id) { |
|||
if(phPostHidden(board, id)) { return "[+]"; } |
|||
else { return "[–]"; } |
|||
} |
|||
function phGetOpID(element) { |
|||
return Number(element.children("div.post.op").children("p.intro").children("a.post_no.p2").text()); |
|||
} |
|||
function phGetOpBoard(element) { |
|||
return element.data("board"); |
|||
} |
|||
function phPostHandle(element) { |
|||
var id = phGetOpID(element); |
|||
var board = phGetOpBoard(element); |
|||
var preplies = element.children("div.post.reply"); |
|||
var pbody = element.children("div.post.op").children("div.body"); |
|||
var pimage = element.children("a:first").children("img"); |
|||
var pbutton = element.children("div.post.op").children("p.intro").children("a.posthider"); |
|||
var pomitted = element.children("div.post.op").children("span.omitted"); |
|||
if(phPostHidden(id)) { element.addClass("thread-hidden"); pomitted.hide(); preplies.hide(); pbody.hide(); pimage.hide(); pbutton.text("[+]"); } |
|||
else { element.removeClass("thread-hidden"); pomitted.show(); preplies.show(); pbody.show(); pimage.show(); pbutton.text("[-]"); } |
|||
if(phPostHidden(board, id)) { element.addClass("thread-hidden"); pomitted.hide(); preplies.hide(); pbody.hide(); pimage.hide(); pbutton.text("[+]"); } |
|||
else { element.removeClass("thread-hidden"); pomitted.show(); preplies.show(); pbody.show(); pimage.show(); pbutton.text("[–]"); } |
|||
} |
|||
|
|||
function phHandleThread(index, element) { |
|||
// Get thread ID.
|
|||
var pin = $(this).children("div.post.op").children("p.intro"); |
|||
var tid = phGetOpID($(this)); |
|||
if(tid != NaN) { |
|||
$("<a href='javascript:;' class='posthider'>[?]</a>").insertAfter(pin.children('a:last')).click(function(e) { |
|||
var eO = $(e.target); |
|||
var par = eO.parent().parent().parent(); |
|||
phPostToggle(phGetOpBoard(par), phGetOpID(par)); |
|||
phPostHandle(par); |
|||
return false; |
|||
}); |
|||
phPostHandle($(this)); |
|||
} |
|||
} |
|||
|
|||
$(document).ready(function(){ |
|||
$('div[id^="thread"]').each(function(index, element){ |
|||
// Get thread ID.
|
|||
var pin = $(this).children("div.post.op").children("p.intro"); |
|||
var tid = phGetOpID($(this)); |
|||
if(tid != NaN) { |
|||
$("<a href='javascript:;' class='posthider'>[?]</a>").insertAfter(pin.children('a:last')).click(function(e) { |
|||
var eO = $(e.target); |
|||
var par = eO.parent().parent().parent(); |
|||
phPostToggle(phGetOpID(par)); |
|||
phPostHandle(par); |
|||
return false; |
|||
}); |
|||
phPostHandle($(this)); |
|||
} |
|||
}); |
|||
if (active_page != "thread") { |
|||
$('form[name="postcontrols"] > div[id^="thread"]').each(phHandleThread); |
|||
} |
|||
}); |
|||
|
@ -0,0 +1,67 @@ |
|||
body { |
|||
background: #0E0E0E url(data:image/gif;base64,R0lGODlhGAAMAKEEAOXl5ebm5vDw8PHx8SH+EUNyZWF0ZWQgd2l0aCBHSU1QACwAAAAAGAAMAAACRpQiY6cLa146MyY1EJQKjG81lNGRUPOIkgMJHtquBgIO7xwvpbrpduUSuXq8ntEC0bBEylYitdDAdM1ViaobkgKgZwyDLAAAOw==) repeat 0 0!important; |
|||
color: #000; |
|||
} |
|||
a:link, a:visited, p.intro a.email span.name { |
|||
-webkit-transition: all ease-in 0.3s; |
|||
-moz-transition: all ease-in 0.3s; |
|||
color: rgba(0, 0, 0, 0.6); |
|||
text-decoration:none !important; |
|||
} |
|||
a:link:hover { |
|||
-moz-transition: all ease-in 0.5s; |
|||
text-shadow: 0px 0px 2px #000; |
|||
} |
|||
a.post_no { |
|||
color: #fff; |
|||
} |
|||
.boardlist { |
|||
color: #ccc; |
|||
} |
|||
div.post.reply, input, textarea { |
|||
background: rgba(0, 0, 0, 0.1)!important; |
|||
border: 1px solid rgba(0, 0, 0, 0.2)!important; |
|||
border-radius: 2px !important; |
|||
} |
|||
div.post.reply.highlighted { |
|||
background: #f0c0b0; |
|||
border-color: #d9bfb7; |
|||
} |
|||
div.post.reply p.body a { |
|||
color: navy; |
|||
} |
|||
p.intro span.subject { |
|||
color: #000; |
|||
} |
|||
form table tr th { |
|||
background: #EA8; |
|||
} |
|||
div.ban h2 { |
|||
background: #FCA; |
|||
color: inherit; |
|||
} |
|||
div.ban { |
|||
border-color: #000; |
|||
} |
|||
div.ban p { |
|||
color: black; |
|||
} |
|||
div.pages { |
|||
background: #F0E0D6; |
|||
border-color: #D9BFB7; |
|||
} |
|||
div.pages a.selected { |
|||
color: #800; |
|||
} |
|||
hr { |
|||
border-color: rgba(0, 0, 0, 0.2); |
|||
} |
|||
div.boardlist { |
|||
color: rgba(0, 0, 0, 0.2); |
|||
} |
|||
div.boardlist a { |
|||
color: #000; |
|||
} |
|||
table.modlog tr th { |
|||
background: #EA8; |
|||
} |
@ -0,0 +1 @@ |
|||
I'm your overboard boardlist. You can put here anything and I reside in templates/boardlist.html |
@ -1,152 +1,148 @@ |
|||
{% filter remove_whitespace %} |
|||
{# tabs and new lines will be ignored #} |
|||
|
|||
<div id="thread_{{ post.id }}"> |
|||
|
|||
{% if post.embed %} |
|||
{{ post.embed }} |
|||
{% elseif post.file == 'deleted' %} |
|||
<img src="{{ config.image_deleted }}" alt="" /> |
|||
{% elseif post.file and post.file %} |
|||
<p class="fileinfo">{% trans %}File:{% endtrans %} <a href="{{ config.uri_img }}{{ post.file }}">{{ post.file }}</a> <span class="unimportant"> |
|||
( |
|||
{% if post.thumb == 'spoiler' %} |
|||
{% trans %}Spoiler Image{% endtrans %}, |
|||
{% endif %} |
|||
{{ post.filesize|filesize }} |
|||
{% if post.filex and post.filey %} |
|||
, {{ post.filex}}x{{ post.filey }} |
|||
{% if config.show_ratio %} |
|||
, {{ post.ratio }} |
|||
{% endif %} |
|||
{% endif %} |
|||
{% if config.show_filename and post.filename %} |
|||
, |
|||
{% if post.filename|length > config.max_filename_display %} |
|||
<span title="{{ post.filename }}">{{ post.filename|truncate(config.max_filename_display) }}</span> |
|||
{% else %} |
|||
{{ post.filename }} |
|||
{% endif %} |
|||
{% endif %} |
|||
{% if post.thumb != 'file' and config.image_identification %} |
|||
, |
|||
<span class='image_id'> |
|||
<a href="http://imgops.com/{{ config.domain }}{{ config.uri_img }}{{ post.file }}">io</a> |
|||
{% if post.file|extension == 'jpg' %} |
|||
<a href="http://regex.info/exif.cgi?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">e</a> |
|||
{% endif %} |
|||
<a href="http://www.google.com/searchbyimage?image_url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">g</a> |
|||
<a href="http://www.tineye.com/search?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">t</a> |
|||
</span> |
|||
{% endif %} |
|||
) |
|||
</span></p> |
|||
<a href="{{ config.uri_img }}{{ post.file }}" target="_blank"{% if post.thumb == 'file' %} class="file"{% endif %}> |
|||
<img src=" |
|||
{% if post.thumb == 'file' %} |
|||
{{ config.root }} |
|||
{% if config.file_icons[post.filename|extension] %} |
|||
{{ config.file_thumb|sprintf(config.file_icons[post.filename|extension]) }} |
|||
{% else %} |
|||
{{ config.file_thumb|sprintf(config.file_icons.default) }} |
|||
{% endif %} |
|||
{% elseif post.thumb == 'spoiler' %} |
|||
{{ config.root }}{{ config.spoiler_image }} |
|||
{% else %} |
|||
{{ config.uri_thumb }}{{ post.thumb }} |
|||
{% endif %}" style="width:{{ post.thumbx }}px;height:{{ post.thumby }}px" alt="" /></a> |
|||
{% endif %} |
|||
<div class="post op"><p class="intro"{% if not index %} id="{{ post.id }}"{% endif %}> |
|||
<input type="checkbox" class="delete" name="delete_{{ post.id }}" id="delete_{{ post.id }}" /> |
|||
<label for="delete_{{ post.id }}"> |
|||
{% if post.subject|length > 0 %} |
|||
{# show subject #} |
|||
<span class="subject">{{ post.subject }}</span> |
|||
{% endif %} |
|||
{% if post.email|length > 0 %} |
|||
{# start email #} |
|||
<a class="email" href="mailto:{{ post.email }}"> |
|||
{% endif %} |
|||
{% set capcode = post.capcode|capcode %} |
|||
<span {% if capcode.name %}style="{{ capcode.name }}" {% endif %}class="name">{{ post.name }}</span> |
|||
{% if post.trip|length > 0 %} |
|||
<span {% if capcode.trip %}style="{{ capcode.trip }}" {% endif %}class="trip">{{ post.trip }}</span> |
|||
{% endif %} |
|||
{% if post.email|length > 0 %} |
|||
{# end email #} |
|||
</a> |
|||
{% endif %} |
|||
{% if capcode %} |
|||
{{ capcode.cap }} |
|||
{% endif %} |
|||
{% if post.mod and post.mod|hasPermission(config.mod.show_ip, board.uri) %} |
|||
[<a style="margin:0;" href="?/IP/{{ post.ip }}">{{ post.ip }}</a>] |
|||
{% endif %} |
|||
|
|||
<time datetime="{{ post.time|date('%Y-%m-%dT%H:%M:%S') }}{{ timezone() }}">{{ post.time|date(config.post_date) }}</time> |
|||
</label> |
|||
{% if config.poster_ids %} |
|||
ID: {{ post.ip|poster_id(post.id) }} |
|||
{% endif %} |
|||
<a class="post_no" href="http://webchat.6irc.net/?channels=vichan-int-{{ board.uri }}-{{ post.id }}&nick=Anon...."> |
|||
#</a> |
|||
|
|||
<a class="post_no p1" href="{{ post.link }}">No.</a> |
|||
<a class="post_no p2" |
|||
{% if not index %} |
|||
onclick="citeReply({{ post.id }});" |
|||
{% endif %} |
|||
href="{% if index %} |
|||
{{ post.link('q') }} |
|||
{% else %} |
|||
javascript:void(0); |
|||
{% endif %}"> |
|||
{{ post.id }} |
|||
</a> |
|||
{% if post.sticky %} |
|||
<img class="icon" title="Sticky" src="{{ config.image_sticky }}" alt="Sticky" /> |
|||
{% endif %} |
|||
{% if post.locked %} |
|||
<img class="icon" title="Locked" src="{{ config.image_locked }}" alt="Locked" /> |
|||
{% endif %} |
|||
{% if post.bumplocked and (config.mod.view_bumplock < 0 or (post.mod and post.mod|hasPermission(config.mod.view_bumplock, board.uri))) %} |
|||
<img class="icon" title="Bumplocked" src="{{ config.image_bumplocked }}" alt="Bumplocked" /> |
|||
{% endif %} |
|||
{% if index %} |
|||
<a href="{{ post.root }}{{ board.dir }}{{ config.dir.res }}{{ config.file_page|sprintf(post.id) }}">[{% trans %}Reply{% endtrans %}]</a> |
|||
{% endif %} |
|||
{{ post.postControls }} |
|||
</p> |
|||
<div class="body"> |
|||
{% endfilter %}{% if index %}{{ post.body|truncate_body(post.link) }}{% else %}{{ post.body }}{% endif %}{% filter remove_whitespace %} |
|||
</div> |
|||
{% if post.omitted or post.omitted_images %} |
|||
<span class="omitted"> |
|||
{% if post.omitted %} |
|||
{% trans %} |
|||
1 post |
|||
{% plural post.omitted %} |
|||
{{ count }} posts |
|||
{% endtrans %} |
|||
{% if post.omitted_images %} |
|||
{% trans %}and{% endtrans %} |
|||
{% endif %} |
|||
{% endif %} |
|||
{% if post.omitted_images %} |
|||
{% trans %} |
|||
1 image reply |
|||
{% plural post.omitted_images %} |
|||
{{ count }} image replies |
|||
{% endtrans %} |
|||
{% endif %} {% trans %}omitted. Click reply to view.{% endtrans %} |
|||
</span> |
|||
{% endif %} |
|||
{% if not index %} |
|||
{% endif %} |
|||
</div>{% endfilter %} |
|||
{% set hr = post.hr %} |
|||
{% for post in post.posts %} |
|||
{% include 'post_reply.html' %} |
|||
{% endfor %} |
|||
<br class="clear"/>{% if hr %}<hr/>{% endif %} |
|||
</div> |
|||
{% filter remove_whitespace %} |
|||
{# tabs and new lines will be ignored #} |
|||
|
|||
<div id="thread_{{ post.id }}" data-board="{{ board.uri }}"> |
|||
|
|||
{% if post.embed %} |
|||
{{ post.embed }} |
|||
{% elseif post.file == 'deleted' %} |
|||
<img src="{{ config.image_deleted }}" alt="" /> |
|||
{% elseif post.file and post.file %} |
|||
<p class="fileinfo">{% trans %}File:{% endtrans %} <a href="{{ config.uri_img }}{{ post.file }}">{{ post.file }}</a> <span class="unimportant"> |
|||
( |
|||
{% if post.thumb == 'spoiler' %} |
|||
{% trans %}Spoiler Image{% endtrans %}, |
|||
{% endif %} |
|||
{{ post.filesize|filesize }} |
|||
{% if post.filex and post.filey %} |
|||
, {{ post.filex}}x{{ post.filey }} |
|||
{% if config.show_ratio %} |
|||
, {{ post.ratio }} |
|||
{% endif %} |
|||
{% endif %} |
|||
{% if config.show_filename and post.filename %} |
|||
, |
|||
{% if post.filename|length > config.max_filename_display %} |
|||
<span class="postfilename" title="{{ post.filename|bidi_cleanup }}">{{ post.filename|truncate(config.max_filename_display)|bidi_cleanup }}</span> |
|||
{% else %} |
|||
<span class="postfilename">{{ post.filename|bidi_cleanup }}</span> |
|||
{% endif %} |
|||
{% endif %} |
|||
{% if post.thumb != 'file' and config.image_identification %} |
|||
, |
|||
<span class='image_id'> |
|||
<a href="http://imgops.com/{{ config.domain }}{{ config.uri_img }}{{ post.file }}">io</a> |
|||
{% if post.file|extension == 'jpg' %} |
|||
<a href="http://regex.info/exif.cgi?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">e</a> |
|||
{% endif %} |
|||
<a href="http://www.google.com/searchbyimage?image_url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">g</a> |
|||
<a href="http://www.tineye.com/search?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">t</a> |
|||
</span> |
|||
{% endif %} |
|||
) |
|||
</span></p> |
|||
<a href="{{ config.uri_img }}{{ post.file }}" target="_blank"{% if post.thumb == 'file' %} class="file"{% endif %}> |
|||
<img src=" |
|||
{% if post.thumb == 'file' %} |
|||
{{ config.root }} |
|||
{% if config.file_icons[post.filename|extension] %} |
|||
{{ config.file_thumb|sprintf(config.file_icons[post.filename|extension]) }} |
|||
{% else %} |
|||
{{ config.file_thumb|sprintf(config.file_icons.default) }} |
|||
{% endif %} |
|||
{% elseif post.thumb == 'spoiler' %} |
|||
{{ config.root }}{{ config.spoiler_image }} |
|||
{% else %} |
|||
{{ config.uri_thumb }}{{ post.thumb }} |
|||
{% endif %}" style="width:{{ post.thumbx }}px;height:{{ post.thumby }}px" alt="" /></a> |
|||
{% endif %} |
|||
<div class="post op"><p class="intro"{% if not index %} id="{{ post.id }}"{% endif %}> |
|||
<input type="checkbox" class="delete" name="delete_{{ post.id }}" id="delete_{{ post.id }}" /> |
|||
<label for="delete_{{ post.id }}"> |
|||
{% if post.subject|length > 0 %} |
|||
{# show subject #} |
|||
<span class="subject">{{ post.subject|bidi_cleanup }}</span> |
|||
{% endif %} |
|||
{% if post.email|length > 0 %} |
|||
{# start email #} |
|||
<a class="email" href="mailto:{{ post.email }}"> |
|||
{% endif %} |
|||
{% set capcode = post.capcode|capcode %} |
|||
<span {% if capcode.name %}style="{{ capcode.name }}" {% endif %}class="name">{{ post.name|bidi_cleanup }}</span> |
|||
{% if post.trip|length > 0 %} |
|||
<span {% if capcode.trip %}style="{{ capcode.trip }}" {% endif %}class="trip">{{ post.trip }}</span> |
|||
{% endif %} |
|||
{% if post.email|length > 0 %} |
|||
{# end email #} |
|||
</a> |
|||
{% endif %} |
|||
{% if capcode %} |
|||
{{ capcode.cap }} |
|||
{% endif %} |
|||
{% if post.mod and post.mod|hasPermission(config.mod.show_ip, board.uri) %} |
|||
[<a style="margin:0;" href="?/IP/{{ post.ip }}">{{ post.ip }}</a>] |
|||
{% endif %} |
|||
<time datetime="{{ post.time|date('%Y-%m-%dT%H:%M:%S') }}{{ timezone() }}">{{ post.time|date(config.post_date) }}</time> |
|||
</label> |
|||
{% if config.poster_ids %} |
|||
ID: {{ post.ip|poster_id(post.id) }} |
|||
{% endif %} |
|||
<a class="post_no" href="{{ post.link }}">No.</a> |
|||
<a class="post_no" |
|||
{% if not index %} |
|||
onclick="citeReply({{ post.id }});" |
|||
{% endif %} |
|||
href="{% if index %} |
|||
{{ post.link('q') }} |
|||
{% else %} |
|||
javascript:void(0); |
|||
{% endif %}"> |
|||
{{ post.id }} |
|||
</a> |
|||
{% if post.sticky %} |
|||
<img class="icon" title="Sticky" src="{{ config.image_sticky }}" alt="Sticky" /> |
|||
{% endif %} |
|||
{% if post.locked %} |
|||
<img class="icon" title="Locked" src="{{ config.image_locked }}" alt="Locked" /> |
|||
{% endif %} |
|||
{% if post.bumplocked and (config.mod.view_bumplock < 0 or (post.mod and post.mod|hasPermission(config.mod.view_bumplock, board.uri))) %} |
|||
<img class="icon" title="Bumplocked" src="{{ config.image_bumplocked }}" alt="Bumplocked" /> |
|||
{% endif %} |
|||
{% if index %} |
|||
<a href="{{ post.root }}{{ board.dir }}{{ config.dir.res }}{{ config.file_page|sprintf(post.id) }}">[{% trans %}Reply{% endtrans %}]</a> |
|||
{% endif %} |
|||
{{ post.postControls }} |
|||
</p> |
|||
<div class="body"> |
|||
{% endfilter %}{% if index %}{{ post.body|truncate_body(post.link) }}{% else %}{{ post.body }}{% endif %}{% filter remove_whitespace %} |
|||
</div> |
|||
{% if post.omitted or post.omitted_images %} |
|||
<span class="omitted"> |
|||
{% if post.omitted %} |
|||
{% trans %} |
|||
1 post |
|||
{% plural post.omitted %} |
|||
{{ count }} posts |
|||
{% endtrans %} |
|||
{% if post.omitted_images %} |
|||
{% trans %}and{% endtrans %} |
|||
{% endif %} |
|||
{% endif %} |
|||
{% if post.omitted_images %} |
|||
{% trans %} |
|||
1 image reply |
|||
{% plural post.omitted_images %} |
|||
{{ count }} image replies |
|||
{% endtrans %} |
|||
{% endif %} {% trans %}omitted. Click reply to view.{% endtrans %} |
|||
</span> |
|||
{% endif %} |
|||
{% if not index %} |
|||
{% endif %} |
|||
</div>{% endfilter %} |
|||
{% set hr = post.hr %} |
|||
{% for post in post.posts %} |
|||
{% include 'post_reply.html' %} |
|||
{% endfor %} |
|||
<br class="clear"/>{% if hr %}<hr/>{% endif %} |
|||
</div> |
@ -0,0 +1,38 @@ |
|||
img { |
|||
float:none!important; |
|||
margin: auto; |
|||
margin-bottom: 12px; |
|||
max-height: 150px; |
|||
max-width: 200px; |
|||
box-shadow: 0 0 4px rgba(0, 0, 0, 0.55); |
|||
border: 2px solid rgba(153, 153, 153, 0); |
|||
} |
|||
|
|||
/* |
|||
img:hover { |
|||
border: 2px solid rgba(153, 153, 153, 0.27); |
|||
} |
|||
*/ |
|||
|
|||
div.thread { |
|||
display: inline-block; |
|||
vertical-align: top; |
|||
margin-bottom:25px; |
|||
margin-left: 20px; |
|||
margin-right: 15px; |
|||
text-align:center; |
|||
font-weight:normal; |
|||
width:205px; |
|||
overflow:hidden; |
|||
position: relative; |
|||
font-size:11px; |
|||
padding: 15px; |
|||
background: rgba(182, 182, 182, 0.12); |
|||
border: 2px solid rgba(111, 111, 111, 0.34); |
|||
max-height:300px; |
|||
} |
|||
|
|||
div.thread:hover { |
|||
background: #D6DAF0; |
|||
border-color: #B7C5D9; |
|||
} |
@ -0,0 +1,36 @@ |
|||
{% filter remove_whitespace %} |
|||
<!doctype html> |
|||
<html> |
|||
<head> |
|||
<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> |
|||
<title>{{ settings.title }}</title> |
|||
<link rel="stylesheet" media="screen" href="{{ config.url_stylesheet }}"/> |
|||
<link rel="stylesheet" media="screen" href="{{ config.root }}{{ settings.css }}"/> |
|||
{% if config.url_favicon %}<link rel="shortcut icon" href="{{ config.url_favicon }}" />{% endif %} |
|||
</head> |
|||
<body> |
|||
{{ boardlist.top }} |
|||
<header> |
|||
<h1>{{ settings.title }} (<a href="{{link}}">/{{ board }}/</a>)</h1> |
|||
<div class="subtitle">{{ settings.subtitle }}</div> |
|||
</header> |
|||
|
|||
<ul> |
|||
{% for post in recent_posts %} |
|||
<div class="thread"> |
|||
<a href="{{post.link}}"> |
|||
<img src="{{post.file}}" class="{{post.board}}" title="{{post.bump|date('%b %d %H:%M')}}"> |
|||
</a> |
|||
<span class="replies"> |
|||
<strong>{% trans %}1 reply{% plural post.reply_count %}{{ count }} replies{% endtrans %}</strong><br/> |
|||
{{ post.body }} |
|||
</span> |
|||
</div> |
|||
{% endfor %} |
|||
</ul> |
|||
|
|||
<hr/> |
|||
<p class="unimportant" style="margin-top:20px;text-align:center;">Powered by <a href="http://tinyboard.org/">Tinyboard</a> {{ config.version }} | <a href="http://tinyboard.org/">Tinyboard</a> Copyright © 2010-2013 Tinyboard Development Group</p> |
|||
</body> |
|||
</html> |
|||
{% endfilter %} |
@ -0,0 +1,42 @@ |
|||
<?php |
|||
$theme = array(); |
|||
|
|||
// Theme name |
|||
$theme['name'] = 'Catalog'; |
|||
// Description (you can use Tinyboard markup here) |
|||
$theme['description'] = 'Show a post catalog.'; |
|||
$theme['version'] = 'v0.1'; |
|||
|
|||
// Theme configuration |
|||
$theme['config'] = Array(); |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Title', |
|||
'name' => 'title', |
|||
'type' => 'text', |
|||
'default' => 'Catalog' |
|||
); |
|||
|
|||
$__boards = listBoards(); |
|||
$__default_boards = Array(); |
|||
foreach ($__boards as $__board) |
|||
$__default_boards[] = $__board['uri']; |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Included boards', |
|||
'name' => 'boards', |
|||
'type' => 'text', |
|||
'comment' => '(space seperated)', |
|||
'default' => implode(' ', $__default_boards) |
|||
); |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'CSS file', |
|||
'name' => 'css', |
|||
'type' => 'text', |
|||
'default' => 'catalog.css', |
|||
'comment' => '(eg. "catalog.css")' |
|||
); |
|||
|
|||
// Unique function name for building everything |
|||
$theme['build_function'] = 'catalog_build'; |
@ -0,0 +1,60 @@ |
|||
<?php |
|||
require 'info.php'; |
|||
|
|||
function catalog_build($action, $settings, $board) { |
|||
global $config; |
|||
|
|||
// Possible values for $action: |
|||
// - all (rebuild everything, initialization) |
|||
// - news (news has been updated) |
|||
// - boards (board list changed) |
|||
// - post (a reply has been made) |
|||
// - post-thread (a thread has been made) |
|||
|
|||
$boards = explode(' ', $settings['boards']); |
|||
|
|||
if ($action == 'all') { |
|||
copy('templates/themes/catalog/catalog.css', $config['dir']['home'] . $settings['css']); |
|||
|
|||
foreach ($boards as $board) { |
|||
$b = new Catalog(); |
|||
$b->build($settings, $board); |
|||
} |
|||
} elseif ($action == 'post-thread' && in_array($board, $boards)) { |
|||
$b = new Catalog(); |
|||
$b->build($settings, $board); |
|||
} |
|||
} |
|||
|
|||
// Wrap functions in a class so they don't interfere with normal Tinyboard operations |
|||
class Catalog { |
|||
public function build($settings, $board_name) { |
|||
global $config, $board; |
|||
|
|||
openBoard($board_name); |
|||
|
|||
$recent_images = array(); |
|||
$recent_posts = array(); |
|||
$stats = array(); |
|||
|
|||
$query = query(sprintf("SELECT *, `id` AS `thread_id`, (SELECT COUNT(*) FROM `posts_%s` WHERE `thread` = `thread_id`) AS `reply_count`, '%s' AS `board` FROM `posts_%s` WHERE `thread` IS NULL ORDER BY `bump` DESC", $board_name, $board_name, $board_name)) or error(db_error()); |
|||
|
|||
while ($post = $query->fetch()) { |
|||
$post['link'] = $config['root'] . $board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], ($post['thread'] ? $post['thread'] : $post['id'])); |
|||
$post['board_name'] = $board['name']; |
|||
$post['file'] = $config['uri_thumb'] . $post['thumb']; |
|||
$recent_posts[] = $post; |
|||
} |
|||
|
|||
file_write($config['dir']['home'] . $board_name . '/catalog.html', Element('themes/catalog/catalog.html', Array( |
|||
'settings' => $settings, |
|||
'config' => $config, |
|||
'boardlist' => createBoardlist(), |
|||
'recent_images' => $recent_images, |
|||
'recent_posts' => $recent_posts, |
|||
'stats' => $stats, |
|||
'board' => $board_name, |
|||
'link' => $config['root'] . $board['dir'] |
|||
))); |
|||
} |
|||
}; |
@ -0,0 +1,53 @@ |
|||
<?php |
|||
$theme = Array(); |
|||
|
|||
// Theme name |
|||
$theme['name'] = 'Sitemap Generator'; |
|||
// Description (you can use Tinyboard markup here) |
|||
$theme['description'] = 'Generates an XML sitemap to help search engines find all threads and pages.'; |
|||
$theme['version'] = 'v1.0'; |
|||
|
|||
// Theme configuration |
|||
$theme['config'] = Array(); |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Sitemap Path', |
|||
'name' => 'path', |
|||
'type' => 'text', |
|||
'default' => 'sitemap.xml', |
|||
'size' => '20' |
|||
); |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'URL prefix', |
|||
'name' => 'url', |
|||
'type' => 'text', |
|||
'comment' => '(with trailing slash)', |
|||
'default' => 'http://' . (isset ($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : "localhost") . $config['root'], |
|||
'size' => '20' |
|||
); |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Thread change frequency', |
|||
'name' => 'changefreq', |
|||
'type' => 'text', |
|||
'comment' => '(eg. "hourly", "daily", etc.)', |
|||
'default' => 'hourly', |
|||
'size' => '20' |
|||
); |
|||
|
|||
$__boards = listBoards(); |
|||
$__default_boards = Array(); |
|||
foreach ($__boards as $__board) |
|||
$__default_boards[] = $__board['uri']; |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Boards', |
|||
'name' => 'boards', |
|||
'type' => 'text', |
|||
'comment' => '(boards to include; space seperated)', |
|||
'size' => 24, |
|||
'default' => implode(' ', $__default_boards) |
|||
); |
|||
|
|||
$theme['build_function'] = 'sitemap_build'; |
@ -0,0 +1,19 @@ |
|||
{% filter remove_whitespace %} |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> |
|||
{% for board in boards %} |
|||
<url> |
|||
<loc>{{ settings.url ~ (config.board_path | format(board)) ~ config.file_index }}</loc> |
|||
</url> |
|||
{% endfor %} |
|||
{% for board, thread_list in threads %} |
|||
{% for thread in thread_list %} |
|||
<url> |
|||
<loc>{{ settings.url ~ (config.board_path | format(board)) ~ config.dir.res ~ (config.file_page | format(thread.thread_id)) }}</loc> |
|||
<lastmod>{{ thread.lastmod | date('%Y-%m-%dT%H:%M:%S') }}{{ timezone() }}</lastmod> |
|||
<changefreq>{{ settings.changefreq }}</changefreq> |
|||
</url> |
|||
{% endfor %} |
|||
{% endfor %} |
|||
</urlset> |
|||
{% endfilter %} |
@ -0,0 +1,32 @@ |
|||
<?php |
|||
require 'info.php'; |
|||
|
|||
function sitemap_build($action, $settings, $board) { |
|||
global $config; |
|||
|
|||
// Possible values for $action: |
|||
// - all (rebuild everything, initialization) |
|||
// - news (news has been updated) |
|||
// - boards (board list changed) |
|||
// - post (a post has been made) |
|||
// - thread (a thread has been made) |
|||
|
|||
if ($action != 'post' && $action != 'post-thread') |
|||
return; |
|||
|
|||
$boards = explode(' ', $settings['boards']); |
|||
|
|||
$threads = array(); |
|||
|
|||
foreach ($boards as $board) { |
|||
$query = query(sprintf("SELECT `id` AS `thread_id`, (SELECT `time` FROM `posts_%s` WHERE `thread` = `thread_id` OR `id` = `thread_id` ORDER BY `time` DESC LIMIT 1) AS `lastmod` FROM `posts_%s` WHERE `thread` IS NULL", $board, $board)) or error(db_error()); |
|||
$threads[$board] = $query->fetchAll(PDO::FETCH_ASSOC); |
|||
} |
|||
|
|||
file_write($settings['path'], Element('themes/sitemap/sitemap.xml', Array( |
|||
'settings' => $settings, |
|||
'config' => $config, |
|||
'threads' => $threads, |
|||
'boards' => $boards, |
|||
))); |
|||
} |
@ -0,0 +1,53 @@ |
|||
<?php |
|||
$theme = Array(); |
|||
|
|||
// Theme name |
|||
$theme['name'] = 'Ukko'; |
|||
// Description (you can use Tinyboard markup here) |
|||
$theme['description'] = 'Board with threads and messages from all boards'; |
|||
$theme['version'] = 'v0.1'; |
|||
|
|||
// Theme configuration |
|||
$theme['config'] = Array(); |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Board name', |
|||
'name' => 'title', |
|||
'type' => 'text', |
|||
'default' => 'Ukko' |
|||
); |
|||
$theme['config'][] = Array( |
|||
'title' => 'Board URI', |
|||
'name' => 'uri', |
|||
'type' => 'text', |
|||
'comment' => '(ukko for example)' |
|||
); |
|||
$theme['config'][] = Array( |
|||
'title' => 'Subtitle', |
|||
'name' => 'subtitle', |
|||
'type' => 'text', |
|||
'comment' => '(%s = thread limit. for example "%s freshly bumped threads")' |
|||
); |
|||
$theme['config'][] = Array( |
|||
'title' => 'Excluded boards', |
|||
'name' => 'exclude', |
|||
'type' => 'text', |
|||
'comment' => '(space seperated)' |
|||
); |
|||
$theme['config'][] = Array( |
|||
'title' => 'Number of threads', |
|||
'name' => 'thread_limit', |
|||
'type' => 'text', |
|||
'default' => '15', |
|||
); |
|||
// Unique function name for building everything |
|||
$theme['build_function'] = 'ukko_build'; |
|||
$theme['install_callback'] = 'ukko_install'; |
|||
|
|||
if(!function_exists('ukko_install')) { |
|||
function ukko_install($settings) { |
|||
if (!file_exists($settings['uri'])) |
|||
@mkdir($settings['uri'], 0777) or error("Couldn't create " . $settings['uri'] . ". Check permissions.", true); |
|||
} |
|||
} |
|||
|
@ -0,0 +1,111 @@ |
|||
<?php |
|||
require 'info.php'; |
|||
|
|||
function ukko_build($action, $settings) { |
|||
$ukko = new ukko(); |
|||
$ukko->settings = $settings; |
|||
$ukko->build(); |
|||
} |
|||
|
|||
class ukko { |
|||
public $settings; |
|||
public function build($mod = false) { |
|||
global $config; |
|||
$boards = listBoards(); |
|||
|
|||
$body = ''; |
|||
$overflow = array(); |
|||
$board = array( |
|||
'url' => $this->settings['uri'], |
|||
'name' => $this->settings['title'], |
|||
'title' => sprintf($this->settings['subtitle'], $this->settings['thread_limit']) |
|||
); |
|||
|
|||
$query = ''; |
|||
foreach($boards as &$_board) { |
|||
if(in_array($_board['uri'], explode(' ', $this->settings['exclude']))) |
|||
continue; |
|||
$query .= sprintf("SELECT *, '%s' AS `board` FROM `posts_%s` WHERE `thread` IS NULL UNION ALL ", $_board['uri'], $_board['uri']); |
|||
} |
|||
$query = preg_replace('/UNION ALL $/', 'ORDER BY `bump` DESC', $query); |
|||
$query = query($query) or error(db_error()); |
|||
|
|||
$count = 0; |
|||
$threads = array(); |
|||
while($post = $query->fetch()) { |
|||
|
|||
if(!isset($threads[$post['board']])) { |
|||
$threads[$post['board']] = 1; |
|||
} else { |
|||
$threads[$post['board']] += 1; |
|||
} |
|||
|
|||
if($count < $this->settings['thread_limit']) { |
|||
openBoard($post['board']); |
|||
$thread = new Thread( |
|||
$post['id'], $post['subject'], $post['email'], $post['name'], $post['trip'], $post['capcode'], $post['body'], $post['time'], |
|||
$post['thumb'], $post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'], $post['fileheight'], $post['filesize'], |
|||
$post['filename'], $post['ip'], $post['sticky'], $post['locked'], $post['sage'], $post['embed'], $mod ? '?/' : $config['root'], $mod |
|||
); |
|||
|
|||
$posts = prepare(sprintf("SELECT * FROM `posts_%s` WHERE `thread` = :id ORDER BY `id` DESC LIMIT :limit", $post['board'])); |
|||
$posts->bindValue(':id', $post['id']); |
|||
$posts->bindValue(':limit', ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']), PDO::PARAM_INT); |
|||
$posts->execute() or error(db_error($posts)); |
|||
|
|||
$num_images = 0; |
|||
while ($po = $posts->fetch()) { |
|||
if ($po['file']) |
|||
$num_images++; |
|||
|
|||
$thread->add(new Post( |
|||
$po['id'], $post['id'], $po['subject'], $po['email'], $po['name'], $po['trip'], $po['capcode'], $po['body'], $po['time'], |
|||
$po['thumb'], $po['thumbwidth'], $po['thumbheight'], $po['file'], $po['filewidth'], $po['fileheight'], $po['filesize'], |
|||
$po['filename'], $po['ip'], $po['embed'], $mod ? '?/' : $config['root'], $mod) |
|||
); |
|||
|
|||
} |
|||
if ($posts->rowCount() == ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview'])) { |
|||
$ct = prepare(sprintf("SELECT COUNT(`id`) as `num` FROM `posts_%s` WHERE `thread` = :thread UNION ALL SELECT COUNT(`id`) FROM `posts_%s` WHERE `file` IS NOT NULL AND `thread` = :thread", $post['board'], $post['board'])); |
|||
$ct->bindValue(':thread', $post['id'], PDO::PARAM_INT); |
|||
$ct->execute() or error(db_error($count)); |
|||
|
|||
$c = $ct->fetch(); |
|||
$thread->omitted = $c['num'] - ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']); |
|||
|
|||
$c = $ct->fetch(); |
|||
$thread->omitted_images = $c['num'] - $num_images; |
|||
} |
|||
|
|||
|
|||
$thread->posts = array_reverse($thread->posts); |
|||
$body .= '<h2><a href="' . $config['root'] . $post['board'] . '">/' . $post['board'] . '/</a></h2>'; |
|||
$body .= $thread->build(true); |
|||
} else { |
|||
$page = 'index'; |
|||
if(floor($threads[$post['board']] / $config['threads_per_page']) > 0) { |
|||
$page = floor($threads[$post['board']] / $config['threads_per_page']) + 1; |
|||
} |
|||
$overflow[] = array('id' => $post['id'], 'board' => $post['board'], 'page' => $page . '.html'); |
|||
} |
|||
|
|||
$count += 1; |
|||
} |
|||
|
|||
$body .= '<script> var overflow = ' . json_encode($overflow) . '</script>'; |
|||
$body .= '<script type="text/javascript" src="ukko.js"></script>'; |
|||
|
|||
file_write($this->settings['uri'] . '/index.html', Element('index.html', array( |
|||
'config' => $config, |
|||
'board' => $board, |
|||
'no_post_form' => true, |
|||
'body' => $body, |
|||
'boardlist' => createBoardlist($mod) |
|||
))); |
|||
|
|||
file_write($this->settings['uri'] . '/ukko.js', Element('themes/ukko/ukko.js', array())); |
|||
} |
|||
|
|||
}; |
|||
|
|||
?> |
After Width: | Height: | Size: 15 KiB |
@ -0,0 +1,37 @@ |
|||
var cache = new Array(), |
|||
thread = false, |
|||
loading = false; |
|||
$(document).ready(function() { |
|||
$(window).on('scroll', function() { |
|||
if($(window).scrollTop() + $(window).height() + 100 > $(document).height() && !loading && overflow.length > 0) { |
|||
var page = '../' + overflow[0].board + '/' + overflow[0].page; |
|||
if($.inArray(page, cache) != -1) { |
|||
thread = $('div#thread_' + overflow[0].id); |
|||
if(thread.length > 0) { |
|||
thread.prepend('<h2><a href="/' + overflow[0].board + '/">/' + overflow[0].board + '/</a></h2>'); |
|||
$('div[id*="thread_"]').last().after(thread.attr('data-board', overflow[0].board).css('display', 'block')); |
|||
overflow.shift(); |
|||
} |
|||
} else { |
|||
loading = true; |
|||
$.get(page, function(data) { |
|||
cache.push(page); |
|||
|
|||
$(data).find('div[id*="thread_"]').each(function() { |
|||
$('body').prepend($(this).css('display', 'none').attr('data-board', overflow[0].board)); |
|||
}); |
|||
|
|||
thread = $('div#thread_' + overflow[0].id + '[data-board="' + overflow[0].board + '"]'); |
|||
if(thread.length > 0) { |
|||
thread.prepend('<h2><a href="/' + overflow[0].board + '/">/' + overflow[0].board + '/</a></h2>'); |
|||
$('div[id*="thread_"]').last().after(thread.attr('data-board', overflow[0].board).css('display', 'block')); |
|||
overflow.shift(); |
|||
} |
|||
|
|||
loading = false; |
|||
}); |
|||
} |
|||
} |
|||
}); |
|||
|
|||
}); |
@ -0,0 +1,52 @@ |
|||
#!/usr/bin/php |
|||
<?php |
|||
/* |
|||
* benchmark.php - benchmarks thumbnailing methods |
|||
* |
|||
*/ |
|||
|
|||
require dirname(__FILE__) . '/inc/cli.php'; |
|||
require 'inc/image.php'; |
|||
|
|||
// move back to this directory |
|||
chdir(dirname(__FILE__)); |
|||
|
|||
if(count($argv) != 2) |
|||
die("Usage: {$argv[0]} [file]\n"); |
|||
|
|||
$file = $argv[1]; |
|||
$extension = strtolower(substr($file, strrpos($file, '.') + 1)); |
|||
$out = tempnam($config['tmp'], 'thumb'); |
|||
$count = 300; |
|||
|
|||
function benchmark($method) { |
|||
global $config, $file, $extension, $out, $count; |
|||
|
|||
$config['thumb_method'] = $method; |
|||
|
|||
printf("Method: %s\nThumbnailing %d times... ", $method, $count); |
|||
|
|||
$start = microtime(true); |
|||
for($i = 0; $i < $count; $i++) { |
|||
$image = new Image($file, $extension); |
|||
$thumb = $image->resize( |
|||
$config['thumb_ext'] ? $config['thumb_ext'] : $extension, |
|||
$config['thumb_width'], |
|||
$config['thumb_height'] |
|||
); |
|||
|
|||
$thumb->to($out); |
|||
$thumb->_destroy(); |
|||
$image->destroy(); |
|||
} |
|||
$end = microtime(true); |
|||
|
|||
printf("Took %.2f seconds (%.2f/second; %.2f ms)\n", $end - $start, $rate = ($count / ($end - $start)), 1000 / $rate); |
|||
|
|||
unlink($out); |
|||
} |
|||
|
|||
benchmark('gd'); |
|||
benchmark('imagick'); |
|||
benchmark('convert'); |
|||
|
@ -0,0 +1,44 @@ |
|||
#!/usr/bin/php |
|||
<?php |
|||
|
|||
/* |
|||
* i18n_compile.php - compiles the i18n |
|||
* |
|||
* Options: |
|||
* -l [locale], --locale=[locale] |
|||
* Compiles [locale] locale. |
|||
* |
|||
*/ |
|||
|
|||
require dirname(__FILE__) . '/inc/cli.php'; |
|||
|
|||
// parse command line |
|||
$opts = getopt('l:', Array('locale:')); |
|||
$options = Array(); |
|||
|
|||
$options['locale'] = isset($opts['l']) ? $opts['l'] : (isset($opts['locale']) ? $opts['locale'] : false); |
|||
|
|||
if ($options['locale']) $locales = array($options['locale']); |
|||
else die("Error: no locales specified; use -l switch, eg. -l pl_PL\n"); |
|||
|
|||
foreach ($locales as $loc) { |
|||
if (file_exists ($locdir = "inc/locale/".$loc)) { |
|||
if (!is_dir ($locdir)) { |
|||
continue; |
|||
} |
|||
} |
|||
else { |
|||
die("Error: $locdir does not exist\n"); |
|||
} |
|||
|
|||
// Generate tinyboard.po |
|||
if (file_exists($locdir."/LC_MESSAGES/tinyboard.po")) $join = "-j"; |
|||
else $join = ""; |
|||
passthru("cd $locdir/LC_MESSAGES; |
|||
msgfmt tinyboard.po -o tinyboard.mo"); |
|||
|
|||
// Generate javascript.po |
|||
passthru("cd tools/inc/lib/jsgettext/; |
|||
php po2json.php -i ../../../../$locdir/LC_MESSAGES/javascript.po \ |
|||
-o ../../../../$locdir/LC_MESSAGES/javascript.js"); |
|||
} |
@ -0,0 +1,47 @@ |
|||
#!/usr/bin/php |
|||
<?php |
|||
|
|||
/* |
|||
* i18n_extract.php - extracts the strings and updates all locales |
|||
* |
|||
* Options: |
|||
* -l [locale], --locale=[locale] |
|||
* Updates only [locale] locale. If it does not exist yet, we create a new directory. |
|||
* |
|||
*/ |
|||
|
|||
require dirname(__FILE__) . '/inc/cli.php'; |
|||
|
|||
// parse command line |
|||
$opts = getopt('l:', Array('locale:')); |
|||
$options = Array(); |
|||
|
|||
$options['locale'] = isset($opts['l']) ? $opts['l'] : (isset($opts['locale']) ? $opts['locale'] : false); |
|||
|
|||
$locales = glob("inc/locale/*"); |
|||
$locales = array_map("basename", $locales); |
|||
|
|||
if ($options['locale']) $locales = array($options['locale']); |
|||
|
|||
|
|||
foreach ($locales as $loc) { |
|||
if (file_exists ($locdir = "inc/locale/".$loc)) { |
|||
if (!is_dir ($locdir)) { |
|||
continue; |
|||
} |
|||
} |
|||
else { |
|||
mkdir($locdir); |
|||
mkdir($locdir."/LC_MESSAGES"); |
|||
} |
|||
|
|||
// Generate tinyboard.po |
|||
if (file_exists($locdir."/LC_MESSAGES/tinyboard.po")) $join = "-j"; |
|||
else $join = ""; |
|||
passthru("cd $locdir/LC_MESSAGES; |
|||
xgettext -d tinyboard -L php --from-code utf-8 $join -c $(find ../../../../ -name \*.php)"); |
|||
|
|||
// Generate javascript.po |
|||
passthru("cd $locdir/LC_MESSAGES; |
|||
xgettext -d javascript -L Python --force-po --from-code utf-8 $join -c $(find ../../../../js/ -name \*.js)"); |
|||
} |
@ -0,0 +1,100 @@ |
|||
<?php |
|||
|
|||
/* |
|||
* This script will look for Tinyboard in the following places (in order): |
|||
* - $TINYBOARD_PATH environment varaible |
|||
* - ./ |
|||
* - ./Tinyboard/ |
|||
* - ../ |
|||
*/ |
|||
|
|||
set_time_limit(0); |
|||
$shell_path = getcwd(); |
|||
|
|||
if(getenv('TINYBOARD_PATH') !== false) |
|||
$dir = getenv('TINYBOARD_PATH'); |
|||
elseif(file_exists('inc/functions.php')) |
|||
$dir = false; |
|||
elseif(file_exists('Tinyboard') && is_dir('Tinyboard') && file_exists('Tinyboard/inc/functions.php')) |
|||
$dir = 'Tinyboard'; |
|||
elseif(file_exists('../inc/functions.php')) |
|||
$dir = '..'; |
|||
else |
|||
die("Could not locate Tinyboard directory!\n"); |
|||
|
|||
if($dir && !chdir($dir)) |
|||
die("Could not change directory to {$dir}\n"); |
|||
|
|||
if(!getenv('TINYBOARD_PATH')) { |
|||
// follow symlink |
|||
chdir(realpath('inc') . '/..'); |
|||
} |
|||
|
|||
putenv('TINYBOARD_PATH=' . getcwd()); |
|||
|
|||
require 'inc/functions.php'; |
|||
require 'inc/mod.php'; |
|||
|
|||
$mod = Array( |
|||
'id' => -1, |
|||
'type' => ADMIN, |
|||
'username' => '?', |
|||
'boards' => Array('*') |
|||
); |
|||
|
|||
function get_httpd_privileges() { |
|||
global $config, $shell_path, $argv; |
|||
|
|||
if(php_sapi_name() != 'cli') |
|||
die("get_httpd_privileges(): invoked from HTTP client.\n"); |
|||
|
|||
echo "Dropping priviledges...\n"; |
|||
|
|||
if(!is_writable('.')) |
|||
die("get_httpd_privileges(): web directory is not writable\n"); |
|||
|
|||
$filename = '.' . md5(rand()) . '.php'; |
|||
$inc_filename = '.' . md5(rand()) . '.php'; |
|||
|
|||
echo "Copying rebuilder to web directory...\n"; |
|||
|
|||
// replace "/inc/cli.php" with its new filename |
|||
passthru("cat " . escapeshellarg($shell_path . '/' . $_SERVER['PHP_SELF']) . " | sed \"s/'\/inc\/cli\.php'/'\/{$inc_filename}'/\" > {$filename}"); |
|||
|
|||
$inc_header = "<?php\n";
|
|||
|
|||
// copy environment |
|||
$env = explode("\n", shell_exec('printenv | grep ^TINYBOARD')); |
|||
foreach($env as $line) { |
|||
if(!empty($line)) |
|||
$inc_header .= "putenv('" . addslashes($line) . "');\n"; |
|||
} |
|||
|
|||
// copy command line arguments |
|||
$inc_header .= "\$argv = " . var_export($argv, true) . ";\n"; |
|||
|
|||
// copy this file |
|||
file_put_contents($inc_filename, $inc_header . substr($inc = file_get_contents(__FILE__), strpos($inc, "\n"))); |
|||
|
|||
chmod($filename, 0666); |
|||
chmod($inc_filename, 0666); |
|||
|
|||
if(preg_match('/^https?:\/\//', $config['root'])) { |
|||
$url = $config['root'] . $filename; |
|||
} elseif($host = getenv('TINYBOARD_HOST')) { |
|||
$url = 'http://' . $host . $config['root'] . $filename; |
|||
} else { |
|||
// assume localhost |
|||
$url = 'http://localhost' . $config['root'] . $filename; |
|||
} |
|||
|
|||
echo "Downloading $url\n"; |
|||
|
|||
passthru('curl -s -N ' . escapeshellarg($url)); |
|||
|
|||
unlink($filename); |
|||
unlink($inc_filename); |
|||
|
|||
exit(0); |
|||
} |
|||
|
@ -0,0 +1,94 @@ |
|||
<?php |
|||
|
|||
class JSParser { |
|||
|
|||
protected $content; |
|||
protected $keywords; |
|||
protected $regs = array(); |
|||
protected $regsCounter = 0; |
|||
protected $strings = array(); |
|||
protected $stringsCounter = 0; |
|||
|
|||
protected function _extractRegs($match) { |
|||
$this->regs[$this->regsCounter] = $match[1]; |
|||
$id = "<<reg{$this->regsCounter}>>"; |
|||
$this->regsCounter++; |
|||
return $id; |
|||
} |
|||
protected function _extractStrings($match) { |
|||
$this->strings[$this->stringsCounter] = $this->importRegExps($match[0]); |
|||
$id = "<<s{$this->stringsCounter}>>"; |
|||
$this->stringsCounter++; |
|||
return $id; |
|||
} |
|||
protected function importRegExps($input) { |
|||
$regs = $this->regs; |
|||
return preg_replace_callback("#<<reg(\d+)>>#", function ($match) use($regs) { |
|||
return $regs[$match[1]]; |
|||
}, $input); |
|||
} |
|||
|
|||
protected function importStrings($input) { |
|||
$strings = $this->strings; |
|||
return preg_replace_callback("#<<s(\d+)>>#", function ($match) use($strings) { |
|||
return $strings[$match[1]]; |
|||
}, $input); |
|||
} |
|||
|
|||
public function __construct($file, $keywords = '_') { |
|||
$this->content = file_get_contents($file); |
|||
$this->keywords = (array)$keywords; |
|||
} |
|||
|
|||
public function parse() { |
|||
$output = $this->content; //htmlspecialchars($this->content, ENT_NOQUOTES); |
|||
|
|||
// extract reg exps |
|||
$output = preg_replace_callback( |
|||
'# ( / (?: (?>[^/\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\/ )+ (?<!\\\\)/ ) [a-z]* \b #ix', |
|||
array($this, '_extractRegs'), $output |
|||
); |
|||
|
|||
// extract strings |
|||
$output = preg_replace_callback( |
|||
array( |
|||
'# " ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)" #ix', |
|||
"# ' ( (?: (?>[^'\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\' )* ) (?<!\\\\)' #ix" |
|||
), array($this, '_extractStrings'), $output |
|||
); |
|||
|
|||
// delete line comments |
|||
$output = preg_replace("#(//.*?)$#m", '', $output); |
|||
|
|||
// delete multiline comments |
|||
$output = preg_replace('#/\*(.*?)\*/#is', '', $output); |
|||
|
|||
$strings = $this->strings; |
|||
$output = preg_replace_callback("#<<s(\d+)>>#", function($match) use($strings) { |
|||
return $strings[$match[1]]; |
|||
}, $output); |
|||
|
|||
$keywords = implode('|', $this->keywords); |
|||
|
|||
$strings = array(); |
|||
|
|||
// extract func calls |
|||
preg_match_all( |
|||
'# (?:'.$keywords.') \(\\ *" ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)"\\ *\) #ix', |
|||
$output, $matches, PREG_SET_ORDER |
|||
); |
|||
|
|||
foreach ($matches as $m) $strings[] = stripslashes($m[1]); |
|||
|
|||
$matches = array(); |
|||
preg_match_all( |
|||
"# (?:$keywords) \(\\ *' ( (?: (?>[^'\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\' )* ) (?<!\\\\)'\\ *\) #ix", |
|||
$output, $matches, PREG_SET_ORDER |
|||
); |
|||
|
|||
foreach ($matches as $m) $strings[] = stripslashes($m[1]); |
|||
|
|||
return $strings; |
|||
} |
|||
} |
|||
?> |
@ -0,0 +1,83 @@ |
|||
<?php |
|||
|
|||
require_once 'PoeditString.php'; |
|||
|
|||
class PoeditParser { |
|||
|
|||
protected $file; |
|||
protected $header = ''; |
|||
protected $strings = array(); |
|||
|
|||
protected function _fixQuotes($str) { |
|||
return stripslashes($str); |
|||
} |
|||
|
|||
public function __construct($file) { |
|||
$this->file = $file; |
|||
} |
|||
|
|||
public function parse() { |
|||
$contents = file_get_contents($this->file); |
|||
|
|||
$parts = preg_split('#(\r\n|\n){2}#', $contents, -1, PREG_SPLIT_NO_EMPTY); |
|||
|
|||
$this->header = array_shift($parts); |
|||
|
|||
foreach ($parts as $part) { |
|||
|
|||
// parse comments |
|||
$comments = array(); |
|||
preg_match_all('#^\\#: (.*?)$#m', $part, $matches, PREG_SET_ORDER); |
|||
foreach ($matches as $m) $comments[] = $m[1]; |
|||
|
|||
$isFuzzy = preg_match('#^\\#, fuzzy$#im', $part) ? true : false; |
|||
|
|||
preg_match_all('# ^ (msgid|msgstr)\ " ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)" $ #ixm', $part, $matches2, PREG_SET_ORDER); |
|||
|
|||
$k = $this->_fixQuotes($matches2[0][2]); |
|||
$v = !empty($matches2[1][2]) ? $this->_fixQuotes($matches2[1][2]) : ''; |
|||
|
|||
$this->strings[$k] = new PoeditString($k, $v, $isFuzzy, $comments); |
|||
} |
|||
} |
|||
|
|||
public function merge($strings) { |
|||
foreach ((array)$strings as $str) { |
|||
if (!in_array($str, array_keys($this->strings))) { |
|||
$this->strings[$str] = new PoeditString($str); |
|||
} |
|||
} |
|||
} |
|||
|
|||
public function getHeader() { |
|||
return $this->header; |
|||
} |
|||
|
|||
public function getStrings() { |
|||
return $this->strings; |
|||
} |
|||
|
|||
public function getJSON() { |
|||
$str = array(); |
|||
foreach ($this->strings as $s) { |
|||
if ($s->value) $str[$s->key] = $s->value; |
|||
} |
|||
return json_encode($str); |
|||
} |
|||
|
|||
public function toJSON($outputFilename, $varName = 'l10n') { |
|||
$str = "$varName = " . $this->getJSON() . ";"; |
|||
return file_put_contents($outputFilename, $str) !== false; |
|||
} |
|||
|
|||
public function save($filename = null) { |
|||
$data = $this->header . "\n\n"; |
|||
foreach ($this->strings as $str) { |
|||
$data .= $str; |
|||
} |
|||
return file_put_contents($filename ? $filename : $this->file, $data) !== false; |
|||
} |
|||
} |
|||
|
|||
|
|||
?> |
@ -0,0 +1,29 @@ |
|||
<?php |
|||
|
|||
class PoeditString { |
|||
public $key; |
|||
public $value; |
|||
public $fuzzy; |
|||
public $comments; |
|||
|
|||
function __construct($key, $value = '', $fuzzy = false, $comments = array()) { |
|||
$this->key = $key; |
|||
$this->value = $value; |
|||
$this->fuzzy = $fuzzy; |
|||
$this->comments = (array)$comments; |
|||
} |
|||
|
|||
public function __toString() { |
|||
$str =''; |
|||
foreach ($this->comments as $c) { |
|||
$str .= "#: $c\n"; |
|||
} |
|||
if ($this->fuzzy) $str .= "#, fuzzy\n"; |
|||
$str .= 'msgid "'.str_replace('"', '\\"', $this->key).'"' . "\n"; |
|||
$str .= 'msgstr "'.str_replace('"', '\\"', $this->value).'"' . "\n"; |
|||
$str .= "\n"; |
|||
return $str; |
|||
} |
|||
} |
|||
|
|||
?> |
@ -0,0 +1,63 @@ |
|||
<?php |
|||
|
|||
require_once 'JSParser.php'; |
|||
require_once 'PoeditParser.php'; |
|||
|
|||
function buildOptions($args) { |
|||
$options = array( |
|||
'files' => array(), |
|||
'-o' => null, |
|||
'-k' => '_' |
|||
); |
|||
$len = count($args); |
|||
$i = 1; |
|||
while ($i < $len) { |
|||
if (preg_match('#^-[a-z]$#i', $args[$i])) { |
|||
$options[$args[$i]] = isset($args[$i+1]) ? trim($args[$i+1]) : true; |
|||
$i += 2; |
|||
} |
|||
else { |
|||
$options['files'][] = $args[$i]; |
|||
$i++; |
|||
} |
|||
} |
|||
return $options; |
|||
} |
|||
|
|||
$options = buildOptions($argv); |
|||
|
|||
if (!file_exists($options['-o'])) { |
|||
touch($options['-o']); |
|||
} |
|||
|
|||
if (!is_writable($options['-o'])) { |
|||
die("Invalid output file name. Make sure it exists and is writable."); |
|||
} |
|||
|
|||
$inputFiles = $options['files']; |
|||
|
|||
if (empty($inputFiles)) { |
|||
die("You did not provide any input file."); |
|||
} |
|||
|
|||
$poeditParser = new PoeditParser($options['-o']); |
|||
$poeditParser->parse(); |
|||
|
|||
$errors = array(); |
|||
|
|||
foreach ($inputFiles as $f) { |
|||
if (!is_readable($f) || !preg_match('#\.js$#', $f)) { |
|||
$errors[] = ("$f is not a valid javascript file."); |
|||
continue; |
|||
} |
|||
$jsparser = new JSParser($f, explode(' ', $options['-k'])); |
|||
$jsStrings = $jsparser->parse(); |
|||
$poeditParser->merge($jsStrings); |
|||
} |
|||
|
|||
if (!empty($errors)) { |
|||
echo "\nThe following errors occured:\n" . implode("\n", $errors) . "\n"; |
|||
} |
|||
|
|||
$poeditParser->save(); |
|||
?> |
@ -0,0 +1,42 @@ |
|||
<?php |
|||
|
|||
require_once 'PoeditParser.php'; |
|||
|
|||
function buildOptions($args) { |
|||
$options = array( |
|||
'-o' => null, |
|||
'-i' => null, |
|||
'-n' => 'l10n' |
|||
); |
|||
$len = count($args); |
|||
$i = 0; |
|||
while ($i < $len) { |
|||
if (preg_match('#^-[a-z]$#i', $args[$i])) { |
|||
$options[$args[$i]] = isset($args[$i+1]) ? trim($args[$i+1]) : true; |
|||
$i += 2; |
|||
} |
|||
else { |
|||
$options[] = $args[$i]; |
|||
$i++; |
|||
} |
|||
} |
|||
return $options; |
|||
} |
|||
|
|||
$options = buildOptions($argv); |
|||
|
|||
if (!file_exists($options['-i']) || !is_readable($options['-i'])) { |
|||
die("Invalid input file. Make sure it exists and is readable."); |
|||
} |
|||
|
|||
$poeditParser = new PoeditParser($options['-i']); |
|||
$poeditParser->parse(); |
|||
|
|||
if ($poeditParser->toJSON($options['-o'], $options['-n'])) { |
|||
$strings = count($poeditParser->getStrings()); |
|||
echo "Successfully exported " . count($strings) . " strings.\n"; |
|||
} |
|||
else { |
|||
echo "Cannor write to file '{$options['-o']}'.\n"; |
|||
} |
|||
?> |
@ -0,0 +1,105 @@ |
|||
#!/usr/bin/php |
|||
<?php |
|||
|
|||
/* |
|||
* rebuild.php - rebuilds all static files |
|||
* |
|||
* Command line arguments: |
|||
* -q, --quiet |
|||
* Suppress output. |
|||
* |
|||
* --quick |
|||
* Do not rebuild posts. |
|||
* |
|||
* -b, --board <string> |
|||
* Rebuild only the specified board. |
|||
* |
|||
* -f, --full |
|||
* Rebuild replies as well as threads (re-markup). |
|||
* |
|||
*/ |
|||
|
|||
require dirname(__FILE__) . '/inc/cli.php'; |
|||
|
|||
if(!is_writable($config['file_script'])) { |
|||
get_httpd_privileges(); |
|||
} |
|||
|
|||
$start = microtime(true); |
|||
|
|||
// parse command line |
|||
$opts = getopt('qfb:', Array('board:', 'quick', 'full', 'quiet')); |
|||
$options = Array(); |
|||
|
|||
$options['board'] = isset($opts['board']) ? $opts['board'] : (isset($opts['b']) ? $opts['b'] : false); |
|||
$options['quiet'] = isset($opts['q']) || isset($opts['quiet']); |
|||
$options['quick'] = isset($opts['quick']); |
|||
$options['full'] = isset($opts['full']) || isset($opts['f']); |
|||
|
|||
if(!$options['quiet']) |
|||
echo "== Tinyboard {$config['version']} ==\n"; |
|||
|
|||
if(!$options['quiet']) |
|||
echo "Clearing template cache...\n"; |
|||
|
|||
load_twig(); |
|||
$twig->clearCacheFiles(); |
|||
|
|||
if(!$options['quiet']) |
|||
echo "Regenerating theme files...\n"; |
|||
rebuildThemes('all'); |
|||
|
|||
if(!$options['quiet']) |
|||
echo "Generating Javascript file...\n"; |
|||
buildJavascript(); |
|||
|
|||
$main_js = $config['file_script']; |
|||
|
|||
$boards = listBoards(); |
|||
|
|||
foreach($boards as &$board) { |
|||
if($options['board'] && $board['uri'] != $options['board']) |
|||
continue; |
|||
|
|||
if(!$options['quiet']) |
|||
echo "Opening board /{$board['uri']}/...\n"; |
|||
openBoard($board['uri']); |
|||
|
|||
if($config['file_script'] != $main_js) { |
|||
// different javascript file |
|||
if(!$options['quiet']) |
|||
echo "Generating Javascript file...\n"; |
|||
buildJavascript(); |
|||
} |
|||
|
|||
|
|||
if(!$options['quiet']) |
|||
echo "Creating index pages...\n"; |
|||
buildIndex(); |
|||
|
|||
if($options['quick']) |
|||
continue; // do no more |
|||
|
|||
if($options['full']) { |
|||
$query = query(sprintf("SELECT `id` FROM `posts_%s`", $board['uri'])) or error(db_error()); |
|||
while($post = $query->fetch()) { |
|||
if(!$options['quiet']) |
|||
echo "Rebuilding #{$post['id']}...\n"; |
|||
rebuildPost($post['id']); |
|||
} |
|||
} |
|||
|
|||
$query = query(sprintf("SELECT `id` FROM `posts_%s` WHERE `thread` IS NULL", $board['uri'])) or error(db_error()); |
|||
while($post = $query->fetch()) { |
|||
if(!$options['quiet']) |
|||
echo "Rebuilding #{$post['id']}...\n"; |
|||
buildThread($post['id']); |
|||
} |
|||
} |
|||
|
|||
if(!$options['quiet']) |
|||
printf("Complete! Took %g seconds\n", microtime(true) - $start); |
|||
|
|||
unset($board); |
|||
modLog('Rebuilt everything using tools/rebuild.php'); |
|||
|
Loading…
Reference in new issue