Admin: Localization & fixing tabs (#407)

This commit is contained in:
Ilya Prokopenko 2022-04-24 13:02:23 +07:00 committed by GitHub
parent c1d7b49dda
commit e6c14c2eeb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 495 additions and 459 deletions

View file

@ -23,7 +23,7 @@ final class AdminPresenter extends OpenVKPresenter
private function warnIfNoCommerce(): void
{
if(!OPENVK_ROOT_CONF["openvk"]["preferences"]["commerce"])
$this->flash("warn", "Коммерция отключена системным администратором", "Настройки ваучеров и подарков будут сохранены, но не будут оказывать никакого влияния.");
$this->flash("warn", tr("admin_commerce_disabled"), tr("admin_commerce_disabled_desc"));
}
private function searchResults(object $repo, &$count)

View file

@ -173,7 +173,7 @@
{var $canAccessHelpdesk = $thisUser->getChandlerUser()->can("write")->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
{var $menuLinksAvaiable = sizeof(OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links']) > 0 && $thisUser->getLeftMenuItemStatus('links')}
<div n:if="$canAccessAdminPanel || $canAccessHelpdesk || $menuLinksAvaiable" class="menu_divider"></div>
<a href="/admin" class="link" n:if="$canAccessAdminPanel" title="Админ-панель [Alt+Shift+A]" accesskey="a">Админ-панель</a>
<a href="/admin" class="link" n:if="$canAccessAdminPanel" title="{_admin} [Alt+Shift+A]" accesskey="a">{_admin}</a>
<a href="/support/tickets" class="link" n:if="$canAccessHelpdesk">Helpdesk
{if $helpdeskTicketNotAnsweredCount > 0}
(<b>{$helpdeskTicketNotAnsweredCount}</b>)

View file

@ -1,3 +1,4 @@
{var $instance_name = OPENVK_ROOT_CONF['openvk']['appearance']['name']}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
@ -6,7 +7,7 @@
{var $css = file_get_contents(OPENVK_ROOT . "/Web/static/js/node_modules/@atlassian/aui/dist/aui/aui-prototyping.css")}
{str_replace("fonts/", "/assets/packages/static/openvk/js/node_modules/@atlassian/aui/dist/aui/fonts/", $css)|noescape}
</style>
<title>{include title} - Админ-панель {=OPENVK_ROOT_CONF['openvk']['appearance']['name']}</title>
<title>{include title} - {_admin} {$instance_name}</title>
</head>
<body>
<div id="page">
@ -16,23 +17,15 @@
<div class="aui-header-primary">
<h1 id="logo" class="aui-header-logo aui-header-logo-textonly">
<a href="/admin">
<span class="aui-header-logo-device">{=OPENVK_ROOT_CONF['openvk']['appearance']['name']}</span>
<span class="aui-header-logo-device">{$instance_name}</span>
</a>
</h1>
</div>
<div n:if="$search ?? false" class="aui-header-secondary">
<ul class="aui-nav">
<form class="aui-quicksearch dont-default-focus ajs-dirty-warning-exempt">
<input
id="quickSearchInput"
autocomplete="off"
class="search"
type="text"
placeholder="{include searchTitle}"
value="{$_GET['q'] ?? ''}"
name="q"
accesskey="Q" />
<input type="hidden" value=1 name=p />
<input id="quickSearchInput" autocomplete="off" class="search" type="text" placeholder="{include searchTitle}" value="{$_GET['q'] ?? ''}" name="q" accesskey="Q" />
<input type="hidden" value=1 name=p />
</form>
</ul>
</div>
@ -46,83 +39,64 @@
<div class="aui-navgroup-inner">
<div class="aui-navgroup-primary">
<div class="aui-nav-heading">
<strong>Обзор</strong>
<strong>{_admin_overview}</strong>
</div>
<ul class="aui-nav">
<li>
<a href="/admin">
Сводка
</a>
<a href="/admin">{_admin_overview_summary}</a>
</li>
</ul>
<div class="aui-nav-heading">
<strong>Пользовательский контент</strong>
<strong>{_admin_content}</strong>
</div>
<ul class="aui-nav">
<li>
<a href="/admin/users">
Пользователи
</a>
<a href="/admin/users">{_users}</a>
</li>
<li>
<a href="/admin/clubs">
Группы
</a>
<a href="/admin/clubs">{_groups}</a>
</li>
</ul>
<div class="aui-nav-heading">
<strong>Платные услуги</strong>
<strong>{_admin_services}</strong>
</div>
<ul class="aui-nav">
<li>
<a href="/admin/vouchers">
{_vouchers}
</a>
<a href="/admin/vouchers">{_vouchers}</a>
</li>
<li>
<a href="/admin/gifts">
Подарки
</a>
<a href="/admin/gifts">{_gifts}</a>
</li>
</ul>
<div class="aui-nav-heading">
<strong>Настройки</strong>
<strong>{_admin_settings}</strong>
</div>
<ul class="aui-nav">
<li>
<a href="/admin/settings/tuning">
Общие
</a>
<a href="/admin/settings/tuning">{_admin_settings_tuning}</a>
</li>
<li>
<a href="/admin/settings/appearance">
Внешний вид
</a>
<a href="/admin/settings/appearance">{_admin_settings_appearance}</a>
</li>
<li>
<a href="/admin/settings/security">
Безопасность
</a>
<a href="/admin/settings/security">{_admin_settings_security}</a>
</li>
<li>
<a href="/admin/settings/integrations">
Интеграции
</a>
<a href="/admin/settings/integrations">{_admin_settings_integrations}</a>
</li>
<li>
<a href="/admin/settings/system">
Система
</a>
<a href="/admin/settings/system">{_admin_settings_system}</a>
</li>
</ul>
<div class="aui-nav-heading">
<strong>Об OpenVK</strong>
<strong>{_admin_about}</strong>
</div>
<ul class="aui-nav">
<li>
<a href="/about:openvk">
Версия
</a>
<a href="/about:openvk">{_admin_about_version}</a>
</li>
<li>
<a href="/about">{_admin_about_instance}</a>
</li>
</ul>
</div>
@ -139,11 +113,11 @@
<p>{$flashMessage->msg|noescape}</p>
</div>
{/ifset}
{ifset preHeader}
{include preHeader}
{/ifset}
<header class="aui-page-header">
<div class="aui-page-header-inner">
<div class="aui-page-header-main">
@ -167,11 +141,11 @@
</section>
</footer>
</div>
{script "js/node_modules/jquery/dist/jquery.min.js"}
{script "js/node_modules/@atlassian/aui/dist/aui/aui-prototyping.js"}
<script>AJS.tabs.setup();</script>
{ifset scripts}
{include scripts}
{/ifset}

View file

@ -1,191 +1,157 @@
{extends "@layout.xml"}
{block title}
Редактировать {$club->getCanonicalName()}
{_edit} {$club->getCanonicalName()}
{/block}
{block heading}
{$club->getCanonicalName()}
{/block}
{block content}
{var $isMain = $mode === 'main'}
{var $isBan = $mode === 'ban'}
{var $isFollowers = $mode === 'followers'}
{var $isMain = $mode === 'main'}
{var $isBan = $mode === 'ban'}
{var $isFollowers = $mode === 'followers'}
{if $isMain}
<!-- This main block -->
<div class="aui-tabs horizontal-tabs">
<nav class="aui-navgroup aui-navgroup-horizontal">
<div class="aui-navgroup-inner">
<div class="aui-navgroup-primary">
<ul class="aui-nav">
<li class="aui-nav-selected"><a href="?act=main">Главное</a></li>
<li><a href="?act=ban">Бан</a></li>
<li><a href="?act=followers">Участники</a></li>
</ul>
</div>
</div>
</nav>
<form class="aui" method="POST">
<div class="field-group">
<label for="avatar">
Аватарка
</label>
<span id="avatar" class="aui-avatar aui-avatar-project aui-avatar-xlarge">
<span class="aui-avatar-inner">
<img src="{$club->getAvatarUrl('tiny')}" style="object-fit: cover;"></img>
</span>
</span>
</div>
<div class="field-group">
<label for="id">
ID
</label>
<input class="text medium-field" type="number" id="id" disabled value="{$club->getId()}" />
</div>
<div class="field-group">
<label for="id_owner">
ID владельца
</label>
<input class="text medium-field" type="text" id="id_owner" name="id_owner" value="{$club->getOwner()->getId()}" />
</div>
<div class="field-group">
<label for="name">
Название
</label>
<input class="text medium-field" type="text" id="name" name="name" value="{$club->getName()}" />
</div>
<div class="field-group">
<label for="about">
Описание
</label>
<input class="text medium-field" type="text" id="about" name="about" value="{$club->getDescription()}" />
</div>
<div class="field-group">
<label for="shortcode">
Адрес
</label>
<input class="text medium-field" type="text" id="shortcode" name="shortcode" value="{$club->getShortCode()}" />
</div>
<br/>
<div class="group">
<input class="toggle-large" type="checkbox" id="verify" name="verify" value="1" {if $club->isVerified()} checked {/if} />
<label for="verify">
Верификация
</label>
</div>
<div class="group">
<input class="toggle-large" type="checkbox" id="hide_from_global_feed" name="hide_from_global_feed" value="1" {if $club->isHideFromGlobalFeedEnabled()} checked {/if} />
<label for="hide_from_global_feed">
Не отображать записи в глобальной ленте
</label>
</div>
<hr/>
<div class="buttons-container">
<div class="buttons">
<input type="hidden" name="hash" value="{$csrfToken}" />
<input class="button submit" type="submit" value="Сохранить">
</div>
</div>
</form>
</div>
{/if}
{if $isBan}
<!-- This ban block -->
<div class="aui-tabs horizontal-tabs">
<nav class="aui-navgroup aui-navgroup-horizontal">
<div class="aui-navgroup-inner">
<div class="aui-navgroup-primary">
<ul class="aui-nav">
<li><a href="?act=main">Главное</a></li>
<li class="aui-nav-selected"><a href="?act=ban">Бан</a></li>
<li><a href="?act=followers">Участники</a></li>
</ul>
</div>
</div>
</nav>
<form class="aui" method="POST">
<div class="field-group">
<label for="ban_reason">
Причина бана
</label>
<input class="text" type="text" id="text-input" name="ban_reason" value="{$club->getBanReason()}" />
</div>
<hr/>
<div class="buttons-container">
<div class="buttons">
<input type="hidden" name="hash" value="{$csrfToken}" />
<input class="button submit" type="submit" value="Сохранить">
</div>
</div>
</form>
</div>
{/if}
{if $isFollowers}
<!-- This followers block -->
{var $followers = iterator_to_array($followers)}
<div class="aui-tabs horizontal-tabs">
<nav class="aui-navgroup aui-navgroup-horizontal">
<div class="aui-navgroup-inner">
<div class="aui-navgroup-primary">
<ul class="aui-nav">
<li><a href="?act=main">Главное</a></li>
<li><a href="?act=ban">Бан</a></li>
<li class="aui-nav-selected"><a href="?act=followers">Участники</a></li>
</ul>
</div>
</div>
</nav>
<table rules="none" class="aui aui-table-list">
<tbody>
<tr n:foreach="$followers as $follower">
<td>{$follower->getId()}</td>
<td>
<span class="aui-avatar aui-avatar-xsmall">
{if $isMain}
<div class="aui-tabs horizontal-tabs">
<nav class="aui-navgroup aui-navgroup-horizontal">
<div class="aui-navgroup-inner">
<div class="aui-navgroup-primary">
<ul class="aui-nav">
<li class="aui-nav-selected"><a href="?act=main">{_admin_tab_main}</a></li>
<li><a href="?act=ban">{_admin_tab_ban}</a></li>
<li><a href="?act=followers">{_admin_tab_followers}</a></li>
</ul>
</div>
</div>
</nav>
<form class="aui" method="POST">
<div class="field-group">
<label for="avatar">{_avatar}</label>
<span id="avatar" class="aui-avatar aui-avatar-project aui-avatar-xlarge">
<span class="aui-avatar-inner">
<img src="{$follower->getAvatarUrl('miniscule')}" alt="{$follower->getCanonicalName()}" role="presentation" />
<img src="{$club->getAvatarUrl('tiny')}" style="object-fit: cover;"></img>
</span>
</span>
<a href="{$follower->getURL()}">{$follower->getCanonicalName()}</a>
<span n:if="$follower->isBanned()" class="aui-lozenge aui-lozenge-subtle aui-lozenge-removed">
заблокирован
</span>
</td>
<td>{$follower->isFemale() ? "Женский" : "Мужской"}</td>
<td>{$follower->getShortCode() ?? "(отсутствует)"}</td>
<td>{$follower->getRegistrationTime()}</td>
<td>
<a class="aui-button aui-button-primary" href="/admin/users/id{$follower->getId()}">
<span class="aui-icon aui-icon-small aui-iconfont-new-edit">Редактировать</span>
</a>
</td>
</tr>
</tbody>
</table>
<div align="right">
{var $isLast = ((20 * (($_GET['p'] ?? 1) - 1)) + $amount) < $count}
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?p={($_GET['p'] ?? 1) - 1}">
⭁ туда
</a>
<a n:if="$isLast" class="aui-button" href="?p={($_GET['p'] ?? 1) + 1}">
⭇ сюда
</a>
</div>
</div>
{/if}
</div>
<div class="field-group">
<label for="id">ID</label>
<input class="text medium-field" type="number" id="id" disabled value="{$club->getId()}" />
</div>
<div class="field-group">
<label for="id_owner">{_admin_ownerid}</label>
<input class="text medium-field" type="text" id="id_owner" name="id_owner" value="{$club->getOwner()->getId()}" />
</div>
<div class="field-group">
<label for="name">{_admin_title}</label>
<input class="text medium-field" type="text" id="name" name="name" value="{$club->getName()}" />
</div>
<div class="field-group">
<label for="about">{_admin_description}</label>
<input class="text medium-field" type="text" id="about" name="about" value="{$club->getDescription()}" />
</div>
<div class="field-group">
<label for="shortcode">{_admin_shortcode}</label>
<input class="text medium-field" type="text" id="shortcode" name="shortcode" value="{$club->getShortCode()}" />
</div>
<br/>
<div class="group">
<input class="toggle-large" type="checkbox" id="verify" name="verify" value="1" {if $club->isVerified()} checked {/if} />
<label for="verify">{_admin_verification}</label>
</div>
<div class="group">
<input class="toggle-large" type="checkbox" id="hide_from_global_feed" name="hide_from_global_feed" value="1" {if $club->isHideFromGlobalFeedEnabled()} checked {/if} />
<label for="hide_from_global_feed">{_admin_club_excludeglobalfeed}</label>
</div>
<hr/>
<div class="buttons-container">
<div class="buttons">
<input type="hidden" name="hash" value="{$csrfToken}" />
<input class="button submit" type="submit" value="{_save}">
</div>
</div>
</form>
</div>
{/if}
{if $isBan}
<div class="aui-tabs horizontal-tabs">
<nav class="aui-navgroup aui-navgroup-horizontal">
<div class="aui-navgroup-inner">
<div class="aui-navgroup-primary">
<ul class="aui-nav">
<li><a href="?act=main">{_admin_tab_main}</a></li>
<li class="aui-nav-selected"><a href="?act=ban">{_admin_tab_ban}</a></li>
<li><a href="?act=followers">{_admin_tab_followers}</a></li>
</ul>
</div>
</div>
</nav>
<form class="aui" method="POST">
<div class="field-group">
<label for="ban_reason">{_admin_banreason}</label>
<input class="text" type="text" id="text-input" name="ban_reason" value="{$club->getBanReason()}" />
</div>
<hr/>
<div class="buttons-container">
<div class="buttons">
<input type="hidden" name="hash" value="{$csrfToken}" />
<input class="button submit" type="submit" value="{_save}">
</div>
</div>
</form>
</div>
{/if}
{if $isFollowers}
{var $followers = iterator_to_array($followers)}
<div class="aui-tabs horizontal-tabs">
<nav class="aui-navgroup aui-navgroup-horizontal">
<div class="aui-navgroup-inner">
<div class="aui-navgroup-primary">
<ul class="aui-nav">
<li><a href="?act=main">{_admin_tab_main}</a></li>
<li><a href="?act=ban">{_admin_tab_ban}</a></li>
<li class="aui-nav-selected"><a href="?act=followers">{_admin_tab_followers}</a></li>
</ul>
</div>
</div>
</nav>
<table rules="none" class="aui aui-table-list">
<tbody>
<tr n:foreach="$followers as $follower">
<td>{$follower->getId()}</td>
<td>
<span class="aui-avatar aui-avatar-xsmall">
<span class="aui-avatar-inner">
<img src="{$follower->getAvatarUrl()}" alt="{$follower->getCanonicalName()}" role="presentation" />
</span>
</span>
<a href="{$follower->getURL()}">{$follower->getCanonicalName()}</a>
<span n:if="$follower->isBanned()" class="aui-lozenge aui-lozenge-subtle aui-lozenge-removed">{_admin_banned}</span>
</td>
<td>{$follower->isFemale() ? tr("female") : tr("male")}</td>
<td>{$follower->getShortCode() ?? "(" . tr("none") . ")"}</td>
<td>{$follower->getRegistrationTime()}</td>
<td>
<a class="aui-button aui-button-primary" href="/admin/users/id{$follower->getId()}">
<span class="aui-icon aui-icon-small aui-iconfont-new-edit">{_edit}</span>
</a>
</td>
</tr>
</tbody>
</table>
<div align="right">
{var $isLast = ((20 * (($_GET['p'] ?? 1) - 1)) + $amount) < $count}
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?p={($_GET['p'] ?? 1) - 1}">«</a>
<a n:if="$isLast" class="aui-button" href="?p={($_GET['p'] ?? 1) + 1}">»</a>
</div>
</div>
{/if}
{/block}

View file

@ -2,14 +2,16 @@
{var $search = true}
{block title}
Группы
{_admin_club_search}
{/block}
{block heading}
Бутылки
{_groups}
{/block}
{block searchTitle}Поиск бутылок{/block}
{block searchTitle}
{include title}
{/block}
{block content}
{var $clubs = iterator_to_array($clubs)}
@ -18,12 +20,12 @@
<table class="aui aui-table-list">
<thead>
<tr>
<th>#</th>
<th>Имя</th>
<th>Автор</th>
<th>Описание</th>
<th>Короткий адрес</th>
<th>Действия</th>
<th>ID</th>
<th>{_admin_title}</th>
<th>{_admin_author}</th>
<th>{_admin_description}</th>
<th>{_admin_shortcode}</th>
<th>{_admin_actions}</th>
</tr>
</thead>
<tbody>
@ -49,11 +51,11 @@
<a href="{$user->getURL()}">{$user->getCanonicalName()}</a>
</td>
<td>{$club->getDescription() ?? "(не указано)"}</td>
<td>{$club->getDescription() ?? "(" . tr("none") . ")"}</td>
<td>{$club->getShortCode()}</td>
<td>
<a class="aui-button aui-button-primary" href="/admin/clubs/id{$club->getId()}">
<span class="aui-icon aui-icon-small aui-iconfont-new-edit">Редактировать</span>
<span class="aui-icon aui-icon-small aui-iconfont-new-edit">{_edit}</span>
</a>
</td>
</tr>
@ -63,11 +65,7 @@
<div align="right">
{var $isLast = ((10 * (($_GET['p'] ?? 1) - 1)) + $amount) < $count}
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?p={($_GET['p'] ?? 1) - 1}">
⭁ туда
</a>
<a n:if="$isLast" class="aui-button" href="?p={($_GET['p'] ?? 1) + 1}">
⭇ сюда
</a>
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?p={($_GET['p'] ?? 1) - 1}">&laquo;</a>
<a n:if="$isLast" class="aui-button" href="?p={($_GET['p'] ?? 1) + 1}">&raquo;</a>
</div>
{/block}

View file

@ -2,9 +2,9 @@
{block title}
{if $form->id === 0}
Новый подарок
{_admin_newgift}
{else}
Подарок "{$form->name}"
{_gift} "{$form->name}"
{/if}
{/block}
@ -16,7 +16,7 @@
<form class="aui" method="POST" enctype="multipart/form-data">
<div class="field-group">
<label for="avatar">
Изображение
{_admin_image}
<span n:if="$form->id === 0" class="aui-icon icon-required"></span>
</label>
{if $form->id === 0}
@ -29,43 +29,39 @@
</span>
<input style="display: none;" id="picInput" type="file" name="pic" accept="image/jpeg,image/png,image/gif,image/webp" />
<div class="description">
<a id="picChange" href="javascript:false">Заменить изображение?</a>
<a id="picChange" href="javascript:false">{_admin_image_replace}</a>
</div>
{/if}
</div>
<div class="field-group">
<label for="id">
ID
</label>
<label for="id">ID</label>
<input class="text long-field" type="number" id="id" disabled="disabled" value="{$form->id}" />
</div>
<div class="field-group">
<label for="putin">
Использований
</label>
<input class="text long-field" type="number" id="putin" disabled="disabled" value="{$form->usages}" />
<label for="usages">{_admin_uses}</label>
<input class="text long-field" type="number" id="usages" disabled="disabled" value="{$form->usages}" />
<div n:if="$form->usages > 0" class="description">
<a href="javascript:$('#putin').value(0);">Обнулить?</a>
<a href="javascript:$('#usages').value(0);">{_admin_uses_reset}</a>
</div>
</div>
<div class="field-group">
<label for="name">
Внутренее имя
{_admin_name}
<span class="aui-icon icon-required"></span>
</label>
<input class="text long-field" type="text" id="name" name="name" value="{$form->name}" />
</div>
<div class="field-group">
<label for="price">
Цена
{_admin_price}
<span class="aui-icon icon-required"></span>
</label>
<input class="text long-field" type="number" id="price" name="price" min="0" value="{$form->price}" />
</div>
<div class="field-group">
<label for="limit">
Ограничение
{_admin_limits}
<span class="aui-icon icon-required"></span>
</label>
<input class="text long-field" type="number" min="-1" id="limit" name="limit" value="{$form->limit}" />
@ -75,13 +71,13 @@
<div class="checkbox" resolved="">
<input n:attr="disabled => $form->id === 0, checked => $form->id === 0" class="checkbox" type="checkbox" name="reset_limit" id="reset_limit" />
<span class="aui-form-glyph"></span>
<label for="reset_limit">Сбросить счётчик ограничений</label>
<label for="reset_limit">{_admin_limits_reset}</label>
</div>
</fieldset>
<input n:if="$form->id === 0" type="hidden" name="_cat" value="{$_GET['cat'] ?? 1}" />
<div class="buttons-container">
<div class="buttons">
<input type="hidden" name="hash" value="{$csrfToken}" />
@ -94,12 +90,12 @@
{block scripts}
<script>
const TRANS_GIF = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
$("#picChange").click(_ => $("#picInput").click());
$("#picInput").bind("change", e => {
if(typeof e.target.files[0] === "undefined")
$("#pic").prop("src", URL.createObjectURL(TRANS_GIF));
$("#pic").prop("src", URL.createObjectURL(e.target.files[0]));
});
</script>

View file

@ -1,7 +1,7 @@
{extends "@layout.xml"}
{block title}
Наборы подарков
{_admin_giftsets}
{/block}
{block headingWrap}
@ -9,7 +9,7 @@
{_create}
</a>
<h1>Наборы подарков</h1>
<h1>{_admin_giftsets}</h1>
{/block}
{block content}
@ -27,12 +27,11 @@
</td>
<td style="vertical-align: middle; text-align: right;">
<a class="aui-button aui-button-primary" href="/admin/gifts/{$cat->getSlug()}.{$cat->getId()}.meta">
<span class="aui-icon aui-icon-small aui-iconfont-new-edit">Редактировать</span>
<span class="aui-icon aui-icon-small aui-iconfont-new-edit">{_edit}</span>
</a>
<a class="aui-button" href="/admin/gifts/{$cat->getSlug()}.{$cat->getId()}/">
<span class="aui-icon aui-icon-small aui-iconfont-gallery">Открыть</span>
Открыть
<span class="aui-icon aui-icon-small aui-iconfont-gallery">{_admin_open}</span>
</a>
</td>
</tr>
@ -40,17 +39,13 @@
</table>
{else}
<center>
<p>Наборов подарков нету. Чтобы создать подарок, создайте набор.</p>
<p>{_admin_giftsets_none}</p>
</center>
{/if}
<div align="right">
{var $isLast = ((20 * (($_GET['p'] ?? 1) - 1)) + sizeof($categories)) < $count}
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?act={$act}&p={($_GET['p'] ?? 1) - 1}">
⭁ туда
</a>
<a n:if="$isLast" class="aui-button" href="?act={$act}&p={($_GET['p'] ?? 1) + 1}">
⭇ сюда
</a>
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?act={$act}&p={($_GET['p'] ?? 1) - 1}">&laquo;</a>
<a n:if="$isLast" class="aui-button" href="?act={$act}&p={($_GET['p'] ?? 1) + 1}">&raquo;</a>
</div>
{/block}

View file

@ -2,7 +2,7 @@
{block title}
{if $form->id === 0}
Создать набор подарков
{_admin_giftsets_create}
{else}
{$form->languages["master"]->name}
{/if}
@ -14,7 +14,7 @@
{block content}
<form class="aui" method="POST">
<h3>Общие настройки</h3>
<h3>{_admin_commonsettings}</h3>
<fieldset>
<div class="field-group">
<label for="id">
@ -24,37 +24,37 @@
</div>
<div class="field-group">
<label for="name_master">
Наименование
{_admin_name}
<span class="aui-icon icon-required"></span>
</label>
<input class="text long-field" type="text" id="name_master" name="name_master" value="{$form->languages['master']->name}" />
<div class="description">Внутреннее название набора, которое будет использоваться, если не удаётся найти название на языке пользователя.</div>
<div class="description">{_admin_giftsets_title}</div>
</div>
<div class="field-group">
<label for="description_master">
Описание
{_admin_description}
<span class="aui-icon icon-required"></span>
</label>
<input class="text long-field" type="text" id="description_master" name="description_master" value="{$form->languages['master']->description}" />
<div class="description">Внутреннее описание набора, которое будет использоваться, если не удаётся найти название на языке пользователя.</div>
<div class="description">{_admin_giftsets_description}</div>
</div>
</fieldset>
<h3>Языко-зависимые настройки</h3>
<h3>{_admin_langsettings}</h3>
<fieldset>
{foreach $form->languages as $locale => $data}
{continueIf $locale === "master"}
<div class="field-group">
<label for="name_{$locale}">
Наименование
{_admin_name}
<img src="/assets/packages/static/openvk/img/flags/{$locale}.gif" alt="{$locale}" />
</label>
<input class="text long-field" type="text" id="name_{$locale}" name="name_{$locale}" value="{$data->name}" />
</div>
<div class="field-group">
<label for="description_{$locale}">
Описание
{_admin_description}
<img src="/assets/packages/static/openvk/img/flags/{$locale}.gif" alt="{$locale}" />
</label>
<input class="text long-field" type="text" id="description_{$locale}" name="description_{$locale}" value="{$data->description}" />

View file

@ -9,7 +9,7 @@
{_create}
</a>
<h1>Набор "{$cat->getName()}"</h1>
<h1>{_admin_giftset} "{$cat->getName()}"</h1>
{/block}
{block content}
@ -32,11 +32,11 @@
<td style="vertical-align: middle;">
{$gift->getName()}
<span n:if="$gift->isFree()" class="aui-lozenge aui-lozenge-subtle aui-lozenge-success">
бесплатный
{_admin_price_free}
</span>
</td>
<td style="vertical-align: middle;">
{$gift->getPrice()} голосов
{tr("points_amount", $gift->getPrice())}
</td>
<td style="vertical-align: middle;">
{$gift->getUsages()} раз
@ -72,11 +72,8 @@
<div align="right">
{var $isLast = ((20 * (($_GET['p'] ?? 1) - 1)) + sizeof($gifts)) < $count}
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?p={($_GET['p'] ?? 1) - 1}">
⭁ туда
</a>
<a n:if="$isLast" class="aui-button" href="?p={($_GET['p'] ?? 1) + 1}">
⭇ сюда
</a>
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?p={($_GET['p'] ?? 1) - 1}">&laquo;</a>
<a n:if="$isLast" class="aui-button" href="?p={($_GET['p'] ?? 1) + 1}">&raquo;</a>
</div>
{/block}

View file

@ -1,13 +1,13 @@
{extends "@layout.xml"}
{block title}
Сводка
{_admin_overview_summary}
{/block}
{block heading}
Сводка
{_admin_overview_summary}
{/block}
{block content}
Да!
┬─┬︵/(.□.)╯
{/block}

View file

@ -1,7 +1,7 @@
{extends "@layout.xml"}
{block title}
Редактировать {$user->getCanonicalName()}
{_edit} {$user->getCanonicalName()}
{/block}
{block heading}
@ -10,95 +10,70 @@
{block content}
<div class="aui-tabs horizontal-tabs">
<form class="aui" method="POST">
<div class="field-group">
<label for="avatar">
Аватарка
</label>
<span id="avatar" class="aui-avatar aui-avatar-project aui-avatar-xlarge">
<span class="aui-avatar-inner">
<img src="{$user->getAvatarUrl('tiny')}" style="object-fit: cover;"></img>
<form class="aui" method="POST">
<div class="field-group">
<label for="avatar">{_avatar}</label>
<span id="avatar" class="aui-avatar aui-avatar-project aui-avatar-xlarge">
<span class="aui-avatar-inner">
<img src="{$user->getAvatarUrl('tiny')}" style="object-fit: cover;"></img>
</span>
</span>
</span>
</div>
<div class="field-group">
<label for="id">
ID
</label>
<input class="text medium-field" type="number" id="id" disabled value="{$user->getId()}" />
</div>
<div class="field-group">
<label for="guid">
GUID
</label>
<input class="text medium-field" id="guid" disabled value="{$user->getChandlerUser()->getId()}" />
</div>
<div class="field-group">
<label for="registration_ip">
Первый IP
</label>
<input class="text medium-field" id="registration_ip" disabled value="{$user->getRegistrationIP()}" />
</div>
<div class="field-group">
<label for="first_name">
Имя
</label>
<input class="text medium-field" type="text" id="first_name" name="first_name" value="{$user->getFirstName()}" />
</div>
<div class="field-group">
<label for="last_name">
Фамилия
</label>
<input class="text medium-field" type="text" id="last_name" name="last_name" value="{$user->getLastName()}" />
</div>
<div class="field-group">
<label for="nickname">
Никнейм
</label>
<input class="text medium-field" type="text" id="nickname" name="nickname" value="{$user->getPseudo()}" />
</div>
<div class="field-group">
<label for="status">
Статус
</label>
<input class="text medium-field" type="text" id="status" name="status" value="{$user->getStatus()}" />
</div>
<div class="field-group">
<label for="email">
E-Mail
</label>
<input class="text medium-field" type="email" id="email" name="email" value="{$user->getEmail()}" />
</div>
<div class="field-group">
<label for="shortcode">
Адрес страницы
</label>
<input class="text medium-field" type="text" id="shortcode" name="shortcode" value="{$user->getShortCode()}" />
</div>
<hr>
<div class="field-group">
<label for="city">
Верификация
</label>
<input class="toggle-large" type="checkbox" id="verify" name="verify" value="1" {if $user->isVerified()} checked {/if} />
</div>
<div class="field-group">
<label for="city">
Онлайн статус
</label>
<select name="online" class="select">
<option value="0" {if $user->onlineStatus() > 2}selected{/if}>По-умолчанию</option>
<option value="1" {if $user->onlineStatus() == 1}selected{/if}>Инкогнито</option>
<option value="2" {if $user->onlineStatus() == 2}selected{/if}>Юзер умер</option>
</select>
</div>
<div class="buttons-container">
<div class="buttons">
<input type="hidden" name="hash" value="{$csrfToken}" />
<input class="button submit" type="submit" value="Сохранить">
</div>
</div>
</form>
<div class="field-group">
<label for="id">ID</label>
<input class="text medium-field" type="number" id="id" disabled value="{$user->getId()}" />
</div>
<div class="field-group">
<label for="guid">GUID</label>
<input class="text medium-field" id="guid" disabled value="{$user->getChandlerUser()->getId()}" />
</div>
<div class="field-group">
<label for="registration_ip">{_admin_first_known_ip}</label>
<input class="text medium-field" id="guid" disabled value="{$user->getRegistrationIP()}" />
</div>
<div class="field-group">
<label for="first_name">{_name}</label>
<input class="text medium-field" type="text" id="first_name" name="first_name" value="{$user->getFirstName()}" />
</div>
<div class="field-group">
<label for="last_name">{_surname}</label>
<input class="text medium-field" type="text" id="last_name" name="last_name" value="{$user->getLastName()}" />
</div>
<div class="field-group">
<label for="nickname">{_nickname}</label>
<input class="text medium-field" type="text" id="nickname" name="nickname" value="{$user->getPseudo()}" />
</div>
<div class="field-group">
<label for="status">{_status}</label>
<input class="text medium-field" type="text" id="status" name="status" value="{$user->getStatus()}" />
</div>
<div class="field-group">
<label for="email">E-Mail</label>
<input class="text medium-field" type="email" id="email" name="email" value="{$user->getEmail()}" />
</div>
<div class="field-group">
<label for="shortcode">{_admin_shortcode}</label>
<input class="text medium-field" type="text" id="shortcode" name="shortcode" value="{$user->getShortCode()}" />
</div>
<hr>
<div class="field-group">
<label for="city">{_admin_verification}</label>
<input class="toggle-large" type="checkbox" id="verify" name="verify" value="1" {if $user->isVerified()} checked {/if} />
</div>
<div class="field-group">
<label for="city">{_admin_user_online}</label>
<select name="online" class="select">
<option value="0" {if $user->onlineStatus() > 2}selected{/if}>{_admin_user_online_default}</option>
<option value="1" {if $user->onlineStatus() == 1}selected{/if}>{_admin_user_online_incognite}</option>
<option value="2" {if $user->onlineStatus() == 2}selected{/if}>{_admin_user_online_deceased}</option>
</select>
</div>
<div class="buttons-container">
<div class="buttons">
<input type="hidden" name="hash" value="{$csrfToken}" />
<input class="button submit" type="submit" value="{_save}">
</div>
</div>
</form>
</div>
{/block}

View file

@ -2,14 +2,16 @@
{var $search = true}
{block title}
Пользователи
{_admin_user_search}
{/block}
{block heading}
Пиздюки
{_users}
{/block}
{block searchTitle}Поиск пиздюков{/block}
{block searchTitle}
{include title}
{/block}
{block content}
{var $users = iterator_to_array($users)}
@ -18,12 +20,12 @@
<table class="aui aui-table-list">
<thead>
<tr>
<th>#</th>
<th>Имя</th>
<th>Пол</th>
<th>Короткий адрес</th>
<th>Дата регистрации</th>
<th>Действия</th>
<th>ID</th>
<th>{_admin_name}</th>
<th>{_gender}</th>
<th>{_admin_shortcode}</th>
<th>{_registration_date}</th>
<th>{_admin_actions}</th>
</tr>
</thead>
<tbody>
@ -35,23 +37,21 @@
<img src="{$user->getAvatarUrl('miniscule')}" alt="{$user->getCanonicalName()}" style="object-fit: cover;" role="presentation" />
</span>
</span>
<a href="{$user->getURL()}">{$user->getCanonicalName()}</a>
<span n:if="$user->isBanned()" class="aui-lozenge aui-lozenge-subtle aui-lozenge-removed">
заблокирован
</span>
<span n:if="$user->isBanned()" class="aui-lozenge aui-lozenge-subtle aui-lozenge-removed">{_admin_banned}</span>
</td>
<td>{$user->isFemale() ? "Женский" : "Мужской"}</td>
<td>{$user->getShortCode() ?? "(отсутствует)"}</td>
<td>{$user->isFemale() ? tr("female") : tr("male")}</td>
<td>{$user->getShortCode() ?? "(" . tr("none") . ")"}</td>
<td>{$user->getRegistrationTime()}</td>
<td>
<a class="aui-button aui-button-primary" href="/admin/users/id{$user->getId()}">
<span class="aui-icon aui-icon-small aui-iconfont-new-edit">Редактировать</span>
<span class="aui-icon aui-icon-small aui-iconfont-new-edit">{_edit}</span>
</a>
{if $thisUser->getChandlerUser()->can("substitute")->model('openvk\Web\Models\Entities\User')->whichBelongsTo(0)}
<a class="aui-button" href="/setSID/{$user->getChandlerUser()->getId()}?hash={rawurlencode($csrfToken)}">
<span class="aui-icon aui-icon-small aui-iconfont-sign-in">Войти как</span>
<span class="aui-icon aui-icon-small aui-iconfont-sign-in">{_admin_loginas}</span>
</a>
{/if}
</td>
@ -61,12 +61,8 @@
<br/>
<div align="right">
{var $isLast = ((20 * (($_GET['p'] ?? 1) - 1)) + $amount) < $count}
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?p={($_GET['p'] ?? 1) - 1}">
⭁ туда
</a>
<a n:if="$isLast" class="aui-button" href="?p={($_GET['p'] ?? 1) + 1}">
⭇ сюда
</a>
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?p={($_GET['p'] ?? 1) - 1}">&laquo;</a>
<a n:if="$isLast" class="aui-button" href="?p={($_GET['p'] ?? 1) + 1}">&raquo;</a>
</div>
{/block}

View file

@ -5,45 +5,36 @@
{/block}
{block heading}
{_edit} {$form->token ?? "undefined"}
{_edit} #{$form->token ?? "undefined"}
{/block}
{block content}
<div style="margin: 8px -8px;" class="aui-tabs horizontal-tabs">
<ul class="tabs-menu">
<li class="menu-item active-tab">
<a href="#info">Информация</a>
<a href="#info">{_admin_tab_main}</a>
</li>
<li class="menu-item">
<a href="#activators">{_voucher_activators}</a>
</li>
</ul>
<div class="tabs-pane active-pane" id="info">
<form class="aui" method="POST">
<div class="field-group">
<label for="id">
ID
</label>
<label for="id">ID</label>
<input class="text long-field" type="number" id="id" name="id" disabled value="{$form->id}" />
</div>
<div class="field-group">
<label for="token">
Серийный номер
</label>
<label for="token">{_admin_voucher_serial}</label>
<input class="text long-field" type="text" id="token" name="token" value="{$form->token}" />
<div class="description">Номер состоит из 24 символов, если формат неправильный или поле не заполнено, будет назначен автоматически.</div>
<div class="description">{_admin_voucher_serial_desc}</div>
</div>
<div class="field-group">
<label for="coins">
Количество голосов
</label>
<label for="coins">{_admin_voucher_coins}</label>
<input class="text long-field" type="number" min="0" id="coins" name="coins" value="{$form->coins}" />
</div>
<div class="field-group">
<label for="rating">
Количество рейтинга
</label>
<label for="rating">{_admin_voucher_rating}</label>
<input class="text long-field" type="number" min="0" id="rating" name="rating" value="{$form->rating}" />
</div>
<div class="field-group">
@ -55,9 +46,9 @@
{/if}
</label>
<input class="text long-field" type="number" min="-1" id="usages" name="usages" value="{$form->usages}" />
<div class="description">Количество аккаунтов, которые могут использовать ваучер. Если написать -1, будет Infinity.</div>
<div class="description">{_admin_voucher_usages_desc}</div>
</div>
<div class="buttons-container">
<div class="buttons">
<input type="hidden" name="hash" value="{$csrfToken}" />
@ -66,7 +57,6 @@
</div>
</form>
</div>
<div class="tabs-pane" id="activators">
<table rules="none" class="aui aui-table-list">
<tbody>
@ -77,12 +67,10 @@
<img src="{$user->getAvatarUrl('miniscule')}" alt="{$user->getCanonicalName()}" role="presentation" />
</span>
</span>
<a href="{$user->getURL()}">{$user->getCanonicalName()}</a>
<span n:if="$user->isBanned()" class="aui-lozenge aui-lozenge-subtle aui-lozenge-removed">
заблокирован
</span>
<span n:if="$user->isBanned()" class="aui-lozenge aui-lozenge-subtle aui-lozenge-removed">{_admin_banned}</span>
</td>
</tr>
</tbody>

View file

@ -8,7 +8,7 @@
<a style="float: right;" class="aui-button aui-button-primary" href="/admin/vouchers/id0">
{_create}
</a>
<h1>{_vouchers}</h1>
{/block}
@ -16,13 +16,13 @@
<table class="aui aui-table-list">
<thead>
<tr>
<th>#</th>
<th>Серийный номер</th>
<th>Голоса</th>
<th>Рейгтинг</th>
<th>Осталось использований</th>
<th>Состояние</th>
<th>Действия</th>
<th>ID</th>
<th>{_admin_voucher_serial}</th>
<th>{_coins}</th>
<th>{_admin_voucher_rating}</th>
<th>{_usages_left}</th>
<th>{_admin_voucher_status}</th>
<th>{_admin_actions}</th>
</tr>
</thead>
<tbody>
@ -34,28 +34,25 @@
<td>{$voucher->getRemainingUsages() === INF ? "∞" : $voucher->getRemainingUsages()}</td>
<td>
{if $voucher->isExpired()}
<span class="aui-lozenge aui-lozenge-subtle aui-lozenge-removed">закончился</span>
<span class="aui-lozenge aui-lozenge-subtle aui-lozenge-removed">{_admin_voucher_status_closed}</span>
{else}
<span class="aui-lozenge aui-lozenge-subtle aui-lozenge-success">активен</span>
<span class="aui-lozenge aui-lozenge-subtle aui-lozenge-success">{_admin_voucher_status_opened}</span>
{/if}
</td>
<td>
<a class="aui-button aui-button-primary" href="/admin/vouchers/id{$voucher->getId()}">
<span class="aui-icon aui-icon-small aui-iconfont-new-edit">Редактировать</span>
<span class="aui-icon aui-icon-small aui-iconfont-new-edit">{_edit}</span>
</a>
</td>
</tr>
</tbody>
</table>
<br/>
<div align="right">
{var $isLast = ((20 * (($_GET['p'] ?? 1) - 1)) + sizeof($vouchers)) < $count}
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?p={($_GET['p'] ?? 1) - 1}">
⭁ туда
</a>
<a n:if="$isLast" class="aui-button" href="?p={($_GET['p'] ?? 1) + 1}">
⭇ сюда
</a>
<a n:if="($_GET['p'] ?? 1) > 1" class="aui-button" href="?p={($_GET['p'] ?? 1) - 1}">&laquo;</a>
<a n:if="$isLast" class="aui-button" href="?p={($_GET['p'] ?? 1) + 1}">&raquo;</a>
</div>
{/block}

View file

@ -842,6 +842,84 @@
"ban_in_support_user_action" = "Ban in support";
"unban_in_support_user_action" = "Unban in support";
/* Admin panel */
"admin" = "Admin panel";
"admin_ownerid" = "Owner ID";
"admin_author" = "Author";
"admin_name" = "Name";
"admin_title" = "Title";
"admin_description" = "Description";
"admin_first_known_ip" = "First known IP";
"admin_shortcode" = "Short code";
"admin_verification" = "Verification";
"admin_banreason" = "Ban reason";
"admin_banned" = "banned";
"admin_gender" = "Gender";
"admin_registrationdate" = "Registration date";
"admin_actions" = "Actions";
"admin_image" = "Image";
"admin_image_replace" = "Replace the image?";
"admin_uses" = "Uses";
"admin_uses_reset" = "Reset the number of uses?";
"admin_limits" = "Limits";
"admin_limits_reset" = "Reset the number of limits";
"admin_open" = "Open";
"admin_loginas" = "Login as...";
"admin_commonsettings" = "Common settings";
"admin_langsettings" = "Language-dependent settings";
"admin_tab_main" = "General";
"admin_tab_ban" = "Ban";
"admin_tab_followers" = "Followers";
"admin_overview" = "Overview";
"admin_overview_summary" = "Summary";
"admin_content" = "User-generated content";
"admin_user_search" = "Search for users";
"admin_user_online" = "Online status";
"admin_user_online_default" = "Default";
"admin_user_online_incognito" = "Incognito";
"admin_user_online_deceased" = "Deceased";
"admin_club_search" = "Search for groups";
"admin_club_excludeglobalfeed" = "Do not display posts in the global feed";
"admin_services" = "Paid services";
"admin_newgift" = "New gift";
"admin_price" = "Price";
"admin_giftset" = "Gift set";
"admin_giftsets" = "Gift sets";
"admin_giftsets_none" = "There are no gift sets. Create a set to create a gift.";
"admin_giftsets_create" = "Create a gift set";
"admin_giftsets_title" = "The internal name of the set, which will be used if no name can be found in the user's language.";
"admin_giftsets_description" = "The internal description of the set, which will be used if no name can be found in the user's language.";
"admin_price_free" = "free";
"admin_voucher_rating" = "Rating";
"admin_voucher_serial" = "Serial number";
"admin_voucher_serial_desc" = "The number consists of 24 characters. If the format is incorrect or the field is not filled in, it will be assigned automatically.";
"admin_voucher_coins" = "Number of votes";
"admin_voucher_rating" = "Number of rating";
"admin_voucher_usages_desc" = "The number of accounts that can use the voucher. If you type -1, it will be infinity.";
"admin_voucher_status" = "Status";
"admin_voucher_status_opened" = "active";
"admin_voucher_status_closed" = "closed";
"admin_settings" = "Settings";
"admin_settings_tuning" = "General";
"admin_settings_appearance" = "Appearance";
"admin_settings_security" = "Security";
"admin_settings_integrations" = "Integrations";
"admin_settings_system" = "System";
"admin_about" = "About OpenVK";
"admin_about_version" = "Version";
"admin_about_instance" = "Instance";
"admin_commerce_disabled" = "Commerce has been disabled by the system administrator";
"admin_commerce_disabled_desc" = "The voucher and gift settings will be saved, but will have no effect.";
/* Paginator (deprecated) */
"paginator_back" = "Back";

View file

@ -885,6 +885,82 @@
"ban_in_support_user_action" = "Заблокировать в поддержке";
"unban_in_support_user_action" = "Разблокировать в поддержке";
/* Admin panel */
"admin" = "Админ-панель";
"admin_ownerid" = "ID владельца";
"admin_author" = "Автор";
"admin_name" = "Имя";
"admin_title" = "Название";
"admin_description" = "Описание";
"admin_first_known_ip" = "Первый IP";
"admin_shortcode" = "Короткий адрес";
"admin_verification" = "Верификация";
"admin_banreason" = "Причина блокировки";
"admin_banned" = "заблокирован";
"admin_actions" = "Действия";
"admin_image" = "Изображение";
"admin_image_replace" = "Заменить изображение?";
"admin_uses" = "Использований";
"admin_uses_reset" = "Сбросить количество использований?";
"admin_limits" = "Ограничения";
"admin_limits_reset" = "Сбросить количество ограничений";
"admin_open" = "Открыть";
"admin_loginas" = "Войти как...";
"admin_commonsettings" = "Общие настройки";
"admin_langsettings" = "Языко-зависимые настройки";
"admin_tab_main" = "Главное";
"admin_tab_ban" = "Блокировка";
"admin_tab_followers" = "Участники";
"admin_overview" = "Обзор";
"admin_overview_summary" = "Сводка";
"admin_content" = "Пользовательский контент";
"admin_user_search" = "Поиск пользователей";
"admin_user_online" = "Онлайн статус";
"admin_user_online_default" = "По-умолчанию";
"admin_user_online_incognito" = "Инкогнито";
"admin_user_online_deceased" = "Покойник";
"admin_club_search" = "Поиск групп";
"admin_club_excludeglobalfeed" = "Не отображать записи в глобальной ленте";
"admin_services" = "Платные услуги";
"admin_newgift" = "Новый подарок";
"admin_price" = "Цена";
"admin_giftset" = "Набор подарков";
"admin_giftsets" = "Наборы подарков";
"admin_giftsets_none" = "Нет наборов подарков. Создайте набор, чтобы создать подарок.";
"admin_giftsets_create" = "Создать набор подарков";
"admin_giftsets_title" = "Внутреннее название набора, которое будет использоваться, если не удаётся найти название на языке пользователя.";
"admin_giftsets_description" = "Внутреннее описание набора, которое будет использоваться, если не удаётся найти название на языке пользователя.";
"admin_price_free" = "бесплатный";
"admin_voucher_rating" = "Рейтинг";
"admin_voucher_serial" = "Серийный номер";
"admin_voucher_serial_desc" = "Номер состоит из 24 символов. Если формат неправильный или поле не заполнено, будет назначен автоматически.";
"admin_voucher_coins" = "Количество голосов";
"admin_voucher_rating" = "Количество рейтинга";
"admin_voucher_usages_desc" = "Количество аккаунтов, которые могут использовать ваучер. Если написать -1, будет бесконечность.";
"admin_voucher_status" = "Состояние";
"admin_voucher_status_opened" = "активен";
"admin_voucher_status_closed" = "закончился";
"admin_settings" = "Настройки";
"admin_settings_tuning" = "Общее";
"admin_settings_appearance" = "Внешний вид";
"admin_settings_security" = "Безопасность";
"admin_settings_integrations" = "Интеграции";
"admin_settings_system" = "Система";
"admin_about" = "Об OpenVK";
"admin_about_version" = "Версия";
"admin_about_instance" = "Инстанция";
"admin_commerce_disabled" = "Коммерция отключена системным администратором";
"admin_commerce_disabled_desc" = "Настройки ваучеров и подарков будут сохранены, но не будут оказывать никакого влияния.";
/* Paginator (deprecated) */
"paginator_back" = "Назад";