Merge branch 'master' of github.com:openvk/openvk
3
.gitmodules
vendored
|
@ -1,3 +0,0 @@
|
|||
[submodule "Web/static/img/oxygen-icons"]
|
||||
path = Web/static/img/oxygen-icons
|
||||
url = https://github.com/KDE/oxygen-icons5.git
|
|
@ -34,11 +34,16 @@ class Comment extends Post
|
|||
*/
|
||||
function getOwner(bool $honourFlags = true, bool $real = false): RowModel
|
||||
{
|
||||
if($honourFlags && $this->isPostedOnBehalfOfGroup()) {
|
||||
if($this->getTarget() instanceof Post)
|
||||
return (new Clubs)->get(abs($this->getTarget()->getTargetWall()));
|
||||
}
|
||||
if($honourFlags && $this->isPostedOnBehalfOfGroup() && $this->getTarget() instanceof Post)
|
||||
return (new Clubs)->get(abs($this->getTarget()->getTargetWall()));
|
||||
|
||||
return parent::getOwner($honourFlags, $real);
|
||||
}
|
||||
|
||||
function canBeDeletedBy(User $user): bool
|
||||
{
|
||||
return $this->getOwner()->getId() == $user->getId() ||
|
||||
$this->getTarget()->getOwner()->getId() == $user->getId() ||
|
||||
$this->getTarget() instanceof Post && $this->getTarget()->getTargetWall() < 0 && (new Clubs)->get(abs($this->getTarget()->getTargetWall()))->canBeModifiedBy($user);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<?php declare(strict_types=1);
|
||||
namespace openvk\Web\Models\Entities\Traits;
|
||||
use Wkhooy\ObsceneCensorRus;
|
||||
|
||||
trait TRichText
|
||||
{
|
||||
|
@ -69,6 +70,9 @@ trait TRichText
|
|||
$text = nl2br($text);
|
||||
}
|
||||
|
||||
if(OPENVK_ROOT_CONF["openvk"]["preferences"]["wall"]["christian"])
|
||||
ObsceneCensorRus::filterText($text);
|
||||
|
||||
return $text;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -106,9 +106,8 @@ final class CommentPresenter extends OpenVKPresenter
|
|||
|
||||
$comment = (new Comments)->get($id);
|
||||
if(!$comment) $this->notFound();
|
||||
if($comment->getOwner()->getId() !== $this->user->id)
|
||||
if($comment->getTarget()->getOwner()->getId() !== $this->user->id)
|
||||
$this->throwError(403, "Forbidden", "У вас недостаточно прав чтобы редактировать этот ресурс.");
|
||||
if(!$comment->canBeDeletedBy($this->user->identity))
|
||||
$this->throwError(403, "Forbidden", "У вас недостаточно прав чтобы редактировать этот ресурс.");
|
||||
|
||||
$comment->delete();
|
||||
$this->flashFail(
|
||||
|
|
|
@ -34,10 +34,10 @@ abstract class OpenVKPresenter extends SimplePresenter
|
|||
]));
|
||||
}
|
||||
|
||||
protected function setTempTheme(string $theme): void
|
||||
{
|
||||
Session::i()->set("_tempTheme", $theme);
|
||||
}
|
||||
protected function setTempTheme(string $theme): void
|
||||
{
|
||||
Session::i()->set("_tempTheme", $theme);
|
||||
}
|
||||
|
||||
protected function flashFail(string $type, string $title, ?string $message = NULL, ?int $code = NULL): void
|
||||
{
|
||||
|
@ -198,6 +198,7 @@ abstract class OpenVKPresenter extends SimplePresenter
|
|||
header("HTTP/1.1 403 Forbidden");
|
||||
$this->getTemplatingEngine()->render(__DIR__ . "/templates/@banned.xml", [
|
||||
"thisUser" => $this->user->identity,
|
||||
"csrfToken" => $GLOBALS["csrfToken"],
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
@ -221,25 +222,23 @@ abstract class OpenVKPresenter extends SimplePresenter
|
|||
{
|
||||
parent::onBeforeRender();
|
||||
|
||||
if(!is_null($this->user)) {
|
||||
$theme = $this->user->identity->getTheme();
|
||||
if(!is_null($theme) && $theme->overridesTemplates()) {
|
||||
$this->template->_templatePath = $theme->getBaseDir() . "/tpl";
|
||||
}
|
||||
$theme = NULL;
|
||||
if(Session::i()->get("_tempTheme")) {
|
||||
$theme = Themepacks::i()[Session::i()->get("_tempTheme", "ovk")];
|
||||
Session::i()->set("_tempTheme", NULL);
|
||||
} else if($this->requestParam("themePreview")) {
|
||||
$theme = Themepacks::i()[$this->requestParam("themePreview")];
|
||||
} else if($this->user->identity !== null && $this->user->identity->getTheme()) {
|
||||
$theme = $this->user->identity->getTheme();
|
||||
}
|
||||
|
||||
$this->template->theme = $theme;
|
||||
if(!is_null($theme) && $theme->overridesTemplates())
|
||||
$this->template->_templatePath = $theme->getBaseDir() . "/tpl";
|
||||
|
||||
if(!is_null(Session::i()->get("_error"))) {
|
||||
$this->template->flashMessage = json_decode(Session::i()->get("_error"));
|
||||
Session::i()->set("_error", NULL);
|
||||
}
|
||||
|
||||
if(Session::i()->get("_tempTheme"))
|
||||
$this->template->theme = Themepacks::i()[Session::i()->get("_tempTheme", "ovk")];
|
||||
else if($this->requestParam("themePreview"))
|
||||
$this->template->theme = Themepacks::i()[$this->requestParam("themePreview")];
|
||||
else if($this->user->identity !== null && $this->user->identity->getTheme())
|
||||
$this->template->theme = $this->user->identity->getTheme();
|
||||
|
||||
// Знаю, каша ебаная, целестора рефактор всё равно сделает :)))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -128,99 +128,99 @@ final class UserPresenter extends OpenVKPresenter
|
|||
if(!$id)
|
||||
$this->notFound();
|
||||
|
||||
$user = $this->users->get($id);
|
||||
if($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
$this->willExecuteWriteAction();
|
||||
$user = $this->users->get($id);
|
||||
if($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
$this->willExecuteWriteAction();
|
||||
|
||||
if($_GET['act'] === "main" || $_GET['act'] == NULL) {
|
||||
$user->setFirst_Name(empty($this->postParam("first_name")) ? $user->getFirstName() : $this->postParam("first_name"));
|
||||
$user->setLast_Name(empty($this->postParam("last_name")) ? "" : $this->postParam("last_name"));
|
||||
$user->setPseudo(empty($this->postParam("pseudo")) ? NULL : $this->postParam("pseudo"));
|
||||
$user->setStatus(empty($this->postParam("status")) ? NULL : $this->postParam("status"));
|
||||
if (strtotime($this->postParam("birthday")) < time())
|
||||
$user->setBirthday(strtotime($this->postParam("birthday")));
|
||||
|
||||
if ($this->postParam("marialstatus") <= 8 && $this->postParam("marialstatus") >= 0)
|
||||
$user->setMarital_Status($this->postParam("marialstatus"));
|
||||
|
||||
if($_GET['act'] === "main" || $_GET['act'] == NULL) {
|
||||
$user->setFirst_Name(empty($this->postParam("first_name")) ? $user->getFirstName() : $this->postParam("first_name"));
|
||||
$user->setLast_Name(empty($this->postParam("last_name")) ? "" : $this->postParam("last_name"));
|
||||
$user->setPseudo(empty($this->postParam("pseudo")) ? NULL : $this->postParam("pseudo"));
|
||||
$user->setStatus(empty($this->postParam("status")) ? NULL : $this->postParam("status"));
|
||||
if (strtotime($this->postParam("birthday")) < time())
|
||||
$user->setBirthday(strtotime($this->postParam("birthday")));
|
||||
|
||||
if ($this->postParam("marialstatus") <= 8 && $this->postParam("marialstatus") >= 0)
|
||||
$user->setMarital_Status($this->postParam("marialstatus"));
|
||||
if ($this->postParam("politViews") <= 9 && $this->postParam("politViews") >= 0)
|
||||
$user->setPolit_Views($this->postParam("politViews"));
|
||||
|
||||
if ($this->postParam("gender") <= 1 && $this->postParam("gender") >= 0)
|
||||
$user->setSex($this->postParam("gender"));
|
||||
|
||||
if(!empty($this->postParam("phone")) && $this->postParam("phone") !== $user->getPhone()) {
|
||||
if(!OPENVK_ROOT_CONF["openvk"]["credentials"]["smsc"]["enable"])
|
||||
$this->flashFail("err", tr("error_segmentation"), "котлетки");
|
||||
|
||||
if ($this->postParam("politViews") <= 9 && $this->postParam("politViews") >= 0)
|
||||
$user->setPolit_Views($this->postParam("politViews"));
|
||||
$code = $user->setPhoneWithVerification($this->postParam("phone"));
|
||||
|
||||
if ($this->postParam("gender") <= 1 && $this->postParam("gender") >= 0)
|
||||
$user->setSex($this->postParam("gender"));
|
||||
|
||||
if(!empty($this->postParam("phone")) && $this->postParam("phone") !== $user->getPhone()) {
|
||||
if(!OPENVK_ROOT_CONF["openvk"]["credentials"]["smsc"]["enable"])
|
||||
$this->flashFail("err", tr("error_segmentation"), "котлетки");
|
||||
|
||||
$code = $user->setPhoneWithVerification($this->postParam("phone"));
|
||||
|
||||
if(!Sms::send($this->postParam("phone"), "OPENVK - Your verification code is: $code"))
|
||||
$this->flashFail("err", tr("error_segmentation"), "котлетки: Remote err!");
|
||||
}
|
||||
} elseif($_GET['act'] === "contacts") {
|
||||
if(empty($this->postParam("email_contact")) || Validator::i()->emailValid($this->postParam("email_contact")))
|
||||
$user->setEmail_Contact(empty($this->postParam("email_contact")) ? NULL : $this->postParam("email_contact"));
|
||||
else
|
||||
$this->flashFail("err", tr("invalid_email_address"), tr("invalid_email_address_comment"));
|
||||
|
||||
$telegram = $this->postParam("telegram");
|
||||
if(empty($telegram) || Validator::i()->telegramValid($telegram))
|
||||
if(strpos($telegram, "t.me/") === 0)
|
||||
$user->setTelegram(empty($telegram) ? NULL : substr($telegram, 5));
|
||||
else
|
||||
$user->setTelegram(empty($telegram) ? NULL : ltrim($telegram, "@"));
|
||||
else
|
||||
$this->flashFail("err", tr("invalid_telegram_name"), tr("invalid_telegram_name_comment"));
|
||||
|
||||
$user->setCity(empty($this->postParam("city")) ? NULL : $this->postParam("city"));
|
||||
$user->setAddress(empty($this->postParam("address")) ? NULL : $this->postParam("address"));
|
||||
|
||||
$website = $this->postParam("website") ?? "";
|
||||
if(empty($website))
|
||||
$user->setWebsite(NULL);
|
||||
else
|
||||
$user->setWebsite((!parse_url($website, PHP_URL_SCHEME) ? "https://" : "") . $website);
|
||||
} elseif($_GET['act'] === "interests") {
|
||||
$user->setInterests(empty($this->postParam("interests")) ? NULL : ovk_proc_strtr($this->postParam("interests"), 300));
|
||||
$user->setFav_Music(empty($this->postParam("fav_music")) ? NULL : ovk_proc_strtr($this->postParam("fav_music"), 300));
|
||||
$user->setFav_Films(empty($this->postParam("fav_films")) ? NULL : ovk_proc_strtr($this->postParam("fav_films"), 300));
|
||||
$user->setFav_Shows(empty($this->postParam("fav_shows")) ? NULL : ovk_proc_strtr($this->postParam("fav_shows"), 300));
|
||||
$user->setFav_Books(empty($this->postParam("fav_books")) ? NULL : ovk_proc_strtr($this->postParam("fav_books"), 300));
|
||||
$user->setFav_Quote(empty($this->postParam("fav_quote")) ? NULL : ovk_proc_strtr($this->postParam("fav_quote"), 300));
|
||||
$user->setAbout(empty($this->postParam("about")) ? NULL : ovk_proc_strtr($this->postParam("about"), 300));
|
||||
} elseif($_GET['act'] === "status") {
|
||||
if(mb_strlen($this->postParam("status")) > 255) {
|
||||
$statusLength = (string) mb_strlen($this->postParam("status"));
|
||||
$this->flashFail("err", "Ошибка", "Статус слишком длинный ($statusLength символов вместо 255 символов)");
|
||||
}
|
||||
|
||||
$user->setStatus(empty($this->postParam("status")) ? NULL : $this->postParam("status"));
|
||||
$user->save();
|
||||
|
||||
header("HTTP/1.1 302 Found");
|
||||
header("Location: /id" . $user->getId());
|
||||
exit;
|
||||
if(!Sms::send($this->postParam("phone"), "OPENVK - Your verification code is: $code"))
|
||||
$this->flashFail("err", tr("error_segmentation"), "котлетки: Remote err!");
|
||||
}
|
||||
|
||||
try {
|
||||
$user->save();
|
||||
} catch(\PDOException $ex) {
|
||||
if($ex->getCode() == 23000)
|
||||
$this->flashFail("err", tr("error"), tr("error_shorturl"));
|
||||
} elseif($_GET['act'] === "contacts") {
|
||||
if(empty($this->postParam("email_contact")) || Validator::i()->emailValid($this->postParam("email_contact")))
|
||||
$user->setEmail_Contact(empty($this->postParam("email_contact")) ? NULL : $this->postParam("email_contact"));
|
||||
else
|
||||
$this->flashFail("err", tr("invalid_email_address"), tr("invalid_email_address_comment"));
|
||||
|
||||
$telegram = $this->postParam("telegram");
|
||||
if(empty($telegram) || Validator::i()->telegramValid($telegram))
|
||||
if(strpos($telegram, "t.me/") === 0)
|
||||
$user->setTelegram(empty($telegram) ? NULL : substr($telegram, 5));
|
||||
else
|
||||
throw $ex;
|
||||
}
|
||||
$user->setTelegram(empty($telegram) ? NULL : ltrim($telegram, "@"));
|
||||
else
|
||||
$this->flashFail("err", tr("invalid_telegram_name"), tr("invalid_telegram_name_comment"));
|
||||
|
||||
$user->setCity(empty($this->postParam("city")) ? NULL : $this->postParam("city"));
|
||||
$user->setAddress(empty($this->postParam("address")) ? NULL : $this->postParam("address"));
|
||||
|
||||
$this->flash("succ", tr("changes_saved"), tr("changes_saved_comment"));
|
||||
$website = $this->postParam("website") ?? "";
|
||||
if(empty($website))
|
||||
$user->setWebsite(NULL);
|
||||
else
|
||||
$user->setWebsite((!parse_url($website, PHP_URL_SCHEME) ? "https://" : "") . $website);
|
||||
} elseif($_GET['act'] === "interests") {
|
||||
$user->setInterests(empty($this->postParam("interests")) ? NULL : ovk_proc_strtr($this->postParam("interests"), 300));
|
||||
$user->setFav_Music(empty($this->postParam("fav_music")) ? NULL : ovk_proc_strtr($this->postParam("fav_music"), 300));
|
||||
$user->setFav_Films(empty($this->postParam("fav_films")) ? NULL : ovk_proc_strtr($this->postParam("fav_films"), 300));
|
||||
$user->setFav_Shows(empty($this->postParam("fav_shows")) ? NULL : ovk_proc_strtr($this->postParam("fav_shows"), 300));
|
||||
$user->setFav_Books(empty($this->postParam("fav_books")) ? NULL : ovk_proc_strtr($this->postParam("fav_books"), 300));
|
||||
$user->setFav_Quote(empty($this->postParam("fav_quote")) ? NULL : ovk_proc_strtr($this->postParam("fav_quote"), 300));
|
||||
$user->setAbout(empty($this->postParam("about")) ? NULL : ovk_proc_strtr($this->postParam("about"), 300));
|
||||
} elseif($_GET['act'] === "status") {
|
||||
if(mb_strlen($this->postParam("status")) > 255) {
|
||||
$statusLength = (string) mb_strlen($this->postParam("status"));
|
||||
$this->flashFail("err", "Ошибка", "Статус слишком длинный ($statusLength символов вместо 255 символов)");
|
||||
}
|
||||
|
||||
$user->setStatus(empty($this->postParam("status")) ? NULL : $this->postParam("status"));
|
||||
$user->save();
|
||||
|
||||
header("HTTP/1.1 302 Found");
|
||||
header("Location: /id" . $user->getId());
|
||||
exit;
|
||||
}
|
||||
|
||||
$this->template->mode = in_array($this->queryParam("act"), [
|
||||
"main", "contacts", "interests", "avatar"
|
||||
]) ? $this->queryParam("act")
|
||||
: "main";
|
||||
try {
|
||||
$user->save();
|
||||
} catch(\PDOException $ex) {
|
||||
if($ex->getCode() == 23000)
|
||||
$this->flashFail("err", tr("error"), tr("error_shorturl"));
|
||||
else
|
||||
throw $ex;
|
||||
}
|
||||
|
||||
$this->template->user = $user;
|
||||
$this->flash("succ", tr("changes_saved"), tr("changes_saved_comment"));
|
||||
}
|
||||
|
||||
$this->template->mode = in_array($this->queryParam("act"), [
|
||||
"main", "contacts", "interests", "avatar"
|
||||
]) ? $this->queryParam("act")
|
||||
: "main";
|
||||
|
||||
$this->template->user = $user;
|
||||
}
|
||||
|
||||
function renderVerifyPhone(): void
|
||||
|
|
|
@ -1,22 +1,20 @@
|
|||
{extends "@layout.xml"}
|
||||
{block title}Вам бан{/block}
|
||||
{block title}{_"banned_title"}{/block}
|
||||
|
||||
{block header}
|
||||
Вы были верискокнуты
|
||||
{_"banned_header"}
|
||||
{/block}
|
||||
|
||||
{block content}
|
||||
<center>
|
||||
<img src="/assets/packages/static/openvk/img/oof.apng" alt="Пользователь заблокирован." style="width: 20%;" />
|
||||
<img src="/assets/packages/static/openvk/img/oof.apng" alt="{_'banned_alt'}" style="width: 20%;" />
|
||||
</center>
|
||||
<p>
|
||||
Извините, <b>{$thisUser->getCanonicalName()}</b>, но вы были верискокнуты.<br/>
|
||||
А причина этому проста: <b>{$thisUser->getBanReason()}</b>. К сожалению, на этот раз
|
||||
нам пришлось заблокировать вас навсегда.
|
||||
{tr("banned_1", htmlentities($thisUser->getCanonicalName()))|noescape}<br/>
|
||||
{tr("banned_2", htmlentities($thisUser->getBanReason()))|noescape}
|
||||
</p>
|
||||
<hr/>
|
||||
<p>
|
||||
Вы всё ещё можете <a href="/support?act=new">написать в службу поддержки</a>, если считаете что произошла ошибка
|
||||
или <a href="/logout">выйти</a>.
|
||||
{tr("banned_3", urlencode($csrfToken))|noescape}
|
||||
</p>
|
||||
{/block}
|
||||
{/block}
|
||||
|
|
|
@ -201,8 +201,8 @@
|
|||
style="max-width: 100%; margin-top: 50px;" />
|
||||
</a>
|
||||
{else}
|
||||
<a href="/support" class="link">Поддержка</a>
|
||||
<a href="/logout" class="link">Выйти</a>
|
||||
<a href="/support" class="link">{_"menu_support"}</a>
|
||||
<a href="/logout?hash={urlencode($csrfToken)}" class="link">{_"menu_logout"}</a>
|
||||
{/if}
|
||||
{else}
|
||||
<form id="fastLogin" action="/login" method="POST" enctype="multipart/form-data">
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
{/block}
|
||||
|
||||
{block header}
|
||||
OpenVK »
|
||||
{=OPENVK_ROOT_CONF["openvk"]["appearance"]["name"]} »
|
||||
{if $type === "users"}
|
||||
{tr("search_for_people")}
|
||||
{else}
|
||||
|
@ -21,7 +21,7 @@
|
|||
<form style="margin-left: 12px;">
|
||||
<input name="type" type="hidden" value="{$_GET['type'] ?? 'users'}" />
|
||||
<input name="query" type="text" placeholder="{_"header_search"}" value="{$_GET['query'] ?? ''}" style="width: 90%" />
|
||||
<input type="submit" class="button" value="{_"search_button"}" style="width: 9%" />
|
||||
<input type="submit" class="button" value="{_"search_button"}" style="width: 7%" />
|
||||
</form>
|
||||
|
||||
<p style="margin-left: 15px;">
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<center>
|
||||
<img src="/assets/packages/static/openvk/img/oof.apng" alt="Пользователь заблокирован." style="width: 20%;" />
|
||||
<p>
|
||||
К сожалению, нам пришлось заблокировать страницу пользователя <b>{$user->getFirstName()}</b>.<br/>
|
||||
Комментарий модератора: <b>{$user->getBanReason()}</b>.
|
||||
{tr("user_banned", htmlentities($user->getFirstName()))|noescape}<br/>
|
||||
{_"user_banned_comment"} <b>{$user->getBanReason()}</b>.
|
||||
</p>
|
||||
</center>
|
||||
|
|
|
@ -29,9 +29,7 @@
|
|||
</div>
|
||||
<div n:if="isset($thisUser) &&! ($compact ?? false)" class="post-menu">
|
||||
<a href="#_comment{$comment->getId()}" class="date">{$comment->getPublicationTime()}</a> |
|
||||
{var canDelete = $comment->getOwner()->getId() == $thisUser->getId()}
|
||||
{var canDelete = $canDelete || $comment->getTarget()->getOwner()->getId() == $thisUser->getId()}
|
||||
{if $canDelete}
|
||||
{if $comment->canBeDeletedBy($thisUser)}
|
||||
<a href="/comment{$comment->getId()}/delete">{_"delete"}</a> |
|
||||
{/if}
|
||||
<a class="comment-reply">Ответить</a>
|
||||
|
|
|
@ -10,7 +10,9 @@
|
|||
{foreach $comments as $comment}
|
||||
{include "comment.xml", comment => $comment}
|
||||
{/foreach}
|
||||
{include "paginator.xml", conf => (object) ["page" => $page, "count" => $count, "amount" => sizeof($comments), "perPage" => 10]}
|
||||
<div style="margin-top: 11px;">
|
||||
{include "paginator.xml", conf => (object) ["page" => $page, "count" => $count, "amount" => sizeof($comments), "perPage" => 10]}
|
||||
</div>
|
||||
{else}
|
||||
<!-- {if $model === "photos"}
|
||||
<p>Будьте первым, кто оставит комментарий к этой фотографии</p>
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
</div>
|
||||
<div id="post-buttons{$textAreaId}" style="display: none;">
|
||||
<div class="post-upload">
|
||||
Вложение: <span>(unknown)</span>
|
||||
{_attachment}: <span>(unknown)</span>
|
||||
</div>
|
||||
<div n:if="$postOpts ?? true" class="post-opts">
|
||||
{var anonEnabled = OPENVK_ROOT_CONF['openvk']['preferences']['wall']['anonymousPosting']['enable']}
|
||||
|
@ -35,7 +35,7 @@
|
|||
{/if}
|
||||
|
||||
<label n:if="$anonEnabled" id="octoberAnonOpt">
|
||||
<input type="checkbox" name="anon" /> Анонимно
|
||||
<input type="checkbox" name="anon" /> {_"as_anonymous"}
|
||||
</label>
|
||||
|
||||
<label>
|
||||
|
@ -55,7 +55,7 @@
|
|||
<input type="submit" value="{_'write'}" class="button" />
|
||||
<div style="float: right; display: flex; flex-direction: column;">
|
||||
<a href="javascript:void(u('#post-buttons{$textAreaId} #wallAttachmentMenu').toggleClass('hidden'));">
|
||||
Прикрепить
|
||||
{_attach}
|
||||
</a>
|
||||
|
||||
<div id="wallAttachmentMenu" class="hidden">
|
||||
|
@ -65,11 +65,11 @@
|
|||
</a>
|
||||
<a href="javascript:void(document.querySelector('#post-buttons{$textAreaId} input[name=_vid_attachment]').click());">
|
||||
<img src="/assets/packages/static/openvk/img/oxygen-icons/16x16/mimetypes/application-vnd.rn-realmedia.png" />
|
||||
Прикрепить видео
|
||||
{_attach_video}
|
||||
</a>
|
||||
<a n:if="$graffiti ?? false" href="javascript:initGraffiti({$textAreaId});">
|
||||
<img src="/assets/packages/static/openvk/img/oxygen-icons/16x16/actions/draw-brush.png" />
|
||||
Нарисовать граффити
|
||||
{_draw_graffiti}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -57,7 +57,7 @@ class Localizator
|
|||
$lang = is_null($lang) ? static::DEFAULT_LANG : $lang;
|
||||
$array = @self::parse(dirname(__FILE__) . "/../../locales/$lang.strings");
|
||||
|
||||
return $array[$id] ?? "@$id";
|
||||
return $array[$id] ?? (!empty($array["__fallback"]) ? $this->_($id, $array["__fallback"]) : "@$id");
|
||||
}
|
||||
|
||||
function export($lang = NULL): ?array
|
||||
|
|
BIN
Web/static/img/flags/ru_old.gif
Normal file
After Width: | Height: | Size: 560 B |
|
@ -1 +0,0 @@
|
|||
Subproject commit 9d4eb793307e7af10c39c9da3b46646d97ad9dc2
|
|
@ -0,0 +1 @@
|
|||
system-run.png
|
|
@ -0,0 +1 @@
|
|||
run-build.png
|
|
@ -0,0 +1 @@
|
|||
appointment-new.png
|
BIN
Web/static/img/oxygen-icons/16x16/actions/acrobat.png
Normal file
After Width: | Height: | Size: 615 B |
|
@ -0,0 +1 @@
|
|||
folder-new.png
|
|
@ -0,0 +1 @@
|
|||
fork.png
|
1
Web/static/img/oxygen-icons/16x16/actions/actor.png
Normal file
|
@ -0,0 +1 @@
|
|||
im-user.png
|
|
@ -0,0 +1 @@
|
|||
flag-red.png
|
BIN
Web/static/img/oxygen-icons/16x16/actions/address-book-new.png
Normal file
After Width: | Height: | Size: 797 B |
|
@ -0,0 +1 @@
|
|||
address-book-new.png
|
|
@ -0,0 +1 @@
|
|||
address-book-new.png
|
|
@ -0,0 +1 @@
|
|||
go-home.png
|
|
@ -0,0 +1 @@
|
|||
folder-new.png
|
|
@ -0,0 +1 @@
|
|||
document-import.png
|
|
@ -0,0 +1 @@
|
|||
folder-new.png
|
|
@ -0,0 +1 @@
|
|||
configure.png
|
|
@ -0,0 +1 @@
|
|||
edit-delete.png
|
After Width: | Height: | Size: 384 B |
After Width: | Height: | Size: 441 B |
After Width: | Height: | Size: 454 B |
After Width: | Height: | Size: 456 B |
After Width: | Height: | Size: 444 B |
After Width: | Height: | Size: 457 B |
After Width: | Height: | Size: 418 B |
After Width: | Height: | Size: 445 B |
After Width: | Height: | Size: 399 B |
After Width: | Height: | Size: 452 B |
|
@ -0,0 +1 @@
|
|||
align-vertical-bottom-out.png
|
After Width: | Height: | Size: 451 B |
After Width: | Height: | Size: 484 B |
After Width: | Height: | Size: 457 B |
|
@ -0,0 +1 @@
|
|||
align-horizontal-top-out.png
|
BIN
Web/static/img/oxygen-icons/16x16/actions/align-vertical-top.png
Normal file
After Width: | Height: | Size: 413 B |
|
@ -0,0 +1 @@
|
|||
im-invisible-user.png
|
|
@ -0,0 +1 @@
|
|||
appointment-new.png
|
|
@ -0,0 +1 @@
|
|||
view-media-lyrics.png
|
|
@ -0,0 +1 @@
|
|||
view-statistics.png
|
|
@ -0,0 +1 @@
|
|||
view-media-playlist.png
|
|
@ -0,0 +1 @@
|
|||
view-refresh.png
|
|
@ -0,0 +1 @@
|
|||
dialog-ok-apply.png
|
1
Web/static/img/oxygen-icons/16x16/actions/answer.png
Normal file
|
@ -0,0 +1 @@
|
|||
dialog-ok-apply.png
|
BIN
Web/static/img/oxygen-icons/16x16/actions/application-exit.png
Normal file
After Width: | Height: | Size: 842 B |
|
@ -0,0 +1 @@
|
|||
configure.png
|
|
@ -0,0 +1 @@
|
|||
../places/folder-html.png
|
BIN
Web/static/img/oxygen-icons/16x16/actions/appointment-new.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
Web/static/img/oxygen-icons/16x16/actions/archive-extract.png
Normal file
After Width: | Height: | Size: 626 B |
After Width: | Height: | Size: 762 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/archive-insert.png
Normal file
After Width: | Height: | Size: 433 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/archive-remove.png
Normal file
After Width: | Height: | Size: 516 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/arrow-down-double.png
Normal file
After Width: | Height: | Size: 691 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/arrow-down.png
Normal file
After Width: | Height: | Size: 525 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/arrow-left-double.png
Normal file
After Width: | Height: | Size: 653 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/arrow-left.png
Normal file
After Width: | Height: | Size: 512 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/arrow-right-double.png
Normal file
After Width: | Height: | Size: 666 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/arrow-right.png
Normal file
After Width: | Height: | Size: 527 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/arrow-up-double.png
Normal file
After Width: | Height: | Size: 650 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/arrow-up.png
Normal file
After Width: | Height: | Size: 484 B |
1
Web/static/img/oxygen-icons/16x16/actions/atmosphere.png
Normal file
|
@ -0,0 +1 @@
|
|||
../categories/applications-internet.png
|
1
Web/static/img/oxygen-icons/16x16/actions/audio-on.png
Normal file
|
@ -0,0 +1 @@
|
|||
player-volume.png
|
|
@ -0,0 +1 @@
|
|||
bookmark-new.png
|
|
@ -0,0 +1 @@
|
|||
bookmark-new.png
|
BIN
Web/static/img/oxygen-icons/16x16/actions/bookmark-new-list.png
Normal file
After Width: | Height: | Size: 794 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/bookmark-new.png
Normal file
After Width: | Height: | Size: 707 B |
|
@ -0,0 +1 @@
|
|||
list-remove.png
|
BIN
Web/static/img/oxygen-icons/16x16/actions/bookmark-toolbar.png
Normal file
After Width: | Height: | Size: 669 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/bookmarks-organize.png
Normal file
After Width: | Height: | Size: 625 B |
1
Web/static/img/oxygen-icons/16x16/actions/bookmarks.png
Normal file
|
@ -0,0 +1 @@
|
|||
bookmark-new.png
|
1
Web/static/img/oxygen-icons/16x16/actions/box.png
Normal file
|
@ -0,0 +1 @@
|
|||
draw-rectangle.png
|
1
Web/static/img/oxygen-icons/16x16/actions/bqm-add.png
Normal file
|
@ -0,0 +1 @@
|
|||
list-add.png
|
|
@ -0,0 +1 @@
|
|||
list-add.png
|
1
Web/static/img/oxygen-icons/16x16/actions/bqm-commit.png
Normal file
|
@ -0,0 +1 @@
|
|||
go-up.png
|
1
Web/static/img/oxygen-icons/16x16/actions/bqm-diff.png
Normal file
|
@ -0,0 +1 @@
|
|||
run-build.png
|
1
Web/static/img/oxygen-icons/16x16/actions/bqm-remove.png
Normal file
|
@ -0,0 +1 @@
|
|||
edit-delete.png
|
|
@ -0,0 +1 @@
|
|||
edit-delete.png
|
1
Web/static/img/oxygen-icons/16x16/actions/bqm-update.png
Normal file
|
@ -0,0 +1 @@
|
|||
go-down.png
|
BIN
Web/static/img/oxygen-icons/16x16/actions/call-start.png
Normal file
After Width: | Height: | Size: 865 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/call-stop.png
Normal file
After Width: | Height: | Size: 708 B |
|
@ -0,0 +1 @@
|
|||
dialog-cancel.png
|
BIN
Web/static/img/oxygen-icons/16x16/actions/character-set.png
Normal file
After Width: | Height: | Size: 494 B |
BIN
Web/static/img/oxygen-icons/16x16/actions/checkbox.png
Normal file
After Width: | Height: | Size: 654 B |
1
Web/static/img/oxygen-icons/16x16/actions/checkmark.png
Normal file
|
@ -0,0 +1 @@
|
|||
dialog-ok-apply.png
|
|
@ -0,0 +1 @@
|
|||
draw-circle.png
|
|
@ -0,0 +1 @@
|
|||
chronometer.png
|
|
@ -0,0 +1 @@
|
|||
view-refresh.png
|