mirror of
https://github.com/openvk/openvk
synced 2024-12-23 09:01:15 +03:00
Merge branch 'master' of github.com:openvk/openvk
This commit is contained in:
commit
990bda4618
10 changed files with 235 additions and 16 deletions
|
@ -215,6 +215,11 @@ class User extends RowModel
|
||||||
return $this->getRecord()->block_reason;
|
return $this->getRecord()->block_reason;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getBanInSupportReason(): ?string
|
||||||
|
{
|
||||||
|
return $this->getRecord()->block_in_support_reason;
|
||||||
|
}
|
||||||
|
|
||||||
function getType(): int
|
function getType(): int
|
||||||
{
|
{
|
||||||
return $this->getRecord()->type;
|
return $this->getRecord()->type;
|
||||||
|
@ -674,6 +679,11 @@ class User extends RowModel
|
||||||
return !is_null($this->getBanReason());
|
return !is_null($this->getBanReason());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isBannedInSupport(): bool
|
||||||
|
{
|
||||||
|
return !is_null($this->getBanInSupportReason());
|
||||||
|
}
|
||||||
|
|
||||||
function isOnline(): bool
|
function isOnline(): bool
|
||||||
{
|
{
|
||||||
return time() - $this->getRecord()->online <= 300;
|
return time() - $this->getRecord()->online <= 300;
|
||||||
|
|
|
@ -346,7 +346,20 @@ final class AdminPresenter extends OpenVKPresenter
|
||||||
exit(json_encode([ "error" => "User does not exist" ]));
|
exit(json_encode([ "error" => "User does not exist" ]));
|
||||||
|
|
||||||
$user->ban($this->queryParam("reason"));
|
$user->ban($this->queryParam("reason"));
|
||||||
exit(json_encode([ "reason" => $this->queryParam("reason") ]));
|
exit(json_encode([ "success" => true, "reason" => $this->queryParam("reason") ]));
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderQuickUnban(int $id): void
|
||||||
|
{
|
||||||
|
$this->assertNoCSRF();
|
||||||
|
|
||||||
|
$user = $this->users->get($id);
|
||||||
|
if(!$user)
|
||||||
|
exit(json_encode([ "error" => "User does not exist" ]));
|
||||||
|
|
||||||
|
$user->setBlock_Reason(null);
|
||||||
|
$user->save();
|
||||||
|
exit(json_encode([ "success" => true ]));
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderQuickWarn(int $id): void
|
function renderQuickWarn(int $id): void
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php declare(strict_types=1);
|
<?php declare(strict_types=1);
|
||||||
namespace openvk\Web\Presenters;
|
namespace openvk\Web\Presenters;
|
||||||
use openvk\Web\Models\Entities\Ticket;
|
use openvk\Web\Models\Entities\Ticket;
|
||||||
use openvk\Web\Models\Repositories\Tickets;
|
use openvk\Web\Models\Repositories\{Tickets, Users};
|
||||||
use openvk\Web\Models\Entities\TicketComment;
|
use openvk\Web\Models\Entities\TicketComment;
|
||||||
use openvk\Web\Models\Repositories\TicketComments;
|
use openvk\Web\Models\Repositories\TicketComments;
|
||||||
use openvk\Web\Util\Telegram;
|
use openvk\Web\Util\Telegram;
|
||||||
|
@ -34,7 +34,13 @@ final class SupportPresenter extends OpenVKPresenter
|
||||||
$this->template->tickets = $this->tickets->getTicketsByUserId($this->user->id, $this->template->page);
|
$this->template->tickets = $this->tickets->getTicketsByUserId($this->user->id, $this->template->page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($this->template->mode === "new")
|
||||||
|
$this->template->banReason = $this->user->identity->getBanInSupportReason();
|
||||||
|
|
||||||
if($_SERVER["REQUEST_METHOD"] === "POST") {
|
if($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||||
|
if($this->user->identity->isBannedInSupport())
|
||||||
|
$this->flashFail("err", tr("not_enough_permissions"), tr("not_enough_permissions_comment"));
|
||||||
|
|
||||||
if(!empty($this->postParam("name")) && !empty($this->postParam("text"))) {
|
if(!empty($this->postParam("name")) && !empty($this->postParam("text"))) {
|
||||||
$this->willExecuteWriteAction();
|
$this->willExecuteWriteAction();
|
||||||
|
|
||||||
|
@ -268,4 +274,32 @@ final class SupportPresenter extends OpenVKPresenter
|
||||||
|
|
||||||
exit(header("HTTP/1.1 200 OK"));
|
exit(header("HTTP/1.1 200 OK"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function renderQuickBanInSupport(int $id): void
|
||||||
|
{
|
||||||
|
$this->assertPermission("openvk\Web\Models\Entities\TicketReply", "write", 0);
|
||||||
|
$this->assertNoCSRF();
|
||||||
|
|
||||||
|
$user = (new Users)->get($id);
|
||||||
|
if(!$user)
|
||||||
|
exit(json_encode([ "error" => "User does not exist" ]));
|
||||||
|
|
||||||
|
$user->setBlock_In_Support_Reason($this->queryParam("reason"));
|
||||||
|
$user->save();
|
||||||
|
$this->returnJson([ "success" => true, "reason" => $this->queryParam("reason") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderQuickUnbanInSupport(int $id): void
|
||||||
|
{
|
||||||
|
$this->assertPermission("openvk\Web\Models\Entities\TicketReply", "write", 0);
|
||||||
|
$this->assertNoCSRF();
|
||||||
|
|
||||||
|
$user = (new Users)->get($id);
|
||||||
|
if(!$user)
|
||||||
|
exit(json_encode([ "error" => "User does not exist" ]));
|
||||||
|
|
||||||
|
$user->setBlock_In_Support_Reason(null);
|
||||||
|
$user->save();
|
||||||
|
$this->returnJson([ "success" => true ]);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -26,6 +26,15 @@
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
{if $isNew}
|
{if $isNew}
|
||||||
|
{if !is_null($banReason)}
|
||||||
|
<center>
|
||||||
|
<img src="/assets/packages/static/openvk/img/oof.apng" alt="{_'banned_alt'}" style="width: 20%;" />
|
||||||
|
</center>
|
||||||
|
<p>
|
||||||
|
{tr("banned_in_support_1", htmlentities($thisUser->getCanonicalName()))|noescape}<br/>
|
||||||
|
{tr("banned_in_support_2", htmlentities($banReason))|noescape}
|
||||||
|
</p>
|
||||||
|
{else}
|
||||||
<div class="new">
|
<div class="new">
|
||||||
<form action="/support" method="post" style="margin:0;">
|
<form action="/support" method="post" style="margin:0;">
|
||||||
<center>
|
<center>
|
||||||
|
@ -38,6 +47,7 @@
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
|
{/if}
|
||||||
|
|
||||||
{if $isMain}
|
{if $isMain}
|
||||||
<h4>{_support_faq}</h4><br />
|
<h4>{_support_faq}</h4><br />
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
<div id="profile_link" style="width: 194px;">
|
<div id="profile_link" style="width: 194px;">
|
||||||
<a href="/edit" class="link">{_"edit_page"}</a>
|
<a href="/edit" class="link">{_"edit_page"}</a>
|
||||||
</div>
|
</div>
|
||||||
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['commerce']" id="profile_link" style="width: 194px;">
|
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['commerce'] && !$thisUser->prefersNotToSeeRating()" id="profile_link" style="width: 194px;">
|
||||||
<a onClick="showIncreaseRatingDialog({$thisUser->getCoins()}, {ltrim($thisUser->getUrl(), '/')}, {$csrfToken})" class="link">{_increase_rating}</a>
|
<a onClick="showIncreaseRatingDialog({$thisUser->getCoins()}, {ltrim($thisUser->getUrl(), '/')}, {$csrfToken})" class="link">{_increase_rating}</a>
|
||||||
</div>
|
</div>
|
||||||
{else}
|
{else}
|
||||||
|
@ -94,6 +94,16 @@
|
||||||
</a>
|
</a>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
{if $thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
|
||||||
|
<a href="javascript:toggleBanInSupport()" class="profile_link">
|
||||||
|
{if $user->isBannedInSupport()}
|
||||||
|
{_unban_in_support_user_action}
|
||||||
|
{else}
|
||||||
|
{_ban_in_support_user_action}
|
||||||
|
{/if}
|
||||||
|
</a>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['commerce'] && $user->getGiftCount() == 0" href="/gifts?act=pick&user={$user->getId()}" class="profile_link">{_send_gift}</a>
|
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['commerce'] && $user->getGiftCount() == 0" href="/gifts?act=pick&user={$user->getId()}" class="profile_link">{_send_gift}</a>
|
||||||
<a n:if="$user->getPrivacyPermission('messages.write', $thisUser)" href="/im?sel={$user->getId()}" class="profile_link">{_"send_message"}</a>
|
<a n:if="$user->getPrivacyPermission('messages.write', $thisUser)" href="/im?sel={$user->getId()}" class="profile_link">{_"send_message"}</a>
|
||||||
|
|
||||||
|
@ -512,7 +522,7 @@
|
||||||
xhr = new XMLHttpRequest();
|
xhr = new XMLHttpRequest();
|
||||||
xhr.open("GET", "/admin/ban/" + {$user->getId()} + "?reason=" + res + "&hash=" + {rawurlencode($csrfToken)}, true);
|
xhr.open("GET", "/admin/ban/" + {$user->getId()} + "?reason=" + res + "&hash=" + {rawurlencode($csrfToken)}, true);
|
||||||
xhr.onload = (function() {
|
xhr.onload = (function() {
|
||||||
if(xhr.responseText.indexOf("reason") === -1)
|
if(xhr.responseText.indexOf("success") === -1)
|
||||||
MessageBox("Ошибка", "Не удалось забанить пользователя...", ["OK"], [Function.noop]);
|
MessageBox("Ошибка", "Не удалось забанить пользователя...", ["OK"], [Function.noop]);
|
||||||
else
|
else
|
||||||
MessageBox("Операция успешна", "Пользователь заблокирован", ["OK"], [Function.noop]);
|
MessageBox("Операция успешна", "Пользователь заблокирован", ["OK"], [Function.noop]);
|
||||||
|
@ -526,7 +536,7 @@
|
||||||
function warnUser() {
|
function warnUser() {
|
||||||
uBanMsgTxt = "Вы собираетесь предупредить пользователя " + {$user->getCanonicalName()} + ".";
|
uBanMsgTxt = "Вы собираетесь предупредить пользователя " + {$user->getCanonicalName()} + ".";
|
||||||
uBanMsgTxt += "<br/>Мы отправим уведомление пользователю в личные сообщения от имени аккаунта администратора.";
|
uBanMsgTxt += "<br/>Мы отправим уведомление пользователю в личные сообщения от имени аккаунта администратора.";
|
||||||
uBanMsgTxt += "<br/><br/><b>Текст предупреждения</b>: <input type='text' id='uWarnMsgInput' placeholder='придумайте что-нибудь крутое' />"
|
uBanMsgTxt += "<br/><br/><b>Текст предупреждения</b>: <input type='text' id='uWarnMsgInput' placeholder='придумайте что-нибудь крутое' />";
|
||||||
|
|
||||||
MessageBox("Выдать предупреждение " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
MessageBox("Выдать предупреждение " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||||
(function() {
|
(function() {
|
||||||
|
@ -546,6 +556,51 @@
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<script n:if="isset($thisUser) && $thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)">
|
||||||
|
{if $user->isBannedInSupport()}
|
||||||
|
function toggleBanInSupport() {
|
||||||
|
uBanMsgTxt = "Вы собираетесь разблокировать в поддержке пользователя " + {$user->getCanonicalName()} + ".";
|
||||||
|
uBanMsgTxt += "<br/>Сейчас он заблокирован по причине <strong>" + {$user->getBanInSupportReason()} + "</strong>.";
|
||||||
|
|
||||||
|
MessageBox("Разблокировать в поддержке " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||||
|
(function() {
|
||||||
|
xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("GET", "/admin/support/unban/" + {$user->getId()} + "?hash=" + {rawurlencode($csrfToken)}, true);
|
||||||
|
xhr.onload = (function() {
|
||||||
|
if(xhr.responseText.indexOf("success") === -1)
|
||||||
|
MessageBox("Ошибка", "Не удалось разблокировать пользователя в поддержке...", ["OK"], [Function.noop]);
|
||||||
|
else
|
||||||
|
MessageBox("Операция успешна", "Пользователь разблокирован в поддержке", ["OK"], [Function.noop]);
|
||||||
|
});
|
||||||
|
xhr.send(null);
|
||||||
|
}),
|
||||||
|
Function.noop
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
{else}
|
||||||
|
function toggleBanInSupport() {
|
||||||
|
uBanMsgTxt = "Вы собираетесь заблокировать в поддержке пользователя " + {$user->getCanonicalName()} + ".";
|
||||||
|
uBanMsgTxt += "<br/><br/><b>Причина бана</b>: <input type='text' id='uBanMsgInput' placeholder='придумайте что-нибудь крутое' />";
|
||||||
|
|
||||||
|
MessageBox("Заблокировать в поддержке " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||||
|
(function() {
|
||||||
|
res = document.querySelector("#uBanMsgInput").value;
|
||||||
|
xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("GET", "/admin/support/ban/" + {$user->getId()} + "?reason=" + res + "&hash=" + {rawurlencode($csrfToken)}, true);
|
||||||
|
xhr.onload = (function() {
|
||||||
|
if(xhr.responseText.indexOf("success") === -1)
|
||||||
|
MessageBox("Ошибка", "Не удалось заблокировать пользователя в поддержке...", ["OK"], [Function.noop]);
|
||||||
|
else
|
||||||
|
MessageBox("Операция успешна", "Пользователь заблокирован в поддержке", ["OK"], [Function.noop]);
|
||||||
|
});
|
||||||
|
xhr.send(null);
|
||||||
|
}),
|
||||||
|
Function.noop
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
{/if}
|
||||||
|
</script>
|
||||||
|
|
||||||
<script n:if="isset($thisUser) && $user->getId() == $thisUser->getId()" n:syntax="off">
|
<script n:if="isset($thisUser) && $user->getId() == $thisUser->getId()" n:syntax="off">
|
||||||
function setStatusEditorShown(shown) {
|
function setStatusEditorShown(shown) {
|
||||||
document.getElementById("status_editor").style.display = shown ? "block" : "none";
|
document.getElementById("status_editor").style.display = shown ? "block" : "none";
|
||||||
|
|
|
@ -4,4 +4,82 @@
|
||||||
{tr("user_banned", htmlentities($user->getFirstName()))|noescape}<br/>
|
{tr("user_banned", htmlentities($user->getFirstName()))|noescape}<br/>
|
||||||
{_"user_banned_comment"} <b>{$user->getBanReason()}</b>.
|
{_"user_banned_comment"} <b>{$user->getBanReason()}</b>.
|
||||||
</p>
|
</p>
|
||||||
|
<p n:if="isset($thisUser) && $thisUser->getChandlerUser()->can('access')->model('admin')->whichBelongsTo(NULL) || $thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)">
|
||||||
|
<br />
|
||||||
|
<a n:if="$thisUser->getChandlerUser()->can('access')->model('admin')->whichBelongsTo(NULL)" href="javascript:unbanUser()" class="button">{_unban_user_action}</a>
|
||||||
|
<a n:if="$thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)" href="javascript:toggleBanInSupport()" class="button">
|
||||||
|
{if $user->isBannedInSupport()}
|
||||||
|
{_unban_in_support_user_action}
|
||||||
|
{else}
|
||||||
|
{_ban_in_support_user_action}
|
||||||
|
{/if}
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
|
<script n:if="isset($thisUser) && $thisUser->getChandlerUser()->can('access')->model('admin')->whichBelongsTo(NULL)">
|
||||||
|
function unbanUser() {
|
||||||
|
uUnbanMsgTxt = "Вы собираетесь разбанить пользователя " + {$user->getCanonicalName()} + ".";
|
||||||
|
uUnbanMsgTxt += "<br/>Сейчас он заблокирован по причине: <strong>" + {$user->getBanReason()} + "</strong>.";
|
||||||
|
|
||||||
|
MessageBox("Разбанить " + {$user->getFirstName()}, uUnbanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||||
|
(function() {
|
||||||
|
xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("GET", "/admin/unban/" + {$user->getId()} + "?hash=" + {rawurlencode($csrfToken)}, true);
|
||||||
|
xhr.onload = (function() {
|
||||||
|
if(xhr.responseText.indexOf("success") === -1)
|
||||||
|
MessageBox("Ошибка", "Не удалось разблокировать пользователя...", ["OK"], [Function.noop]);
|
||||||
|
else
|
||||||
|
MessageBox("Операция успешна", "Пользователь разблокирован", ["OK"], [Function.noop]);
|
||||||
|
});
|
||||||
|
xhr.send(null);
|
||||||
|
}),
|
||||||
|
Function.noop
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script n:if="isset($thisUser) && $thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)">
|
||||||
|
{if $user->isBannedInSupport()}
|
||||||
|
function toggleBanInSupport() {
|
||||||
|
uBanMsgTxt = "Вы собираетесь разблокировать в поддержке пользователя " + {$user->getCanonicalName()} + ".";
|
||||||
|
uBanMsgTxt += "<br/>Сейчас он заблокирован по причине <strong>" + {$user->getBanInSupportReason()} + "</strong>.";
|
||||||
|
|
||||||
|
MessageBox("Разблокировать в поддержке " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||||
|
(function() {
|
||||||
|
xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("GET", "/admin/support/unban/" + {$user->getId()} + "?hash=" + {rawurlencode($csrfToken)}, true);
|
||||||
|
xhr.onload = (function() {
|
||||||
|
if(xhr.responseText.indexOf("success") === -1)
|
||||||
|
MessageBox("Ошибка", "Не удалось разблокировать пользователя в поддержке...", ["OK"], [Function.noop]);
|
||||||
|
else
|
||||||
|
MessageBox("Операция успешна", "Пользователь разблокирован в поддержке", ["OK"], [Function.noop]);
|
||||||
|
});
|
||||||
|
xhr.send(null);
|
||||||
|
}),
|
||||||
|
Function.noop
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
{else}
|
||||||
|
function toggleBanInSupport() {
|
||||||
|
uBanMsgTxt = "Вы собираетесь заблокировать в поддержке пользователя " + {$user->getCanonicalName()} + ".";
|
||||||
|
uBanMsgTxt += "<br/><br/><b>Причина бана</b>: <input type='text' id='uBanMsgInput' placeholder='придумайте что-нибудь крутое' />";
|
||||||
|
|
||||||
|
MessageBox("Заблокировать в поддержке " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||||
|
(function() {
|
||||||
|
res = document.querySelector("#uBanMsgInput").value;
|
||||||
|
xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("GET", "/admin/support/ban/" + {$user->getId()} + "?reason=" + res + "&hash=" + {rawurlencode($csrfToken)}, true);
|
||||||
|
xhr.onload = (function() {
|
||||||
|
if(xhr.responseText.indexOf("success") === -1)
|
||||||
|
MessageBox("Ошибка", "Не удалось заблокировать пользователя в поддержке...", ["OK"], [Function.noop]);
|
||||||
|
else
|
||||||
|
MessageBox("Операция успешна", "Пользователь заблокирован в поддержке", ["OK"], [Function.noop]);
|
||||||
|
});
|
||||||
|
xhr.send(null);
|
||||||
|
}),
|
||||||
|
Function.noop
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
{/if}
|
||||||
|
</script>
|
||||||
|
|
|
@ -271,8 +271,14 @@ routes:
|
||||||
handler: "Admin->gifts"
|
handler: "Admin->gifts"
|
||||||
- url: "/admin/ban/{num}"
|
- url: "/admin/ban/{num}"
|
||||||
handler: "Admin->quickBan"
|
handler: "Admin->quickBan"
|
||||||
|
- url: "/admin/unban/{num}"
|
||||||
|
handler: "Admin->quickUnban"
|
||||||
- url: "/admin/warn/{num}"
|
- url: "/admin/warn/{num}"
|
||||||
handler: "Admin->quickWarn"
|
handler: "Admin->quickWarn"
|
||||||
|
- url: "/admin/support/ban/{num}"
|
||||||
|
handler: "Support->quickBanInSupport"
|
||||||
|
- url: "/admin/support/unban/{num}"
|
||||||
|
handler: "Support->quickUnbanInSupport"
|
||||||
- url: "/method/{text}.{text}"
|
- url: "/method/{text}.{text}"
|
||||||
handler: "VKAPI->route"
|
handler: "VKAPI->route"
|
||||||
- url: "/token"
|
- url: "/token"
|
||||||
|
|
1
install/sqls/00019-block-in-support.sql
Normal file
1
install/sqls/00019-block-in-support.sql
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE `profiles` ADD COLUMN `block_in_support_reason` text COLLATE utf8mb4_unicode_520_ci DEFAULT NULL AFTER `block_reason`;
|
|
@ -688,6 +688,9 @@
|
||||||
"ticket_changed" = "Ticket changed";
|
"ticket_changed" = "Ticket changed";
|
||||||
"ticket_changed_comment" = "The changes will take effect in a few seconds.";
|
"ticket_changed_comment" = "The changes will take effect in a few seconds.";
|
||||||
|
|
||||||
|
"banned_in_support_1" = "Sorry, <b>$1</b>, but now you can't create tickets.";
|
||||||
|
"banned_in_support_2" = "And the reason for this is simple: <b>$1</b>. Unfortunately, this time we had to take away this opportunity from you forever.";
|
||||||
|
|
||||||
/* Invite */
|
/* Invite */
|
||||||
|
|
||||||
"invite" = "Invite";
|
"invite" = "Invite";
|
||||||
|
@ -831,7 +834,10 @@
|
||||||
"manage_user_action" = "Manage user";
|
"manage_user_action" = "Manage user";
|
||||||
"manage_group_action" = "Manage group";
|
"manage_group_action" = "Manage group";
|
||||||
"ban_user_action" = "Ban user";
|
"ban_user_action" = "Ban user";
|
||||||
|
"unban_user_action" = "Unban user";
|
||||||
"warn_user_action" = "Warn user";
|
"warn_user_action" = "Warn user";
|
||||||
|
"ban_in_support_user_action" = "Ban in support";
|
||||||
|
"unban_in_support_user_action" = "Unban in support";
|
||||||
|
|
||||||
/* Paginator (deprecated) */
|
/* Paginator (deprecated) */
|
||||||
|
|
||||||
|
|
|
@ -725,6 +725,9 @@
|
||||||
"ticket_changed" = "Тикет изменён";
|
"ticket_changed" = "Тикет изменён";
|
||||||
"ticket_changed_comment" = "Изменения вступят силу через несколько секунд.";
|
"ticket_changed_comment" = "Изменения вступят силу через несколько секунд.";
|
||||||
|
|
||||||
|
"banned_in_support_1" = "Извините, <b>$1</b>, но теперь вам нельзя создавать обращения.";
|
||||||
|
"banned_in_support_2" = "А причина этому проста: <b>$1</b>. К сожалению, на этот раз нам пришлось отобрать у вас эту возможность навсегда.";
|
||||||
|
|
||||||
/* Invite */
|
/* Invite */
|
||||||
|
|
||||||
"invite" = "Пригласить";
|
"invite" = "Пригласить";
|
||||||
|
@ -874,7 +877,10 @@
|
||||||
"manage_user_action" = "Управление пользователем";
|
"manage_user_action" = "Управление пользователем";
|
||||||
"manage_group_action" = "Управление группой";
|
"manage_group_action" = "Управление группой";
|
||||||
"ban_user_action" = "Заблокировать пользователя";
|
"ban_user_action" = "Заблокировать пользователя";
|
||||||
|
"unban_user_action" = "Разблокировать пользователя";
|
||||||
"warn_user_action" = "Предупредить пользователя";
|
"warn_user_action" = "Предупредить пользователя";
|
||||||
|
"ban_in_support_user_action" = "Заблокировать в поддержке";
|
||||||
|
"unban_in_support_user_action" = "Разблокировать в поддержке";
|
||||||
|
|
||||||
/* Paginator (deprecated) */
|
/* Paginator (deprecated) */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue