Merge branch 'master' into feature-reports

This commit is contained in:
Ilya Prokopenko 2022-01-10 22:18:27 +07:00 committed by GitHub
commit bae42e5d10
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
63 changed files with 1541 additions and 694 deletions

1
.github/FUNDING.yml vendored Normal file
View file

@ -0,0 +1 @@
custom: "https://openvk.su/donate"

View file

@ -94,7 +94,7 @@
<tr> <tr>
<td> <td>
<center> <center>
<a href="http://{$_SERVER['HTTP_HOST']}/restore.pl?act=finish&key={rawurlencode($key)}" align="center" class="float-center">Сбросить пароль!</a> <a href="http://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={rawurlencode($key)}" align="center" class="float-center">Сбросить пароль!</a>
</center> </center>
</td> </td>
</tr> </tr>
@ -118,8 +118,8 @@
<table class="callout"> <table class="callout">
<tr> <tr>
<th class="callout-inner primary"> <th class="callout-inner primary">
<a href="http://{$_SERVER['HTTP_HOST']}/restore.pl?act=finish&key={$key}" style="color: #000; text-decoration: none;"> <a href="http://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={$key}" style="color: #000; text-decoration: none;">
http://{$_SERVER['HTTP_HOST']}/restore.pl?act=finish&key={$key} http://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={$key}
</a> </a>
</th> </th>
</tr> </tr>

View file

@ -1,5 +1,7 @@
# <img align="right" src="https://github.com/openvk/openvk/raw/master/Web/static/img/logo_shadow.png" alt="openvk" title="openvk" width="15%">OpenVK # <img align="right" src="https://github.com/openvk/openvk/raw/master/Web/static/img/logo_shadow.png" alt="openvk" title="openvk" width="15%">OpenVK
_[Русский](README_RU.md)_
**OpenVK** is an attempt to create a simple CMS that ~~cosplays~~ imitates old VK. Code provided here is not stable yet. **OpenVK** is an attempt to create a simple CMS that ~~cosplays~~ imitates old VK. Code provided here is not stable yet.
VKontakte belongs to Pavel Durov and VK Group. VKontakte belongs to Pavel Durov and VK Group.
@ -16,16 +18,19 @@ Updating the source code is done with this command: `git pull`
* **[openvk.su](https://openvk.su/)** * **[openvk.su](https://openvk.su/)**
* [social.fetbuk.ru](http://social.fetbuk.ru/) * [social.fetbuk.ru](http://social.fetbuk.ru/)
* [openvk.zavsc.pw](https://openvk.zavsc.pw/)
## Can I create my own OpenVK instance? ## Can I create my own OpenVK instance?
Yes! And you're very welcome to. Yes! And you're very welcome to.
However, OVK makes use of Chandler Application Server. This software requires extensions, that may not be provided by your hosting provider (namely, sodium and yaml. this extensions are available on most of ISPManager hostings). However, OVK makes use of Chandler Application Server. This software requires extensions, that may not be provided by your hosting provider (namely, sodium and yaml. this extensions are available on most of ISPManager hostings).
If you want, you can add your instance to the list above so that people can register there. If you want, you can add your instance to the list above so that people can register there.
### Installation procedure ### Installation procedure
1. Install PHP 7, web-server, Composer, Node.js, Yarn and [Chandler](https://github.com/openvk/chandler) 1. Install PHP 7.4, web-server, Composer, Node.js, Yarn and [Chandler](https://github.com/openvk/chandler)
* PHP 8 has **not** yet been tested, so you should not expect it to work. * PHP 8 has **not** yet been tested, so you should not expect it to work.
2. Install [commitcaptcha](https://github.com/openvk/commitcaptcha) and OpenVK as Chandler extensions like this: 2. Install [commitcaptcha](https://github.com/openvk/commitcaptcha) and OpenVK as Chandler extensions like this:
``` ```
@ -54,6 +59,7 @@ Full example installation instruction for CentOS 8 is also available [here](docs
### If my website uses OpenVK, should I publish it's sources? ### If my website uses OpenVK, should I publish it's sources?
You are encouraged to do so. We don't enforce this though. You can keep your sources to yourself (unless you distribute your OpenVK distro to other people). You are encouraged to do so. We don't enforce this though. You can keep your sources to yourself (unless you distribute your OpenVK distro to other people).
You also not required to publish source texts of your themepacks and plugins. You also not required to publish source texts of your themepacks and plugins.
## Where can I get assistance? ## Where can I get assistance?

78
README_RU.md Normal file
View file

@ -0,0 +1,78 @@
# <img align="right" src="https://github.com/openvk/openvk/raw/master/Web/static/img/logo_shadow.png" alt="openvk" title="openvk" width="15%">OpenVK
_[English](README.md)_
**OpenVK** это попытка создать простую CMS, которая ~~косплеит~~ имитирует старый ВКонтакте. Представленный здесь код пока не стабилен.
ВКонтакте принадлежит Павлу Дурову и VK Group.
Честно говоря, мы даже не знаем, работает ли она вообще. Однако, эта версия поддерживается, и мы будем рады принять ваши сообщения об ошибках [в нашем баг-трекере](https://github.com/openvk/openvk/projects/1). Вы также можете отправлять их через [вкладку "Помощь"](https://openvk.su/support?act=new) (для этого вам понадобится учетная запись OVK).
## Когда релиз?
Пожалуйста, используйте ветку master, так как в ней больше всего изменений.
Обновление исходного кода выполняется с помощью этой команды: `git pull`.
## Инстанции
* **[openvk.su](https://openvk.su/)**
* [social.fetbuk.ru](http://social.fetbuk.ru/)
* [openvk.zavsc.pw](https://openvk.zavsc.pw/)
## Могу ли я создать свою собственную инстанцию OpenVK?
Да! И всегда пожалуйста.
Однако, OVK использует Chandler Application Server. Это программное обеспечение требует расширений, которые могут быть не предоставлены вашим хостинг-провайдером (а именно, sodium и yaml. эти расширения доступны на большинстве хостингов ISPManager).
Если вы хотите, вы можете добавить вашу инстанцию в список выше, чтобы люди могли зарегистрироваться там.
### Процедура установки
1. Установите PHP 7.4, веб-сервер, Composer, Node.js, Yarn и [Chandler](https://github.com/openvk/chandler)
* PHP 8 еще **не** тестировался, поэтому не стоит ожидать, что он будет работать.
2. Установите [commitcaptcha](https://github.com/openvk/commitcaptcha) и OpenVK в качестве расширений Chandler следующим образом:
```
git clone https://github.com/openvk/openvk /path/to/chandler/extensions/available/openvk
git clone https://github.com/openvk/commitcaptcha /path/to/chandler/extensions/available/commitcaptcha
```
3. И включите их:
```
ln -s /path/to/chandler/extensions/available/commitcaptcha /path/to/chandler/extensions/enabled/
ln -s /path/to/chandler/extensions/available/openvk /path/to/chandler/extensions/enabled/
```
4. Импортируйте `install/init-static-db.sql` в **ту же базу данных**, в которую вы установили Chandler
5. Импортируйте `install/init-event-db.sql` в **отдельную базу данных**
6. Скопируйте `openvk-example.yml` в `openvk.yml` и измените параметры
7. Запустите `composer install` в директории OpenVK
8. Перейдите в `Web/static/js` и выполните `yarn install`
9. Установите `openvk` в качестве корневого приложения в файле `chandler.yml`
После этого вы можете войти как системный администратор в саму сеть (регистрация не требуется):
* **Логин**: `admin@localhost.localdomain6`
* **Пароль**: `admin`
* Перед использованием встроенной учетной записи рекомендуется сменить пароль.
Полный пример инструкции по установке CentOS 8 также доступен [здесь](docs/centos8_install.md).
### Если мой сайт использует OpenVK, должен ли я публиковать его исходные тексты?
Вам рекомендуется это делать. Однако мы не следим за этим. Вы можете держать свои исходные тексты при себе (если только вы не распространяете свой дистрибутив OpenVK среди других людей).
Вы также не обязаны публиковать исходные тексты ваших тематических пакетов и плагинов.
## Где я могу получить помощь?
Вы можете связаться с нами через:
* [Баг-трекер](https://github.com/openvk/openvk/projects/1)
* [Помощь в OVK](https://openvk.su/support?act=new)
* Telegram-чат: Перейдите на [наш канал](https://t.me/openvkch) и откройте обсуждение в меню нашего канала.
* [Reddit](https://www.reddit.com/r/openvk/)
* [Обсуждения](https://github.com/openvk/openvk/discussions)
**Внимание**: баг-трекер и телеграм-чат являются публичными местами, и жалобы в OVK обслуживается волонтерами. Если вам нужно сообщить о чем-то, что не должно быть раскрыто широкой публике (например, сообщение об уязвимости), пожалуйста, свяжитесь с нами напрямую по этому адресу: **openvk [at] tutanota [dot] com**.
<a href="https://codeberg.org/OpenVK/openvk">
<img alt="Get it on Codeberg" src="https://codeberg.org/Codeberg/GetItOnCodeberg/media/branch/main/get-it-on-blue-on-white.png" height="60">
</a>

View file

@ -140,6 +140,11 @@ class Club extends RowModel
return (bool) $this->getRecord()->display_topics_above_wall; return (bool) $this->getRecord()->display_topics_above_wall;
} }
function isHideFromGlobalFeedEnabled(): bool
{
return (bool) $this->getRecord()->hide_from_global_feed;
}
function getType(): int function getType(): int
{ {
return $this->getRecord()->type; return $this->getRecord()->type;

View file

@ -354,6 +354,7 @@ class User extends RowModel
"groups", "groups",
"news", "news",
"links", "links",
"poster",
], ],
])->get($id); ])->get($id);
} }
@ -372,6 +373,7 @@ class User extends RowModel
"friends.read", "friends.read",
"friends.add", "friends.add",
"wall.write", "wall.write",
"messages.write",
], ],
])->get($id); ])->get($id);
} }
@ -756,6 +758,7 @@ class User extends RowModel
"friends.read", "friends.read",
"friends.add", "friends.add",
"wall.write", "wall.write",
"messages.write",
], ],
])->set($id, $status)->toInteger()); ])->set($id, $status)->toInteger());
} }
@ -772,6 +775,7 @@ class User extends RowModel
"groups", "groups",
"news", "news",
"links", "links",
"poster",
], ],
])->set($id, (int) $status)->toInteger(); ])->set($id, (int) $status)->toInteger();

View file

@ -38,5 +38,23 @@ class Clubs
return new Util\EntityStream("Club", $result); return new Util\EntityStream("Club", $result);
} }
function getCount(): int
{
return sizeof(clone $this->clubs);
}
function getPopularClubs(): \Traversable
{
$query = "SELECT ROW_NUMBER() OVER (ORDER BY `subscriptions` DESC) as `place`, `target` as `id`, COUNT(`follower`) as `subscriptions` FROM `subscriptions` WHERE `model` = \"openvk\\\Web\\\Models\\\Entities\\\Club\" GROUP BY `target` ORDER BY `subscriptions` DESC, `id` LIMIT 10;";
$entries = DatabaseConnection::i()->getConnection()->query($query);
foreach($entries as $entry)
yield (object) [
"place" => $entry["place"],
"club" => $this->get($entry["id"]),
"subscriptions" => $entry["subscriptions"],
];
}
use \Nette\SmartObject; use \Nette\SmartObject;
} }

View file

@ -105,4 +105,9 @@ class Posts
{ {
return sizeof($this->posts->where(["wall" => $user, "deleted" => 0])); return sizeof($this->posts->where(["wall" => $user, "deleted" => 0]));
} }
function getCount(): int
{
return sizeof(clone $this->posts);
}
} }

View file

@ -22,8 +22,8 @@ class Tickets
function getTickets(int $state = 0, int $page = 1): \Traversable function getTickets(int $state = 0, int $page = 1): \Traversable
{ {
foreach($this->tickets->where(["deleted" => 0, "type" => $state])->order("created DESC")->page($page, OPENVK_DEFAULT_PER_PAGE) as $t) foreach($this->tickets->where(["deleted" => 0, "type" => $state])->order("created DESC")->page($page, OPENVK_DEFAULT_PER_PAGE) as $ticket)
yield new Ticket($t); yield new Ticket($ticket);
} }
function getTicketCount(int $state = 0): int function getTicketCount(int $state = 0): int
@ -31,21 +31,23 @@ class Tickets
return sizeof($this->tickets->where(["deleted" => 0, "type" => $state])); return sizeof($this->tickets->where(["deleted" => 0, "type" => $state]));
} }
function getTicketsByuId(int $user_id): \Traversable function getTicketsByUserId(int $userId, int $page = 1): \Traversable
{ {
foreach($this->tickets->where(['user_id' => $user_id, 'deleted' => 0])->order("created DESC") as $ticket) yield new Ticket($ticket); foreach($this->tickets->where(["user_id" => $userId, "deleted" => 0])->order("created DESC")->page($page, OPENVK_DEFAULT_PER_PAGE) as $ticket) yield new Ticket($ticket);
} }
function getTicketsCountByuId(int $user_id, int $type = 0): int function getTicketsCountByUserId(int $userId, int $type = NULL): int
{ {
return sizeof($this->tickets->where(['user_id' => $user_id, 'deleted' => 0, 'type' => $type])); if(is_null($type))
return sizeof($this->tickets->where(["user_id" => $userId, "deleted" => 0]));
else
return sizeof($this->tickets->where(["user_id" => $userId, "deleted" => 0, "type" => $type]));
} }
function getRequestById(int $req_id): ?Ticket function getRequestById(int $requestId): ?Ticket
{ {
$requests = $this->tickets->where(['id' => $req_id])->fetch(); $requests = $this->tickets->where(["id" => $requestId])->fetch();
if(!is_null($requests)) if(!is_null($requests))
return new Req($requests); return new Req($requests);
else else
return null; return null;

View file

@ -70,5 +70,23 @@ class Users
return $this->getByShortUrl($address); return $this->getByShortUrl($address);
} }
/**
* If you need to check if the user is an instance administrator, use `$user->getChandlerUser()->can("access")->model("admin")->whichBelongsTo(NULL)`.
* This method is more suitable for instance administrators lists
*/
function getInstanceAdmins(bool $excludeHidden = true): \Traversable
{
$query = "SELECT DISTINCT(`profiles`.`id`) FROM `ChandlerACLRelations` JOIN `profiles` ON `ChandlerACLRelations`.`user` = `profiles`.`user` COLLATE utf8mb4_unicode_520_ci WHERE `ChandlerACLRelations`.`group` IN (SELECT `group` FROM `ChandlerACLGroupsPermissions` WHERE `model` = \"admin\" AND `permission` = \"access\")";
if($excludeHidden)
$query .= " AND `ChandlerACLRelations`.`user` NOT IN (SELECT `user` FROM `ChandlerACLRelations` WHERE `group` IN (SELECT `group` FROM `ChandlerACLGroupsPermissions` WHERE `model` = \"hidden_admin\" AND `permission` = \"be\"))";
$query .= " ORDER BY `profiles`.`id`;";
$result = DatabaseConnection::i()->getConnection()->query($query);
foreach($result as $entry)
yield $this->get($entry->id);
}
use \Nette\SmartObject; use \Nette\SmartObject;
} }

View file

@ -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\Themes\Themepacks; use openvk\Web\Themes\Themepacks;
use openvk\Web\Models\Repositories\{Users, Managers}; use openvk\Web\Models\Repositories\{Users, Managers, Clubs, Posts};
use openvk\Web\Util\Localizator; use openvk\Web\Util\Localizator;
use Chandler\Session\Session; use Chandler\Session\Session;
@ -58,6 +58,15 @@ final class AboutPresenter extends OpenVKPresenter
$this->template->languages = getLanguages(); $this->template->languages = getLanguages();
} }
function renderAboutInstance(): void
{
$this->template->usersStats = (new Users)->getStatistics();
$this->template->clubsCount = (new Clubs)->getCount();
$this->template->postsCount = (new Posts)->getCount();
$this->template->popularClubs = (new Clubs)->getPopularClubs();
$this->template->admins = iterator_to_array((new Users)->getInstanceAdmins());
}
function renderLanguage(): void function renderLanguage(): void
{ {
$this->template->languages = getLanguages(); $this->template->languages = getLanguages();
@ -83,4 +92,37 @@ final class AboutPresenter extends OpenVKPresenter
{ {
$this->template->languages = getLanguages(); $this->template->languages = getLanguages();
} }
function renderRobotsTxt(): void
{
$text = "# robots.txt file for openvk\n"
. "#\n"
. "# this includes only those links that are not in any way\n"
. "# covered from unauthorized persons (for example, due to\n"
. "# lack of rights to access the admin panel)\n\n"
. "User-Agent: *\n"
. "Disallow: /rpc\n"
. "Disallow: /language\n"
. "Disallow: /badbrowser.php\n"
. "Disallow: /logout\n"
. "Disallow: /away.php\n"
. "Disallow: /im?\n"
. "Disallow: *query=\n"
. "Disallow: *?lg=\n"
. "Disallow: *hash=\n"
. "Disallow: *?jReturnTo=\n"
. "Disallow: /method/*\n"
. "Disallow: /token*";
header("Content-Type: text/plain");
exit($text);
}
function renderHumansTxt(): void
{
// :D
header("HTTP/1.1 302 Found");
header("Location: https://github.com/openvk/openvk#readme");
exit;
}
} }

View file

@ -72,6 +72,8 @@ final class AdminPresenter extends OpenVKPresenter
$user->setStatus($this->postParam("status")); $user->setStatus($this->postParam("status"));
$user->setVerified(empty($this->postParam("verify") ? 0 : 1)); $user->setVerified(empty($this->postParam("verify") ? 0 : 1));
if($user->onlineStatus() != $this->postParam("online")) $user->setOnline(intval($this->postParam("online"))); if($user->onlineStatus() != $this->postParam("online")) $user->setOnline(intval($this->postParam("online")));
if(!$user->setShortCode(empty($this->postParam("shortcode")) ? NULL : $this->postParam("shortcode")))
$this->flash("err", tr("error"), tr("error_shorturl_incorrect"));
$user->save(); $user->save();
break; break;

View file

@ -215,6 +215,9 @@ final class AuthPresenter extends OpenVKPresenter
function renderRestore(): void function renderRestore(): void
{ {
if(!is_null($this->user))
$this->redirect("/id" . $this->user->id, static::REDIRECT_TEMPORARY);
if(($this->queryParam("act") ?? "default") === "finish") if(($this->queryParam("act") ?? "default") === "finish")
$this->pass("openvk!Auth->finishRestoringPassword"); $this->pass("openvk!Auth->finishRestoringPassword");

View file

@ -122,7 +122,7 @@ final class CommentPresenter extends OpenVKPresenter
$this->flashFail( $this->flashFail(
"succ", "succ",
"Успешно", "Успешно",
"Этот комментарий больше не будет показыватся.<br/><a href='/al_comments.pl/spam?$id'>Отметить как спам</a>?" "Этот комментарий больше не будет показыватся.<br/><a href='/al_comments/spam?$id'>Отметить как спам</a>?"
); );
} }
} }

View file

@ -207,8 +207,8 @@ final class GroupPresenter extends OpenVKPresenter
$club->setShortcode(empty($this->postParam("shortcode")) ? NULL : $this->postParam("shortcode")); $club->setShortcode(empty($this->postParam("shortcode")) ? NULL : $this->postParam("shortcode"));
$club->setWall(empty($this->postParam("wall")) ? 0 : 1); $club->setWall(empty($this->postParam("wall")) ? 0 : 1);
$club->setAdministrators_List_Display(empty($this->postParam("administrators_list_display")) ? 0 : $this->postParam("administrators_list_display")); $club->setAdministrators_List_Display(empty($this->postParam("administrators_list_display")) ? 0 : $this->postParam("administrators_list_display"));
$club->setEveryone_Can_Create_Topics(empty($this->postParam("everyone_can_create_topics")) ? 0 : 1); $club->setDisplay_Topics_Above_Wall(empty($this->postParam("display_topics_above_wall")) ? 0 : 1);
$club->setDisplay_Topics_Above_Wall(empty($this->postParam("display_topics_above_wall")) ? 0 : 1);; $club->setHide_From_Global_Feed(empty($this->postParam("hide_from_global_feed")) ? 0 : 1);
$website = $this->postParam("website") ?? ""; $website = $this->postParam("website") ?? "";
if(empty($website)) if(empty($website))

View file

@ -124,7 +124,7 @@ final class MessengerPresenter extends OpenVKPresenter
} }
$sel = $this->getCorrespondent($sel); $sel = $this->getCorrespondent($sel);
if($sel->getId() !== $this->user->id && $sel->getSubscriptionStatus($this->user->identity) !== 3) if($sel->getId() !== $this->user->id && !$sel->getPrivacyPermission('messages.write', $this->user->identity))
exit(header("HTTP/1.1 403 Forbidden")); exit(header("HTTP/1.1 403 Forbidden"));
$cor = new Correspondence($this->user->identity, $sel); $cor = new Correspondence($this->user->identity, $sel);

View file

@ -220,7 +220,7 @@ abstract class OpenVKPresenter extends SimplePresenter
$this->user->identity->save(); $this->user->identity->save();
} }
$this->template->ticketAnsweredCount = (new Tickets)->getTicketsCountByuId($this->user->id, 1); $this->template->ticketAnsweredCount = (new Tickets)->getTicketsCountByUserId($this->user->id, 1);
if($user->can("write")->model("openvk\Web\Models\Entities\TicketReply")->whichBelongsTo(0)) if($user->can("write")->model("openvk\Web\Models\Entities\TicketReply")->whichBelongsTo(0))
$this->template->helpdeskTicketNotAnsweredCount = (new Tickets)->getTicketCount(0); $this->template->helpdeskTicketNotAnsweredCount = (new Tickets)->getTicketCount(0);
} }

View file

@ -70,9 +70,9 @@ final class PhotosPresenter extends OpenVKPresenter
} }
if($_SERVER["REQUEST_METHOD"] === "POST") { if($_SERVER["REQUEST_METHOD"] === "POST") {
if(empty($this->postParam("name"))) { if(empty($this->postParam("name")))
$this->flashFail("err", tr("error"), tr("error_segmentation")); $this->flashFail("err", tr("error"), tr("error_segmentation"));
}
$album = new Album; $album = new Album;
$album->setOwner(isset($club) ? $club->getId() * -1 : $this->user->id); $album->setOwner(isset($club) ? $club->getId() * -1 : $this->user->id);
$album->setName($this->postParam("name")); $album->setName($this->postParam("name"));
@ -80,7 +80,10 @@ final class PhotosPresenter extends OpenVKPresenter
$album->setCreated(time()); $album->setCreated(time());
$album->save(); $album->save();
$this->redirect("/album" . $album->getOwner()->getId() . "_" . $album->getId(), static::REDIRECT_TEMPORARY); if(isset($club))
$this->redirect("/album-" . $album->getOwner()->getId() . "_" . $album->getId(), static::REDIRECT_TEMPORARY);
else
$this->redirect("/album" . $album->getOwner()->getId() . "_" . $album->getId(), static::REDIRECT_TEMPORARY);
} }
} }
@ -118,10 +121,11 @@ final class PhotosPresenter extends OpenVKPresenter
if(is_null($this->user) || !$album->canBeModifiedBy($this->user->identity)) if(is_null($this->user) || !$album->canBeModifiedBy($this->user->identity))
$this->flashFail("err", "Ошибка доступа", "Недостаточно прав для модификации данного ресурса."); $this->flashFail("err", "Ошибка доступа", "Недостаточно прав для модификации данного ресурса.");
$name = $album->getName(); $name = $album->getName();
$owner = $album->getOwner();
$album->delete(); $album->delete();
$this->flash("succ", "Альбом удалён", "Альбом $name был успешно удалён."); $this->flash("succ", "Альбом удалён", "Альбом $name был успешно удалён.");
$this->redirect("/albums" . $this->user->id); $this->redirect("/albums" . ($owner instanceof Club ? "-" : "") . $owner->getId());
} }
function renderAlbum(int $owner, int $id): void function renderAlbum(int $owner, int $id): void

View file

@ -28,17 +28,19 @@ final class SupportPresenter extends OpenVKPresenter
$this->assertUserLoggedIn(); $this->assertUserLoggedIn();
$this->template->mode = in_array($this->queryParam("act"), ["faq", "new", "list"]) ? $this->queryParam("act") : "faq"; $this->template->mode = in_array($this->queryParam("act"), ["faq", "new", "list"]) ? $this->queryParam("act") : "faq";
$tickets = $this->tickets->getTicketsByuId($this->user->id); $this->template->count = $this->tickets->getTicketsCountByUserId($this->user->id);
if($tickets) if($this->template->mode === "list") {
$this->template->tickets = $tickets; $this->template->page = (int) ($this->queryParam("p") ?? 1);
$this->template->tickets = $this->tickets->getTicketsByUserId($this->user->id, $this->template->page);
}
if($_SERVER["REQUEST_METHOD"] === "POST") { if($_SERVER["REQUEST_METHOD"] === "POST") {
if(!empty($this->postParam("name")) && !empty($this->postParam("text"))) { if(!empty($this->postParam("name")) && !empty($this->postParam("text"))) {
$this->assertNoCSRF();
$this->willExecuteWriteAction(); $this->willExecuteWriteAction();
$ticket = new Ticket; $ticket = new Ticket;
$ticket->setType(0); $ticket->setType(0);
$ticket->setUser_id($this->user->id); $ticket->setUser_Id($this->user->id);
$ticket->setName($this->postParam("name")); $ticket->setName($this->postParam("name"));
$ticket->setText($this->postParam("text")); $ticket->setText($this->postParam("text"));
$ticket->setcreated(time()); $ticket->setcreated(time());
@ -111,11 +113,11 @@ final class SupportPresenter extends OpenVKPresenter
if(!$ticket || $ticket->isDeleted() != 0 || $ticket->getUserId() !== $this->user->id && !$this->hasPermission('openvk\Web\Models\Entities\TicketReply', 'write', 0)) { if(!$ticket || $ticket->isDeleted() != 0 || $ticket->getUserId() !== $this->user->id && !$this->hasPermission('openvk\Web\Models\Entities\TicketReply', 'write', 0)) {
$this->notFound(); $this->notFound();
} else { } else {
header("HTTP/1.1 302 Found");
if($ticket->getUserId() !== $this->user->id && $this->hasPermission('openvk\Web\Models\Entities\TicketReply', 'write', 0)) if($ticket->getUserId() !== $this->user->id && $this->hasPermission('openvk\Web\Models\Entities\TicketReply', 'write', 0))
header("Location: /support/tickets"); $this->redirect("/support/tickets");
else else
header("Location: /support"); $this->redirect("/support");
$ticket->delete(); $ticket->delete();
} }
} }
@ -136,7 +138,6 @@ final class SupportPresenter extends OpenVKPresenter
$ticket->setType(0); $ticket->setType(0);
$ticket->save(); $ticket->save();
$this->assertNoCSRF();
$this->willExecuteWriteAction(); $this->willExecuteWriteAction();
$comment = new TicketComment; $comment = new TicketComment;
@ -183,12 +184,11 @@ final class SupportPresenter extends OpenVKPresenter
$ticket->setType($this->postParam("status")); $ticket->setType($this->postParam("status"));
$ticket->save(); $ticket->save();
$this->assertNoCSRF();
$comment = new TicketComment; $comment = new TicketComment;
$comment->setUser_id($this->user->id); $comment->setUser_id($this->user->id);
$comment->setUser_type(1); $comment->setUser_type(1);
$comment->setText($this->postParam("text")); $comment->setText($this->postParam("text"));
$comment->setTicket_id($id); $comment->setTicket_Id($id);
$comment->setCreated(time()); $comment->setCreated(time());
$comment->save(); $comment->save();
} elseif(empty($this->postParam("text"))) { } elseif(empty($this->postParam("text"))) {

View file

@ -329,6 +329,7 @@ final class UserPresenter extends OpenVKPresenter
"friends.read", "friends.read",
"friends.add", "friends.add",
"wall.write", "wall.write",
"messages.write",
]; ];
foreach($settings as $setting) { foreach($settings as $setting) {
$input = $this->postParam(str_replace(".", "_", $setting)); $input = $this->postParam(str_replace(".", "_", $setting));
@ -369,13 +370,14 @@ final class UserPresenter extends OpenVKPresenter
$user->setNsfwTolerance((int) $this->postParam("nsfw")); $user->setNsfwTolerance((int) $this->postParam("nsfw"));
} else if($_GET['act'] === "lMenu") { } else if($_GET['act'] === "lMenu") {
$settings = [ $settings = [
"menu_bildoj" => "photos", "menu_bildoj" => "photos",
"menu_filmetoj" => "videos", "menu_filmetoj" => "videos",
"menu_mesagoj" => "messages", "menu_mesagoj" => "messages",
"menu_notatoj" => "notes", "menu_notatoj" => "notes",
"menu_grupoj" => "groups", "menu_grupoj" => "groups",
"menu_novajoj" => "news", "menu_novajoj" => "news",
"menu_ligiloj" => "links", "menu_ligiloj" => "links",
"menu_standardo" => "poster",
]; ];
foreach($settings as $checkbox => $setting) foreach($settings as $checkbox => $setting)
$user->setLeftMenuItemStatus($setting, $this->checkbox($checkbox)); $user->setLeftMenuItemStatus($setting, $this->checkbox($checkbox));
@ -446,11 +448,16 @@ final class UserPresenter extends OpenVKPresenter
$this->template->secret = $secret; $this->template->secret = $secret;
} }
$issuer = OPENVK_ROOT_CONF["openvk"]["appearance"]["name"]; // Why are these crutch? For some reason, the QR code is not displayed if you just pass the render output to the view
$email = $this->user->identity->getEmail();
$this->template->qrCode = substr((new QRCode(new QROptions([ $issuer = OPENVK_ROOT_CONF["openvk"]["appearance"]["name"];
$email = $this->user->identity->getEmail();
$qrCode = explode("base64,", (new QRCode(new QROptions([
"imageTransparent" => false "imageTransparent" => false
])))->render("otpauth://totp/$issuer:$email?secret=$secret&issuer=$issuer"), 22); ])))->render("otpauth://totp/$issuer:$email?secret=$secret&issuer=$issuer"));
$this->template->qrCodeType = substr($qrCode[0], 5);
$this->template->qrCodeData = $qrCode[1];
} }
function renderDisableTwoFactorAuth(): void function renderDisableTwoFactorAuth(): void

View file

@ -122,24 +122,24 @@ final class WallPresenter extends OpenVKPresenter
$page = (int) ($_GET["p"] ?? 1); $page = (int) ($_GET["p"] ?? 1);
$pPage = min((int) ($_GET["posts"] ?? OPENVK_DEFAULT_PER_PAGE), 50); $pPage = min((int) ($_GET["posts"] ?? OPENVK_DEFAULT_PER_PAGE), 50);
$posts = DatabaseConnection::i()
->getContext() $queryBase = "FROM `posts` LEFT JOIN `groups` ON GREATEST(`posts`.`wall`, 0) = 0 AND `groups`.`id` = ABS(`posts`.`wall`) WHERE (`groups`.`hide_from_global_feed` = 0 OR `groups`.`name` IS NULL) AND `posts`.`deleted` = 0";
->table("posts")
->where("deleted", 0)
->order("created DESC");
if($this->user->identity->getNsfwTolerance() === User::NSFW_INTOLERANT) if($this->user->identity->getNsfwTolerance() === User::NSFW_INTOLERANT)
$posts = $posts->where("nsfw", false); $queryBase .= " AND `nsfw` = 0";
$posts = DatabaseConnection::i()->getConnection()->query("SELECT `posts`.`id` " . $queryBase . " ORDER BY `created` DESC LIMIT " . $pPage . " OFFSET " . ($page - 1) * $pPage);
$count = DatabaseConnection::i()->getConnection()->query("SELECT COUNT(*) " . $queryBase)->fetch()->{"COUNT(*)"};
$this->template->_template = "Wall/Feed.xml"; $this->template->_template = "Wall/Feed.xml";
$this->template->globalFeed = true; $this->template->globalFeed = true;
$this->template->paginatorConf = (object) [ $this->template->paginatorConf = (object) [
"count" => sizeof($posts), "count" => $count,
"page" => (int) ($_GET["p"] ?? 1), "page" => (int) ($_GET["p"] ?? 1),
"amount" => sizeof($posts->page($page, $pPage)), "amount" => sizeof($posts),
"perPage" => $pPage, "perPage" => $pPage,
]; ];
foreach($posts->page($page, $pPage) as $post) foreach($posts as $post)
$this->template->posts[] = $this->posts->get($post->id); $this->template->posts[] = $this->posts->get($post->id);
} }

View file

@ -1,21 +1,23 @@
{var instance_name = OPENVK_ROOT_CONF['openvk']['appearance']['name']}
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Произошёл троллинг... | OpenVK</title> <title>An error occurred - {$instance_name}</title>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, user-scalable=no" /> <meta name="viewport" content="width=device-width, user-scalable=no" />
<style> <style>
@keyframes gradient { @keyframes gradient {
0% { 0% {
background-position:0% 50% background-position: 0% 50%;
} }
50% { 50% {
background-position:100% 50% background-position: 100% 50%;
} }
100% { 100% {
background-position:0% 50% background-position: 0% 50%;
} }
} }

View file

@ -1,5 +1,6 @@
{var instance_name = OPENVK_ROOT_CONF['openvk']['appearance']['name']} {var instance_name = OPENVK_ROOT_CONF['openvk']['appearance']['name']}
<!DOCTYPE html>
<html n:if="!isset($parentModule) || substr($parentModule, 0, 21) === 'libchandler:absolute.'"> <html n:if="!isset($parentModule) || substr($parentModule, 0, 21) === 'libchandler:absolute.'">
<head> <head>
<title> <title>
@ -9,8 +10,9 @@
<link rel="shortcut icon" href="/assets/packages/static/openvk/img/icon.ico" /> <link rel="shortcut icon" href="/assets/packages/static/openvk/img/icon.ico" />
<meta name="application-name" content="{$instance_name}" /> <meta name="application-name" content="{$instance_name}" />
<meta n:ifset="$csrfToken" name="csrf" value="{$csrfToken}" /> <meta n:ifset="$csrfToken" name="csrf" value="{$csrfToken}" />
<script src="/language/{php echo getLanguage()}.js" crossorigin="anonymous"></script> <script src="/language/{php echo getLanguage()}.js" crossorigin="anonymous"></script>
{script "js/node_modules/jquery/dist/jquery.min.js"} {script "js/node_modules/jquery/dist/jquery.min.js"}
{script "js/node_modules/umbrellajs/umbrella.min.js"} {script "js/node_modules/umbrellajs/umbrella.min.js"}
{script "js/l10n.js"} {script "js/l10n.js"}
{script "js/openvk.cls.js"} {script "js/openvk.cls.js"}
@ -21,16 +23,18 @@
{/if} {/if}
{if $theme !== null} {if $theme !== null}
{if $theme->inheritDefault()} {if $theme->inheritDefault()}
{css "css/style.css"} {css "css/style.css"}
{css "css/dialog.css"} {css "css/dialog.css"}
{css "css/notifications.css"} {css "css/notifications.css"}
{if $isXmas} {if $isXmas}
{css "css/xmas.css"} {css "css/xmas.css"}
{/if} {/if}
{/if} {/if}
<link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/stylesheet/styles.css" /> <link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/stylesheet/styles.css" />
{if $isXmas} {if $isXmas}
<link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/resource/xmas.css" /> <link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/resource/xmas.css" />
{/if} {/if}
@ -38,6 +42,7 @@
{css "css/style.css"} {css "css/style.css"}
{css "css/dialog.css"} {css "css/dialog.css"}
{css "css/notifications.css"} {css "css/notifications.css"}
{if $isXmas} {if $isXmas}
{css "css/xmas.css"} {css "css/xmas.css"}
{/if} {/if}
@ -46,13 +51,13 @@
{if $thisUser->getStyleAvatar() == 1} {if $thisUser->getStyleAvatar() == 1}
{css "css/avatar.1.css"} {css "css/avatar.1.css"}
{/if} {/if}
{if $thisUser->getStyleAvatar() == 2} {if $thisUser->getStyleAvatar() == 2}
{css "css/avatar.2.css"} {css "css/avatar.2.css"}
{/if} {/if}
{if $thisUser->hasMicroblogEnabled() == 1} {if $thisUser->hasMicroblogEnabled() == 1}
{css "css/microblog.css"} {css "css/microblog.css"}
{/if} {/if}
{else} {else}
{css "css/style.css"} {css "css/style.css"}
@ -65,7 +70,9 @@
{/if} {/if}
{/ifset} {/ifset}
{ifset headIncludes}{include headIncludes}{/ifset} {ifset headIncludes}
{include headIncludes}
{/ifset}
</head> </head>
<body> <body>
<div id="sudo-banner" n:if="isset($thisUser) && $userTainted"> <div id="sudo-banner" n:if="isset($thisUser) && $userTainted">
@ -77,8 +84,10 @@
</div> </div>
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['bellsAndWhistles']['testLabel']" id="test-label">FOR TESTING PURPOSES ONLY</div> <div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['bellsAndWhistles']['testLabel']" id="test-label">FOR TESTING PURPOSES ONLY</div>
<div class="notifications_global_wrap"></div>
<div class="notifications_global_wrap"></div>
<div class="dimmer"></div> <div class="dimmer"></div>
<div class="toTop"> <div class="toTop">
⬆ Вверх ⬆ Вверх
</div> </div>
@ -89,45 +98,38 @@
<a href="/" class="home_button {if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME}home_button_custom{/if}" title="{$instance_name}">{$instance_name}</a> <a href="/" class="home_button {if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME}home_button_custom{/if}" title="{$instance_name}">{$instance_name}</a>
<div n:if="isset($thisUser) ? !$thisUser->isBanned() : true" class="header_navigation"> <div n:if="isset($thisUser) ? !$thisUser->isBanned() : true" class="header_navigation">
{ifset $thisUser} {ifset $thisUser}
<div class="link"> <div class="link">
<a href="/">{_"header_home"}</a> <a href="/">{_header_home}</a>
</div> </div>
<div class="link"> <div class="link">
<a href="/search?type=groups">{_"header_groups"}</a> <a href="/search?type=groups">{_header_groups}</a>
</div> </div>
<div class="link"> <div class="link">
<a href="/search">{_"header_search"}</a> <a href="/search">{_header_search}</a>
</div> </div>
<div class="link"> <div class="link">
<a href="/invite"> <a href="/invite">{_header_invite}</a>
{_"header_invite"} </div>
</a> <div class="link">
</div> <a href="/support">{_header_help} <b n:if="$ticketAnsweredCount > 0">({$ticketAnsweredCount})</b></a>
<div class="link"> </div>
<a href="/support"> <div class="link">
{_"header_help"} <a href="/logout?hash={urlencode($csrfToken)}">{_header_log_out}</a>
<b n:if="$ticketAnsweredCount > 0">({$ticketAnsweredCount})</b> </div>
</a> <div class="link">
</div> <form action="/search" method="get">
<div class="link"> <input type="search" name="query" placeholder="{_header_search}" style="height: 20px;background: url('/assets/packages/static/openvk/img/search_icon.png') no-repeat 3px 4px; background-color: #fff; padding-left: 18px;width: 120px;" />
<a href="/logout?hash={urlencode($csrfToken)}">{_"header_log_out"}</a> </form>
</div> </div>
<div class="link">
<form action="/search" method="get">
<input type="search" name="query" placeholder="{_"header_search"}" style="height: 20px;background: url('/assets/packages/static/openvk/img/search_icon.png') no-repeat 3px 4px; background-color: #fff; padding-left: 18px;width: 120px;" />
</form>
</div>
{else} {else}
<div class="link"> <div class="link">
<a href="/login">{_"header_login"}</a> <a href="/login">{_header_login}</a>
</div> </div>
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" class="link"> <div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" class="link">
<a href="/reg">{_"header_registration"}</a> <a href="/reg">{_header_registration}</a>
</div> </div>
<div class="link"> <div class="link">
<a href="/support">{_"header_help"}</a> <a href="/support">{_header_help}</a>
</div> </div>
{/ifset} {/ifset}
</div> </div>
@ -135,92 +137,72 @@
<div class="sidebar"> <div class="sidebar">
<div class="navigation"> <div class="navigation">
{ifset $thisUser} {ifset $thisUser}
{if !$thisUser->isBanned()} {if !$thisUser->isBanned()}
<a href="/edit" class="link edit-button">{_"edit_button"}</a> <a href="/edit" class="link edit-button">{_edit_button}</a>
<a href="{$thisUser->getURL()}" class="link">{_"my_page"}</a> <a href="{$thisUser->getURL()}" class="link">{_my_page}</a>
<a href="/friends{$thisUser->getId()}" class="link">{_"my_friends"} <a href="/friends{$thisUser->getId()}" class="link">{_my_friends}
{if $thisUser->getFollowersCount() > 0} <object type="internal/link" n:if="$thisUser->getFollowersCount() > 0">
<object type="internal/link"> <a href="/friends{$thisUser->getId()}?act=incoming">
<a href="/friends{$thisUser->getId()}?act=incoming"> (<b>{$thisUser->getFollowersCount()}</b>)
(<b>{$thisUser->getFollowersCount()}</b>) </a>
</object>
</a> </a>
</object> <a n:if="$thisUser->getLeftMenuItemStatus('photos')" href="/albums{$thisUser->getId()}" class="link">{_my_photos}</a>
{/if}</a> <a n:if="$thisUser->getLeftMenuItemStatus('videos')" href="/videos{$thisUser->getId()}" class="link">{_my_videos}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('photos')" href="/albums{$thisUser->getId()}" class="link">{_"my_photos"}</a> <a n:if="$thisUser->getLeftMenuItemStatus('messages')" href="/im" class="link">{_my_messages}
<a n:if="$thisUser->getLeftMenuItemStatus('videos')" href="/videos{$thisUser->getId()}" class="link">{_"my_videos"}</a> <object type="internal/link" n:if="$thisUser->getUnreadMessagesCount() > 0">
<a n:if="$thisUser->getLeftMenuItemStatus('messages')" href="/im" class="link">{_"my_messages"} (<b>{$thisUser->getUnreadMessagesCount()}</b>)
{if $thisUser->getUnreadMessagesCount() > 0} </object>
<object type="internal/link"> </a>
(<b>{$thisUser->getUnreadMessagesCount()}</b>) <a n:if="$thisUser->getLeftMenuItemStatus('notes')" href="/notes{$thisUser->getId()}" class="link">{_my_notes}</a>
</object> <a n:if="$thisUser->getLeftMenuItemStatus('groups')" href="/groups{$thisUser->getId()}" class="link">{_my_groups}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('news')" href="/feed" class="link">{_my_feed}</a>
<a href="/notifications" class="link">{_my_feedback}
{if $thisUser->getNotificationsCount() > 0}
(<b>{$thisUser->getNotificationsCount()}</b>)
{/if}
</a>
<a href="/settings" class="link">{_my_settings}</a>
{/if} {var canAccessAdminPanel = $thisUser->getChandlerUser()->can("access")->model("admin")->whichBelongsTo(NULL)}
</a> {var canAccessHelpdesk = $thisUser->getChandlerUser()->can("write")->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
<a n:if="$thisUser->getLeftMenuItemStatus('notes')" href="/notes{$thisUser->getId()}" class="link">{_"my_notes"}</a> {var menuLinksAvaiable = sizeof(OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links']) > 0 && $thisUser->getLeftMenuItemStatus('links')}
<a n:if="$thisUser->getLeftMenuItemStatus('groups')" href="/groups{$thisUser->getId()}" class="link">{_"my_groups"}</a> <div n:if="$canAccessAdminPanel || $canAccessHelpdesk || $menuLinksAvaiable" class="menu_divider"></div>
<a n:if="$thisUser->getLeftMenuItemStatus('news')" href="/feed" class="link">{_"my_feed"}</a> <a href="/admin" class="link" n:if="$canAccessAdminPanel">Админ-панель</a>
<a href="/notifications" class="link">{_my_feedback} <a href="/support/tickets" class="link" n:if="$canAccessHelpdesk">Helpdesk
{if $thisUser->getNotificationsCount() > 0}
(<b>{$thisUser->getNotificationsCount()}</b>)
{/if}
</a>
<a href="/settings" class="link">{_"my_settings"}</a>
{var canAccessAdminPanel = $thisUser->getChandlerUser()->can("access")->model("admin")->whichBelongsTo(NULL)}
{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>
{if $canAccessAdminPanel}
<a href="/admin" class="link">Админ-панель</a>
{/if}
{if $canAccessHelpdesk}
<a href="/support/tickets" class="link">Helpdesk
{if $helpdeskTicketNotAnsweredCount > 0} {if $helpdeskTicketNotAnsweredCount > 0}
(<b>{$helpdeskTicketNotAnsweredCount}</b>) (<b>{$helpdeskTicketNotAnsweredCount}</b>)
{/if} {/if}
</a> </a>
<a href="/admin/reports" class="link">Reports</a> <a href="/admin/reports" class="link">Reports</a>
{/if}
<a
n:if="$thisUser->getLeftMenuItemStatus('links')"
n:foreach="OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links'] as $menuItem"
href="{$menuItem['url']}"
target="_blank"
class="link">{strpos($menuItem["name"], "@") === 0 ? tr(substr($menuItem["name"], 1)) : $menuItem["name"]}</a>
<div id="_groupListPinnedGroups">
<div n:if="$thisUser->getPinnedClubCount() > 0" class="menu_divider"></div>
<a
n:foreach="$thisUser->getPinnedClubs() as $club"
href="{$club->getURL()}"
class="link group_link">{$club->getName()}</a>
</div> <a n:if="$thisUser->getLeftMenuItemStatus('links')" n:foreach="OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links'] as $menuItem" href="{$menuItem['url']}" target="_blank" class="link">{strpos($menuItem["name"], "@") === 0 ? tr(substr($menuItem["name"], 1)) : $menuItem["name"]}</a>
<a
n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable']" <div id="_groupListPinnedGroups">
href="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['link']}" > <div n:if="$thisUser->getPinnedClubCount() > 0" class="menu_divider"></div>
<img <a n:foreach="$thisUser->getPinnedClubs() as $club" href="{$club->getURL()}" class="link group_link">{$club->getName()}</a>
src="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['src']}" </div>
alt="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['caption']}" <a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable'] && $thisUser->getLeftMenuItemStatus('poster')" href="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['link']}" >
class="psa-poster" <img src="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['src']}" alt="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['caption']}" class="psa-poster" style="max-width: 100%; margin-top: 50px;" />
style="max-width: 100%; margin-top: 50px;" /> </a>
</a> {else}
<a href="/support" class="link">{_menu_support}</a>
<a href="/logout?hash={urlencode($csrfToken)}" class="link">{_menu_logout}</a>
{/if}
{else} {else}
<a href="/support" class="link">{_"menu_support"}</a> <form id="fastLogin" action="/login" method="POST" enctype="multipart/form-data">
<a href="/logout?hash={urlencode($csrfToken)}" class="link">{_"menu_logout"}</a> <label for="login"><span>{_email}:</span></label>
{/if} <input id="login" type="text" name="login" required />
{else} <label for="password"><span>{_password}:</span></label>
<form id="fastLogin" action="/login" method="POST" enctype="multipart/form-data"> <input id="password" type="password" name="password" required />
<label for="login"><span>{_"email"}:</span></label> <input type="hidden" name="jReturnTo" value="{$_SERVER['REQUEST_URI']}" />
<input id="login" type="text" name="login" required /> <input type="hidden" name="hash" value="{$csrfToken}" />
<label for="password"><span>{_"password"}:</span></label> <input type="submit" value="{_log_in}" class="button" style="display: inline-block;" />
<input id="password" type="password" name="password" required /> <a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" href="/reg" class="button" style="display: inline-block;">{_registration}</a><br><br>
<input type="hidden" name="jReturnTo" value="{$_SERVER['REQUEST_URI']}" /> <a href="/restore">{_forgot_password}</a>
<input type="hidden" name="hash" value="{$csrfToken}" /> </form>
<input type="submit" value="{_'log_in'}" class="button" style="display: inline-block;" /> {/ifset}
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" href="/reg" class="button" style="display: inline-block;" >{_registration}</a><br><br>
<a href="/restore.pl">{_"forgot_password"}</a>
</form>
{/ifset}
</div> </div>
</div> </div>
@ -228,39 +210,34 @@
<div id="wrapH"> <div id="wrapH">
<div id="wrapHI"> <div id="wrapHI">
<div n:ifcontent class="page_yellowheader"> <div n:ifcontent class="page_yellowheader">
{include header} {include header}
</div> </div>
</div> </div>
</div> </div>
{ifset wrap} {ifset wrap}
{ifset $flashMessage} <div class="msg msg_{$flashMessage->type}" n:ifset="$flashMessage">
<div class="msg msg_{$flashMessage->type}"> <b>{$flashMessage->title}</b><br/>
{$flashMessage->msg|noescape}
</div>
{include wrap}
{else}
<div class="wrap2">
<div class="wrap1">
<div id="auth" class="page-wrap">
<div class="page_content">
<div class="msg msg_{$flashMessage->type}" n:ifset="$flashMessage">
<b>{$flashMessage->title}</b><br/> <b>{$flashMessage->title}</b><br/>
{$flashMessage->msg|noescape} {$flashMessage->msg|noescape}
</div> </div>
{/ifset}
{include wrap} {include content}
{else}
<div class="wrap2">
<div class="wrap1">
<div id="auth" class="page-wrap">
<div class="page_content">
{ifset $flashMessage}
<div class="msg msg_{$flashMessage->type}">
<b>{$flashMessage->title}</b><br/>
{$flashMessage->msg|noescape}
</div>
{/ifset}
{include content}
</div>
</div>
</div>
</div> </div>
{/ifset} </div>
</div>
</div>
{/ifset}
</div> </div>
</div> </div>
@ -268,6 +245,7 @@
{var dbVersion = \Chandler\Database\DatabaseConnection::i()->getConnection()->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION)} {var dbVersion = \Chandler\Database\DatabaseConnection::i()->getConnection()->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION)}
<div class="navigation_footer"> <div class="navigation_footer">
<a href="/about" class="link">{_footer_about_instance}</a>
<a href="/blog" class="link">{_footer_blog}</a> <a href="/blog" class="link">{_footer_blog}</a>
<a href="/support" class="link">{_footer_help}</a> <a href="/support" class="link">{_footer_help}</a>
<a href="/dev" target="_blank" class="link">{_footer_developers}</a> <a href="/dev" target="_blank" class="link">{_footer_developers}</a>
@ -293,14 +271,14 @@
{script "js/al_notifs.js"} {script "js/al_notifs.js"}
{/ifset} {/ifset}
<script src="https://unpkg.com/fartscroll@1.0.0/fartscroll.js"></script> {if OPENVK_ROOT_CONF['openvk']['preferences']['bellsAndWhistles']['fartscroll']}
<script n:if="OPENVK_ROOT_CONF['openvk']['preferences']['bellsAndWhistles']['fartscroll']"> <script src="https://unpkg.com/fartscroll@1.0.0/fartscroll.js"></script>
fartscroll(400); <script>
</script> fartscroll(400);
</script>
{/if}
<script n:if="OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['enable']" <script n:if="OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['enable']" async defer data-domain="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['domain']}" src="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['server']}js/plausible.js"></script>
async defer data-domain="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['domain']}"
src="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['server']}js/plausible.js"></script>
{ifset bodyScripts} {ifset bodyScripts}
{include bodyScripts} {include bodyScripts}

View file

@ -0,0 +1,59 @@
{extends "../@layout.xml"}
{block title}{_about_this_instance}{/block}
{block header}
{_about_this_instance}
{/block}
{block content}
<table width="100%" cellspacing="0" cellpadding="0">
<tbody>
<tr valign="top">
<td width="250" {if sizeof($admins) > 0}style="padding-right: 10px;"{/if}>
<h4>{_statistics}</h4>
<div style="margin-top: 5px;">
{_on_this_instance_are}
<ul>
<li><span>{tr("about_users", $usersStats->all)|noescape}</span></li>
<li><span>{tr("about_online_users", $usersStats->online)|noescape}</span></li>
<li><span>{tr("about_active_users", $usersStats->active)|noescape}</span></li>
<li><span>{tr("about_groups", $clubsCount)|noescape}</span></li>
<li><span>{tr("about_wall_posts", $postsCount)|noescape}</span></li>
</ul>
</div>
</td>
<td n:if="sizeof($admins) > 0">
<h4>{_administrators}</h4>
<div style="margin-left: 5px; margin-top: 5px;">
<div n:foreach="$admins as $admin" class="avatar-list-item">
<div class="avatar">
<a href="{$admin->getURL()}">
<img class="ava" src="{$admin->getAvatarUrl()}" />
</a>
</div>
{* Это наверное костыль, ну да ладно *}
<div n:class="info, mb_strlen($admin->getCanonicalName()) < 22 ? info-centered">
<a href="{$admin->getURL()}" class="title">{$admin->getCanonicalName()}</a>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
<h4>{_most_popular_groups}</h4>
<ol>
<li n:foreach="$popularClubs as $entry" style="margin-top: 5px;">
<a href="{$entry->club->getURL()}">{$entry->club->getName()}</a>
<div>
{tr("participants", $entry->subscriptions)}
</div>
</li>
</ol>
<h4>{_rules}</h4>
<div style="margin-top: 16px;">
{presenter "openvk!Support->knowledgeBaseArticle", "rules"}
</div>
{/block}

View file

@ -8,7 +8,7 @@
{block content} {block content}
<div class="navigation"> <div class="navigation">
{foreach $languages as $language} {foreach $languages as $language}
<a href="language?lg={$language['code']}&hash={urlencode($csrfToken)}" class="link"><img src="/assets/packages/static/openvk/img/flags/{$language['flag']}.gif"> {$language['native_name']}</a> <a href="language?lg={$language['code']}&hash={urlencode($csrfToken)}" class="link" rel="nofollow"><img src="/assets/packages/static/openvk/img/flags/{$language['flag']}.gif"> {$language['native_name']}</a>
{/foreach} {/foreach}
</div> </div>
{/block} {/block}

View file

@ -28,8 +28,7 @@
text-align: center !important; text-align: center !important;
} }
td, td, th {
th {
border: 1px solid #666; border: 1px solid #666;
vertical-align: baseline; vertical-align: baseline;
padding: 4px 5px; padding: 4px 5px;
@ -62,7 +61,7 @@
.h { .h {
background-color: #13599f; background-color: #13599f;
font-weight: bold; font-weight: bold;
color: #fff color: #fff;
} }
.v { .v {
@ -133,7 +132,7 @@
<tr class="v"> <tr class="v">
<td> <td>
This program makes use of the Chandler open-source web application server:<br/> This program makes use of the Chandler open-source web application server:<br/>
libchandler {=CHANDLER_VER} by rem-pai libchandler {=CHANDLER_VER} by Celestora
</td> </td>
</tr> </tr>
</tbody> </tbody>
@ -362,7 +361,7 @@
Default OpenVK look and feel. Default OpenVK look and feel.
</td> </td>
<td class="v"> <td class="v">
Vladimir Barinov, Konstantin Kichulkin and Daniil Myslivets Vladimir Barinov, Konstantin Kichulkin and Daniel Myslivets
</td> </td>
</tr> </tr>
<tr n:foreach="$themes as $theme"> <tr n:foreach="$themes as $theme">
@ -396,8 +395,8 @@
</tr> </tr>
<tr> <tr>
<td class="e"> <td class="e">
Vladimir Barinov (veselcraft), Alexandra Katunina (rem-pai), Konstantin Kichulkin (kosfurler), Vladimir Barinov (veselcraft), Celestora, Konstantin Kichulkin (kosfurler),
Nikita Volkov (sup_ban), Daniel Myslivets (myslivets), Alexander Kotov (l-lacker), Nikita Volkov (sup_ban), Daniel Myslivets, Alexander Kotov (l-lacker),
Alexey Assemblerov (BiosNod), Ilya Prokopenko (dsrev) and Maxim Leshchenko (maksales / maksalees) Alexey Assemblerov (BiosNod), Ilya Prokopenko (dsrev) and Maxim Leshchenko (maksales / maksalees)
</td> </td>
</tr> </tr>
@ -459,7 +458,7 @@
</tr> </tr>
<tr> <tr>
<td class="e">Initial hosting</td> <td class="e">Initial hosting</td>
<td class="v">Ilya Prokopenko (dsrev) and Alexandra Katunina (rem-pai)</td> <td class="v">Ilya Prokopenko (dsrev) and Celestora</td>
</tr> </tr>
<tr> <tr>
<td class="e">Initial bug-tracker hosting</td> <td class="e">Initial bug-tracker hosting</td>
@ -467,22 +466,18 @@
</tr> </tr>
<tr> <tr>
<td class="e">Images</td> <td class="e">Images</td>
<td class="v">Vladimir Barinov (veselcraft), Konstantin Kichulkin (kosfurler) and Daniil Myslivets (myslivets)</td> <td class="v">Vladimir Barinov (veselcraft), Konstantin Kichulkin (kosfurler) and Daniel Myslivets</td>
</tr> </tr>
<tr> <tr>
<td class="e">Illustrations</td> <td class="e">Illustrations</td>
<td class="v">Ash Defenders</td> <td class="v">Ash Defenders, Polina Katunina (RousPhaul)</td>
</tr>
<tr>
<td class="e">Soundtrack</td>
<td class="v">Ash Defenders</td>
</tr> </tr>
<tr> <tr>
<td class="e">Best barmaid</td> <td class="e">Best barmaid</td>
<td class="v">Jill</td> <td class="v">Jill</td> {* I can agree ~~ dsrev *}
</tr> </tr>
<tr> <tr>
<td class="e">Helpdesk implementation</td> <td class="e">Initial Helpdesk implementation</td>
<td class="v">Nikita Volkov (sup_ban)</td> <td class="v">Nikita Volkov (sup_ban)</td>
</tr> </tr>
</tbody> </tbody>
@ -495,8 +490,10 @@
</tr> </tr>
<tr class="e"> <tr class="e">
<td> <td>
Vladimir Lapskiy (0x7d5), Alexander Minkin (WerySkok), Polina Katunina (RousPhaul), kovaltim, Vladimir Lapskiy (0x7d5), Alexander Minkin (WerySkok), Polina Katunina (RousPhaul), veth,
Egor Shevchenko, Dmitriy Daemon and Ilya Prokopenko (dsrev). Egor Shevchenko, Vadim Korovin (yuni), Ash Defenders,
Pavel Silaev, Dmitriy Daemon, Ilya Prokopenko (dsrev),
cmed404 and unknown tester, who disappeared shortly after trying to upload post with cat.
</td> </td>
</tr> </tr>
</tbody> </tbody>

View file

@ -63,6 +63,12 @@
</label> </label>
<input class="text medium-field" type="email" id="email" name="email" value="{$user->getEmail()}" /> <input class="text medium-field" type="email" id="email" name="email" value="{$user->getEmail()}" />
</div> </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> <hr>
<div class="field-group"> <div class="field-group">
<label for="city"> <label for="city">

View file

@ -7,7 +7,7 @@
{block content} {block content}
<div class="container_gray"> <div class="container_gray">
<form method="POST" enctype="multipart/form-data" action="/club{$club->getId()}/setAdmin.jsp"> <form method="POST" enctype="multipart/form-data" action="/club{$club->getId()}/setAdmin">
<table cellspacing="7" cellpadding="0" width="40%" border="0" align="center"> <table cellspacing="7" cellpadding="0" width="40%" border="0" align="center">
<tbody> <tbody>
<tr> <tr>

View file

@ -74,7 +74,8 @@
<span class="nobold">{_wall}: </span> <span class="nobold">{_wall}: </span>
</td> </td>
<td> <td>
<input type="checkbox" name="wall" value="1" {if $club->canPost()}checked{/if}/> {_group_allow_post_for_everyone} <input type="checkbox" name="wall" value="1" n:attr="checked => $club->canPost()" /> {_group_allow_post_for_everyone}<br>
<input type="checkbox" name="hide_from_global_feed" value="1" n:attr="checked => $club->isHideFromGlobalFeedEnabled()" /> {_group_hide_from_global_feed}
</td> </td>
</tr> </tr>
<tr> <tr>

View file

@ -109,7 +109,7 @@
{var user = $x instanceof $Manager ? $x->getUser() : $x} {var user = $x instanceof $Manager ? $x->getUser() : $x}
{var manager = $x instanceof $Manager ? $x : $club->getManager($user, !$club->canBeModifiedBy($thisUser))} {var manager = $x instanceof $Manager ? $x : $club->getManager($user, !$club->canBeModifiedBy($thisUser))}
{if $club->canBeModifiedBy($thisUser ?? NULL)} {if $club->canBeModifiedBy($thisUser ?? NULL)}
<a class="profile_link" href="/club{$club->getId()}/setAdmin.jsp?user={$user->getId()}&hash={rawurlencode($csrfToken)}" n:if="$club->getOwner()->getId() !== $user->getId()"> <a class="profile_link" href="/club{$club->getId()}/setAdmin?user={$user->getId()}&hash={rawurlencode($csrfToken)}" n:if="$club->getOwner()->getId() !== $user->getId()">
{if $manager} {if $manager}
{_devote} {_devote}
{else} {else}
@ -130,12 +130,12 @@
{_set_comment} {_set_comment}
</a> </a>
{if $manager} {if $manager}
<a class="profile_link" href="/club{$club->getId()}/setAdmin.jsp?user={$user->getId()}&hidden={(int) !$manager->isHidden()}&hash={rawurlencode($csrfToken)}"> <a class="profile_link" href="/club{$club->getId()}/setAdmin?user={$user->getId()}&hidden={(int) !$manager->isHidden()}&hash={rawurlencode($csrfToken)}">
{if $manager->isHidden()}{_hidden_yes}{else}{_hidden_no}{/if} {if $manager->isHidden()}{_hidden_yes}{else}{_hidden_no}{/if}
</a> </a>
{/if} {/if}
{if $club->getOwner()->getId() == $user->getId()} {if $club->getOwner()->getId() == $user->getId()}
<a class="profile_link" href="/club{$club->getId()}/setAdmin.jsp?user={$user->getId()}&hidden={(int) !$club->isOwnerHidden()}&hash={rawurlencode($csrfToken)}"> <a class="profile_link" href="/club{$club->getId()}/setAdmin?user={$user->getId()}&hidden={(int) !$club->isOwnerHidden()}&hash={rawurlencode($csrfToken)}">
{if $club->isOwnerHidden()}{_hidden_yes}{else}{_hidden_no}{/if} {if $club->isOwnerHidden()}{_hidden_yes}{else}{_hidden_no}{/if}
</a> </a>
{/if} {/if}

View file

@ -92,7 +92,7 @@
</div> </div>
<div class="right_small_block"> <div class="right_small_block">
{var avatarPhoto = $club->getAvatarPhoto()} {var avatarPhoto = $club->getAvatarPhoto()}
{var avatarLink = ($avatarPhoto->isAnonymous() ? "/photo" . ("s/" . base_convert((string) $avatarPhoto->getId(), 10, 32)) : $club->getAvatarLink())} {var avatarLink = ((is_null($avatarPhoto) ? FALSE : $avatarPhoto->isAnonymous()) ? "/photo" . ("s/" . base_convert((string) $avatarPhoto->getId(), 10, 32)) : $club->getAvatarLink())}
<a href="{$avatarLink|nocheck}"> <a href="{$avatarLink|nocheck}">
<img src="{$club->getAvatarUrl()}" style="width: 100%; image-rendering: -webkit-optimize-contrast;" /> <img src="{$club->getAvatarUrl()}" style="width: 100%; image-rendering: -webkit-optimize-contrast;" />
</a> </a>
@ -189,7 +189,7 @@
</div> </div>
</div> </div>
</div> </div>
<div n:if="$albumsCount > 0"> <div n:if="$albumsCount > 0 || ($thisUser && $club->canBeModifiedBy($thisUser))">
<div class="content_title_expanded" onclick="hidePanel(this, {$albumsCount});"> <div class="content_title_expanded" onclick="hidePanel(this, {$albumsCount});">
{_"albums"} {_"albums"}
</div> </div>

View file

@ -5,7 +5,7 @@
<a href="/im">{_my_messages}</a> » <a href="/im">{_my_messages}</a> »
<a href="{$correspondent->getURL()}">{$correspondent->getCanonicalName()}</a> <a href="{$correspondent->getURL()}">{$correspondent->getCanonicalName()}</a>
<div n:if="($online = $correspondent->getOnline()->timestamp()) < time() + 2678400" style="float: right;"> <div n:if="($online = $correspondent->getOnline()->timestamp()) + 2505600 > time()" style="float: right;">
{var diff = date_diff(date_create(), date_create('@' . $online))} {var diff = date_diff(date_create(), date_create('@' . $online))}
{if 5 >= $diff->i} {if 5 >= $diff->i}
<span><b>{_online}</b></span> <span><b>{_online}</b></span>
@ -43,7 +43,7 @@
</div> </div>
</div> </div>
<div class="messenger-app--input"> <div class="messenger-app--input">
{if $correspondent->getId() === $thisUser->getId() || ($correspondent->getSubscriptionStatus($thisUser) === 3)} {if $correspondent->getId() === $thisUser->getId() || $correspondent->getPrivacyPermission('messages.write', $thisUser)}
<img class="ava" src="{$thisUser->getAvatarUrl()}" alt="{$thisUser->getCanonicalName()}" /> <img class="ava" src="{$thisUser->getAvatarUrl()}" alt="{$thisUser->getCanonicalName()}" />
<div class="messenger-app--input---messagebox"> <div class="messenger-app--input---messagebox">
<textarea <textarea
@ -54,7 +54,7 @@
</div> </div>
<img class="ava" src="{$correspondent->getAvatarUrl()}" alt="{$correspondent->getCanonicalName()}" /> <img class="ava" src="{$correspondent->getAvatarUrl()}" alt="{$correspondent->getCanonicalName()}" />
{else} {else}
<div class="blocked" data-localized-text="Вы не можете писать сообщения {$correspondent->getCanonicalName()}, так как его нет в вашем списке друзей."></div> <div class="blocked" data-localized-text="Вы не можете писать сообщения {$correspondent->getCanonicalName()} из-за его настроек приватности."></div>
{/if} {/if}
</div> </div>
</div> </div>

View file

@ -11,7 +11,7 @@
</div> </div>
<div class="container_gray"> <div class="container_gray">
<form action="/im/search.pl" method="POST" style="margin: 0;"> <form action="/im/search" method="POST" style="margin: 0;">
<input type="text" name="pattern" placeholder="Поиск сообщений" required /> <input type="text" name="pattern" placeholder="Поиск сообщений" required />
</form> </form>
</div> </div>

View file

@ -35,7 +35,7 @@
<div class="album-photo"> <div class="album-photo">
<a <a
n:if="!is_null($thisUser) && $album->canBeModifiedBy($thisUser)" n:if="!is_null($thisUser) && $album->canBeModifiedBy($thisUser)"
href="/album{$album->getPrettyId()}/remove_photo.pl/{$photo->getId()}" class="album-photo--delete"> href="/album{$album->getPrettyId()}/remove_photo/{$photo->getId()}" class="album-photo--delete">
&times; &times;
</a> </a>

View file

@ -39,6 +39,6 @@
</form> </form>
<hr/> <hr/>
<center> <center>
{_"you_can_also"} <a href="/album{$album->getOwner()->getId()}_{$album->getId()}/delete.pl?hash={rawurlencode($csrfToken)}">{_"delete_album"}</a>. {_"you_can_also"} <a href="/album{$album->getOwner() instanceof openvk\Web\Models\Entities\Club ? '-' : ''}{$album->getOwner()->getId()}_{$album->getId()}/delete?hash={rawurlencode($csrfToken)}">{_"delete_album"}</a>.
</center> </center>
{/block} {/block}

View file

@ -6,6 +6,9 @@
{else} {else}
{tr("search_for_groups")} {tr("search_for_groups")}
{/if} {/if}
{if $_GET['query']}
- {$_GET['query']}
{/if}
{/block} {/block}
{block header} {block header}
@ -21,12 +24,12 @@
{block tabs} {block tabs}
<div {if $type === "users"}id="activetabs"{/if} class="tab"> <div {if $type === "users"}id="activetabs"{/if} class="tab">
<a {if $type === "users"}id="act_tab_a"{/if} href="/search?type=users"> <a {if $type === "users"}id="act_tab_a"{/if} href="/search?type=users{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}">
{_users} {_users}
</a> </a>
</div> </div>
<div {if $type === "groups"}id="activetabs"{/if} class="tab"> <div {if $type === "groups"}id="activetabs"{/if} class="tab">
<a {if $type === "groups"}id="act_tab_a"{/if} href="/search?type=groups"> <a {if $type === "groups"}id="act_tab_a"{/if} href="/search?type=groups{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}">
{_groups} {_groups}
</a> </a>
</div> </div>

View file

@ -6,138 +6,129 @@
{/block} {/block}
{block content} {block content}
<div class="post-author"> <div class="post-author">
<a href="#" style="font-size:13px;"> <a href="#" style="font-size: 13px;"><b>{$ticket->getName()}</b></a><br />
<b> {_author}: <a href="/id{$ticket->getUser()->getId()}">{$ticket->getUser()->getFullName()}</a> | {$ticket->getUser()->getRegistrationIP()} | {_status}: {$ticket->getStatus()}.
{$ticket->getName()} </div>
</b> <div class="text" style="padding-top: 10px; border-bottom: #ECECEC solid 1px;">
</a> {$ticket->getText()|noescape}
<br></b>{_author}: <a href="/id{$ticket->getUser()->getId()}">{$ticket->getUser()->getFullName()}</a> | {$ticket->getUser()->getRegistrationIP()} | {_status}: {$ticket->getStatus()}. <br /><br />
</div> </div>
<div class="text" style="padding-top: 10px;border-bottom: #ECECEC solid 1px;"> <div style="padding-top: 5px;">
{$ticket->getText()|noescape} {$ticket->getTime()}&nbsp;|&nbsp;
<br></br> <a href="/support/delete/{$id}?hash={$csrfToken}">{_delete}</a>
</div> </div>
<div style="padding-top: 5px;"> <br />
{$ticket->getTime()}&nbsp;|&nbsp; <div>
<a href="/support/delete/{$id}?hash={$csrfToken}">{_delete}</a> <form action="/al_comments/create/support/reply/{$id}" method="post" style="margin: 0;">
</div><br/> <textarea name="text" id="answer_text" style="width: 100%; resize: vertical;"></textarea>
<div> <br />
<form action="/al_comments.pl/create/support/reply/{$id}" method="post" style="margin:0;"> <input type="hidden" name="hash" value="{$csrfToken}" />
<textarea name="text" id="answer_text" style="width: 100%;resize: vertical;"></textarea> <br />
<div> <div style="float: left;">
<!-- padding to fix <br/> bug --> <input type="submit" value="{_write}" class="button" />
</div> <select name="status" style="width: unset;">
<input type="hidden" name="hash" value="{$csrfToken}" /> <option value="1">{_support_status_1}</option>
<br /> <option value="2">{_support_status_2}</option>
<div style="float: left;"> <option value="0">{_support_status_0}</option>
<input type="submit" value="{_write}" class="button"> </select>
<select name="status" style="width: unset;">
<option value="1">{_support_status_1}</option>
<option value="2">{_support_status_2}</option>
<option value="0">{_support_status_0}</option>
</select>
</div>
<div n:if="!is_null($fastAnswers)" style="float: right;">
<a class="button" href="javascript:showSupportFastAnswerDialog(fastAnswers)">{_fast_answers}</a>
</div>
<br />
</form>
</div>
<br/>
<p n:if="!$comments">{_no_comments}</p>
{var $printedSupportGreeting = false}
<table n:foreach="$comments as $comment" border="0" style="font-size: 11px;" class="post">
<tbody>
<tr>
{if $comment->getUType() === 0}
<td width="54" valign="top">
<img src="{$comment->getUser()->getAvatarUrl()}" width="50">
</td>
{else}
<td width="54" valign="top">
<img
src="{$comment->getAvatar()}"
style="max-width: 50px; filter: hue-rotate({$comment->getColorRotation()}deg);" />
</td>
{/if}
<td width="645" valign="top">
{if $comment->getUType() === 0}
<div class="post-author">
<a href="{$comment->getUser()->getURL()}"><b>
{$comment->getUser()->getFullName()}
</b></a> {($comment->getUser()->isFemale() ? tr("post_writes_f") : tr("post_writes_m"))}<br>
<a href="#" class="date">{$comment->getTime()}</a>
</div> </div>
{elseif ($comment->getUType() === 1)} <div n:if="!is_null($fastAnswers)" style="float: right;">
<div class="post-author"> <a class="button" href="javascript:showSupportFastAnswerDialog(fastAnswers)">{_fast_answers}</a>
<a href="javascript:false">
<b>
{$comment->getAuthorName()}
</b>
</a>
{if $thisUser->getChandlerUser()->can("write")->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
<a href="{$comment->getUser()->getURL()}">
<span class="nobold">
{var lastName = $comment->getUser()->getLastName()}
{if empty(trim($lastName))}
({$comment->getUser()->getFirstName()})
{else}
({$comment->getUser()->getFirstName()} {iconv_substr($lastName, 0, 1)}.)
{/if}
</span>
</a>
{/if}
{_post_writes_m}<br>
<a href="#" class="date">{$comment->getTime()}</a>
</div> </div>
{/if} <br />
<div class="post-content" id="{$comment->getId()}"> </form>
<div class="text" id="text{$comment->getId()}"> </div>
{if $comment->getUType() === 1 && !$printedSupportGreeting} <br />
{var $printedSupportGreeting = true} <p n:if="!$comments">{_no_comments}</p>
{tr("support_greeting_hi", $ticket->getUser()->getFullName())} {var $printedSupportGreeting = false}
<br/> <table n:foreach="$comments as $comment" border="0" style="font-size: 11px;" class="post">
<br/> <tbody>
<tr>
{if $comment->getUType() === 0}
<td width="54" valign="top">
<img src="{$comment->getUser()->getAvatarUrl()}" width="50" />
</td>
{else}
<td width="54" valign="top">
<img
src="{$comment->getAvatar()}"
style="max-width: 50px; filter: hue-rotate({$comment->getColorRotation()}deg);" />
</td>
{/if}
<td width="645" valign="top">
{if $comment->getUType() === 0}
<div class="post-author">
<a href="{$comment->getUser()->getURL()}"><b>
{$comment->getUser()->getFullName()}
</b></a> {($comment->getUser()->isFemale() ? tr("post_writes_f") : tr("post_writes_m"))}<br />
<a href="#" class="date">{$comment->getTime()}</a>
</div>
{elseif ($comment->getUType() === 1)}
<div class="post-author">
<a><b>{$comment->getAuthorName()}</b></a>
{if $thisUser->getChandlerUser()->can("write")->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
<a href="{$comment->getUser()->getURL()}">
<span class="nobold">
{var lastName = $comment->getUser()->getLastName()}
{if empty(trim($lastName))}
({$comment->getUser()->getFirstName()})
{else}
({$comment->getUser()->getFirstName()} {iconv_substr($lastName, 0, 1)}.)
{/if}
</span>
</a>
{/if}
{_post_writes_m}<br />
<a href="#" class="date">{$comment->getTime()}</a>
</div>
{/if}
<div class="post-content" id="{$comment->getId()}">
<div class="text" id="text{$comment->getId()}">
{if $comment->getUType() === 1 && !$printedSupportGreeting}
{var $printedSupportGreeting = true}
{tr("support_greeting_hi", $ticket->getUser()->getFullName())}
<br />
<br />
{$comment->getText()|noescape} {$comment->getText()|noescape}
<br/> <br />
<br/> <br />
{tr("support_greeting_regards", OPENVK_ROOT_CONF["openvk"]["appearance"]["name"])|noescape} {tr("support_greeting_regards", OPENVK_ROOT_CONF["openvk"]["appearance"]["name"])|noescape}
{else} {else}
{$comment->getText()|noescape} {$comment->getText()|noescape}
{/if} {/if}
</div> </div>
{if $comment->getUType() === 0} {if $comment->getUType() === 0}
<div class="post-menu"> <div class="post-menu">
<a href="/support/comment/{$comment->getId()}/delete">{_delete}</a> <a href="/support/comment/{$comment->getId()}/delete">{_delete}</a>
</div> </div>
{/if}
{if $comment->getUType() === 1 && !is_null($comment->isLikedByUser())}
<div class="post-menu">
<strong>
{if $comment->isLikedByUser()}
{_support_good_answer_agent}
{else}
{_support_bad_answer_agent}
{/if} {/if}
</strong>
</div>
{/if}
</div>
</td>
</tr>
</tbody>
</table>
<script> {if $comment->getUType() === 1 && !is_null($comment->isLikedByUser())}
const fastAnswers = [ <div class="post-menu">
{foreach $fastAnswers as $answer} <strong>
{$answer}, {if $comment->isLikedByUser()}
{/foreach} {_support_good_answer_agent}
]; {else}
</script> {_support_bad_answer_agent}
{/if}
</strong>
</div>
{/if}
</div>
</td>
</tr>
</tbody>
</table>
<script>
const fastAnswers = [
{foreach $fastAnswers as $answer}
{$answer},
{/foreach}
];
</script>
{/block} {/block}

View file

@ -6,63 +6,82 @@
{/block} {/block}
{block content} {block content}
{var isMain = $mode === 'faq'}
{var isNew = $mode === 'new'}
{var isList = $mode === 'list'}
{var isMain = $mode === 'faq'} {if $thisUser}
{var isNew = $mode === 'new'} <div class="tabs">
{var isList = $mode === 'list'} <div n:attr="id => ($isMain ? 'activetabs' : 'ki')" class="tab">
<a n:attr="id => ($isMain ? 'act_tab_a' : 'ki')" href="/support">{_support_faq}</a>
{if $thisUser}
<div class="tabs">
<div n:attr="id => ($isMain ? 'activetabs' : 'ki')" class="tab">
<a n:attr="id => ($isMain ? 'act_tab_a' : 'ki')" href="/support">{_support_faq}</a>
</div>
<div n:attr="id => ($isList ? 'activetabs' : 'ki')" class="tab">
<a n:attr="id => ($isList ? 'act_tab_a' : 'ki')" href="/support?act=list">{_support_list}</a>
</div>
<div n:attr="id => ($isNew ? 'activetabs' : 'ki')" class="tab">
<a n:attr="id => ($isNew ? 'act_tab_a' : 'ki')" href="/support?act=new">{_support_new}</a>
</div>
</div>
<br>
{if $isNew}
<div class="new">
<form action="/support" method="post" style="margin:0;">
<center><input name="name" style="width: 80%;resize: vertical;" placeholder="{_support_new_title}"></center><br>
<center><textarea name="text" style="width: 80%;resize: vertical;" placeholder="{_support_new_content}"></textarea></center><br>
<input type="hidden" name="hash" value="{$csrfToken}" />
<center><input type="submit" value="{_write}" class="button" style="margin-left:70%;"></center><br>
</form>
</div>
{/if}{/if}
{if $isMain}
<h4>{_support_faq}</h4><br>
<div class="faq">
<div id="faqhead">{_support_faq_title}</div>
<div id="faqcontent">{_support_faq_content}</div>
</div>
{/if}
{if $isList}
<table n:foreach="$tickets as $ticket" border="0" style="font-size:11px;width: 610px;" class="post">
<tbody>
<tr>
<td width="54" valign="top">
<center><img src="/assets/packages/static/openvk/img/note_icon.png" alt="{_support_ticket}" style="margin-top: 17px;"></center>
</td>
<td width="345" valign="top">
<div class="post-author">
<a href="/support/view/{$ticket->getId()}">
<b>{$ticket->getName()}</b>
</a>
</div> </div>
<div class="post-content" style="padding: 4px;font-size: 11px;"> <div n:if="$count > 0" n:attr="id => ($isList ? 'activetabs' : 'ki')" class="tab">
{_status}: {$ticket->getStatus()} <a n:attr="id => ($isList ? 'act_tab_a' : 'ki')" href="/support?act=list">{_support_list}</a>
</div> </div>
</td> <div n:attr="id => ($isNew ? 'activetabs' : 'ki')" class="tab">
</tr> <a n:attr="id => ($isNew ? 'act_tab_a' : 'ki')" href="/support?act=new">{_support_new}</a>
</tbody> </div>
</table> </div>
{/if}
<br />
{if $isNew}
<div class="new">
<form action="/support" method="post" style="margin:0;">
<center>
<input name="name" style="width: 80%; resize: vertical;" placeholder="{_support_new_title}" /><br /><br />
<textarea name="text" style="width: 80%; resize: vertical;" placeholder="{_support_new_content}"></textarea><br /><br />
<input type="hidden" name="hash" value="{$csrfToken}" />
<input type="submit" value="{_write}" class="button" style="margin-left: 70%;" /><br /><br />
</center>
</form>
</div>
{/if}
{/if}
{if $isMain}
<h4>{_support_faq}</h4><br />
<div class="faq">
<div id="faqhead">{_support_faq_title}</div>
<div id="faqcontent">{_support_faq_content}</div>
</div>
{/if}
{if $isList}
<table n:foreach="$tickets as $ticket" border="0" style="font-size: 11px; width: 610px;" class="post">
<tbody>
<tr>
<td width="54" valign="top">
<center>
<img src="/assets/packages/static/openvk/img/note_icon.png" alt="{_support_ticket}" style="margin-top: 17px;" />
</center>
</td>
<td width="345" valign="top">
<div class="post-author">
<a href="/support/view/{$ticket->getId()}">
<b>{$ticket->getName()}</b>
</a>
</div>
<div class="post-content" style="padding: 4px; font-size: 11px;">
{_status}: {$ticket->getStatus()}
</div>
</td>
</tr>
</tbody>
</table>
{if $count < 1}
{include "../components/nothing.xml"}
{/if}
<div style="padding: 8px;">
{include "../components/paginator.xml", conf => (object) [
"page" => $page,
"count" => $count,
"amount" => sizeof($tickets),
"perPage" => OPENVK_DEFAULT_PER_PAGE,
"atBottom" => true,
]}
</div>
{/if}
{/block} {/block}

View file

@ -6,144 +6,132 @@
{/block} {/block}
{block content} {block content}
<script> <script>
function markAnswer(id, mark) { function markAnswer(id, mark) {
let url = "/support/comment/" + id + "/rate/" + mark + "?hash=" + {urlencode($csrfToken)}; let url = "/support/comment/" + id + "/rate/" + mark + "?hash=" + {urlencode($csrfToken)};
$.ajax(url, { $.ajax(url, {
error: errorHandler, error: errorHandler,
success: success(id, mark) success: success(id, mark)
}); });
} }
function success(id, mark) { function success(id, mark) {
if(mark == 1) if(mark == 1)
document.getElementById("markText-" + id).innerHTML = {_support_good_answer_user}; document.getElementById("markText-" + id).innerHTML = {_support_good_answer_user};
else else
document.getElementById("markText-" + id).innerHTML = {_support_bad_answer_user}; document.getElementById("markText-" + id).innerHTML = {_support_bad_answer_user};
document.getElementById("markLinks-" + id).remove(); document.getElementById("markLinks-" + id).remove();
} }
function errorHandler(id, mark) { function errorHandler(id, mark) {
document.getElementById("markText-" + id).innerHTML = {_error}; document.getElementById("markText-" + id).innerHTML = {_error};
} }
</script> </script>
{if $ticket->isDeleted() == 0 }
<div class="post-author"> {if $ticket->isDeleted() == 0}
<a href="#" style="font-size:13px;"> <div class="post-author">
<b> <a href="#" style="font-size:13px;"><b>{$ticket->getName()}</b></a>
{$ticket->getName()} <br />{_status}: {$ticket->getStatus()}
</b>
</a>
<br></b>{_status}: {$ticket->getStatus()}
</div>
<div class="text" style="padding-top: 10px;border-bottom: #ECECEC solid 1px;">
{$ticket->getText()|noescape}
<br></br>
</div>
<div style="padding-top: 5px;">
{$ticket->getTime()}&nbsp;|&nbsp;
<a href="/support/delete/{$id}?hash={$csrfToken}">{_delete}</a>
</div>
{if $ticket->getType() !== 2}
<br>
<div>
<form action="/al_comments.pl/create/support/{$id}" method="post" style="margin:0;">
<textarea name="text" style="width: 100%;resize: vertical;"></textarea>
<div>
<!-- padding to fix <br/> bug -->
</div>
<input type="hidden" name="hash" value="{$csrfToken}" />
<br>
<input type="submit" value="{_write}" class="button">
</form>
</div> </div>
{/if} <div class="text" style="padding-top: 10px; border-bottom: #ECECEC solid 1px;">
</br> {$ticket->getText()|noescape}
<p n:if="!$comments">{_no_comments}</p> <br /></br>
{var $printedSupportGreeting = false} </div>
<table n:foreach="$comments as $comment" border="0" style="font-size: 11px;" class="post"> <div style="padding-top: 5px;">
<tbody> {$ticket->getTime()}&nbsp;|&nbsp;
<tr> <a href="/support/delete/{$id}?hash={$csrfToken}">{_delete}</a>
{if $comment->getUType() === 0} </div>
<td width="54" valign="top"> {if $ticket->getType() !== 2}
<img src="{$comment->getUser()->getAvatarUrl()}" width="50"> <br />
</td> <div>
{else} <form action="/al_comments/create/support/{$id}" method="post" style="margin:0;">
<td width="54" valign="top"> <textarea name="text" style="width: 100%;resize: vertical;"></textarea><br />
<img <input type="hidden" name="hash" value="{$csrfToken}" /><br />
src="{$comment->getAvatar()}" <input type="submit" value="{_write}" class="button" />
style="max-width: 50px; filter: hue-rotate({$comment->getColorRotation()}deg);" /> </form>
</td>
{/if}
<td width="645" valign="top">
{if $comment->getUType() === 0}
<div class="post-author">
<a href="{$comment->getUser()->getURL()}"><b>
{$comment->getUser()->getFullName()}
</b></a> {($comment->getUser()->isFemale() ? tr("post_writes_f") : tr("post_writes_m"))}<br>
<a href="#" class="date">{$comment->getTime()}</a>
</div> </div>
{elseif ($comment->getUType() === 1)} {/if}
<div class="post-author"> <br />
<a href="javascript:false"> <p n:if="!$comments">{_no_comments}</p>
<b> {var $printedSupportGreeting = false}
{$comment->getAuthorName()} <table n:foreach="$comments as $comment" border="0" style="font-size: 11px;" class="post">
</b> <tbody>
</a> <tr>
{_post_writes_m}<br> {if $comment->getUType() === 0}
<a href="#" class="date">{$comment->getTime()}</a> <td width="54" valign="top">
</div> <img src="{$comment->getUser()->getAvatarUrl()}" width="50" />
{/if} </td>
<div class="post-content" id="{$comment->getId()}"> {else}
<div class="text" id="text{$comment->getId()}"> <td width="54" valign="top">
{if $comment->getUType() === 1 && !$printedSupportGreeting} <img
{var $printedSupportGreeting = true} src="{$comment->getAvatar()}"
{tr("support_greeting_hi", $ticket->getUser()->getFullName())} style="max-width: 50px; filter: hue-rotate({$comment->getColorRotation()}deg);" />
<br/> </td>
<br/> {/if}
<td width="645" valign="top">
{$comment->getText()|noescape} {if $comment->getUType() === 0}
<br/> <div class="post-author">
<br/> <a href="{$comment->getUser()->getURL()}"><b>{$comment->getUser()->getFullName()}</b></a>
{($comment->getUser()->isFemale() ? tr("post_writes_f") : tr("post_writes_m"))}<br />
{tr("support_greeting_regards", OPENVK_ROOT_CONF["openvk"]["appearance"]["name"])|noescape} <a href="#" class="date">{$comment->getTime()}</a>
{else} </div>
{$comment->getText()|noescape} {elseif ($comment->getUType() === 1)}
{/if} <div class="post-author">
</div> <a><b>{$comment->getAuthorName()}</b></a>
{_post_writes_m}<br />
{if $comment->getUType() === 0} <a href="#" class="date">{$comment->getTime()}</a>
<div class="post-menu"> </div>
<a href="/support/comment/{$comment->getId()}/delete">{_delete}</a>
</div>
{/if}
{if $comment->getUType() === 1}
<div class="post-menu">
{var isLikedByUser = $comment->isLikedByUser()}
<strong id="markText-{$comment->getId()}">
{if !is_null($isLikedByUser)}
{if $comment->isLikedByUser()}
{_support_good_answer_user}
{else}
{_support_bad_answer_user}
{/if} {/if}
{/if} <div class="post-content" id="{$comment->getId()}">
</strong> <div class="text" id="text{$comment->getId()}">
<div id="markLinks-{$comment->getId()}"> {if $comment->getUType() === 1 && !$printedSupportGreeting}
{if is_null($isLikedByUser)} {var $printedSupportGreeting = true}
<a onClick="markAnswer({$comment->getId()}, 1)">{_support_rate_good_answer}</a> {tr("support_greeting_hi", $ticket->getUser()->getFullName())}
| <br />
<a onClick="markAnswer({$comment->getId()}, 2)">{_support_rate_bad_answer}</a> <br />
{/if}
</div> {$comment->getText()|noescape}
{/if} <br />
</div> <br />
</div>
</td> {tr("support_greeting_regards", OPENVK_ROOT_CONF["openvk"]["appearance"]["name"])|noescape}
</tr> {else}
</tbody> {$comment->getText()|noescape}
</table> {/if}
{/if} </div>
{if $comment->getUType() === 0}
<div class="post-menu">
<a href="/support/comment/{$comment->getId()}/delete">{_delete}</a>
</div>
{/if}
{if $comment->getUType() === 1}
<div class="post-menu">
{var isLikedByUser = $comment->isLikedByUser()}
<strong id="markText-{$comment->getId()}">
{if !is_null($isLikedByUser)}
{if $comment->isLikedByUser()}
{_support_good_answer_user}
{else}
{_support_bad_answer_user}
{/if}
{/if}
</strong>
<div id="markLinks-{$comment->getId()}">
{if is_null($isLikedByUser)}
<a onClick="markAnswer({$comment->getId()}, 1)">{_support_rate_good_answer}</a>
|
<a onClick="markAnswer({$comment->getId()}, 2)">{_support_rate_bad_answer}</a>
{/if}
</div>
</div>
{/if}
</div>
</td>
</tr>
</tbody>
</table>
{/if}
{/block} {/block}

View file

@ -13,7 +13,7 @@
{var isAvatar = $mode === 'avatar'} {var isAvatar = $mode === 'avatar'}
<div n:if="$user->hasPendingNumberChange()" class="msg"> <div n:if="$user->hasPendingNumberChange()" class="msg">
<b>Подтверждение номера телефона</b><br/> <b>Подтверждение номера телефона</b><br/>
Введите код для подтверждения смены номера: <a href="/edit/verify_phone.pl">ввести код</a>. Введите код для подтверждения смены номера: <a href="/edit/verify_phone">ввести код</a>.
</div> </div>
<div class="tabs"> <div class="tabs">
@ -288,7 +288,7 @@
{elseif $isAvatar} {elseif $isAvatar}
<h4>{_"profile_picture"}</h4> <h4>{_"profile_picture"}</h4>
<form action="/al_avatars.pl" method="POST" enctype="multipart/form-data"> <form action="/al_avatars" method="POST" enctype="multipart/form-data">
<table cellspacing="7" cellpadding="0" width="60%" border="0" align="center"> <table cellspacing="7" cellpadding="0" width="60%" border="0" align="center">
<tbody> <tbody>
<tr> <tr>

View file

@ -316,6 +316,18 @@
</select> </select>
</td> </td>
</tr> </tr>
<tr>
<td width="120" valign="top">
<span class="nobold">{_privacy_setting_write_messages}</span>
</td>
<td>
<select name="messages.write", style="width: 164px;">
<option value="2" {if $user->getPrivacySetting('messages.write') == 2}selected{/if}>{_privacy_value_anybody}</option>
<option value="1" {if $user->getPrivacySetting('messages.write') == 1}selected{/if}>{_privacy_value_friends}</option>
<option value="0" {if $user->getPrivacySetting('messages.write') == 0}selected{/if}>{_privacy_value_nobody}</option>
</select>
</td>
</tr>
<tr> <tr>
<td> <td>
@ -540,6 +552,16 @@
<td> <td>
<span class="nobold">{_additional_links}</span> <span class="nobold">{_additional_links}</span>
</td> </td>
</tr><tr n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable']">
<td width="120" valign="top" align="right" align="right">
<input
n:attr="checked => $user->getLeftMenuItemStatus('poster')"
type="checkbox"
name="menu_standardo" />
</td>
<td>
<span class="nobold">{_ad_poster}</span>
</td>
</tr> </tr>
<tr> <tr>
<td> <td>

View file

@ -9,7 +9,7 @@
{_"two_factor_authentication_settings_1"|noescape} {_"two_factor_authentication_settings_1"|noescape}
<p>{_"two_factor_authentication_settings_2"}</p> <p>{_"two_factor_authentication_settings_2"}</p>
<div style="text-align: center;"> <div style="text-align: center;">
<img src="data:image/png;base64,{$qrCode}"> <img width="225" height="225" src="data:{$qrCodeType};base64,{$qrCodeData}">
</div> </div>
<p>{tr("two_factor_authentication_settings_3", $secret)|noescape}</p> <p>{tr("two_factor_authentication_settings_3", $secret)|noescape}</p>
<p>{_"two_factor_authentication_settings_4"}</p> <p>{_"two_factor_authentication_settings_4"}</p>

View file

@ -92,6 +92,7 @@
{/if} {/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>
{var subStatus = $user->getSubscriptionStatus($thisUser)} {var subStatus = $user->getSubscriptionStatus($thisUser)}
{if $subStatus === 0} {if $subStatus === 0}
@ -116,7 +117,6 @@
<input type="submit" class="profile_link" value="{_"friends_reject"}" /> <input type="submit" class="profile_link" value="{_"friends_reject"}" />
</form> </form>
{elseif $subStatus === 3} {elseif $subStatus === 3}
<a href="/im?sel={$user->getId()}" class="profile_link">{_"send_message"}</a>
<form action="/setSub/user" method="post" class="profile_link_form"> <form action="/setSub/user" method="post" class="profile_link_form">
<input type="hidden" name="act" value="rem" /> <input type="hidden" name="act" value="rem" />
<input type="hidden" name="id" value="{$user->getId()}" /> <input type="hidden" name="id" value="{$user->getId()}" />
@ -313,7 +313,7 @@
<div class="right_big_block"> <div class="right_big_block">
<div class="page_info"> <div class="page_info">
<div n:if="!is_null($alert = $user->getAlert())" class="user-alert">{$alert}</div> <div n:if="!is_null($alert = $user->getAlert())" class="user-alert">{strpos($alert, "@") === 0 ? tr(substr($alert, 1)) : $alert}</div>
{var thatIsThisUser = isset($thisUser) && $user->getId() == $thisUser->getId()} {var thatIsThisUser = isset($thisUser) && $user->getId() == $thisUser->getId()}
<div n:if="$thatIsThisUser" class="page_status_popup" id="status_editor" style="display: none;"> <div n:if="$thatIsThisUser" class="page_status_popup" id="status_editor" style="display: none;">
<form name="status_popup_form" onsubmit="changeStatus(); return false;"> <form name="status_popup_form" onsubmit="changeStatus(); return false;">
@ -507,7 +507,7 @@
(function() { (function() {
res = document.querySelector("#uBanMsgInput").value; res = document.querySelector("#uBanMsgInput").value;
xhr = new XMLHttpRequest(); xhr = new XMLHttpRequest();
xhr.open("GET", "/admin/ban.pl/" + {$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("reason") === -1)
MessageBox("Ошибка", "Не удалось забанить пользователя...", ["OK"], [Function.noop]); MessageBox("Ошибка", "Не удалось забанить пользователя...", ["OK"], [Function.noop]);
@ -529,7 +529,7 @@
(function() { (function() {
res = document.querySelector("#uWarnMsgInput").value; res = document.querySelector("#uWarnMsgInput").value;
xhr = new XMLHttpRequest(); xhr = new XMLHttpRequest();
xhr.open("GET", "/admin/warn.pl/" + {$user->getId()} + "?message=" + res + "&hash=" + {rawurlencode($csrfToken)}, true); xhr.open("GET", "/admin/warn/" + {$user->getId()} + "?message=" + res + "&hash=" + {rawurlencode($csrfToken)}, true);
xhr.onload = (function() { xhr.onload = (function() {
if(xhr.responseText.indexOf("message") === -1) if(xhr.responseText.indexOf("message") === -1)
MessageBox("Ошибка", "Не удалось отправить предупреждение...", ["OK"], [Function.noop]); MessageBox("Ошибка", "Не удалось отправить предупреждение...", ["OK"], [Function.noop]);

View file

@ -16,7 +16,8 @@
<div class="post-author"> <div class="post-author">
<a href="{$author->getURL()}"><b> <a href="{$author->getURL()}"><b>
{$author->getCanonicalName()} {$author->getCanonicalName()}
</b></a><br/> </b></a>
{if $author->isVerified()}<img class="name-checkmark" src="/assets/packages/static/openvk/img/checkmark.png">{/if}<br/>
</div> </div>
<div class="post-content" id="{$comment->getId()}"> <div class="post-content" id="{$comment->getId()}">
<div class="text" id="text{$comment->getId()}"> <div class="text" id="text{$comment->getId()}">

View file

@ -1,7 +1,7 @@
<h4 n:if="$showTitle ?? true">{_"comments"} ({$count})</h4> <h4 n:if="$showTitle ?? true">{_"comments"} ({$count})</h4>
<div n:ifset="$thisUser"> <div n:ifset="$thisUser">
{var commentsURL = "/al_comments.pl/create/$model/" . $parent->getId()} {var commentsURL = "/al_comments/create/$model/" . $parent->getId()}
{var club = $parent instanceof \openvk\Web\Models\Entities\Post && $parent->getTargetWall() < 0 ? (new openvk\Web\Models\Repositories\Clubs)->get(abs($parent->getTargetWall())) : $club} {var club = $parent instanceof \openvk\Web\Models\Entities\Post && $parent->getTargetWall() < 0 ? (new openvk\Web\Models\Repositories\Clubs)->get(abs($parent->getTargetWall())) : $club}
{if !$readOnly} {if !$readOnly}
{include "textArea.xml", route => $commentsURL, postOpts => false, graffiti => (bool) ovkGetQuirk("comments.allow-graffiti"), club => $club} {include "textArea.xml", route => $commentsURL, postOpts => false, graffiti => (bool) ovkGetQuirk("comments.allow-graffiti"), club => $club}

View file

@ -1,7 +1,7 @@
{var $space = 2} {var $space = 2}
{var $pageCount = ceil($conf->count / $conf->perPage)} {var $pageCount = ceil($conf->count / $conf->perPage)}
<div n:if="!($conf->page === 1 && $conf->count <= $conf->perPage)" n:class="paginator, $conf->atBottom ? paginator-at-bottom"> <div n:if="!($conf->page === 1 && $conf->count <= $conf->perPage)" n:class="paginator, ($conf->atBottom ?? false) ? paginator-at-bottom">
{if $conf->page > $space} {if $conf->page > $space}
<a n:attr="class => ($conf->page === 1 ? 'active')" href="?{http_build_query(array_merge($_GET, ['p' => 1]), 'k', '&', PHP_QUERY_RFC3986)}">«</a> <a n:attr="class => ($conf->page === 1 ? 'active')" href="?{http_build_query(array_merge($_GET, ['p' => 1]), 'k', '&', PHP_QUERY_RFC3986)}">«</a>
{/if} {/if}

View file

@ -128,7 +128,7 @@
{include "../comment.xml", comment => $comment, $compact => true} {include "../comment.xml", comment => $comment, $compact => true}
{/foreach} {/foreach}
<div n:ifset="$thisUser" id="commentTextArea{$commentTextAreaId}" n:attr="style => ($commentsCount == 0 ? 'display: none;')" class="commentsTextFieldWrap"> <div n:ifset="$thisUser" id="commentTextArea{$commentTextAreaId}" n:attr="style => ($commentsCount == 0 ? 'display: none;')" class="commentsTextFieldWrap">
{var commentsURL = "/al_comments.pl/create/posts/" . $post->getId()} {var commentsURL = "/al_comments/create/posts/" . $post->getId()}
{include "../textArea.xml", route => $commentsURL, postOpts => false, graffiti => (bool) ovkGetQuirk("comments.allow-graffiti"), post => $post} {include "../textArea.xml", route => $commentsURL, postOpts => false, graffiti => (bool) ovkGetQuirk("comments.allow-graffiti"), post => $post}
</div> </div>
</div> </div>

View file

@ -7,7 +7,7 @@
<img <img
src="{$author->getAvatarURL()}" src="{$author->getAvatarURL()}"
width="50" /> width="50" />
{if !$post->isPostedOnBehalfOfGroup() && !$compact} {if !$post->isPostedOnBehalfOfGroup() && !($compact ?? false)}
<span n:if="$author->isOnline()" class="post-online"> <span n:if="$author->isOnline()" class="post-online">
{_online} {_online}
</span> </span>

View file

@ -1,4 +1,5 @@
{var textAreaId = $post === null ? rand(1,300) : $post->getId()} {php if(!isset($GLOBALS["textAreaCtr"])) $GLOBALS["textAreaCtr"] = 10;}
{var textAreaId = ($post ?? NULL) === null ? (++$GLOBALS["textAreaCtr"]) : $post->getId()}
<div id="write" style="padding: 5px 0;" onfocusin="expand_wall_textarea({$textAreaId});"> <div id="write" style="padding: 5px 0;" onfocusin="expand_wall_textarea({$textAreaId});">
<form action="{$route}" method="post" enctype="multipart/form-data" style="margin:0;"> <form action="{$route}" method="post" enctype="multipart/form-data" style="margin:0;">

View file

@ -19,10 +19,12 @@ routes:
handler: "Support->view" handler: "Support->view"
- url: "/support/comment/{num}/rate/{num}" - url: "/support/comment/{num}/rate/{num}"
handler: "Support->rateAnswer" handler: "Support->rateAnswer"
- url: "/al_comments.pl/create/support/{num}" - url: "/al_comments/create/support/{num}"
handler: "Support->makeComment" handler: "Support->makeComment"
- url: "/al_comments.pl/create/support/reply/{num}" - url: "/al_comments/create/support/reply/{num}"
handler: "Support->AnswerTicketReply" handler: "Support->AnswerTicketReply"
- url: "/al_comments/create/{text}/{num}"
handler: "Comment->makeComment"
- url: "/support/delete/{num}" - url: "/support/delete/{num}"
handler: "Support->delete" handler: "Support->delete"
- url: "/language" - url: "/language"
@ -37,6 +39,8 @@ routes:
handler: "About->version" handler: "About->version"
placeholders: placeholders:
productName: "openvk[2]?|libresoc" productName: "openvk[2]?|libresoc"
- url: "/about"
handler: "About->aboutInstance"
- url: "/privacy" - url: "/privacy"
handler: "About->Privacy" handler: "About->Privacy"
- url: "/badbrowser.php" - url: "/badbrowser.php"
@ -47,9 +51,9 @@ routes:
handler: "Auth->register" handler: "Auth->register"
- url: "/logout" - url: "/logout"
handler: "Auth->logout" handler: "Auth->logout"
- url: "/restore.pl" - url: "/restore"
handler: "Auth->restore" handler: "Auth->restore"
- url: "/restore.pl/internal-finish" - url: "/restore/internal-finish"
handler: "Auth->finishRestoringPassword" handler: "Auth->finishRestoringPassword"
- url: "/setSID/{slug}" - url: "/setSID/{slug}"
handler: "Auth->su" handler: "Auth->su"
@ -67,7 +71,7 @@ routes:
handler: "User->friends" handler: "User->friends"
- url: "/edit" - url: "/edit"
handler: "User->edit" handler: "User->edit"
- url: "/edit/verify_phone.pl" - url: "/edit/verify_phone"
handler: "User->verifyPhone" handler: "User->verifyPhone"
- url: "/setSub/user" - url: "/setSub/user"
handler: "User->sub" handler: "User->sub"
@ -75,8 +79,6 @@ routes:
handler: "Group->sub" handler: "Group->sub"
- url: "/setSub/v4/club" - url: "/setSub/v4/club"
handler: "Group->attend" handler: "Group->attend"
- url: "/al_comments.pl/create/{text}/{num}"
handler: "Comment->makeComment"
- url: "/groups/{num}/setNewOwner/{num}" - url: "/groups/{num}/setNewOwner/{num}"
handler: "Group->changeOwner" handler: "Group->changeOwner"
- url: "/comment{num}/like" - url: "/comment{num}/like"
@ -123,9 +125,9 @@ routes:
handler: "Photos->album" handler: "Photos->album"
- url: "/album{num}_{num}/edit" - url: "/album{num}_{num}/edit"
handler: "Photos->editAlbum" handler: "Photos->editAlbum"
- url: "/album{num}_{num}/delete.pl" - url: "/album{num}_{num}/delete"
handler: "Photos->deleteAlbum" handler: "Photos->deleteAlbum"
- url: "/album{num}_{num}/remove_photo.pl/{num}" - url: "/album{num}_{num}/remove_photo/{num}"
handler: "Photos->unlinkPhoto" handler: "Photos->unlinkPhoto"
- url: "/photos/upload" - url: "/photos/upload"
handler: "Photos->uploadPhoto" handler: "Photos->uploadPhoto"
@ -137,7 +139,7 @@ routes:
handler: "Photos->editPhoto" handler: "Photos->editPhoto"
- url: "/photo{num}_{num}/delete" - url: "/photo{num}_{num}/delete"
handler: "Photos->deletePhoto" handler: "Photos->deletePhoto"
- url: "/al_avatars.pl" - url: "/al_avatars"
handler: "User->setAvatar" handler: "User->setAvatar"
- url: "/videos{num}" - url: "/videos{num}"
handler: "Videos->list" handler: "Videos->list"
@ -161,7 +163,7 @@ routes:
handler: "Group->followers" handler: "Group->followers"
- url: "/club{num}/followers/{num}" - url: "/club{num}/followers/{num}"
handler: "Group->admin" handler: "Group->admin"
- url: "/club{num}/setAdmin.jsp" - url: "/club{num}/setAdmin"
handler: "Group->modifyAdmin" handler: "Group->modifyAdmin"
- url: "/groups{num}" - url: "/groups{num}"
handler: "User->groups" handler: "User->groups"
@ -253,9 +255,9 @@ routes:
handler: "Admin->giftCategory" handler: "Admin->giftCategory"
- url: "/admin/gifts/{slug}.{num}/" - url: "/admin/gifts/{slug}.{num}/"
handler: "Admin->gifts" handler: "Admin->gifts"
- url: "/admin/ban.pl/{num}" - url: "/admin/ban/{num}"
handler: "Admin->quickBan" handler: "Admin->quickBan"
- url: "/admin/warn.pl/{num}" - url: "/admin/warn/{num}"
handler: "Admin->quickWarn" handler: "Admin->quickWarn"
- url: "/admin/reports" - url: "/admin/reports"
handler: "Report->list" handler: "Report->list"
@ -269,10 +271,14 @@ routes:
handler: "VKAPI->route" handler: "VKAPI->route"
- url: "/token" - url: "/token"
handler: "VKAPI->tokenLogin" handler: "VKAPI->tokenLogin"
- url: "/sandbox_cocksex" - url: "/admin/sandbox"
handler: "About->sandbox" handler: "About->sandbox"
- url: "/internal/wall{num}" - url: "/internal/wall{num}"
handler: "Wall->wallEmbedded" handler: "Wall->wallEmbedded"
- url: "/robots.txt"
handler: "About->robotsTxt"
- url: "/humans.txt"
handler: "About->humansTxt"
- url: "/{?shortCode}" - url: "/{?shortCode}"
handler: "UnknownTextRouteStrategy->delegate" handler: "UnknownTextRouteStrategy->delegate"
placeholders: placeholders:

View file

@ -889,7 +889,6 @@ table.User {
display: flex; display: flex;
padding: 8px; padding: 8px;
cursor: pointer; cursor: pointer;
width: 611px;
margin-left: 1px; margin-left: 1px;
border-bottom: 1px solid #d6d6d6; border-bottom: 1px solid #d6d6d6;
} }
@ -923,10 +922,9 @@ table.User {
} }
.crp-entry--message.unread { .crp-entry--message.unread {
background-color: #dcdcdc; background-color: #ededed;
padding: 5px; padding: 5px;
width: 346px; width: 346px;
border-radius: 3px;
} }
.messenger-app--messages---message.unread { .messenger-app--messages---message.unread {
@ -945,8 +943,6 @@ table.User {
} }
.messenger-app--messages---message.unread:last-of-type { .messenger-app--messages---message.unread:last-of-type {
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
padding-bottom: 5px; padding-bottom: 5px;
margin-bottom: 1.2rem; margin-bottom: 1.2rem;
} }

View file

@ -35,6 +35,8 @@ function handleUpload(id) {
u("span", indicator.nodes[0]).text(trim(file.name) + " (" + humanFileSize(file.size, false) + ")"); u("span", indicator.nodes[0]).text(trim(file.name) + " (" + humanFileSize(file.size, false) + ")");
indicator.attr("style", "display: block;"); indicator.attr("style", "display: block;");
} }
document.querySelector("#post-buttons" + id + " #wallAttachmentMenu").classList.add("hidden");
} }
function initGraffiti(id) { function initGraffiti(id) {

View file

@ -185,7 +185,7 @@ function repostPost(id, hash) {
function setClubAdminComment(clubId, adminId, hash) { function setClubAdminComment(clubId, adminId, hash) {
MessageBox("Изменить комментарий к администратору", ` MessageBox("Изменить комментарий к администратору", `
<form action="/club${clubId}/setAdmin.jsp" method="post" id="uClubAdminCommentForm_${clubId}_${adminId}"> <form action="/club${clubId}/setAdmin" method="post" id="uClubAdminCommentForm_${clubId}_${adminId}">
<input type="hidden" name="user" value="${adminId}"> <input type="hidden" name="user" value="${adminId}">
<input type="hidden" name="hash" value="${hash}"> <input type="hidden" name="hash" value="${hash}">
<input type="hidden" name="removeComment" id="uClubAdminCommentRemoveCommentInput_${clubId}_${adminId}" value="0"> <input type="hidden" name="removeComment" id="uClubAdminCommentRemoveCommentInput_${clubId}_${adminId}" value="0">

View file

@ -0,0 +1 @@
ALTER TABLE `groups` ADD COLUMN `hide_from_global_feed` boolean DEFAULT 0 NOT NULL AFTER `display_topics_above_wall`;

View file

@ -18,7 +18,7 @@
"forgot_password" = "Մոռացե՞լ եք գաղտնաբառը"; "forgot_password" = "Մոռացե՞լ եք գաղտնաբառը";
"login_failed" = "Չհաջողվեց մուտք գործել"; "login_failed" = "Չհաջողվեց մուտք գործել";
"invalid_username_or_password" = "Սխալ օգտատիրոջ անուն կամ գաղտնաբառ։ Դուք կարող եք <a href='/restore.pl'>վերականգնել ձեր գաղտնաբառը</a>։"; "invalid_username_or_password" = "Սխալ օգտատիրոջ անուն կամ գաղտնաբառ։ Դուք կարող եք <a href='/restore'>վերականգնել ձեր գաղտնաբառը</a>։";
"failed_to_register" = "Չհաջողվեց գրանցվել"; "failed_to_register" = "Չհաջողվեց գրանցվել";
"referral_link_invalid" = "Հրավերքային հղումը սխալ է։"; "referral_link_invalid" = "Հրավերքային հղումը սխալ է։";
@ -45,6 +45,8 @@
"register_referer_meta_title" = "$1 -ն հրավիրում է ձեզ դեպի $2"; "register_referer_meta_title" = "$1 -ն հրավիրում է ձեզ դեպի $2";
"register_referer_meta_desc" = "Միացե՛ք $1 -ին և բազմաթիվ օգտատերերին $2 -ու՛մ"; "register_referer_meta_desc" = "Միացե՛ք $1 -ին և բազմաթիվ օգտատերերին $2 -ու՛մ";
"users" = "Օգտատերեր";
/* Profile information */ /* Profile information */
"select_language" = "Ընտրել լեզուն"; "select_language" = "Ընտրել լեզուն";
@ -130,6 +132,9 @@
"updated_at" = "Թարմացված է $1"; "updated_at" = "Թարմացված է $1";
"user_banned" = "Ցավո՛ք, մենք ստիպված <b>$1</b>-ի էջը կասեցրել ենք։";
"user_banned_comment" = "Մոդերատորի մեկնաբանությունը․ ";
/* Wall */ /* Wall */
"post_writes_m" = "գրել է"; "post_writes_m" = "գրել է";
@ -173,6 +178,8 @@
"open_post" = "Բացել գրությունը"; "open_post" = "Բացել գրությունը";
"version_incompatibility" = "Չհաջողվեց ցույց տալ հավելվածը։ Հնարավոր է, բազաների տվյալները հասանելի չեն OpenVKի այս տարբերակի հետ։"; "version_incompatibility" = "Չհաջողվեց ցույց տալ հավելվածը։ Հնարավոր է, բազաների տվյալները հասանելի չեն OpenVKի այս տարբերակի հետ։";
"reply" = "Պատասխանել";
/* Friends */ /* Friends */
"friends" = "Ընկերներ"; "friends" = "Ընկերներ";
@ -250,6 +257,10 @@
"group_display_all_administrators" = "Ցուցադրել բոլոր ադմինիստրատորներին"; "group_display_all_administrators" = "Ցուցադրել բոլոր ադմինիստրատորներին";
"group_dont_display_administrators_list" = "Ոչ մեկին ցույց չտալ"; "group_dont_display_administrators_list" = "Ոչ մեկին ցույց չտալ";
"group_changeowner_modal_title" = "Օգտատերի իրավասությունների փոխանցում";
"group_changeowner_modal_text" = "<b>Ուշադրությու՛ն։</b> Դուք փոխանցում եք խմբի բոլոր իրավունքները $1-ին։ Այս գործողությունը անդառնալի է։ Դուք էլի կմնաք ադմինիստրատոր, բայց հեշտությամբ դա ձեզնից կարող են խլել։";
"group_owner_setted" = "Նոր տերը ($1) նշանակված է $2 միությունում։ Ձեզ տրված են ադմինիստրատորի իրավասություններ։ Եթե ուզում եք հետ բերել իրավասությունները, <a href='/support?act=new'>գրե՛ք կայքի տեխնիկական աջակցությանը</a>։";
"participants_zero" = "Ոչ մի մասնակից"; "participants_zero" = "Ոչ մի մասնակից";
"participants_one" = "Միայն մեկ մասնակից"; "participants_one" = "Միայն մեկ մասնակից";
"participants_few" = "$1 մասնակից"; "participants_few" = "$1 մասնակից";
@ -338,6 +349,8 @@
"header_login" = "Մուտք"; "header_login" = "Մուտք";
"header_registration" = "Գրանցում"; "header_registration" = "Գրանցում";
"left_menu_donate" = "Աջակցել";
"footer_blog" = "բլոգ"; "footer_blog" = "բլոգ";
"footer_help" = "օգնություն"; "footer_help" = "օգնություն";
"footer_developers" = "մշակողներին"; "footer_developers" = "մշակողներին";
@ -544,6 +557,33 @@
"usages_total" = "Օգտագործումների քանակ"; "usages_total" = "Օգտագործումների քանակ";
"usages_left" = "Մնացին օգտագործումներ"; "usages_left" = "Մնացին օգտագործումներ";
"points_transfer_dialog_header_1" = "Դուք կարող եք ուղարկել ձայները և նվերների մի մասը այլ մարդուն։";
"points_transfer_dialog_header_2" = "Ձեր ներկայիս բալանսը․ ";
"points_amount_one" = "Մեկ ձայն";
"points_amount_few" = "$1 ձայն";
"points_amount_many" = "$1 ձայն";
"points_amount_other" = "$1 ձայն";
"transfer_poins" = "Ձայների փոխանցում";
"transfer_poins_button" = "Փոխանցել ձայներ";
"also_you_can_transfer_points" = "Նաև դուք կարող եք <a href=\"javascript:showCoinsTransferDialog($1, '$2')\">փոխանցել ձայներ</a> այլ մարդուն։";
"transferred_to_you" = "ձեզ փոխանցեց";
"receiver_address" = "Ստացողի հասցե";
"coins_count" = "Ձայների քանակ";
"message" = "Նամակ";
"failed_to_tranfer_points" = "Չհաջողվեց ձայներ փոխանցել";
"points_transfer_successful" = "Դուք հաջողությամբ <b>$1</b>-ին փոխանցեցիք <b><a href=\"$2\">$3</a></b>.";
"not_all_information_has_been_entered" = "Ոչ բոլոր ինֆորմացիան է ներմուծված";
"negative_transfer_value" = "Կներեք, լավ տղություն չի ուրիշից ձայներ գողանալը։";
"message_is_too_long" = "Նամակը շատ երկար է։";
"receiver_not_found" = "Ստացողը չի գտնվել։";
"you_dont_have_enough_points" = "Դուք չունե՛ք բավական ձայն։";
/* Gifts */ /* Gifts */
"gift" = "Նվեր"; "gift" = "Նվեր";
@ -609,6 +649,61 @@
"you_can_invite" = "Դուք կարող եք հրավիրել ձեր ընկերներին կամ բարեկամներին հատուկ հղման միջոցով․"; "you_can_invite" = "Դուք կարող եք հրավիրել ձեր ընկերներին կամ բարեկամներին հատուկ հղման միջոցով․";
"you_can_invite_2" = "Ամրացրե՛ք այս հղումը ձեր նամակի մեջ։ Գրանցումից հետո օգտատերը անմիջապես կհայտնվի ձեր ընկերների ցուցակում։"; "you_can_invite_2" = "Ամրացրե՛ք այս հղումը ձեր նամակի մեջ։ Գրանցումից հետո օգտատերը անմիջապես կհայտնվի ձեր ընկերների ցուցակում։";
/* Banned */
"banned_title" = "Բլոկավորված եք";
"banned_header" = "Ձեզ կասեցրել է կառլենի անհաջող բոցը։";
"banned_alt" = "Օգտատերը բլոկավորված է";
"banned_1" = "Կներե՛ք, <b>$1</b>, բայց Դուք կասեցված եք։";
"banned_2" = "Պատճառը հետևյալն է․ <b>$1</b>. Ափսոս, բայց մենք ստիպված Ձեզ հավերժ ենք կասեցրել;";
"banned_3" = "Դուք դեռ կարող եք <a href=\"/support?act=new\">գրել նամակ աջակցության ծառայությանը</a>, եթե համարում եք որ դա սխալմունք է, կամ էլ կարող եք <a href=\"/logout?hash=$1\">դուրս գալ</a>։";
/* Discussions */
"discussions" = "Քննարկումներ";
"messages_one" = "Մեկ նամակ";
"messages_few" = "$1 նամակ";
"messages_many" = "$1 նամակ";
"messages_other" = "$1 նամակ";
"topic_messages_count_zero" = "Թեմայում նամակ չկա";
"topic_messages_count_one" = "Թեմայում մեկ նամակ է";
"topic_messages_count_few" = "Թեմայում $1 նամակ կա";
"topic_messages_count_many" = "Թեմայում $1 նամակ կա";
"topic_messages_count_other" = "Թեմայում $1 նամակ կա";
"replied" = "պատասխանել է";
"create_topic" = "Ստեղծել թեմա";
"new_topic" = "Նոր թեմա";
"title" = "Անվանում";
"text" = "Տեքստ";
"view_topic" = "Թեմայի դիտարկում";
"edit_topic_action" = "Խմբագրել թեման";
"edit_topic" = "Թեմայի խմբագրում";
"topic_settings" = "Թեմայի կարգավորումներ";
"pin_topic" = "Ամրացնել թեման";
"close_topic" = "Փակել թեման";
"delete_topic" = "Ջնջել թեման";
"topics_one" = "Մեկ թեմա";
"topics_few" = "$1 թեմա";
"topics_many" = "$1 թեմա";
"topics_other" = "$1 թեմա";
"created" = "Ստեղծված է";
"everyone_can_create_topics" = "Բոլորը կարող են թեմաներ սարքել";
"display_list_of_topics_above_wall" = "Ցուցադրել պատի տակ թեմաների ցուցակը";
"topic_changes_saved_comment" = "Թարմացված անվանումն ու կարգավորումները կհայտնվեն թեմայի էջում։";
"failed_to_create_topic" = "Չհաջողվեց թեմա ստեղծել";
"failed_to_change_topic" = "Չհաջողվեց խմբագրել թեման";
"no_title_specified" = "Անվանումը նշված չէ";
/* Errors */ /* Errors */
"error_1" = "Սխալ հարցում"; "error_1" = "Սխալ հարցում";
@ -628,6 +723,7 @@
"error_old_password" = "Հին գաղտնաբառը չի համընկնում"; "error_old_password" = "Հին գաղտնաբառը չի համընկնում";
"error_new_password" = "Նոր գաղտնաբառերը չեն համընկնում"; "error_new_password" = "Նոր գաղտնաբառերը չեն համընկնում";
"error_shorturl_incorrect" = "Կարճ հասցեն ունի սխալ ֆորմատ"; "error_shorturl_incorrect" = "Կարճ հասցեն ունի սխալ ֆորմատ";
"error_repost_fail" = "Չհաջողվեց կիսվել գրության հետ";
"forbidden" = "Հասանելիության սխալ"; "forbidden" = "Հասանելիության սխալ";
"forbidden_comment" = "Այս օգտատիրոջ գաղտնիության կարգավորումները ձեզ թույլ չեն տալիս դիտել օգտատերի էջը։"; "forbidden_comment" = "Այս օգտատիրոջ գաղտնիության կարգավորումները ձեզ թույլ չեն տալիս դիտել օգտատերի էջը։";
@ -659,9 +755,23 @@
"suspicious_registration_attempt" = "Գրանցման կասկածելի փորձ"; "suspicious_registration_attempt" = "Գրանցման կասկածելի փորձ";
"suspicious_registration_attempt_comment" = "Դուք մի տեսակ փորձել եք սխալ տեղից գրանցվել։"; "suspicious_registration_attempt_comment" = "Դուք մի տեսակ փորձել եք սխալ տեղից գրանցվել։";
"rate_limit_error" = "Արա Կառլեն, կարող ա՞ խառնել ես։";
"rate_limit_error_comment" = "Ա՛յ $1, չի՛ կարելի այսքան հաճախ սպամ հրապարակել։ Հո դու Կառլենը չե՞ս։ Բացառության կոդ․ $2։";
"not_enough_permissions" = "Այդքան իրավասություն չկա";
"not_enough_permissions_comment" = "Դուք բավական իրավասություն չունեք այս գործողությունը կատարելու համար։";
"login_required_error" = "Պահանջվում է մուտք գործել";
"login_required_error_comment" = "Այս էջը դիտելու համար պետք է մուտք գործել դեպի կայք։";
"captcha_error" = "Սխալ են գրված սիմվոլները";
"captcha_error_comment" = "Խնդրում ենք համոզվել, որ ճիշտ եք ներմուծել կապտչայի սիմվոլները։";
/* Admin actions */ /* Admin actions */
"login_as" = "Մտնել ինչպես $1"; "login_as" = "Մտնել ինչպես $1";
"manage_user_action" = "Օգտատերի կառավարում";
"manage_group_action" = "Խմբի կառավարում";
"ban_user_action" = "Բլոկավորել օգտվողին"; "ban_user_action" = "Բլոկավորել օգտվողին";
"warn_user_action" = "Զգուշացնել օգտվողին"; "warn_user_action" = "Զգուշացնել օգտվողին";
@ -671,6 +781,10 @@
"paginator_page" = "$1 էջ"; "paginator_page" = "$1 էջ";
"paginator_next" = "Առաջ"; "paginator_next" = "Առաջ";
/* About */
"about_openvk" = "OpenVK-ի մասին";
/* Dialogs */ /* Dialogs */
"ok" = "ОК"; "ok" = "ОК";
@ -678,6 +792,12 @@
"no" = "Ոչ"; "no" = "Ոչ";
"cancel" = "Չեղարկել"; "cancel" = "Չեղարկել";
"edit_action" = "Փոփոխել"; "edit_action" = "Փոփոխել";
"transfer" = "Փոխանցել";
"close" = "Փակել";
"warning" = "Ուշադրություն"; "warning" = "Ուշադրություն";
"question_confirm" = "Այս գործողությունը էլ երբեք հետ չի բերվի։ Դուք վստա՞հ եք որ ուզում եք շարունակել։"; "question_confirm" = "Այս գործողությունը էլ երբեք հետ չի բերվի։ Դուք վստա՞հ եք որ ուզում եք շարունակել։";
/* User alerts */
"user_alert_scam" = "Այս հաշվի վրա բազմաթիվ բողոքներ են եկել խարդախության հետ կապված։ Խնդրվում է զգույշ լինել, հատկապես եթե Ձեզնից փորձեն գումար խնդրել և շորթել։";

View file

@ -15,7 +15,7 @@
"forgot_password" = "Forgot your password?"; "forgot_password" = "Forgot your password?";
"login_failed" = "Login failed"; "login_failed" = "Login failed";
"invalid_username_or_password" = "The username or password you entered is incorrect. <a href='/restore.pl'>Forgot your password?</a>"; "invalid_username_or_password" = "The username or password you entered is incorrect. <a href='/restore'>Forgot your password?</a>";
"failed_to_register" = "Failed to register"; "failed_to_register" = "Failed to register";
"referral_link_invalid" = "The referral link is invalid."; "referral_link_invalid" = "The referral link is invalid.";
@ -245,6 +245,7 @@
"hidden_yes" = "Hidden: Yes"; "hidden_yes" = "Hidden: Yes";
"hidden_no" = "Hidden: No"; "hidden_no" = "Hidden: No";
"group_allow_post_for_everyone" = "Allow posting for everyone"; "group_allow_post_for_everyone" = "Allow posting for everyone";
"group_hide_from_global_feed" = "Don't display posts in the global feed";
"statistics" = "Statistics"; "statistics" = "Statistics";
"group_administrators_list" = "Admins list"; "group_administrators_list" = "Admins list";
"group_display_only_creator" = "Display only group creator"; "group_display_only_creator" = "Display only group creator";
@ -337,6 +338,7 @@
"left_menu_donate" = "Donate"; "left_menu_donate" = "Donate";
"footer_about_instance" = "about instance";
"footer_blog" = "blog"; "footer_blog" = "blog";
"footer_help" = "help"; "footer_help" = "help";
"footer_developers" = "developers"; "footer_developers" = "developers";
@ -384,6 +386,7 @@
"privacy_setting_see_friends" = "Who can see my friends"; "privacy_setting_see_friends" = "Who can see my friends";
"privacy_setting_add_to_friends" = "Who can add me to friends"; "privacy_setting_add_to_friends" = "Who can add me to friends";
"privacy_setting_write_wall" = "Who can publish post on my wall"; "privacy_setting_write_wall" = "Who can publish post on my wall";
"privacy_setting_write_messages" = "Who can write messages to me";
"privacy_value_anybody" = "Anybody"; "privacy_value_anybody" = "Anybody";
"privacy_value_anybody_dative" = "Anybody"; "privacy_value_anybody_dative" = "Anybody";
"privacy_value_users" = "OpenVK users"; "privacy_value_users" = "OpenVK users";
@ -409,6 +412,7 @@
"ui_settings_rating_hide" = "Hide"; "ui_settings_rating_hide" = "Hide";
"additional_links" = "Additional links"; "additional_links" = "Additional links";
"ad_poster" = "Ad poster";
/* Two-factor authentication */ /* Two-factor authentication */
@ -625,8 +629,8 @@
"you_have_not_entered_text" = "You have not entered any text"; "you_have_not_entered_text" = "You have not entered any text";
"you_have_not_entered_name_or_text" = "You did not enter a name or text"; "you_have_not_entered_name_or_text" = "You did not enter a name or text";
"support_ticket_changed" = "Ticket changed"; "ticket_changed" = "Ticket changed";
"support_ticket_changed_comment" = "The changes will take effect in a few seconds."; "ticket_changed_comment" = "The changes will take effect in a few seconds.";
/* Invite */ /* Invite */
@ -764,6 +768,26 @@
"about_openvk" = "About OpenVK"; "about_openvk" = "About OpenVK";
"about_this_instance" = "About this instance";
"rules" = "Rules";
"most_popular_groups" = "Most popular groups";
"on_this_instance_are" = "On this instance are:";
"about_users_one" = "<b>1</b> user";
"about_users_other" = "<b>$1</b> users";
"about_online_users_one" = "<b>1</b> online user";
"about_online_users_other" = "<b>$1</b> online users";
"about_active_users_one" = "<b>1</b> active user";
"about_active_users_other" = "<b>$1</b> active users";
"about_groups_one" = "<b>1</b> group";
"about_groups_other" = "<b>$1</b> groups";
"about_wall_posts_one" = "<b>1</b> wall post";
"about_wall_posts_other" = "<b>$1</b> wall posts";
/* Dialogs */ /* Dialogs */
"ok" = "OK"; "ok" = "OK";
@ -777,3 +801,6 @@
"warning" = "Warning"; "warning" = "Warning";
"question_confirm" = "This action can't be undone. Do you really wanna do it?"; "question_confirm" = "This action can't be undone. Do you really wanna do it?";
/* User alerts */
"user_alert_scam" = "This account has been reported a lot for scam. Please be careful, especially if he asked for money.";

View file

@ -17,7 +17,7 @@
"forgot_password" = "Ĉu vi forgesis vian pasvorton?"; "forgot_password" = "Ĉu vi forgesis vian pasvorton?";
"login_failed" = "Ensaluto malsukcesis"; "login_failed" = "Ensaluto malsukcesis";
"invalid_username_or_password" = "La uzantnomo aŭ pasvorto, kiun vi enigis, estas malĝusta. <a href='/restore.pl'>Ĉu vi forgesis vian pasvorton?</a>"; "invalid_username_or_password" = "La uzantnomo aŭ pasvorto, kiun vi enigis, estas malĝusta. <a href='/restore'>Ĉu vi forgesis vian pasvorton?</a>";
"failed_to_register" = "Malsukcesis registri"; "failed_to_register" = "Malsukcesis registri";
"referral_link_invalid" = "La invito ligilo estas malvalida."; "referral_link_invalid" = "La invito ligilo estas malvalida.";

View file

@ -17,7 +17,7 @@
"forgot_password" = "Құпиясөзіңізді ұмыттыңыз ба?"; "forgot_password" = "Құпиясөзіңізді ұмыттыңыз ба?";
"login_failed" = "Жүйеге кіру сәтті аяқталмады"; "login_failed" = "Жүйеге кіру сәтті аяқталмады";
"invalid_username_or_password" = "Қолданушы аты немесе құпиясөз дұрыс емес.<a href='/restore.pl'>Құпиясөзді ұмыттыңыз ба?</a>"; "invalid_username_or_password" = "Қолданушы аты немесе құпиясөз дұрыс емес.<a href='/restore'>Құпиясөзді ұмыттыңыз ба?</a>";
"failed_to_register" = "Жүйеге тіркелу сәтті аяқталмады"; "failed_to_register" = "Жүйеге тіркелу сәтті аяқталмады";
"referral_link_invalid" = "Реферал сілтемесі жарамсыз."; "referral_link_invalid" = "Реферал сілтемесі жарамсыз.";
@ -180,6 +180,8 @@
"open_post" = "Жазбаны ашу"; "open_post" = "Жазбаны ашу";
"version_incompatibility" = "Бұл тіркемені көрсете алмадық. Мәліметтер базасы OpenVK-дің қазіргі нұсқасымен үйлеспелмеуі мүмкін."; "version_incompatibility" = "Бұл тіркемені көрсете алмадық. Мәліметтер базасы OpenVK-дің қазіргі нұсқасымен үйлеспелмеуі мүмкін.";
"reply" = "Жауап беру";
/* Friends */ /* Friends */
"friends" = "Достар"; "friends" = "Достар";
@ -237,6 +239,7 @@
"role" = "Рөлі"; "role" = "Рөлі";
"administrator" = "Әкімші"; "administrator" = "Әкімші";
"promote_to_admin" = "Әкімші қылдыру"; "promote_to_admin" = "Әкімші қылдыру";
"promote_to_owner" = "Топтың иесі қылдыру";
"devote" = "Арнау"; "devote" = "Арнау";
"set_comment" = "Пікірді өңдеу"; "set_comment" = "Пікірді өңдеу";
"hidden_yes" = "Жасырылған: Ия"; "hidden_yes" = "Жасырылған: Ия";
@ -248,6 +251,10 @@
"group_display_all_administrators" = "Барлық әкімшілерді көрсету"; "group_display_all_administrators" = "Барлық әкімшілерді көрсету";
"group_dont_display_administrators_list" = "Ештеңе көрсетпеу"; "group_dont_display_administrators_list" = "Ештеңе көрсетпеу";
"group_changeowner_modal_title" = "Топтың иесі құқықтарың беру";
"group_changeowner_modal_text" = "Назар аударыңыз! Сіз $1 деп аталатын пайдаланушыға топтың иесі құқықтарын берудесіз. Бұл әрекет қайтымсыз. Бергеннен кейін сіз топтың әкімшісі боласыз, бірақ оның жаңа иесі сізді оңай сол рөлден алып тастай алады.";
"group_owner_setted" = "Топтың жаңа иесі ($1) $2 тобына сәтті тағайындалды. Сізге топтың әкімші құқықтары берілді. Қайтіп топтың иесі болғыңыз келсе <a href='/support?act=new'>қолдау көрсету тобына</a> жазыңыз.";
"participants_zero" = "Қатысушылар жоқ"; "participants_zero" = "Қатысушылар жоқ";
"participants_one" = "$1 қатысушы"; "participants_one" = "$1 қатысушы";
"participants_other" = "$1 қатысушы"; "participants_other" = "$1 қатысушы";
@ -318,7 +325,7 @@
"header_home" = "басты бет"; "header_home" = "басты бет";
"header_groups" = "топтар"; "header_groups" = "топтар";
"header_donate" = "садақа беру"; "header_donate" = "қайырымдылық жасау";
"header_people" = "кісілер"; "header_people" = "кісілер";
"header_invite" = "шақыру"; "header_invite" = "шақыру";
"header_help" = "көмек"; "header_help" = "көмек";
@ -328,9 +335,11 @@
"header_login" = "кіру"; "header_login" = "кіру";
"header_registration" = "тіркелу"; "header_registration" = "тіркелу";
"left_menu_donate" = "Қайырымдылық жасау";
"footer_blog" = "блог"; "footer_blog" = "блог";
"footer_help" = "көмек"; "footer_help" = "көмек";
"footer_developers" = "әзірлеушілер"; "footer_developers" = "әзірлеушілерге";
"footer_choose_language" = "тіл таңдау"; "footer_choose_language" = "тіл таңдау";
"footer_privacy" = "құпиялық"; "footer_privacy" = "құпиялық";
@ -361,6 +370,7 @@
"search_for_groups" = "Топтар іздеу"; "search_for_groups" = "Топтар іздеу";
"search_for_people" = "Кісілер іздеу"; "search_for_people" = "Кісілер іздеу";
"search_button" = "Іздеу"; "search_button" = "Іздеу";
"search_placeholder" = "Кез келген атауды, тақырыпты немесе сөзді теруді бастаңыз";
"results_zero" = "Нәтиже жоқ"; "results_zero" = "Нәтиже жоқ";
"results_one" = "$1 нәтиже"; "results_one" = "$1 нәтиже";
"results_other" = "$1 нәтиже"; "results_other" = "$1 нәтиже";
@ -380,6 +390,8 @@
"ui_settings_rating_show" = "Көрсету"; "ui_settings_rating_show" = "Көрсету";
"ui_settings_rating_hide" = "Жасыру"; "ui_settings_rating_hide" = "Жасыру";
"additional_links" = "Қосымша сілтемелер";
"two_factor_authentication" = "Екі факторлы аутентификация"; "two_factor_authentication" = "Екі факторлы аутентификация";
"two_factor_authentication_disabled" = "Бұзылудан сенімді қорғаныс қызметін қамтамасыз етеді: парақшаға кіру үшін 2FA қосымшасында алынған кодты енгізу керек."; "two_factor_authentication_disabled" = "Бұзылудан сенімді қорғаныс қызметін қамтамасыз етеді: парақшаға кіру үшін 2FA қосымшасында алынған кодты енгізу керек.";
"two_factor_authentication_enabled" = "Екі факторлы аутентификация қосулы. Сіздің парақшаңыз қорғалған."; "two_factor_authentication_enabled" = "Екі факторлы аутентификация қосулы. Сіздің парақшаңыз қорғалған.";
@ -482,6 +494,7 @@
"privacy_setting_see_friends" = "Кім менің достарларымды көре алады"; "privacy_setting_see_friends" = "Кім менің достарларымды көре алады";
"privacy_setting_add_to_friends" = "Кім мені достарыма қоса алады"; "privacy_setting_add_to_friends" = "Кім мені достарыма қоса алады";
"privacy_setting_write_wall" = "Кім менің қабырғама жазба жаза алады"; "privacy_setting_write_wall" = "Кім менің қабырғама жазба жаза алады";
"privacy_setting_write_messages" = "Кім маған хабарма жібере алады";
"privacy_value_anybody" = "Әркім"; "privacy_value_anybody" = "Әркім";
"privacy_value_anybody_dative" = "Әркім"; "privacy_value_anybody_dative" = "Әркім";
"privacy_value_users" = "OpenVK қолданушылары"; "privacy_value_users" = "OpenVK қолданушылары";
@ -510,6 +523,31 @@
"usages_total" = "Қолдану саны"; "usages_total" = "Қолдану саны";
"usages_left" = "Қалған қолдану саны"; "usages_left" = "Қалған қолдану саны";
"points_transfer_dialog_header_1" = "Сіз сыйлық ретінде немесе дауыстардың бір бөлігін басқа адамға бере аласыз.";
"points_transfer_dialog_header_2" = "Ағымдағы теңгерім:";
"points_amount_one" = "Бір дауыс";
"points_amount_other" = "$1 дауыс";
"transfer_poins" = "Дауыс аудару";
"transfer_poins_button" = "Дауыс аудары";
"also_you_can_transfer_points" = "Сонымен қатар сіз басқа адамға <a href=\"javascript:showCoinsTransferDialog($1, '$2')\">дауыс аудара аласыз</a>.";
"transferred_to_you" = "сізге аударды";
"receiver_address" = "Қабылдаушы мекенжайы";
"coins_count" = "Дауыстардың саны";
"message" = "Хабар";
"failed_to_tranfer_points" = "Дауыстарды аудара алмадық";
"points_transfer_successful" = "Сіз сәтті <b>$1</b> <b><a href=\"$2\">$3</a></b> аталатын пайдаланушыға аудардыңыз.";
"not_all_information_has_been_entered" = "Барлық мәлімет терілген жоқ";
"negative_transfer_value" = "Өкінішке орай біз басқа кісіден дауыс ұрлай алмаймыз.";
"message_is_too_long" = "Хабар тым ұзын.";
"receiver_not_found" = "Қабылдаушы табылған жоқ.";
"you_dont_have_enough_points" = "Сізде жеткілікті дауыс саны жоқ.";
/* Gifts */ /* Gifts */
"gift" = "Сыйлық"; "gift" = "Сыйлық";
@ -561,6 +599,18 @@
"support_new_title" = "Мәселені қысқаша сипаттап беріңіз"; "support_new_title" = "Мәселені қысқаша сипаттап беріңіз";
"support_new_content" = "Мәселе туралы толық жазып беріңіз"; "support_new_content" = "Мәселе туралы толық жазып беріңіз";
"support_rate_good_answer" = "Бұл жақсы жауап";
"support_rate_bad_answer" = "Бұл жаман жауап";
"support_good_answer_user" = "Сіз оң пікір қалдырдыңыз";
"support_bad_answer_user" = "Сіз теріс пікір қалдырдыңыз";
"support_good_answer_agent" = "Пайдаланушы оң пікір қалдырды.";
"support_bad_answer_agent" = "Пайдаланушы теріс пікір қалдырды.";
"support_rated_good" = "Сіз осы жауапқа оң пікір қалдырдыңыз.";
"support_rated_bad" = "Сіз осы жауапқа теріс пікір қалдырдыңыз.";
"wrong_parameters" = "Сұрау параметрлері жарамсыз.";
"fast_answers" = "Тез жауаптар";
"comment" = "Пікір"; "comment" = "Пікір";
"sender" = "Жіберуші"; "sender" = "Жіберуші";
@ -569,8 +619,8 @@
"you_have_not_entered_text" = "Cіз ешқандай мәтін енгізбедіңіз"; "you_have_not_entered_text" = "Cіз ешқандай мәтін енгізбедіңіз";
"you_have_not_entered_name_or_text" = "Сіз ат немесе мәтін енгізген жоқсыз"; "you_have_not_entered_name_or_text" = "Сіз ат немесе мәтін енгізген жоқсыз";
"support_ticket_changed" = "Мәселе өзгерілді"; "ticket_changed" = "Мәселе өзгерілді";
"support_ticket_changed_comment" = "Өзгерістер бірнеше секундтан кейін күшіне енеді."; "ticket_changed_comment" = "Өзгерістер бірнеше секундтан кейін күшіне енеді.";
/* Invite */ /* Invite */
@ -587,6 +637,46 @@
"banned_2" = "Мұның себебі қарапайым: <b>$1</b>. Өкінішке орай, осы жолы сізді мәңгілікке блоктауға мәжбүр болдық."; "banned_2" = "Мұның себебі қарапайым: <b>$1</b>. Өкінішке орай, осы жолы сізді мәңгілікке блоктауға мәжбүр болдық.";
"banned_3" = "Егер сізді қателесіп блоктады деп ойласаңыз, <a href=\"/support?act=new\">қолдау қызметіне жаза аласыз</a> немесе <a href=\"/logout?hash=$1\">жүйеден шыға аласыз</a>."; "banned_3" = "Егер сізді қателесіп блоктады деп ойласаңыз, <a href=\"/support?act=new\">қолдау қызметіне жаза аласыз</a> немесе <a href=\"/logout?hash=$1\">жүйеден шыға аласыз</a>.";
/* Discussions */
"discussions" = "Талқылаулар";
"messages_one" = "Бір хабар";
"messages_other" = "$1 хабар";
"topic_messages_count_zero" = "Тақырыпта хабар жоқ";
"topic_messages_count_one" = "Тақырыпта бір хабар бар";
"topic_messages_count_other" = "Тақырыпта $1 хабар бар";
"replied" = "жауап берді";
"create_topic" = "Тақырып бастау";
"new_topic" = "Жаңа тақырып";
"title" = "Аты";
"text" = "Мәтіні";
"view_topic" = "Тақырыпты қарау";
"edit_topic_action" = "Тақырыпты өндеу";
"edit_topic" = "Тақырыпты өндеу";
"topic_settings" = "Тақырыптың баптаулары";
"pin_topic" = "Тақырыпты бекіту";
"close_topic" = "Тақырыпты жабу";
"delete_topic" = "Тақырыпты жою";
"topics_one" = "Бір тақырып";
"topics_other" = "$1 тақырып";
"created" = "Басталған күні";
"everyone_can_create_topics" = "Әрбір адам тақырып бастай алады";
"display_list_of_topics_above_wall" = "Тақырыптар тізімін жаңалықтар қабырғасынан бұрын көрсету";
"topic_changes_saved_comment" = "Жаңартылған аты мен оның баптаулары тақырыптың бетінде пайда болады.";
"failed_to_create_topic" = "Тақырыпты бастай алмадық";
"failed_to_change_topic" = "Тақырыпты өзгерте алмадық";
"no_title_specified" = "Тақырыптың аты жазылмаған.";
/* Errors */ /* Errors */
"error_1" = "Дұрыс емес сұрау"; "error_1" = "Дұрыс емес сұрау";
@ -654,6 +744,7 @@
"login_as" = "$1 ретінде кіру"; "login_as" = "$1 ретінде кіру";
"manage_user_action" = "Пайдаланушыны басқару"; "manage_user_action" = "Пайдаланушыны басқару";
"manage_group_action" = "Топты басқару";
"ban_user_action" = "Пайдаланушыға тыйым салу"; "ban_user_action" = "Пайдаланушыға тыйым салу";
"warn_user_action" = "Пайдаланушыны ескерту"; "warn_user_action" = "Пайдаланушыны ескерту";
@ -663,6 +754,10 @@
"paginator_page" = "$1 бет"; "paginator_page" = "$1 бет";
"paginator_next" = "Алға"; "paginator_next" = "Алға";
/* About */
"about_openvk" = "OpenVK туралы";
/* Dialogs */ /* Dialogs */
"ok" = "ОК"; "ok" = "ОК";
@ -670,6 +765,12 @@
"no" = "Жоқ"; "no" = "Жоқ";
"cancel" = "Бас тарту"; "cancel" = "Бас тарту";
"edit_action" = "Өзгерту"; "edit_action" = "Өзгерту";
"transfer" = "Аудару";
"close" = "Жабу";
"warning" = "Назар аударыңыз"; "warning" = "Назар аударыңыз";
"question_confirm" = "Бұл әрекетті болдырмауға мүмкін емес. Шынымен осы әрекетті жасауға сенімдісіз бе?"; "question_confirm" = "Бұл әрекетті болдырмауға мүмкін емес. Шынымен осы әрекетті жасауға сенімдісіз бе?";
/* User alerts */
"user_alert_scam" = "Бұл пайдаланушы алаяқтық туралы көп хабарланды. Әсіресе ол ақша сұраса сақ болыңыз.";

View file

@ -17,6 +17,36 @@
"registration" = "Rejestracja"; "registration" = "Rejestracja";
"forgot_password" = "Zapomniałem hasła?"; "forgot_password" = "Zapomniałem hasła?";
"login_failed" = "Nie można się zalogować";
"invalid_username_or_password" = "Niepoprawna nazwa użytkownika lub hasło. <a href='/restore'>Zapomniałeś hasła?</a>";
"failed_to_register" = "Nie można się zarejestrować";
"referral_link_invalid" = "Link zaproszenia jest nieprawidłowy.";
"registration_disabled" = "Rejestracja wyłączona przez administratora systemu.";
"user_already_exists" = "Użytkownik z takim e-mailem już istnieje.";
"access_recovery" = "Przywracanie dostępu";
"page_access_recovery" = "Przywróć dostęp do strony";
"access_recovery_info" = "Zapomniałeś hasła? Nie martw się, Wprowadź swoje dane, a my wyślemy ci e-mail z instrukcjami odzyskiwania konta.";
"access_recovery_info_2" = "Wprowadź nowe hasło. Wszystkie trwające sesje zostaną zawieszone, a tokeny dostępu zostaną anulowane.";
"reset_password" = "Zresetuj hasło";
"2fa_code_2" = "Kod uwierzytelniania dwuskładnikowego";
"password_successfully_reset" = "Twoje hasło zostało pomyślnie zresetowane.";
"password_reset_email_sent" = "Jeśli jesteś zarejestrowany, otrzymasz instrukcje na e-mail.";
"password_reset_error" = "Nieoczekiwany błąd podczas resetowania hasła.";
"password_reset_rate_limit_error" = "Nie możesz tego robić tak często, przepraszam.";
"registration_disabled_info" = "Rejestracja jest wyłączona przez administratora systemu. Jeśli to możliwe, poproś znajomego o zaproszenie, jeśli jest zarejestrowany na tej stronie.";
"registration_closed" = "Rejestracja zamknięta.";
"invites_you_to" = "<strong>$1</strong> zaprasza do $2";
"register_meta_desc" = "Zarejestruj się w $1 już teraz!";
"register_referer_meta_title" = "$1 zaprasza do $2!";
"register_referer_meta_desc" = "Dołącz do $1 i wielu innych użytkowników w$2!";
"users" = "Пользователи";
/* Profile information */ /* Profile information */
"select_language" = "Wybierz język"; "select_language" = "Wybierz język";
@ -47,9 +77,14 @@
"no_information_provided" = "Brak informacji."; "no_information_provided" = "Brak informacji.";
"deceased_person" = "Strona zmarłego człowieka"; "deceased_person" = "Strona zmarłego człowieka";
"none" = "brakuje"; "none" = "brakuje";
"years" = "lat";
"send" = "Wysłać"; "send" = "Wysłać";
"years_zero" = "0 lat";
"years_one" = "1 rok";
"years_few" = "$1 roku";
"years_many" = "$1 lat";
"years_other" = "$1 lat";
"relationship" = "Stan cywilny"; "relationship" = "Stan cywilny";
"relationship_0" = "Nie wybrano"; "relationship_0" = "Nie wybrano";
@ -96,8 +131,13 @@
"updated_at" = "Aktualizacja $1"; "updated_at" = "Aktualizacja $1";
"user_banned" = "Niestety musieliśmy zablokować stronę użytkownika <b>$1</b>.";
"user_banned_comment" = "Komentarz moderatora:";
/* Wall */ /* Wall */
"feed" = "Nowość";
"post_writes_m" = "napisał"; "post_writes_m" = "napisał";
"post_writes_f" = "napisała"; "post_writes_f" = "napisała";
"post_writes_g" = "opublikowali"; "post_writes_g" = "opublikowali";
@ -113,7 +153,6 @@
"pinned" = "stały"; "pinned" = "stały";
"comments_tip" = "Bądź pierwszym, który pozostawi komentarz!"; "comments_tip" = "Bądź pierwszym, który pozostawi komentarz!";
"your_comment" = "Twój komentarz"; "your_comment" = "Twój komentarz";
"comments" = "Komentarz";
"shown" = "Wskazany"; "shown" = "Wskazany";
"x_out_of" = "$1 z"; "x_out_of" = "$1 z";
"wall_zero" = "brak wpisów"; "wall_zero" = "brak wpisów";
@ -121,22 +160,32 @@
"wall_few" = "$1 wpis"; "wall_few" = "$1 wpis";
"wall_many" = "$1 wpis"; "wall_many" = "$1 wpis";
"wall_other" = "$1 wpis"; "wall_other" = "$1 wpis";
"publish_post" = "Dodaj wpis";
"view_other_comments" = "Zobacz pozostałe komentarze";
"no_comments" = "Brak komentarzy";
"all_news" = "Wszystkie aktualności"; "all_news" = "Wszystkie aktualności";
"posts_per_page" = "Ilość wpisów na stronie"; "posts_per_page" = "Ilość wpisów na stronie";
"attachment" = "Włożenie"; "attachment" = "Włożenie";
"post_as_group" = "W imieniu Wspólnoty"; "post_as_group" = "W imieniu Wspólnoty";
"comment_as_group" = "W imieniu Wspólnoty";
"add_signature" = "Podpis autora"; "add_signature" = "Podpis autora";
"contains_nsfw" = "Zawiera treści NSFW"; "contains_nsfw" = "Zawiera treści NSFW";
"nsfw_warning" = "Ten post może zawierać ponad 18+ treści"; "nsfw_warning" = "Ten post może zawierać ponad 18+ treści";
"report" = "Poskarżyć"; "report" = "Poskarżyć";
"attach_photo" = "Załącz zdjęcie"; "attach" = "Przymocować";
"attach_photo" = "Przymocować zdjęcie";
"attach_video" = "Przymocować wideo";
"draw_graffiti" = "Narysować Graffiti";
"no_posts_abstract" = "Nikt tu nic nie napisał... Dopóki."; "no_posts_abstract" = "Nikt tu nic nie napisał... Dopóki.";
"attach_no_longer_available" = "Ten załącznik nie jest już dostępny."; "attach_no_longer_available" = "Ten załącznik nie jest już dostępny.";
"open_post" = "Otwórz wpis"; "open_post" = "Otwórz wpis";
"version_incompatibility" = "Nie można wyświetlić tego załącznika. Być może baza danych nie jest zgodna z bieżącą wersją OpenVK."; "version_incompatibility" = "Nie można wyświetlić tego załącznika. Być może baza danych nie jest zgodna z bieżącą wersją OpenVK.";
"reply" = "Odpowiedzieć";
/* Friends */ /* Friends */
"friends" = "Przyjaciel"; "friends" = "Przyjaciel";
@ -202,17 +251,23 @@
"role" = "Rola"; "role" = "Rola";
"administrator" = "Administrator"; "administrator" = "Administrator";
"promote_to_admin" = "Awans do admina"; "promote_to_admin" = "Awans do admina";
"promote_to_owner" = "Wyznaczyć właściciela";
"devote" = "Zdegradować"; "devote" = "Zdegradować";
"set_comment" = "Edytuj Komentarz"; "set_comment" = "Edytuj Komentarz";
"hidden_yes" = "Ukryty: Tak"; "hidden_yes" = "Ukryty: Tak";
"hidden_no" = "Ukryty: Nie"; "hidden_no" = "Ukryty: Nie";
"group_allow_post_for_everyone" = "Zezwalaj na publikowanie wpisów wszystkim"; "group_allow_post_for_everyone" = "Zezwalaj na publikowanie wpisów wszystkim";
"group_hide_from_global_feed" = "Nie wyświetlaj publikacji w kanale globalnym";
"statistics" = "Statystyk"; "statistics" = "Statystyk";
"group_administrators_list" = "Lista adminów"; "group_administrators_list" = "Lista adminów";
"group_display_only_creator" = "Wyświetl tylko twórcę grupy"; "group_display_only_creator" = "Wyświetl tylko twórcę grupy";
"group_display_all_administrators" = "Wyświetl wszystkich administratorów"; "group_display_all_administrators" = "Wyświetl wszystkich administratorów";
"group_dont_display_administrators_list" = "Nic nie wyświetla"; "group_dont_display_administrators_list" = "Nic nie wyświetla";
"group_changeowner_modal_title" = "Przeniesienie praw właściciela";
"group_changeowner_modal_text" = "Uwaga! Użytkownik przekazuje prawa właściciela użytkownikowi $1. To działanie jest nieodwracalne. Po przeniesieniu pozostaniesz administratorem, ale możesz łatwo przestać nim być.";
"group_owner_setted" = "Nowy właściciel ($1) został pomyślnie przypisany do społeczności $2. Otrzymujesz uprawnienia administratora w społeczności. Jeśli chcesz odzyskać rolę właściciela, skontaktuj się z <a href='/support?act=new'>wsparcie techniczne strony</a>.";
"participants_zero" = "Brak uczestnika"; "participants_zero" = "Brak uczestnika";
"participants_one" = "Jeden uczestnik"; "participants_one" = "Jeden uczestnik";
"participants_few" = "$1 uczestników"; "participants_few" = "$1 uczestników";
@ -261,8 +316,6 @@
"text_note" = "Treść"; "text_note" = "Treść";
"create_note" = "Utwórz notatkę"; "create_note" = "Utwórz notatkę";
"actions" = "Postępowanie"; "actions" = "Postępowanie";
"feed" = "Nowości";
"publish_post" = "Dodaj wpis";
"notes_zero" = "Brak notatek"; "notes_zero" = "Brak notatek";
"notes_one" = "Jedna notka"; "notes_one" = "Jedna notka";
@ -289,30 +342,29 @@
"menu_registration" = "Rejestracja"; "menu_registration" = "Rejestracja";
"menu_help" = "Pomoc"; "menu_help" = "Pomoc";
"menu_logout" = "Wyjść";
"menu_support" = "Pomoc";
"header_home" = "główny"; "header_home" = "główny";
"header_groups" = "grupy"; "header_groups" = "grupy";
"header_donate" = "poprzeć";
"header_people" = "ludzie"; "header_people" = "ludzie";
"header_invite" = "zaprosić"; "header_invite" = "zaprosić";
"header_help" = "pomoc"; "header_help" = "pomoc";
"header_log_out" = "wyjść"; "header_log_out" = "wyjść";
"header_search" = "Wyszukiwanie"; "header_search" = "wyszukiwanie";
"header_login" = "Zaloguj się"; "header_login" = "Zaloguj się";
"header_registration" = "Rejestracja"; "header_registration" = "Rejestracja";
"left_menu_donate" = "Poprzeć";
"footer_about_instance" = "o instancji";
"footer_blog" = "blog"; "footer_blog" = "blog";
"footer_help" = "pomoc"; "footer_help" = "pomoc";
"footer_developers" = "programistom"; "footer_developers" = "programistom";
"footer_choose_language" = "wybierz język"; "footer_choose_language" = "wybierz język";
"footer_privacy" = "prywatność"; "footer_privacy" = "prywatność";
"notes_zero" = "Brak notatek";
"notes_one" = "Jedna notka";
"notes_few" = "$1 notki";
"notes_many" = "$1 notatek";
"notes_other" = "$1 notatek";
/* Settings */ /* Settings */
"main" = "Główny"; "main" = "Główny";
@ -340,6 +392,7 @@
"search_for_groups" = "Szukaj grup"; "search_for_groups" = "Szukaj grup";
"search_for_people" = "Wyszukiwanie osób"; "search_for_people" = "Wyszukiwanie osób";
"search_button" = "Znaleźć"; "search_button" = "Znaleźć";
"search_placeholder" = "Zacznij wpisywać dowolne imię, tytuł lub słowo";
"results_zero" = "Brak wyników"; "results_zero" = "Brak wyników";
"results_one" = "Jeden wynik"; "results_one" = "Jeden wynik";
"results_few" = "$1 wynik"; "results_few" = "$1 wynik";
@ -355,6 +408,7 @@
"privacy_setting_see_friends" = "Kto widzi moich przyjaciół"; "privacy_setting_see_friends" = "Kto widzi moich przyjaciół";
"privacy_setting_add_to_friends" = "Kto może nazywać mnie przyjacielem"; "privacy_setting_add_to_friends" = "Kto może nazywać mnie przyjacielem";
"privacy_setting_write_wall" = "Kto może pisać na mojej ścianie"; "privacy_setting_write_wall" = "Kto może pisać na mojej ścianie";
"privacy_setting_write_messages" = "Kto może pisać do mnie wiadomości";
"privacy_value_anybody" = "Wszyscy chętni"; "privacy_value_anybody" = "Wszyscy chętni";
"privacy_value_anybody_dative" = "Wszystkim chętnym"; "privacy_value_anybody_dative" = "Wszystkim chętnym";
"privacy_value_users" = "Przez użytkownika OpenVK"; "privacy_value_users" = "Przez użytkownika OpenVK";
@ -379,6 +433,40 @@
"ui_settings_rating_show" = "Pokazać"; "ui_settings_rating_show" = "Pokazać";
"ui_settings_rating_hide" = "Ukrywać"; "ui_settings_rating_hide" = "Ukrywać";
"additional_links" = "Dodatkowe linki";
"ad_poster" = "Plakat reklamowy";
/* Two-factor authentication */
"two_factor_authentication" = "Uwierzytelnianie dwuskładnikowe";
"two_factor_authentication_disabled" = "Zapewnia niezawodną ochronę przed włamaniem: aby wejść na stronę, musisz wprowadzić kod otrzymany w aplikacji 2FA.";
"two_factor_authentication_enabled" = "Uwierzytelnianie dwuskładnikowe jest włączone. Twoja strona jest chroniona.";
"two_factor_authentication_login" = "Masz włączone uwierzytelnianie dwuskładnikowe. Aby się zalogować, wprowadź kod otrzymany w aplikacji.";
"two_factor_authentication_settings_1" = "Uwierzytelnianie dwuskładnikowe za pośrednictwem TOTP może być używane nawet bez Internetu. Aby to zrobić, potrzebujesz aplikacji do generowania kodów. Na przykład,<b>Google Authenticator</b> Dla Androida i iOS lub wolne<b>Aegis I andOTP</B> dla Androida. Upewnij się, że telefon ma dokładną datę i godzinę.";
"two_factor_authentication_settings_2" = "Korzystając z aplikacji do uwierzytelniania dwuskładnikowego, zeskanuj poniższy kod QR:";
"two_factor_authentication_settings_3" = "lub ręcznie wprowadź tajny klucz:<b>$1</b>.";
"two_factor_authentication_settings_4" = "Teraz wprowadź kod dostarczony przez aplikację i hasło ze strony, abyśmy mogli potwierdzić, że naprawdę jesteś sobą.";
"connect" = "Podłączyć";
"enable" = "Włączyć";
"disable" = "Wyłączyć";
"code" = "Kod";
"2fa_code" = "Kod 2FA";
"incorrect_password" = "Nieprawidłowe hasło";
"incorrect_code" = "Nieprawidłowy kod";
"incorrect_2fa_code" = "Nieprawidłowy kod uwierzytelniania dwuskładnikowego";
"two_factor_authentication_enabled_message" = "Uwierzytelnianie dwuskładnikowe włączone";
"two_factor_authentication_enabled_message_description" = "Twoja strona stała się trudniejsza do zhakowania. Zachęcamy do pobrania <a href='javascript:viewBackupCodes()'>kody zapasowe</a>";
"two_factor_authentication_disabled_message" = "Uwierzytelnianie dwuskładnikowe wyłączone";
"view_backup_codes" = "Zobacz kody zapasowe";
"backup_codes" = "Kody zapasowe do potwierdzenia logowania";
"two_factor_authentication_backup_codes_1" = "Kody zapasowe pozwalają potwierdzić logowanie, gdy nie masz dostępu do telefonu, na przykład podczas podróży.";
"two_factor_authentication_backup_codes_2" = "Masz jeszcze <b>10 kodów</b>, każdy kod może być użyty tylko raz. Wydrukuj je, odłóż w bezpieczne miejsce i użyj, gdy potrzebne są kody, aby potwierdzić wejście.";
"two_factor_authentication_backup_codes_3" = "Możesz uzyskać nowe kody, jeśli się skończą. Ważne są tylko ostatnio utworzone kody kopii zapasowych.";
/* Sorting */ /* Sorting */
"sort_randomly" = "Sortuj losowo"; "sort_randomly" = "Sortuj losowo";
@ -434,6 +522,7 @@
"nt_post_instrumental" = "postem"; "nt_post_instrumental" = "postem";
"nt_note_instrumental" = "notką"; "nt_note_instrumental" = "notką";
"nt_photo_instrumental" = "zdjęciem"; "nt_photo_instrumental" = "zdjęciem";
"nt_topic_instrumental" = "tematem";
/* Time */ /* Time */
@ -444,21 +533,6 @@
"time_today" = "dziś"; "time_today" = "dziś";
"time_yesterday" = "wczo"; "time_yesterday" = "wczo";
"your_email_address" = "Twój adres e-mail";
"your_page_address" = "Adres Twojej strony";
"page_address" = "Adres strony";
"current_email_address" = "Aktualny adres";
"page_id" = "ID strony";
"you_can_also" = "Możesz także";
"delete_your_page" = "usuń swoją stronę";
"delete_album" = "usuń album";
"ui_settings_interface" = "Interface";
"ui_settings_sidebar" = "Lewe menu";
"ui_settings_rating" = "Ranking";
"ui_settings_rating_show" = "Pokazać";
"ui_settings_rating_hide" = "Ukrywać";
"points" = "Głos"; "points" = "Głos";
"points_count" = "głos"; "points_count" = "głos";
"on_your_account" = "na twoim koncie"; "on_your_account" = "na twoim koncie";
@ -478,6 +552,33 @@
"usages_total" = "Ilość zastosowań"; "usages_total" = "Ilość zastosowań";
"usages_left" = "Pozostało zastosowań"; "usages_left" = "Pozostało zastosowań";
"points_transfer_dialog_header_1" = "Możesz wysłać jako prezent lub przekazać część głosów innej osobie.";
"points_transfer_dialog_header_2" = "Twoje bieżące saldo:";
"points_amount_one" = "1 głos";
"points_amount_few" = "$1 głosy";
"points_amount_many" = "$1 głosów";
"points_amount_other" = "$1 głosów";
"transfer_poins" = "Przekazywanie głosów";
"transfer_poins_button" = "Oddaj głosy";
"also_you_can_transfer_points" = "Możesz także <a href=\"javascript:showCoinsTransferDialog($1, '$2')\">przekazać głosy</a> innej osobie.";
"transferred_to_you" = "przekazał ci";
"receiver_address" = "Adres odbiorcy";
"coins_count" = "Liczba głosów";
"message" = "Wiadomość";
"failed_to_tranfer_points" = "Nie udało się oddać głosów";
"points_transfer_successful" = "Pomyślnie przekazałeś <b>$1 <a href=\"$2\">$3</a></b>.";
"not_all_information_has_been_entered" = "Nie wszystkie informacje zostały wprowadzone.";
"negative_transfer_value" = "Nie możemy ukraść głosów innej osobie, przepraszam.";
"message_is_too_long" = "Wiadomość jest za długa.";
"receiver_not_found" = "Nie znaleziono odbiorcy.";
"you_dont_have_enough_points" = "Masz za mało głosów.";
/* Gifts */ /* Gifts */
"gift" = "Prezent"; "gift" = "Prezent";
@ -509,9 +610,115 @@
"coins_many" = "$1 głosów"; "coins_many" = "$1 głosów";
"coins_other" = "$1 głosów"; "coins_other" = "$1 głosów";
"users_gifts" = "Prezent";
/* Support */
"support_opened" = "Odsłonięty";
"support_answered" = "Z odpowiedzią";
"support_closed" = "Zasłonięty";
"support_ticket" = "Obchodzenie się";
"support_tickets" = "Obchodzenie się";
"support_status_0" = "Pytanie w toku";
"support_status_1" = "Jest odpowiedź";
"support_status_2" = "Zasłonięty";
"support_greeting_hi" = "Witajcie, $1!";
"support_greeting_regards" = "Pozdrawiam,<br/>zespół wsparcia $1.";
"support_faq" = "Najczęściej zadawane pytania";
"support_list" = "Lista zgłoszeń";
"support_new" = "Nowy apel";
"support_faq_title" = "Dla kogo ta strona?";
"support_faq_content" = "Witryna służy do wyszukiwania znajomych i znajomych, a także do przeglądania danych użytkownika. To jak przewodnik po mieście, dzięki któremu ludzie mogą szybko znaleźć aktualne informacje o osobie.";
"support_new_title" = "Wpisz temat swojego apelu";
"support_new_content" = "Opisz problem lub sugestię";
"support_rate_good_answer" = "To dobra odpowiedź";
"support_rate_bad_answer" = "To zła odpowiedź";
"support_good_answer_user" = "Zostawiłeś pozytywną opinię.";
"support_bad_answer_user" = "Zostawiłeś negatywną opinię.";
"support_good_answer_agent" = "Użytkownik zostawił pozytywną opinię";
"support_bad_answer_agent" = "Użytkownik zostawił negatywną opinię";
"support_rated_good" = "Zostawiłeś pozytywną opinię na temat odpowiedzi.";
"support_rated_bad" = "Zostawiłeś negatywną opinię na temat odpowiedzi.";
"wrong_parameters" = "Nieprawidłowe parametry zapytania.";
"fast_answers" = "Szybkie odpowiedzi";
"comment" = "Komentarz"; "comment" = "Komentarz";
"sender" = "Nadawca"; "sender" = "Nadawca";
"author" = "Autor";
"you_have_not_entered_text" = "Nie wpisałeś tekstu";
"you_have_not_entered_name_or_text" = "Nie wpisałeś nazwy ani tekstu";
"ticket_changed" = "Ticket zmieniony";
"ticket_changed_comment" = "Zmiany wejdą w życie za kilka sekund.";
/* Invite */
"invite" = "Zaprosić";
"you_can_invite" = "Możesz zaprosić znajomych lub znajomych do sieci za pomocą spersonalizowanego linku:";
"you_can_invite_2" = "Dołącz ten link do swojego postu. Użytkownik zarejestruje się i natychmiast pojawi się w twoich znajomych.";
/* Banned */
"banned_title" = "Ci ban";
"banned_header" = "Zostałeś zablokowany";
"banned_alt" = "Użytkownik jest zablokowany.";
"banned_1" = "Przepraszam, <b>$1</b>, ale zostałeś zablokowany";
"banned_2" = "A powód tego jest prosty: <b>$1</b>. Niestety, tym razem musieliśmy Cię zablokować na dobre.";
"banned_3" = "Nadal możesz <a href=\"/support?act=new\">napisz do działu obsługi</a>, jeśli uważasz, że wystąpił błąd lub <a href=\"/logout?hash=$1\">wyjść</a>.";
/* Discussions */
"discussions" = "Dyskusja";
"messages_one" = "Jedna post";
"messages_few" = "$1 postów";
"messages_many" = "$1 postów";
"messages_other" = "$1 postów";
"topic_messages_count_zero" = "W temacie brak postów";
"topic_messages_count_one" = "W temacie jeden post";
"topic_messages_count_few" = "W temacie $1 postów";
"topic_messages_count_many" = "W temacie $1 postów";
"topic_messages_count_other" = "W temacie $1 postów";
"replied" = "odpowiedzieć";
"create_topic" = "Utwórz temat";
"new_topic" = "Nowy temat";
"title" = "Nagłówek";
"text" = "Teskt";
"view_topic" = "Zobacz temat";
"edit_topic_action" = "Edytuj temat";
"edit_topic" = "Edycja tematu";
"topic_settings" = "Ustawienia temat";
"pin_topic" = "Przypnij temat";
"close_topic" = "Zamknij temat";
"delete_topic" = "Usuń temat";
"topics_one" = "Jeden temat";
"topics_few" = "$1 tematy";
"topics_many" = "$1 tematy";
"topics_other" = "$1 tematów";
"created" = "Powstały";
"everyone_can_create_topics" = "Każdy może tworzyć tematy";
"display_list_of_topics_above_wall" = "Wyświetl listę tematów nad ścianą";
"topic_changes_saved_comment" = "Zaktualizowany tytuł i ustawienia pojawią się na stronie z motywem.";
"failed_to_create_topic" = "Nie można utworzyć tematu";
"failed_to_change_topic" = "Nie można zmienić tematu";
"no_title_specified" = "Nie podano tytułu.";
/* Errors */ /* Errors */
"error_1" = "Nieprawidłowe zapytanie"; "error_1" = "Nieprawidłowe zapytanie";
@ -531,6 +738,7 @@
"error_old_password" = "Stare hasło nie pasuje"; "error_old_password" = "Stare hasło nie pasuje";
"error_new_password" = "Nowe hasła nie pasują"; "error_new_password" = "Nowe hasła nie pasują";
"error_shorturl_incorrect" = "Krótki adres ma nieprawidłowy format."; "error_shorturl_incorrect" = "Krótki adres ma nieprawidłowy format.";
"error_repost_fail" = "Nie można udostępnić wpisu";
"forbidden" = "Błąd dostępu"; "forbidden" = "Błąd dostępu";
"forbidden_comment" = "Ustawienia prywatności tego użytkownika nie pozwalają na przeglądanie jego strony."; "forbidden_comment" = "Ustawienia prywatności tego użytkownika nie pozwalają na przeglądanie jego strony.";
@ -541,15 +749,100 @@
"photo_saved" = "Zdjęcie zapisane"; "photo_saved" = "Zdjęcie zapisane";
"photo_saved_comment" = "Nowe zdjęcie profilowe pojawi się na twojej stronie"; "photo_saved_comment" = "Nowe zdjęcie profilowe pojawi się na twojej stronie";
"shared_succ" = "Wpis pojawi się na Twojej ścianie. Stuknij powiadomienie, aby przejść do ściany.";
"invalid_email_address" = "Nieprawidłowy adres e-mail";
"invalid_email_address_comment" = "Podany przez Ciebie adres e-mail nie jest poprawny.";
"invalid_telegram_name" = "Nieprawidłowa nazwa konta Telegram";
"invalid_telegram_name_comment" = "Wpisałeś niepoprawną nazwę konta Telegram.";
"invalid_birth_date" = "Nieprawidłowa data urodzenia";
"invalid_birth_date_comment" = "Podana data urodzenia nie jest poprawna.";
"token_manipulation_error" = "Błąd manipulacji tokenem";
"token_manipulation_error_comment" = "Token jest nieprawidłowy lub wygasł";
"profile_changed" = "Profil zmieniony";
"profile_changed_comment" = "Twój aktywny profil został zmieniony.";
"profile_not_found" = "Nie znaleziono użytkownika.";
"suspicious_registration_attempt" = "Podejrzana próba rejestracji";
"suspicious_registration_attempt_comment" = "Próbowałeś zarejestrować się z podejrzanego miejsca.";
"rate_limit_error" = "Chumba, jesteś pojebany?";
"rate_limit_error_comment" = "Idź do psychiatry, napij się kółek. W $1 nie możesz tak często rzucać shitpostu. Kod wyjątku: $2.";
"not_enough_permissions" = "Za mało praw";
"not_enough_permissions_comment" = "Nie masz wystarczających uprawnień, aby wykonać tę czynność.";
"login_required_error" = "Za mało praw";
"login_required_error_comment" = "Aby wyświetlić tę stronę, musisz przejść do witryny.";
"captcha_error" = "Niepoprawnie wprowadzone znaki";
"captcha_error_comment" = "Upewnij się, że poprawnie wypełniłeś pole captcha.";
/* Admin actions */ /* Admin actions */
"login_as" = "Zaloguj się jako $1"; "login_as" = "Zaloguj się jako $1";
"manage_user_action" = "Zarządzanie użytkownikiem"; "manage_user_action" = "Zarządzanie użytkownikiem";
"ban_user_action" = "Zbanuj użytkownika"; "manage_group_action" = "Zarządzanie grupą";
"ban_user_action" = "Zablokuj użytkownika";
"warn_user_action" = "Ostrzec użytkownika"; "warn_user_action" = "Ostrzec użytkownika";
/* Paginator */ /* Paginator (deprecated) */
"paginator_back" = "Do tyłu"; "paginator_back" = "Do tyłu";
"paginator_page" = "Strona $1"; "paginator_page" = "Strona $1";
"paginator_next" = "Dalej"; "paginator_next" = "Dalej";
/* About */
"about_openvk" = "O OpenVK";
"about_this_instance" = "O tej instancji";
"rules" = "Zasada";
"most_popular_groups" = "Najpopularniejsze grupy";
"on_this_instance_are" = "W tej instancji:";
"about_users_one" = "<b>1</b> użytkownik";
"about_users_few" = "<b>$1</b> użytkowników";
"about_users_many" = "<b>$1</b> użytkowników";
"about_users_other" = "<b>$1</b> użytkowników";
"about_online_users_one" = "<b>1</b> użytkownik online";
"about_online_users_few" = "<b>$1</b> użytkowników online";
"about_online_users_many" = "<b>$1</b> użytkowników online";
"about_online_users_other" = "<b>$1</b> użytkowników online";
"about_active_users_one" = "<b>1</b> aktywny użytkownik";
"about_active_users_few" = "<b>$1</b> aktywnych użytkowników";
"about_active_users_many" = "<b>$1</b> aktywnych użytkowników";
"about_active_users_other" = "<b>$1</b> aktywnych użytkowników";
"about_groups_one" = "<b>1</b> grupa";
"about_groups_few" = "<b>$1</b> grupy";
"about_groups_many" = "<b>$1</b> grup";
"about_groups_other" = "<b>$1</b> grup";
"about_wall_posts_one" = "<b>1</b> wpis na ścianach";
"about_wall_posts_few" = "<b>$1</b> wpisy na ścianach";
"about_wall_posts_many" = "<b>$1</b> wpisów na ścianach";
"about_wall_posts_other" = "<b>$1</b> wpisów na ścianach";
/* Dialogs */
"ok" = "ОК";
"yes" = "Tak";
"no" = "Nie";
"cancel" = "Odwołanie";
"edit_action" = "Zmienić";
"transfer" = "Przekazać";
"close" = "Zamknąć";
"warning" = "Uwaga";
"question_confirm" = "Tej akcji nie można cofnąć. Czy naprawdę jesteś pewien tego, co chcesz zrobić?";
/* User alerts */
"user_alert_scam" = "Wiele osób skarżyło się na to konto w związku z oszustwem. Zachowaj ostrożność, zwłaszcza jeśli zostaniesz poproszony o pieniądze.";

View file

@ -16,7 +16,7 @@
"forgot_password" = "Забыли пароль?"; "forgot_password" = "Забыли пароль?";
"login_failed" = "Не удалось войти"; "login_failed" = "Не удалось войти";
"invalid_username_or_password" = "Неверное имя пользователя или пароль. <a href='/restore.pl'>Забыли пароль?</a>"; "invalid_username_or_password" = "Неверное имя пользователя или пароль. <a href='/restore'>Забыли пароль?</a>";
"failed_to_register" = "Не удалось зарегистрироваться"; "failed_to_register" = "Не удалось зарегистрироваться";
"referral_link_invalid" = "Пригласительная ссылка недействительна."; "referral_link_invalid" = "Пригласительная ссылка недействительна.";
@ -255,6 +255,7 @@
"hidden_yes" = "Скрыт: Да"; "hidden_yes" = "Скрыт: Да";
"hidden_no" = "Скрыт: Нет"; "hidden_no" = "Скрыт: Нет";
"group_allow_post_for_everyone" = "Разрешить публиковать записи всем"; "group_allow_post_for_everyone" = "Разрешить публиковать записи всем";
"group_hide_from_global_feed" = "Не отображать публикации в глобальной ленте";
"statistics" = "Статистика"; "statistics" = "Статистика";
"group_administrators_list" = "Список админов"; "group_administrators_list" = "Список админов";
"group_display_only_creator" = "Отображать только создателя группы"; "group_display_only_creator" = "Отображать только создателя группы";
@ -262,7 +263,7 @@
"group_dont_display_administrators_list" = "Ничего не отображать"; "group_dont_display_administrators_list" = "Ничего не отображать";
"group_changeowner_modal_title" = "Передача прав владельца"; "group_changeowner_modal_title" = "Передача прав владельца";
"group_changeowner_modal_text" = "Внимание! Вы передаёте права владельца пользователю $1. Это действие необратимо. После передави вы останетесь адмиинстратором, но сможете легко перестать им быть."; "group_changeowner_modal_text" = "Внимание! Вы передаёте права владельца пользователю $1. Это действие необратимо. После передачи вы останетесь адмиинстратором, но сможете легко перестать им быть.";
"group_owner_setted" = "Новый владелец ($1) успешно назначен в сообщество $2. Вам выданы права администратора в сообществе. Если Вы хотите вернуть роль владельца, обратитесь в <a href='/support?act=new'>техническую поддержку сайта</a>."; "group_owner_setted" = "Новый владелец ($1) успешно назначен в сообщество $2. Вам выданы права администратора в сообществе. Если Вы хотите вернуть роль владельца, обратитесь в <a href='/support?act=new'>техническую поддержку сайта</a>.";
"participants_zero" = "Ни одного участника"; "participants_zero" = "Ни одного участника";
@ -355,6 +356,7 @@
"left_menu_donate" = "Поддержать"; "left_menu_donate" = "Поддержать";
"footer_about_instance" = "об инстанции";
"footer_blog" = "блог"; "footer_blog" = "блог";
"footer_help" = "помощь"; "footer_help" = "помощь";
"footer_developers" = "разработчикам"; "footer_developers" = "разработчикам";
@ -404,6 +406,7 @@
"privacy_setting_see_friends" = "Кому видно моих друзей"; "privacy_setting_see_friends" = "Кому видно моих друзей";
"privacy_setting_add_to_friends" = "Кто может называть меня другом"; "privacy_setting_add_to_friends" = "Кто может называть меня другом";
"privacy_setting_write_wall" = "Кто может писать у меня на стене"; "privacy_setting_write_wall" = "Кто может писать у меня на стене";
"privacy_setting_write_messages" = "Кто может писать мне сообщения";
"privacy_value_anybody" = "Все желающие"; "privacy_value_anybody" = "Все желающие";
"privacy_value_anybody_dative" = "Всем желающим"; "privacy_value_anybody_dative" = "Всем желающим";
"privacy_value_users" = "Пользователям OpenVK"; "privacy_value_users" = "Пользователям OpenVK";
@ -429,6 +432,7 @@
"ui_settings_rating_hide" = "Скрывать"; "ui_settings_rating_hide" = "Скрывать";
"additional_links" = "Дополнительные ссылки"; "additional_links" = "Дополнительные ссылки";
"ad_poster" = "Рекламный плакат";
/* Two-factor authentication */ /* Two-factor authentication */
@ -799,6 +803,36 @@
"about_openvk" = "Об OpenVK"; "about_openvk" = "Об OpenVK";
"about_this_instance" = "Об этой инстанции";
"rules" = "Правила";
"most_popular_groups" = "Самые популярные группы";
"on_this_instance_are" = "На этой инстанции:";
"about_users_one" = "<b>1</b> пользователь";
"about_users_few" = "<b>$1</b> пользователя";
"about_users_many" = "<b>$1</b> пользователей";
"about_users_other" = "<b>$1</b> пользователей";
"about_online_users_one" = "<b>1</b> пользователь в сети";
"about_online_users_few" = "<b>$1</b> пользователя в сети";
"about_online_users_many" = "<b>$1</b> пользователей в сети";
"about_online_users_other" = "<b>$1</b> пользователей в сети";
"about_active_users_one" = "<b>1</b> активный пользователь";
"about_active_users_few" = "<b>$1</b> активных пользователя";
"about_active_users_many" = "<b>$1</b> активных пользователей";
"about_active_users_other" = "<b>$1</b> активных пользователей";
"about_groups_one" = "<b>1</b> группа";
"about_groups_few" = "<b>$1</b> группы";
"about_groups_many" = "<b>$1</b> групп";
"about_groups_other" = "<b>$1</b> групп";
"about_wall_posts_one" = "<b>1</b> запись на стенах";
"about_wall_posts_few" = "<b>$1</b> записи на стенах";
"about_wall_posts_many" = "<b>$1</b> записей на стенах";
"about_wall_posts_other" = "<b>$1</b> записей на стенах";
/* Dialogs */ /* Dialogs */
"ok" = "ОК"; "ok" = "ОК";
@ -811,3 +845,7 @@
"warning" = "Внимание"; "warning" = "Внимание";
"question_confirm" = "Это действие нельзя отменить. Вы действительно уверены в том что хотите сделать?"; "question_confirm" = "Это действие нельзя отменить. Вы действительно уверены в том что хотите сделать?";
/* User alerts */
"user_alert_scam" = "На этот аккаунт много жаловались в связи с мошенничеством. Пожалуйста, будьте осторожны, особенно если у вас попросят денег.";

View file

@ -18,7 +18,7 @@
"forgot_password" = "Запамятовали шифръ?"; "forgot_password" = "Запамятовали шифръ?";
"login_failed" = "Не удалось войти"; "login_failed" = "Не удалось войти";
"invalid_username_or_password" = "Невѣрное имя пользователя или шифръ. <a href='/restore.pl'>Забыли шифръ?</a>"; "invalid_username_or_password" = "Невѣрное имя пользователя или шифръ. <a href='/restore'>Забыли шифръ?</a>";
"failed_to_register" = "Не удалось зарегистрироваться"; "failed_to_register" = "Не удалось зарегистрироваться";
"referral_link_invalid" = "Пригласительная ссылка недѣйствительна."; "referral_link_invalid" = "Пригласительная ссылка недѣйствительна.";
@ -587,8 +587,8 @@
"you_have_not_entered_text" = "Вы не ввели текстъ"; "you_have_not_entered_text" = "Вы не ввели текстъ";
"you_have_not_entered_name_or_text" = "Вы не ввели имя или текстъ"; "you_have_not_entered_name_or_text" = "Вы не ввели имя или текстъ";
"support_ticket_changed" = "​Тикетъ​ измѣненъ"; "ticket_changed" = "​Тикетъ​ измѣненъ";
"support_ticket_changed_comment" = "Измѣненія вступятъ силу черезъ нѣсколько секундъ."; "ticket_changed_comment" = "Измѣненія вступятъ силу черезъ нѣсколько секундъ.";
/* Invite */ /* Invite */

View file

@ -18,7 +18,7 @@
"forgot_password" = "Забули пароль?"; "forgot_password" = "Забули пароль?";
"login_failed" = "Не вдалося увійти"; "login_failed" = "Не вдалося увійти";
"invalid_username_or_password" = "Неправильне ім'я користувача або пароль. <a href='/restore.pl'>Забули пароль?</a>"; "invalid_username_or_password" = "Неправильне ім'я користувача або пароль. <a href='/restore'>Забули пароль?</a>";
"failed_to_register" = "Не вдалося зареєструватися"; "failed_to_register" = "Не вдалося зареєструватися";
"referral_link_invalid" = "Посилання на запрошення недійсне."; "referral_link_invalid" = "Посилання на запрошення недійсне.";