Merge branch 'master' into lo_kal_es

This commit is contained in:
lalka2018 2023-09-17 11:24:06 +03:00 committed by GitHub
commit 5b162fda06
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
32 changed files with 1446 additions and 357 deletions

View file

@ -211,7 +211,7 @@ final class Notes extends VKAPIRequestHandler
$items = [];
$note = (new NotesRepo)->getNoteById((int)$id[0], (int)$id[1]);
if($note) {
if($note && !$note->isDeleted()) {
$nodez->notes[] = $note->toVkApiStruct();
}
}

View file

@ -90,4 +90,12 @@ class Comment extends Post
{
return "/wall" . $this->getTarget()->getPrettyId() . "#_comment" . $this->getId();
}
function canBeEditedBy(?User $user = NULL): bool
{
if(!$user)
return false;
return $user->getId() == $this->getOwner(false)->getId();
}
}

View file

@ -124,7 +124,7 @@ class Note extends Postable
$res = (object) [];
$res->type = "note";
$res->id = $this->getId();
$res->id = $this->getVirtualId();
$res->owner_id = $this->getOwner()->getId();
$res->title = $this->getName();
$res->text = $this->getText();

View file

@ -245,6 +245,20 @@ class Post extends Postable
$this->unwire();
$this->save();
}
function canBeEditedBy(?User $user = NULL): bool
{
if(!$user)
return false;
if($this->isDeactivationMessage() || $this->isUpdateAvatarMessage())
return false;
if($this->getTargetWall() > 0)
return $this->getPublicationTime()->timestamp() + WEEK > time() && $user->getId() == $this->getOwner(false)->getId();
return $user->getId() == $this->getOwner(false)->getId();
}
use Traits\TRichText;
}

View file

@ -167,9 +167,9 @@ abstract class Postable extends Attachable
$this->stateChanges("created", time());
$this->stateChanges("virtual_id", $pCount + 1);
} else {
} /*else {
$this->stateChanges("edited", time());
}
}*/
parent::save();
}

View file

@ -3,6 +3,7 @@ namespace openvk\Web\Models\Entities;
use openvk\Web\Util\DateTime;
use Nette\Database\Table\ActiveRow;
use openvk\Web\Models\RowModel;
use openvk\Web\Models\Entities\Club;
use Chandler\Database\DatabaseConnection;
use openvk\Web\Models\Repositories\{Applications, Comments, Notes, Reports, Users, Posts, Photos, Videos, Clubs};
use Chandler\Database\DatabaseConnection as DB;
@ -96,8 +97,19 @@ class Report extends RowModel
{
if ($this->getContentType() !== "user") {
$pubTime = $this->getContentObject()->getPublicationTime();
$name = $this->getContentObject()->getName();
$this->getAuthor()->adminNotify("Ваш контент, который вы опубликовали $pubTime ($name) был удалён модераторами инстанса. За повторные или серьёзные нарушения вас могут заблокировать.");
if (method_exists($this->getContentObject(), "getName")) {
$name = $this->getContentObject()->getName();
$placeholder = "$pubTime ($name)";
} else {
$placeholder = "$pubTime";
}
if ($this->getAuthor() instanceof Club) {
$name = $this->getAuthor()->getName();
$this->getAuthor()->getOwner()->adminNotify("Ваш контент, который опубликовали $placeholder в созданной вами группе \"$name\" был удалён модераторами инстанса. За повторные или серьёзные нарушения группу могут заблокировать.");
} else {
$this->getAuthor()->adminNotify("Ваш контент, который вы опубликовали $placeholder был удалён модераторами инстанса. За повторные или серьёзные нарушения вас могут заблокировать.");
}
$this->getContentObject()->delete($this->getContentType() !== "app");
}

View file

@ -462,6 +462,7 @@ class User extends RowModel
"news",
"links",
"poster",
"apps"
],
])->get($id);
}
@ -1026,6 +1027,7 @@ class User extends RowModel
"news",
"links",
"poster",
"apps"
],
])->set($id, (int) $status)->toInteger();

View file

@ -363,7 +363,7 @@ final class AdminPresenter extends OpenVKPresenter
if (str_contains($this->queryParam("reason"), "*"))
exit(json_encode([ "error" => "Incorrect reason" ]));
$unban_time = strtotime($this->queryParam("date")) ?: NULL;
$unban_time = strtotime($this->queryParam("date")) ?: "permanent";
$user = $this->users->get($id);
if(!$user)

View file

@ -177,26 +177,25 @@ final class NoSpamPresenter extends OpenVKPresenter
if ($conditions) {
$logs = $db->query("SELECT * FROM `ChandlerLogs` $whereStart $conditions GROUP BY `object_id`, `object_model`");
if (!$where) {
foreach ($logs as $log) {
$log = (new Logs)->get($log->id);
$response[] = $log->getObject()->unwrap();
}
} else {
foreach ($logs as $log) {
$log = (new Logs)->get($log->id);
$object = $log->getObject()->unwrap();
foreach ($logs as $log) {
$log = (new Logs)->get($log->id);
$object = $log->getObject()->unwrap();
if (!$object) continue;
if (!$object) continue;
if ($where) {
if (str_starts_with($where, " AND")) {
$where = substr_replace($where, "", 0, strlen(" AND"));
}
foreach ($db->query("SELECT * FROM `$table` WHERE $where")->fetchAll() as $o) {
if ($object->id === $o["id"]) {
$a = $db->query("SELECT * FROM `$table` WHERE $where")->fetchAll();
foreach ($a as $o) {
if ($object->id == $o["id"]) {
$response[] = $object;
}
}
} else {
$response[] = $object;
}
}
}
@ -206,70 +205,72 @@ final class NoSpamPresenter extends OpenVKPresenter
}
try {
$response = [];
$processed = 0;
$response = [];
$processed = 0;
$where = $this->postParam("where");
$ip = $this->postParam("ip");
$useragent = $this->postParam("useragent");
$searchTerm = $this->postParam("q");
$ts = (int)$this->postParam("ts");
$te = (int)$this->postParam("te");
$user = $this->postParam("user");
$where = $this->postParam("where");
$ip = addslashes($this->postParam("ip"));
$useragent = addslashes($this->postParam("useragent"));
$searchTerm = addslashes($this->postParam("q"));
$ts = (int)$this->postParam("ts");
$te = (int)$this->postParam("te");
$user = addslashes($this->postParam("user"));
if (!$ip && !$useragent && !$searchTerm && !$ts && !$te && !$where && !$searchTerm && !$user)
$this->returnJson(["success" => false, "error" => "Нет запроса. Заполните поле \"подстрока\" или введите запрос \"WHERE\" в поле под ним."]);
$models = explode(",", $this->postParam("models"));
foreach ($models as $_model) {
$model_name = NoSpamPresenter::ENTITIES_NAMESPACE . "\\" . $_model;
if (!class_exists($model_name)) {
continue;
if ($where) {
$where = explode(";", $where)[0];
}
$model = new $model_name;
if (!$ip && !$useragent && !$searchTerm && !$ts && !$te && !$where && !$searchTerm && !$user)
$this->returnJson(["success" => false, "error" => "Нет запроса. Заполните поле \"подстрока\" или введите запрос \"WHERE\" в поле под ним."]);
$c = new \ReflectionClass($model_name);
if ($c->isAbstract() || $c->getName() == NoSpamPresenter::ENTITIES_NAMESPACE . "\\Correspondence") {
continue;
}
$models = explode(",", $this->postParam("models"));
$db = DatabaseConnection::i()->getContext();
$table = $model->getTableName();
$columns = $db->getStructure()->getColumns($table);
if ($searchTerm) {
$conditions = [];
$need_deleted = false;
foreach ($columns as $column) {
if ($column["name"] == "deleted") {
$need_deleted = true;
} else {
$conditions[] = "`$column[name]` REGEXP '$searchTerm'";
}
foreach ($models as $_model) {
$model_name = NoSpamPresenter::ENTITIES_NAMESPACE . "\\" . $_model;
if (!class_exists($model_name)) {
continue;
}
$conditions = implode(" OR ", $conditions);
$where = ($this->postParam("where") ? " AND ($conditions)" : "($conditions)");
if ($need_deleted) $where .= " AND (`deleted` = 0)";
}
$model = new $model_name;
$rows = [];
if ($ip || $useragent || $ts || $te || $user) {
$rows = searchByAdditionalParams($table, $where, $ip, $useragent, $ts, $te, $user);
}
$c = new \ReflectionClass($model_name);
if ($c->isAbstract() || $c->getName() == NoSpamPresenter::ENTITIES_NAMESPACE . "\\Correspondence") {
continue;
}
if (count($rows) === 0) {
if (!$searchTerm) {
if (str_starts_with($where, " AND")) {
if ($searchTerm && !$this->postParam("where")) {
$where = substr_replace($where, "", 0, strlen(" AND"));
$db = DatabaseConnection::i()->getContext();
$table = $model->getTableName();
$columns = $db->getStructure()->getColumns($table);
if ($searchTerm) {
$conditions = [];
$need_deleted = false;
foreach ($columns as $column) {
if ($column["name"] == "deleted") {
$need_deleted = true;
} else {
$where = "(" . $this->postParam("where") . ")" . $where;
$conditions[] = "`$column[name]` REGEXP '$searchTerm'";
}
}
$conditions = implode(" OR ", $conditions);
$where = ($this->postParam("where") ? " AND ($conditions)" : "($conditions)");
if ($need_deleted) $where .= " AND (`deleted` = 0)";
}
$rows = [];
if (str_starts_with($where, " AND")) {
if ($searchTerm && !$this->postParam("where")) {
$where = substr_replace($where, "", 0, strlen(" AND"));
} else {
$where = "(" . $this->postParam("where") . ")" . $where;
}
}
if ($ip || $useragent || $ts || $te || $user) {
$rows = searchByAdditionalParams($table, $where, $ip, $useragent, $ts, $te, $user);
} else {
if (!$where) {
$rows = [];
} else {
@ -277,99 +278,105 @@ final class NoSpamPresenter extends OpenVKPresenter
$rows = $result->fetchAll();
}
}
}
if (!in_array((int)$this->postParam("ban"), [1, 2, 3])) {
foreach ($rows as $key => $object) {
$object = (array)$object;
$_obj = [];
foreach ($object as $key => $value) {
foreach ($columns as $column) {
if ($column["name"] === $key && in_array(strtoupper($column["nativetype"]), ["BLOB", "BINARY", "VARBINARY", "TINYBLOB", "MEDIUMBLOB", "LONGBLOB"])) {
$value = "[BINARY]";
break;
}
}
$_obj[$key] = $value;
$_obj["__model_name"] = $_model;
}
$response[] = $_obj;
}
} else {
$ids = [];
foreach ($rows as $object) {
$object = new $model_name($db->table($table)->get($object->id));
if (!$object) continue;
$ids[] = $object->getId();
}
$log = new NoSpamLog;
$log->setUser($this->user->id);
$log->setModel($_model);
if ($searchTerm) {
$log->setRegex($searchTerm);
} else {
$log->setRequest($where);
}
$log->setBan_Type((int)$this->postParam("ban"));
$log->setCount(count($rows));
$log->setTime(time());
$log->setItems(implode(",", $ids));
$log->save();
$banned_ids = [];
foreach ($rows as $object) {
$object = new $model_name($db->table($table)->get($object->id));
if (!$object) continue;
$owner = NULL;
$methods = ["getOwner", "getUser", "getRecipient", "getInitiator"];
if (method_exists($object, "ban")) {
$owner = $object;
} else {
foreach ($methods as $method) {
if (method_exists($object, $method)) {
$owner = $object->$method();
break;
}
}
}
if ($owner instanceof User && $owner->getId() === $this->user->id) {
if (count($rows) === 1) {
$this->returnJson(["success" => false, "error" => "\"Производственная травма\" — Вы не можете блокировать или удалять свой же контент"]);
} else {
continue;
}
}
if (in_array((int)$this->postParam("ban"), [2, 3])) {
if ($owner) {
$_id = ($owner instanceof Club ? $owner->getId() * -1 : $owner->getId());
if (!in_array($_id, $banned_ids)) {
if ($owner instanceof User) {
$owner->ban("**content-noSpamTemplate-" . $log->getId() . "**", false, time() + $owner->getNewBanTime(), $this->user->id);
} else {
$owner->ban("Подозрительная активность");
if (!in_array((int)$this->postParam("ban"), [1, 2, 3])) {
foreach ($rows as $key => $object) {
$object = (array)$object;
$_obj = [];
foreach ($object as $key => $value) {
foreach ($columns as $column) {
if ($column["name"] === $key && in_array(strtoupper($column["nativetype"]), ["BLOB", "BINARY", "VARBINARY", "TINYBLOB", "MEDIUMBLOB", "LONGBLOB"])) {
$value = "[BINARY]";
break;
}
$banned_ids[] = $_id;
}
$_obj[$key] = $value;
$_obj["__model_name"] = $_model;
}
$response[] = $_obj;
}
} else {
$ids = [];
foreach ($rows as $object) {
$object = new $model_name($db->table($table)->get($object->id));
if (!$object) continue;
$ids[] = $object->getId();
}
if (in_array((int)$this->postParam("ban"), [1, 3]))
$object->delete();
$log = new NoSpamLog;
$log->setUser($this->user->id);
$log->setModel($_model);
if ($searchTerm) {
$log->setRegex($searchTerm);
} else {
$log->setRequest($where);
}
$log->setBan_Type((int)$this->postParam("ban"));
$log->setCount(count($rows));
$log->setTime(time());
$log->setItems(implode(",", $ids));
$log->save();
$banned_ids = [];
foreach ($rows as $object) {
$object = new $model_name($db->table($table)->get($object->id));
if (!$object) continue;
$owner = NULL;
$methods = ["getOwner", "getUser", "getRecipient", "getInitiator"];
if (method_exists($object, "ban")) {
$owner = $object;
} else {
foreach ($methods as $method) {
if (method_exists($object, $method)) {
$owner = $object->$method();
break;
}
}
}
if ($owner instanceof User && $owner->getId() === $this->user->id) {
if (count($rows) === 1) {
$this->returnJson(["success" => false, "error" => "\"Производственная травма\" — Вы не можете блокировать или удалять свой же контент"]);
} else {
continue;
}
}
if (in_array((int)$this->postParam("ban"), [2, 3])) {
$reason = mb_strlen(trim($this->postParam("ban_reason"))) > 0 ? addslashes($this->postParam("ban_reason")) : ("**content-noSpamTemplate-" . $log->getId() . "**");
$is_forever = (string)$this->postParam("is_forever") === "true";
$unban_time = $is_forever ? 0 : (int)$this->postParam("unban_time") ?? NULL;
if ($owner) {
$_id = ($owner instanceof Club ? $owner->getId() * -1 : $owner->getId());
if (!in_array($_id, $banned_ids)) {
if ($owner instanceof User) {
if (!$unban_time && !$is_forever)
$unban_time = time() + $owner->getNewBanTime();
$owner->ban($reason, false, $unban_time, $this->user->id);
} else {
$owner->ban("Подозрительная активность");
}
$banned_ids[] = $_id;
}
}
}
if (in_array((int)$this->postParam("ban"), [1, 3]))
$object->delete();
}
$processed++;
}
$processed++;
}
}
$this->returnJson(["success" => true, "processed" => $processed, "count" => count($response), "list" => $response]);
$this->returnJson(["success" => true, "processed" => $processed, "count" => count($response), "list" => $response]);
} catch (\Throwable $e) {
$this->returnJson(["success" => false, "error" => $e->getMessage()]);
}

View file

@ -1,6 +1,6 @@
<?php declare(strict_types=1);
namespace openvk\Web\Presenters;
use openvk\Web\Models\Entities\{Club, Photo, Album};
use openvk\Web\Models\Entities\{Club, Photo, Album, User};
use openvk\Web\Models\Repositories\{Photos, Albums, Users, Clubs};
use Nette\InvalidStateException as ISE;
@ -27,7 +27,7 @@ final class PhotosPresenter extends OpenVKPresenter
if(!$user) $this->notFound();
if (!$user->getPrivacyPermission('photos.read', $this->user->identity ?? NULL))
$this->flashFail("err", tr("forbidden"), tr("forbidden_comment"));
$this->template->albums = $this->albums->getUserAlbums($user, $this->queryParam("p") ?? 1);
$this->template->albums = $this->albums->getUserAlbums($user, (int)($this->queryParam("p") ?? 1));
$this->template->count = $this->albums->getUserAlbumsCount($user);
$this->template->owner = $user;
$this->template->canEdit = false;
@ -36,7 +36,7 @@ final class PhotosPresenter extends OpenVKPresenter
} else {
$club = (new Clubs)->get(abs($owner));
if(!$club) $this->notFound();
$this->template->albums = $this->albums->getClubAlbums($club, $this->queryParam("p") ?? 1);
$this->template->albums = $this->albums->getClubAlbums($club, (int)($this->queryParam("p") ?? 1));
$this->template->count = $this->albums->getClubAlbumsCount($club);
$this->template->owner = $club;
$this->template->canEdit = false;
@ -46,7 +46,7 @@ final class PhotosPresenter extends OpenVKPresenter
$this->template->paginatorConf = (object) [
"count" => $this->template->count,
"page" => $this->queryParam("p") ?? 1,
"page" => (int)($this->queryParam("p") ?? 1),
"amount" => NULL,
"perPage" => OPENVK_DEFAULT_PER_PAGE,
];
@ -147,7 +147,7 @@ final class PhotosPresenter extends OpenVKPresenter
$this->template->photos = iterator_to_array( $album->getPhotos( (int) ($this->queryParam("p") ?? 1), 20) );
$this->template->paginatorConf = (object) [
"count" => $album->getPhotosCount(),
"page" => $this->queryParam("p") ?? 1,
"page" => (int)($this->queryParam("p") ?? 1),
"amount" => sizeof($this->template->photos),
"perPage" => 20,
"atBottom" => true
@ -221,39 +221,74 @@ final class PhotosPresenter extends OpenVKPresenter
function renderUploadPhoto(): void
{
$this->assertUserLoggedIn();
$this->willExecuteWriteAction();
$this->willExecuteWriteAction(true);
if(is_null($this->queryParam("album")))
$this->flashFail("err", tr("error"), tr("error_adding_to_deleted"));
$this->flashFail("err", tr("error"), tr("error_adding_to_deleted"), 500, true);
[$owner, $id] = explode("_", $this->queryParam("album"));
$album = $this->albums->get((int) $id);
if(!$album)
$this->flashFail("err", tr("error"), tr("error_adding_to_deleted"));
$this->flashFail("err", tr("error"), tr("error_adding_to_deleted"), 500, true);
if(is_null($this->user) || !$album->canBeModifiedBy($this->user->identity))
$this->flashFail("err", tr("error_access_denied_short"), tr("error_access_denied"));
$this->flashFail("err", tr("error_access_denied_short"), tr("error_access_denied"), 500, true);
if($_SERVER["REQUEST_METHOD"] === "POST") {
if(!isset($_FILES["blob"]))
$this->flashFail("err", tr("no_photo"), tr("select_file"));
try {
$photo = new Photo;
$photo->setOwner($this->user->id);
$photo->setDescription($this->postParam("desc"));
$photo->setFile($_FILES["blob"]);
$photo->setCreated(time());
$photo->save();
} catch(ISE $ex) {
$name = $album->getName();
$this->flashFail("err", tr("no_photo"), tr("error_adding_to_x", $name));
}
$album->addPhoto($photo);
$album->setEdited(time());
$album->save();
if($this->queryParam("act") == "finish") {
$result = json_decode($this->postParam("photos"), true);
foreach($result as $photoId => $description) {
$phot = $this->photos->get($photoId);
$this->redirect("/photo" . $photo->getPrettyId() . "?from=album" . $album->getId());
if(!$phot || $phot->isDeleted() || $phot->getOwner()->getId() != $this->user->id)
continue;
if(iconv_strlen($description) > 255)
$this->flashFail("err", tr("error"), tr("description_too_long"), 500, true);
$phot->setDescription($description);
$phot->save();
$album = $phot->getAlbum();
}
$this->returnJson(["success" => true,
"album" => $album->getId(),
"owner" => $album->getOwner() instanceof User ? $album->getOwner()->getId() : $album->getOwner()->getId() * -1]);
}
if(!isset($_FILES))
$this->flashFail("err", tr("no_photo"), tr("select_file"), 500, true);
$photos = [];
for($i = 0; $i < $this->postParam("count"); $i++) {
try {
$photo = new Photo;
$photo->setOwner($this->user->id);
$photo->setDescription("");
$photo->setFile($_FILES["photo_".$i]);
$photo->setCreated(time());
$photo->save();
$photos[] = [
"url" => $photo->getURLBySizeId("tiny"),
"id" => $photo->getId(),
"vid" => $photo->getVirtualId(),
"owner" => $photo->getOwner()->getId(),
"link" => $photo->getURL()
];
} catch(ISE $ex) {
$name = $album->getName();
$this->flashFail("err", "Неизвестная ошибка", "Не удалось сохранить фотографию в $name.", 500, true);
}
$album->addPhoto($photo);
$album->setEdited(time());
$album->save();
}
$this->returnJson(["success" => true,
"photos" => $photos]);
} else {
$this->template->album = $album;
}
@ -285,18 +320,23 @@ final class PhotosPresenter extends OpenVKPresenter
function renderDeletePhoto(int $ownerId, int $photoId): void
{
$this->assertUserLoggedIn();
$this->willExecuteWriteAction();
$this->willExecuteWriteAction($_SERVER["REQUEST_METHOD"] === "POST");
$this->assertNoCSRF();
$photo = $this->photos->getByOwnerAndVID($ownerId, $photoId);
if(!$photo) $this->notFound();
if(is_null($this->user) || $this->user->id != $ownerId)
$this->flashFail("err", tr("error_access_denied_short"), tr("error_access_denied"));
$redirect = $photo->getAlbum()->getOwner() instanceof User ? "/id0" : "/club" . $ownerId;
$photo->isolate();
$photo->delete();
if($_SERVER["REQUEST_METHOD"] === "POST")
$this->returnJson(["success" => true]);
$this->flash("succ", tr("photo_is_deleted"), tr("photo_is_deleted_desc"));
$this->redirect("/id0");
$this->redirect($redirect);
}
}

View file

@ -481,6 +481,7 @@ final class UserPresenter extends OpenVKPresenter
"menu_novajoj" => "news",
"menu_ligiloj" => "links",
"menu_standardo" => "poster",
"menu_aplikoj" => "apps"
];
foreach($settings as $checkbox => $setting)
$user->setLeftMenuItemStatus($setting, $this->checkbox($checkbox));

View file

@ -3,7 +3,7 @@ namespace openvk\Web\Presenters;
use openvk\Web\Models\Exceptions\TooMuchOptionsException;
use openvk\Web\Models\Entities\{Poll, Post, Photo, Video, Club, User};
use openvk\Web\Models\Entities\Notifications\{MentionNotification, RepostNotification, WallPostNotification};
use openvk\Web\Models\Repositories\{Posts, Users, Clubs, Albums, Notes};
use openvk\Web\Models\Repositories\{Posts, Users, Clubs, Albums, Notes, Comments};
use Chandler\Database\DatabaseConnection;
use Nette\InvalidStateException as ISE;
use Bhaktaraz\RSSGenerator\Item;
@ -498,4 +498,64 @@ final class WallPresenter extends OpenVKPresenter
# TODO localize message based on language and ?act=(un)pin
$this->flashFail("succ", tr("information_-1"), tr("changes_saved_comment"));
}
function renderEdit()
{
$this->assertUserLoggedIn();
$this->willExecuteWriteAction();
if($_SERVER["REQUEST_METHOD"] !== "POST")
$this->redirect("/id0");
if($this->postParam("type") == "post")
$post = $this->posts->get((int)$this->postParam("postid"));
else
$post = (new Comments)->get((int)$this->postParam("postid"));
if(!$post || $post->isDeleted())
$this->returnJson(["error" => "Invalid post"]);
if(!$post->canBeEditedBy($this->user->identity))
$this->returnJson(["error" => "Access denied"]);
$attachmentsCount = sizeof(iterator_to_array($post->getChildren()));
if(empty($this->postParam("newContent")) && $attachmentsCount < 1)
$this->returnJson(["error" => "Empty post"]);
$post->setEdited(time());
try {
$post->setContent($this->postParam("newContent"));
} catch(\LengthException $e) {
$this->returnJson(["error" => $e->getMessage()]);
}
if($this->postParam("type") === "post") {
$post->setNsfw($this->postParam("nsfw") == "true");
$flags = 0;
if($post->getTargetWall() < 0 && $post->getWallOwner()->canBeModifiedBy($this->user->identity)) {
if($this->postParam("fromgroup") == "true") {
$flags |= 0b10000000;
$post->setFlags($flags);
} else
$post->setFlags($flags);
}
}
$post->save(true);
$this->returnJson(["error" => "no",
"new_content" => $post->getText(),
"new_edited" => (string)$post->getEditTime(),
"nsfw" => $this->postParam("type") === "post" ? (int)$post->isExplicit() : 0,
"from_group" => $this->postParam("type") === "post" && $post->getTargetWall() < 0 ?
((int)$post->isPostedOnBehalfOfGroup()) : "false",
"new_text" => $post->getText(false),
"author" => [
"name" => $post->getOwner()->getCanonicalName(),
"avatar" => $post->getOwner()->getAvatarUrl()
]]);
}
}

View file

@ -175,7 +175,7 @@
<a href="{$thisUser->getURL()}" class="link" title="{_my_page} [Alt+Shift+.]" accesskey=".">{_my_page}</a>
<a href="/friends{$thisUser->getId()}" class="link">{_my_friends}
<object type="internal/link" n:if="$thisUser->getFollowersCount() > 0">
<a href="/friends{$thisUser->getId()}?act=incoming">
<a href="/friends{$thisUser->getId()}?act=incoming" class="linkunderline">
(<b>{$thisUser->getFollowersCount()}</b>)
</a>
</object>
@ -195,7 +195,7 @@
(<b>{$thisUser->getNotificationsCount()}</b>)
{/if}
</a>
<a href="/apps?act=installed" class="link">{_my_apps}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('apps')" href="/apps?act=installed" class="link">{_my_apps}</a>
<a href="/settings" class="link">{_my_settings}</a>
{var $canAccessAdminPanel = $thisUser->getChandlerUser()->can("access")->model("admin")->whichBelongsTo(NULL)}
@ -300,7 +300,7 @@
</div>
</div>
{ifset $thisUser}
{if !$thisUser->isBanned()}
{if !$thisUser->isBanned() && !$thisUser->isDeleted()}
</div>
{/if}
{/ifset}

View file

@ -106,13 +106,31 @@
<span class="nobold">{_block_params}:</span>
</td>
<td>
<select name="ban_type" id="noSpam-ban-type">
<select name="ban_type" id="noSpam-ban-type" style="width: 140px;"
<option value="1">{_only_rollback}</option>
<option value="2">{_only_block}</option>
<option value="3">{_rollback_and_block}</option>
</select>
</td>
</tr>
<tr class="banSettings" style="width: 129px; border-top: 1px solid #ECECEC; display: none;">
<td>
<span class="nobold">Причина:</span>
</td>
<td>
<input type="text" name="ban-reason" id="ban-reason" style="width: 140px;" />
</td>
</tr>
<tr class="banSettings" style="width: 129px; border-top: 1px solid #ECECEC; display: none;">
<td>
<span class="nobold">До:</span>
</td>
<td>
<input type="datetime-local" name="unban-time" id="unban-time" style="width: 140px;" />
<br />
<input type="checkbox" name="is_forever" id="is-forever" /> навсегда
</td>
</tr>
</tbody>
</table>
<div style="border-top: 1px solid #ECECEC; margin: 8px 0;"/>
@ -158,7 +176,6 @@
$("#noSpam-results-loader").show();
$("#noSpam-loader").show();
let models = [];
$(".model").each(function (i) {
let name = $(this).val();
@ -178,6 +195,10 @@
let ts = $("#ts").val() ? Math.floor(new Date($("#ts").val()).getTime() / 1000) : null;
let te = $("#te").val() ? Math.floor(new Date($("#te").val()).getTime() / 1000) : null;
let user = $("#user").val();
let ban_reason = $("#ban-reason").val();
let unban_time = $("#unban-time").val() ? Math.floor(new Date($("#unban-time").val()).getTime() / 1000) : null;
let is_forever = $("#is-forever").prop('checked');
console.log(ban_reason, unban_time, is_forever);
await $.ajax({
type: "POST",
@ -193,6 +214,9 @@
ts: ts,
te: te,
user: user,
ban_reason: ban_reason,
unban_time: unban_time,
is_forever: is_forever,
hash: {=$csrfToken}
},
success: (response) => {
@ -277,6 +301,17 @@
selectChange(e.target.value);
})
$("#noSpam-ban-type").change(async (e) => {
if (e.target.value > 1) {
$(".banSettings").show();
} else {
$("#ban-reason").val(null);
$("#unban-time").val(null);
$("#is-forever").prop('checked', false);
$(".banSettings").hide();
}
});
$("#add-model").on("click", () => {
console.log($(".model").length);
$("#models-list").append(`

View file

@ -14,6 +14,15 @@
{/block}
{block content}
<div class="tabs">
<div id="activetabs" class="tab">
<a id="act_tab_a" href="/album{$album->getPrettyId()}/edit">{_edit_album}</a>
</div>
<div class="tab">
<a href="/photos/upload?album={$album->getPrettyId()}">{_add_photos}</a>
</div>
</div>
<form method="post" enctype="multipart/form-data">
<table cellspacing="6">
<tbody>

View file

@ -2,9 +2,13 @@
{block title}{_upload_photo}{/block}
{block header}
<a href="{$thisUser->getURL()}">{$thisUser->getCanonicalName()}</a>
<a href="{$album->getOwner()->getURL()}">{$album->getOwner()->getCanonicalName()}</a>
»
<a href="/albums{$thisUser->getId()}">{_albums}</a>
{if $album->getOwner() instanceof openvk\Web\Models\Entities\Club}
<a href="/albums{$album->getOwner()->getId() * -1}">{_albums}</a>
{else}
<a href="/albums{$album->getOwner()->getId()}">{_albums}</a>
{/if}
»
<a href="/album{$album->getPrettyId()}">{$album->getName()}</a>
»
@ -12,32 +16,53 @@
{/block}
{block content}
<form action="/photos/upload?album={$album->getPrettyId()}" method="post" enctype="multipart/form-data">
<table cellspacing="6">
<tbody>
<tr>
<td width="120" valign="top"><span class="nobold">{_description}:</span></td>
<td><textarea style="margin: 0px; height: 50px; width: 159px; resize: none;" name="desc"></textarea></td>
</tr>
<tr>
<td width="120" valign="top"><span class="nobold">{_photo}:</span></td>
<td>
<label class="button" style="">{_browse}
<input type="file" id="blob" name="blob" style="display: none;" onchange="filename.innerHTML=blob.files[0].name" />
</label>
<div id="filename" style="margin-top: 10px;"></div>
</td>
</tr>
<tr>
<td width="120" valign="top"></td>
<td>
<input type="hidden" name="hash" value="{$csrfToken}" />
<input type="submit" class="button" name="submit" value="Загрузить" />
</td>
</tr>
</tbody>
</table>
<input n:ifset="$_GET['album']" type="hidden" name="album" value="{$_GET['album']}" />
</form>
<div class="tabs">
<div class="tab">
<a href="/album{$album->getPrettyId()}/edit">{_edit_album}</a>
</div>
<div id="activetabs" class="tab">
<a id="act_tab_a" href="#">{_add_photos}</a>
</div>
</div>
<input type="file" accept=".jpg,.png,.gif" name="files[]" multiple class="button" id="uploadButton" style="display:none">
<div class="container_gray" style="min-height: 344px;">
<div class="insertThere"></div>
<div class="whiteBox" style="display: block;">
<div class="boxContent">
<h4>{_uploading_photos_from_computer}</h4>
<div class="limits" style="margin-top:17px">
<b style="color:#45688E">{_admin_limits}</b>
<ul class="blueList" style="margin-left: -25px;margin-top: 1px;">
<li>{_supported_formats}</li>
<li>{_max_load_photos}</li>
</ul>
<div style="text-align: center;padding-top: 4px;" class="insertAgain">
<input type="button" class="button" id="fakeButton" onclick="uploadButton.click()" value="{_upload_picts}">
</div>
<div class="tipping" style="margin-top: 19px;">
<span style="line-height: 15px"><b>{_tip}</b>: {_tip_ctrl}</span>
</div>
</div>
</div>
</div>
<div class="insertPhotos" id="photos" style="margin-top: 9px;padding-bottom: 12px;"></div>
<input type="button" class="button" style="display:none;margin-left: auto;margin-right: auto;" id="endUploading" value="{_end_uploading}">
</div>
<input n:ifset="$_GET['album']" type="hidden" id="album" value="{$_GET['album']}" />
<script>
uploadButton.value = ''
</script>
{/block}
{block bodyScripts}
{script "js/al_photos.js"}
{/block}

View file

@ -16,7 +16,7 @@
{elseif $type == "group" || $type == "user"}
{include "../components/group.xml", group => $object, isUser => $type == "user"}
{elseif $type == "comment"}
{include "../components/comment.xml", comment => $object, timeOnly => true}
{include "../components/comment.xml", comment => $object, timeOnly => true, linkWithPost => true}
{elseif $type == "note"}
{include "./content/note.xml", note => $object}
{elseif $type == "app"}

View file

@ -650,6 +650,16 @@
<td>
<span class="nobold">{_my_feed}</span>
</td>
</tr><tr>
<td width="120" valign="top" align="right" align="right">
<input
n:attr="checked => $user->getLeftMenuItemStatus('apps')"
type="checkbox"
name="menu_aplikoj" />
</td>
<td>
<span class="nobold">{_my_apps}</span>
</td>
</tr><tr n:if="sizeof(OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links']) > 0">
<td width="120" valign="top" align="right" align="right">
<input

View file

@ -34,6 +34,14 @@
{/if}
<a n:if="$canDelete ?? false" class="profile_link" style="display:block;width:96%;" href="/wall{$post->getPrettyId()}/delete">{_delete}</a>
<a
n:if="$thisUser->getChandlerUser()->can('access')->model('admin')->whichBelongsTo(NULL) AND $post->getEditTime()"
style="display:block;width:96%;"
class="profile_link"
href="/admin/logs?type=1&obj_type=Post&obj_id={$post->getId()}"
>
{_changes_history}
</a>
<a n:if="$canReport ?? false" class="profile_link" style="display:block;width:96%;" href="javascript:reportPost()">{_report}</a>
</div>
<script n:if="$canReport ?? false">

View file

@ -8,19 +8,19 @@
<tr>
<td width="30" valign="top">
<a href="{$author->getURL()}">
<img src="{$author->getAvatarURL('miniscule')}" width="30" class="cCompactAvatars" />
<img src="{$author->getAvatarURL('miniscule')}" width="30" class="cCompactAvatars post-avatar" />
</a>
</td>
<td width="100%" valign="top">
<div class="post-author">
<a href="{$author->getURL()}"><b>
<a href="{$author->getURL()}"><b class="post-author-name">
{$author->getCanonicalName()}
</b></a>
<img n:if="$author->isVerified()" class="name-checkmark" src="/assets/packages/static/openvk/img/checkmark.png"><br/>
</div>
<div class="post-content" id="{$comment->getId()}">
<div class="text" id="text{$comment->getId()}">
{$comment->getText()|noescape}
<span data-text="{$comment->getText(false)}" class="really_text">{$comment->getText()|noescape}</span>
<div n:ifcontent class="attachments_b">
<div class="attachment" n:foreach="$comment->getChildren() as $attachment" data-localized-nsfw-text="{_nsfw_warning}">
@ -29,12 +29,17 @@
</div>
</div>
<div n:if="isset($thisUser) &&! ($compact ?? false)" class="post-menu">
<a href="#_comment{$comment->getId()}" class="date">{$comment->getPublicationTime()}</a>
<a href="#_comment{$comment->getId()}" class="date">{$comment->getPublicationTime()}
<span n:if="$comment->getEditTime()" class="edited editedMark">({_edited_short})</span>
</a>
{if !$timeOnly}
&nbsp;|
{if $comment->canBeDeletedBy($thisUser)}
<a href="/comment{$comment->getId()}/delete">{_delete}</a>&nbsp;|
{/if}
{if $comment->canBeEditedBy($thisUser)}
<a id="editPost" data-id="{$comment->getId()}">{_edit}</a>&nbsp;|
{/if}
<a class="comment-reply">{_reply}</a>
{if $thisUser->getId() != $comment->getOwner()->getId()}
{var $canReport = true}

View file

@ -18,13 +18,13 @@
<tr>
<td width="54" valign="top">
<a href="{$author->getURL()}">
<img src="{$author->getAvatarURL('miniscule')}" width="{if $compact}25{else}50{/if}" {if $compact}class="cCompactAvatars"{/if} />
<img src="{$author->getAvatarURL('miniscule')}" width="{if $compact}25{else}50{/if}" class="post-avatar {if $compact}cCompactAvatars{/if}" />
<span n:if="!$post->isPostedOnBehalfOfGroup() && !$compact && $author->isOnline()" class="post-online">{_online}</span>
</a>
</td>
<td width="100%" valign="top">
<div class="post-author">
<a href="{$author->getURL()}"><b>{$author->getCanonicalName()}</b></a>
<a href="{$author->getURL()}"><b class="post-author-name">{$author->getCanonicalName()}</b></a>
<img n:if="$author->isVerified()" class="name-checkmark" src="/assets/packages/static/openvk/img/checkmark.png">
{$post->isDeactivationMessage() ? ($author->isFemale() ? tr($deac . "_f") : tr($deac . "_m"))}
{$post->isUpdateAvatarMessage() && !$post->isPostedOnBehalfOfGroup() ? ($author->isFemale() ? tr("upd_f") : tr("upd_m"))}
@ -62,11 +62,18 @@
<a class="pin" href="/wall{$post->getPrettyId()}/pin?act=pin&hash={rawurlencode($csrfToken)}"></a>
{/if}
{/if}
{if $post->canBeEditedBy($thisUser) && !($forceNoEditLink ?? false) && $compact == false}
<a class="edit" id="editPost"
data-id="{$post->getId()}"
data-nsfw="{(int)$post->isExplicit()}"
{if $post->getTargetWall() < 0 && $post->getWallOwner()->canBeModifiedBy($thisUser)}data-fromgroup="{(int)$post->isPostedOnBehalfOfGroup()}"{/if}></a>
{/if}
</div>
<div class="post-content" id="{$post->getPrettyId()}">
<div class="text" id="text{$post->getPrettyId()}">
{$post->getText()|noescape}
<div class="text">
<span data-text="{$post->getText(false)}" class="really_text">{$post->getText()|noescape}</span>
<div n:ifcontent class="attachments_b">
<div class="attachment" n:foreach="$post->getChildren() as $attachment" data-localized-nsfw-text="{_nsfw_warning}">
{include "../attachment.xml", attachment => $attachment}
@ -88,13 +95,15 @@
</div>
</div>
<div class="post-menu" n:if="$compact == false">
<a href="/wall{$post->getPrettyId()}" class="date">{$post->getPublicationTime()}</a>
<a href="/wall{$post->getPrettyId()}" class="date">{$post->getPublicationTime()}
<span n:if="$post->getEditTime()" class="edited editedMark">({_edited_short})</span>
</a>
<a n:if="!empty($platform)" class="client_app" data-app-tag="{$platform}" data-app-name="{$platformDetails['name']}" data-app-url="{$platformDetails['url']}" data-app-img="{$platformDetails['img']}">
<img src="/assets/packages/static/openvk/img/app_icons_mini/{$post->getPlatform(this)}.svg">
</a>
{if isset($thisUser)}
&nbsp;
<a n:if="!($forceNoCommentsLink ?? false) && $commentsCount == 0" href="javascript:expand_comment_textarea({$commentTextAreaId})">{_comment}</a>
<div class="like_wrap">

View file

@ -7,18 +7,20 @@
{var $deac = "post_deact_silent"}
{/if}
<table border="0" style="font-size: 11px;" n:class="post, $post->isExplicit() ? post-nsfw">
<tbody>
<tr>
<td width="54" valign="top">
<a href="{$author->getURL()}">
<img src="{$author->getAvatarURL('miniscule')}" width="50" />
<img src="{$author->getAvatarURL('miniscule')}" class="post-avatar" width="50" />
<span n:if="!$post->isPostedOnBehalfOfGroup() && !($compact ?? false) && $author->isOnline()" class="post-online">{_online}</span>
</a>
</td>
<td width="100%" valign="top">
<div class="post-author">
<a href="{$author->getURL()}"><b>{$author->getCanonicalName()}</b></a>
<a href="{$author->getURL()}"><b class="post-author-name">{$author->getCanonicalName()}</b></a>
<img n:if="$author->isVerified()" class="name-checkmark" src="/assets/packages/static/openvk/img/checkmark.png">
{if $post->isDeactivationMessage()}
{$author->isFemale() ? tr($deac . "_f") : tr($deac . "_m")}
@ -51,16 +53,18 @@
{/if}
<br/>
<a href="/wall{$post->getPrettyId()}" class="date">
{$post->getPublicationTime()}{if $post->isPinned()}, {_pinned}{/if}
{$post->getPublicationTime()} <span n:if="$post->getEditTime()" class="editedMark">({_edited_short})</span>{if $post->isPinned()}, {_pinned}{/if}
<a n:if="!empty($platform)" class="client_app" data-app-tag="{$platform}" data-app-name="{$platformDetails['name']}" data-app-url="{$platformDetails['url']}" data-app-img="{$platformDetails['img']}">
<img src="/assets/packages/static/openvk/img/app_icons_mini/{$post->getPlatform(this)}.svg">
</a>
</a>
</div>
<div class="post-content" id="{$post->getPrettyId()}">
<div class="text" id="text{$post->getPrettyId()}">
{$post->getText()|noescape}
<div class="text">
{var $owner = $author->getId()}
<span data-text="{$post->getText(false)}" class="really_text">{$post->getText()|noescape}</span>
<div n:ifcontent class="attachments_b">
<div class="attachment" n:foreach="$post->getChildren() as $attachment" data-localized-nsfw-text="{_nsfw_warning}">
{include "../attachment.xml", attachment => $attachment}
@ -87,6 +91,13 @@
{var $forceNoPinLink = true}
{/if}
{if !($forceNoEditLink ?? false) && $post->canBeEditedBy($thisUser)}
<a id="editPost"
data-id="{$post->getId()}"
data-nsfw="{(int)$post->isExplicit()}"
{if $post->getTargetWall() < 0 && $post->getWallOwner()->canBeModifiedBy($thisUser)}data-fromgroup="{(int)$post->isPostedOnBehalfOfGroup()}"{/if}>{_edit}</a> &nbsp;|&nbsp;
{/if}
{if !($forceNoDeleteLink ?? false) && $post->canBeDeletedBy($thisUser)}
<a href="/wall{$post->getPrettyId()}/delete">{_delete}</a> &nbsp;|&nbsp;
{/if}

View file

@ -5,8 +5,10 @@
<td valign="top">
<div class="video-preview">
<a href="/video{$video->getPrettyId()}">
<img src="{$video->getThumbnailURL()}"
style="max-width: 170px; max-height: 127px; margin: auto;" >
<div class="video-preview">
<img src="{$video->getThumbnailURL()}"
style="max-width: 170px; max-height: 127px; margin: auto;" >
</div>
</a>
</div>
</td>
@ -33,5 +35,5 @@
</td>
</tr>
</tbody>
</table
</table>
{/block}

View file

@ -129,6 +129,8 @@ routes:
handler: "Wall->rss"
- url: "/wall{num}/makePost"
handler: "Wall->makePost"
- url: "/wall/edit"
handler: "Wall->edit"
- url: "/wall{num}_{num}"
handler: "Wall->post"
- url: "/wall{num}_{num}/like"

View file

@ -29,6 +29,10 @@ a {
cursor: pointer;
}
.linkunderline:hover {
text-decoration: underline;
}
p {
margin: 5px 0;
}
@ -2696,4 +2700,115 @@ body.article .floating_sidebar, body.article .page_content {
position: absolute;
right: 22px;
font-size: 12px;
}
}
.edited {
color: #9b9b9b;
}
.uploadedImage img {
max-height: 76px;
object-fit: cover;
}
.lagged {
filter: opacity(0.5);
cursor: progress;
user-select: none;
}
.editMenu.loading {
filter: opacity(0.5);
cursor: progress;
user-select: none;
}
.editMenu.loading * {
pointer-events: none;
}
.lagged * {
pointer-events: none;
}
.button.dragged {
background: #c4c4c4 !important;
border-color: #c4c4c4 !important;
color: black !important;
}
.whiteBox {
background: white;
width: 421px;
margin-left: auto;
margin-right: auto;
border: 1px solid #E8E8E8;
margin-top: 7%;
height: 231px;
}
.boxContent {
padding: 24px 38px;
}
.blueList {
list-style-type: none;
}
.blueList li {
color: black;
font-size: 11px;
padding-top: 7px;
}
.blueList li::before {
content: " ";
width: 5px;
height: 5px;
display: inline-block;
vertical-align: bottom;
background-color: #73889C;
margin: 3px;
margin-left: 2px;
margin-right: 7px;
}
.insertedPhoto {
background: white;
border: 1px solid #E8E7EA;
padding: 10px;
height: 100px;
margin-top: 6px;
}
.uploadedImage {
float: right;
display: flex;
flex-direction: column;
}
.uploadedImageDescription {
width: 449px;
}
.uploadedImageDescription textarea {
width: 84%;
height: 86px;
}
.smallFrame {
border: 1px solid #E1E3E5;
background: #F0F0F0;
height: 33px;
text-align: center;
cursor: pointer;
}
.smallFrame .smallBtn {
margin-top: 10px;
}
.smallFrame:hover {
background: #E9F0F1 !important;
}

View file

@ -110,10 +110,24 @@
transition-duration: 0.3s;
}
.post-author .edit {
float: right;
height: 16px;
width: 16px;
overflow: auto;
background: url("/assets/packages/static/openvk/img/edit.png") no-repeat 0 0;
opacity: 0.1;
transition-duration: 0.3s;
}
.post-author .pin:hover {
opacity: 0.4;
}
.post-author .edit:hover {
opacity: 0.4;
}
.expand_button {
background-color: #eee;
width: 100%;

BIN
Web/static/img/edit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

198
Web/static/js/al_photos.js Normal file
View file

@ -0,0 +1,198 @@
$(document).on("change", "#uploadButton", (e) => {
let iterator = 0
if(e.currentTarget.files.length > 10) {
MessageBox(tr("error"), tr("too_many_pictures"), [tr("ok")], [() => {Function.noop}])
return;
}
for(const file of e.currentTarget.files) {
if(!file.type.startsWith('image/')) {
MessageBox(tr("error"), tr("only_images_accepted", escapeHtml(file.name)), [tr("ok")], [() => {Function.noop}])
return;
}
if(file.size > 5 * 1024 * 1024) {
MessageBox(tr("error"), tr("max_filesize", 5), [tr("ok")], [() => {Function.noop}])
return;
}
}
if(document.querySelector(".whiteBox").style.display == "block") {
document.querySelector(".whiteBox").style.display = "none"
document.querySelector(".insertThere").append(document.getElementById("fakeButton"));
}
let photos = new FormData()
for(file of e.currentTarget.files) {
photos.append("photo_"+iterator, file)
iterator += 1
}
photos.append("count", e.currentTarget.files.length)
photos.append("hash", u("meta[name=csrf]").attr("value"))
let xhr = new XMLHttpRequest()
xhr.open("POST", "/photos/upload?album="+document.getElementById("album").value)
xhr.onloadstart = () => {
document.querySelector(".insertPhotos").insertAdjacentHTML("beforeend", `<img id="loader" src="/assets/packages/static/openvk/img/loading_mini.gif">`)
}
xhr.onload = () => {
let result = JSON.parse(xhr.responseText)
if(result.success) {
u("#loader").remove()
let photosArr = result.photos
for(photo of photosArr) {
let table = document.querySelector(".insertPhotos")
table.insertAdjacentHTML("beforeend", `
<div id="photo" class="insertedPhoto" data-id="${photo.id}">
<div class="uploadedImageDescription" style="float: left;">
<span style="color: #464646;position: absolute;">${tr("description")}:</span>
<textarea style="margin-left: 62px; resize: none;" maxlength="255"></textarea>
</div>
<div class="uploadedImage">
<a href="${photo.link}" target="_blank"><img width="125" src="${photo.url}"></a>
<a class="profile_link" style="width: 125px;" id="deletePhoto" data-id="${photo.vid}" data-owner="${photo.owner}">${tr("delete")}</a>
<!--<div class="smallFrame" style="margin-top: 6px;">
<div class="smallBtn">${tr("album_poster")}</div>
</div>-->
</div>
</div>
`)
}
document.getElementById("endUploading").style.display = "block"
} else {
u("#loader").remove()
MessageBox(tr("error"), escapeHtml(result.flash.message) ?? tr("error_uploading_photo"), [tr("ok")], [() => {Function.noop}])
}
}
xhr.send(photos)
})
$(document).on("click", "#endUploading", (e) => {
let table = document.querySelector("#photos")
let data = new FormData()
let arr = new Map();
for(el of table.querySelectorAll("div#photo")) {
arr.set(el.dataset.id, el.querySelector("textarea").value)
}
data.append("photos", JSON.stringify(Object.fromEntries(arr)))
data.append("hash", u("meta[name=csrf]").attr("value"))
let xhr = new XMLHttpRequest()
// в самом вк на каждое изменение описания отправляется свой запрос, но тут мы экономим запросы
xhr.open("POST", "/photos/upload?act=finish&album="+document.getElementById("album").value)
xhr.onloadstart = () => {
e.currentTarget.setAttribute("disabled", "disabled")
}
xhr.onerror = () => {
MessageBox(tr("error"), tr("error_uploading_photo"), [tr("ok")], [() => {Function.noop}])
}
xhr.onload = () => {
let result = JSON.parse(xhr.responseText)
if(!result.success) {
MessageBox(tr("error"), escapeHtml(result.flash.message), [tr("ok")], [() => {Function.noop}])
} else {
document.querySelector(".page_content .insertPhotos").innerHTML = ""
document.getElementById("endUploading").style.display = "none"
NewNotification(tr("photos_successfully_uploaded"), tr("click_to_go_to_album"), null, () => {window.location.assign(`/album${result.owner}_${result.album}`)})
document.querySelector(".whiteBox").style.display = "block"
document.querySelector(".insertAgain").append(document.getElementById("fakeButton"))
}
e.currentTarget.removeAttribute("disabled")
}
xhr.send(data)
})
$(document).on("click", "#deletePhoto", (e) => {
let data = new FormData()
data.append("hash", u("meta[name=csrf]").attr("value"))
let xhr = new XMLHttpRequest()
xhr.open("POST", `/photo${e.currentTarget.dataset.owner}_${e.currentTarget.dataset.id}/delete`)
xhr.onloadstart = () => {
e.currentTarget.closest("div#photo").classList.add("lagged")
}
xhr.onerror = () => {
MessageBox(tr("error"), tr("unknown_error"), [tr("ok")], [() => {Function.noop}])
}
xhr.onload = () => {
u(e.currentTarget.closest("div#photo")).remove()
if(document.querySelectorAll("div#photo").length < 1) {
document.getElementById("endUploading").style.display = "none"
document.querySelector(".whiteBox").style.display = "block"
document.querySelector(".insertAgain").append(document.getElementById("fakeButton"))
}
}
xhr.send(data)
})
$(document).on("dragover drop", (e) => {
e.preventDefault()
return false;
})
$(".container_gray").on("dragover", (e) => {
e.preventDefault()
document.querySelector("#fakeButton").classList.add("dragged")
document.querySelector("#fakeButton").value = tr("drag_files_here")
})
$(".container_gray").on("dragleave", (e) => {
e.preventDefault()
document.querySelector("#fakeButton").classList.remove("dragged")
document.querySelector("#fakeButton").value = tr("upload_picts")
})
$(".container_gray").on("drop", (e) => {
e.originalEvent.dataTransfer.dropEffect = 'move';
e.preventDefault()
$(".container_gray").trigger("dragleave")
let files = e.originalEvent.dataTransfer.files
for(const file of files) {
if(!file.type.startsWith('image/')) {
MessageBox(tr("error"), tr("only_images_accepted", escapeHtml(file.name)), [tr("ok")], [() => {Function.noop}])
return;
}
if(file.size > 5 * 1024 * 1024) {
MessageBox(tr("error"), tr("max_filesize", 5), [tr("ok")], [() => {Function.noop}])
return;
}
}
document.getElementById("uploadButton").files = files
u("#uploadButton").trigger("change")
})
u(".container_gray").on("paste", (e) => {
if(e.clipboardData.files.length > 0 && e.clipboardData.files.length < 10) {
document.getElementById("uploadButton").files = e.clipboardData.files;
u("#uploadButton").trigger("change")
}
})

View file

@ -262,4 +262,112 @@ async function showArticle(note_id) {
u("#articleText").html(`<h1 class="articleView_nameHeading">${note.title}</h1>` + note.html);
u("body").removeClass("dimmed");
u("body").addClass("article");
}
}
$(document).on("click", "#editPost", (e) => {
let post = e.currentTarget.closest("table")
let content = post.querySelector(".text")
let text = content.querySelector(".really_text")
if(content.querySelector("textarea") == null) {
content.insertAdjacentHTML("afterbegin", `
<div class="editMenu">
<div id="wall-post-input999">
<textarea id="new_content">${text.dataset.text}</textarea>
<input type="button" class="button" value="${tr("save")}" id="endEditing">
<input type="button" class="button" value="${tr("cancel")}" id="cancelEditing">
</div>
${e.currentTarget.dataset.nsfw != null ? `
<div class="postOptions">
<label><input type="checkbox" id="nswfw" ${e.currentTarget.dataset.nsfw == 1 ? `checked` : ``}>${tr("contains_nsfw")}</label>
</div>
` : ``}
${e.currentTarget.dataset.fromgroup != null ? `
<div class="postOptions">
<label><input type="checkbox" id="fromgroup" ${e.currentTarget.dataset.fromgroup == 1 ? `checked` : ``}>${tr("post_as_group")}</label>
</div>
` : ``}
</div>
`)
u(content.querySelector("#cancelEditing")).on("click", () => {post.querySelector("#editPost").click()})
u(content.querySelector("#endEditing")).on("click", () => {
let nwcntnt = content.querySelector("#new_content").value
let type = "post"
if(post.classList.contains("comment")) {
type = "comment"
}
let xhr = new XMLHttpRequest()
xhr.open("POST", "/wall/edit")
xhr.onloadstart = () => {
content.querySelector(".editMenu").classList.add("loading")
}
xhr.onerror = () => {
MessageBox(tr("error"), "unknown error occured", [tr("ok")], [() => {Function.noop}])
}
xhr.ontimeout = () => {
MessageBox(tr("error"), "Try to refresh page", [tr("ok")], [() => {Function.noop}])
}
xhr.onload = () => {
let result = JSON.parse(xhr.responseText)
if(result.error == "no") {
post.querySelector("#editPost").click()
content.querySelector(".really_text").innerHTML = result.new_content
if(post.querySelector(".editedMark") == null) {
post.querySelector(".date").insertAdjacentHTML("beforeend", `
<span class="edited editedMark">(${tr("edited_short")})</span>
`)
}
if(e.currentTarget.dataset.nsfw != null) {
e.currentTarget.setAttribute("data-nsfw", result.nsfw)
if(result.nsfw == 0) {
post.classList.remove("post-nsfw")
} else {
post.classList.add("post-nsfw")
}
}
if(e.currentTarget.dataset.fromgroup != null) {
e.currentTarget.setAttribute("data-fromgroup", result.from_group)
}
post.querySelector(".post-avatar").setAttribute("src", result.author.avatar)
post.querySelector(".post-author-name").innerHTML = result.author.name
post.querySelector(".really_text").setAttribute("data-text", result.new_text)
} else {
MessageBox(tr("error"), result.error, [tr("ok")], [Function.noop])
post.querySelector("#editPost").click()
}
}
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send("postid="+e.currentTarget.dataset.id+
"&newContent="+nwcntnt+
"&hash="+encodeURIComponent(u("meta[name=csrf]").attr("value"))+
"&type="+type+
"&nsfw="+(content.querySelector("#nswfw") != null ? content.querySelector("#nswfw").checked : 0)+
"&fromgroup="+(content.querySelector("#fromgroup") != null ? content.querySelector("#fromgroup").checked : 0))
})
u(".editMenu").on("keydown", (e) => {
if(e.ctrlKey && e.keyCode === 13)
content.querySelector("#endEditing").click()
});
text.style.display = "none"
setupWallPostInputHandlers(999)
} else {
u(content.querySelector(".editMenu")).remove()
text.style.display = "block"
}
})

View file

@ -219,6 +219,8 @@
"reply" = "Reply";
"post_is_ad" = "This post is sponsored.";
"edited_short" = "edited";
/* Friends */
"friends" = "Friends";
@ -391,6 +393,25 @@
"upd_f" = "updated her profile picture";
"upd_g" = "updated group's picture";
"add_photos" = "Add photos";
"upload_picts" = "Upload photos";
"end_uploading" = "Finish uploading";
"photos_successfully_uploaded" = "Photos successfully uploaded";
"click_to_go_to_album" = "Click here to go to album.";
"error_uploading_photo" = "Error when uploading photo";
"too_many_pictures" = "No more than 10 pictures";
"drag_files_here" = "Drag files here";
"only_images_accepted" = "File \"$1\" is not an image";
"max_filesize" = "Max filesize is $1 MB";
"uploading_photos_from_computer" = "Uploading photos from Your computer";
"supported_formats" = "Supported file formats: JPG, PNG and GIF.";
"max_load_photos" = "You can upload up to 10 photos at a time.";
"tip" = "Tip";
"tip_ctrl" = "to select multiple photos at once, hold down the Ctrl key when selecting files in Windows or the CMD key in Mac OS.";
"album_poster" = "Album poster";
/* Notes */
"notes" = "Notes";
@ -1098,6 +1119,7 @@
"error_data_too_big" = "Attribute '$1' must be at most $2 $3 long";
"forbidden" = "Access error";
"unknown_error" = "Unknown error";
"forbidden_comment" = "This user's privacy settings do not allow you to look at his page.";
"changes_saved" = "Changes saved";
@ -1149,6 +1171,7 @@
"media_file_corrupted_or_too_large" = "The media content file is corrupted or too large.";
"post_is_empty_or_too_big" = "The post is empty or too big.";
"post_is_too_big" = "The post is too big.";
"error_sending_report" = "Failed to make a report...";
"error_when_saving_gift" = "Error when saving gift";
@ -1238,6 +1261,8 @@
"group_owner_is_banned" = "Group's owner was successfully banned";
"group_is_banned" = "Group was successfully banned";
"description_too_long" = "Description is too long.";
/* Admin actions */
"login_as" = "Login as $1";
@ -1250,6 +1275,7 @@
"warn_user_action" = "Warn user";
"ban_in_support_user_action" = "Ban in support";
"unban_in_support_user_action" = "Unban in support";
"changes_history" = "Editing history";
/* Admin panel */

View file

@ -17,6 +17,7 @@
"password" = "Գաղտնաբառ";
"registration" = "Գրանցում";
"forgot_password" = "Մոռացե՞լ եք գաղտնաբառը";
"checkbox_in_registration" = "Ես համաձայն եմ <a href='/privacy'>կոնֆիդենցիալության քաղաքականությանն</a> ու <a href='/terms'>կայքի կանոնադրությանը</a>։";
"checkbox_in_registration_unchecked" = "Դուք պետք է համաձայնվեք պայմանների հետ նախքան գրանցվելը։";
@ -54,8 +55,11 @@
"register_meta_desc" = "Գրանցվեք $1 -ում հենց հիմա՛";
"register_referer_meta_title" = "$1 -ն հրավիրում է ձեզ դեպի $2";
"register_referer_meta_desc" = "Միացե՛ք $1 -ին և բազմաթիվ օգտատերերին $2 -ու՛մ";
"registration_welcome_1" = "յուրահատուկ գործընկերների որոնման գործիք է, հիմնված ՎԿոնտակտե–ի կառուցվաշքի վրա։";
"registration_welcome_2" = "Մենք ցանկանում ենք, որպեսզի Ձեր ընկերները, դասարանցիները, հարևանները և գործընկերները միշտ մնան կապի մեջ։";
"users" = "Օգտատերեր";
"other_fields" = "Այլ դաշտեր";
/* Profile information */
@ -75,18 +79,20 @@
"female" = "իգական";
"description" = "Նկարագրություն";
"save" = "Պահպանել";
"main_information" = "Հիմնական ինֆորմացիա";
"main_information" = "Հիմնական տեղեկություն";
"additional_information" = "Հավելյալ տեղեկություն";
"nickname" = "Մականուն";
"online" = "Օնլայն";
"was_online" = "եղել է ցանցում";
"was_online_m" = "եղել է ցանցում";
"was_online_f" = "եղել է ցանցում";
"all_title" = "Բոլորը";
"information" = "Ինֆորմացիա";
"information" = "Տեղեկություն";
"status" = "Կարգավիճակ";
"no_information_provided" = "Ինֆորմացիան բացակայում է";
"no_information_provided" = "Տեղեկությունը բացակայում է";
"deceased_person" = "Վախճանված";
"none" = "բացակայում է";
"desc_none" = "առանց նկարագրության";
"send" = "ուղարկել";
"years_zero" = "Զրո տարեկան";
@ -98,7 +104,7 @@
"show_my_birthday" = "Ցույց տալ ծննդյան օրը";
"show_only_month_and_day" = "Ցուցադրել միայն ամիսն ու օրը";
"relationship" = "Ընտանեկան դրություն";
"relationship" = "Կարգավիճակ";
"relationship_0" = "Ընտրված չէ";
"relationship_1" = "Չամուսնացած եմ";
@ -128,7 +134,7 @@
"politViews_8" = "Ուլտրակոնսերվատիվ";
"politViews_9" = "Լիբերտարիանական";
"contact_information" = "Կոնտակտային ինֆորմացիա";
"contact_information" = "Կոնտակտային տեղեկատվություն";
"email" = "Էլեկտրոնային հասցե";
"phone" = "Հեռախոս";
@ -137,7 +143,7 @@
"city" = "Քաղաք";
"address" = "Հասցե";
"personal_information" = "Անձնական ինֆորմացիա";
"personal_information" = "Անձնական տեղեկատվություն";
"interests" = "Հետաքրքրություններ";
"favorite_music" = "Սիրված երգ";
@ -150,7 +156,7 @@
"updated_at" = "Թարմացված է $1";
"user_banned" = "Ցավո՛ք, մենք ստիպված կասեցրել ենք <b>$1</b>-ի էջը։";
"user_banned_comment" = "Մոդերատորի մեկնաբանությունը";
"user_banned_comment" = "Մոդերատորի մեկնաբանությունը.";
/* Wall */
@ -163,6 +169,9 @@
"post_deact_f" = "ջնջել է էջը հետևյալ բառերով.";
"post_deact_silent_m" = "սուս ու փուս ջնջել է էջը։";
"post_deact_silent_f" = "սուս ու փուս ջնջել է էջը։";
"post_on_your_wall" = "Ձեր պատին";
"post_on_group_wall" = "$1 –ին";
"post_on_user_wall" = "$1 –ի պատին";
"wall" = "Պատ";
"post" = "Գրություն";
"write" = "Գրել";
@ -194,9 +203,9 @@
"attachment" = "Հավելում";
"post_as_group" = "Խմբի անունից";
"comment_as_group" = "Մեկնաբանել խմբի անունից";
"add_signature" = "Հեղինակի ստորագրություն";
"add_signature" = "Ավելացնել ստորագրություն";
"contains_nsfw" = "Պարունակում է NSFW մատերիալ";
"nsfw_warning" = "Այս պոստը կարող է պարունակել 18+ մատերիալ";
"nsfw_warning" = "Այս գրությունը կարող է պարունակել 18+ մատերիալ";
"report" = "Բողոքարկել";
"attach" = "Ամրացնել";
"attach_photo" = "Ամրացնել նկար";
@ -214,47 +223,37 @@
/* Friends */
"friends" = "Ընկերներ";
"followers" = "Բաժանորդներ";
"follower" = "Բաժանորդ";
"followers" = "Հետևորդներ";
"follower" = "Հետևորդ";
"friends_add" = "Ավելացնել դեպի ընկերներ";
"friends_delete" = "Հեռացնել ընկերներից";
"friends_reject" = "Չեղարկել հայտը";
"friends_accept" = "Ընդունել հայտը";
"send_message" = "Ուղարկել նամակ";
"incoming_req" = "Բաժանորդներ";
"outcoming_req" = "Հայցեր";
"incoming_req" = "Սպասվող";
"outcoming_req" = "Արտագնա";
"req" = "Հայցեր";
"friends_online" = "Ընկերները ցանցում";
"all_friends" = "Բոլոր ընկերները";
"req_zero" = "Ոչ մի հայտ չի գտնվել...";
"req_one" = "Գտնվեց մեկ հայտ";
"req_few" = "Գտնվեց $1 հայտ";
"req_many" = "Գտնվեց $1 հայտ";
"req_other" = "Գտնվեց $1 հայտ";
"friends_zero" = "Ոչ մի ընկեր չկա";
"friends_one" = "$1 ընկեր";
"friends_few" = "$1 ընկեր";
"friends_many" = "$1 հատ ընկեր";
"friends_other" = "$1 հատ ընկեր";
"friends_list_zero" = "Դուք դեռ չունեք ընկերներ";
"friends_list_one" = "Դուք ունեք մեկ ընկեր";
"friends_list_few" = "Դուք ունեք $1 ընկեր";
"friends_list_many" = "Դուք ունեք $1 ընկեր";
"friends_list_other" = "Դուք ունեք $1 ընկեր";
"followers_zero" = "Ոչ մի բաժանորդ չունեք";
"followers_one" = "$1 բաժանորդ";
"followers_few" = "$1 բաժանորդ";
"followers_many" = "$1 բաժանորդ";
"followers_other" = "$1 բաժանորդ";
"followers_zero" = "Ոչ մի հետևորդ չունեք";
"followers_one" = "$1 հետևորդ";
"followers_other" = "$1 հետևորդ";
"subscriptions_zero" = "Ոչ մեկի վրա չեք բաժանորդագրվել";
"subscriptions_one" = "$1 բաժանորդագրություն";
"subscriptions_few" = "$1 բաժանորդագրություն";
"subscriptions_many" = "$1 բաժանորդագրություն";
"subscriptions_other" = "$1 բաժանորդագրություն";
"friends_list_online_zero" = "Դուք դեռ չունեք ցանցի մեջ գտնվող ընկերներ";
@ -269,7 +268,7 @@
"subscribe" = "Բաժանորդագրվել";
"unsubscribe" = "Հետ բաժանորդագրվել";
"subscriptions" = "Բաժանորդագրություններ";
"join_community" = "Մտնել խումբ";
"join_community" = "Միանալ խմբին";
"leave_community" = "Լքել խումբը";
"check_community" = "Դիտել խումբը";
"min_6_community" = "Անվանումը չպետք է լինի 6 նշից պակաս";
@ -279,20 +278,19 @@
"create_group" = "Ստեղծել խումբ";
"group_managers" = "Ղեկավարություն";
"group_type" = "Խմբի տեսակ";
"group_type_open" = "Սա բաց խումբ է․ այստեղ ամեն ոք կարող է մտնել։";
"group_type_open" = "Սա բաց խումբ է․ ամեն ոք կարող է միանալ իրեն։";
"group_type_closed" = "Սա փակ խումբ է․ այստեղ միանալու համար անհրաժեշտ է հայտ թողնել։";
"creator" = "Ստեղծող";
"creator" = "Հեղինակ";
"administrators" = "Ադմինիստրատորներ";
"add_to_left_menu" = "Ավելացնել դեպի ձախ մենյու";
"remove_from_left_menu" = "Ջնջել ձախ մենյուից";
"all_followers" = "Բոլոր բաժանորդները";
"add_to_left_menu" = "Ավելացնել ձախ մենյույում";
"remove_from_left_menu" = "Հեռացնել ձախ մենյուից";
"all_followers" = "Բոլոր հետևորդները";
"only_administrators" = "Միայն ադմինիստրատորները";
"website" = "Վեբկայք";
"website" = "Կայք";
"managed" = "Կառավարվում է";
"size" = "Չափ";
"administrators_one" = "$1 ադմինիստրատոր";
"administrators_few" = "$1 ադմինիստրատոր";
"administrators_other" = "$1 ադմինիստրատոր";
"role" = "Դեր";
@ -301,30 +299,26 @@
"promote_to_owner" = "Դարձնել տեր";
"devote" = "Հետ բողոքարկել";
"set_comment" = "Փոփոխել մեկնաբանությունը";
"hidden_yes" = "Թաքցված է";
"hidden_no" = "Թաքցված չէ";
"hidden_yes" = "Թաքնված է";
"hidden_no" = "Թաքնված չէ";
"group_allow_post_for_everyone" = "Թույլատրել հրապարակել բոլորին";
"group_hide_from_global_feed" = "Չցույց տալ հրապարակությունները ընդհանուր լրահոսում։";
"statistics" = "Ստատիստիկա";
"statistics" = "Վիճակագրություն";
"group_administrators_list" = "Ադմինների ցուցակ";
"group_display_only_creator" = "Ցույց տալ միայն խմբի ստեղծողին";
"group_display_only_creator" = "Ցուցադրել միայն խմբի ստեղծողին";
"group_display_all_administrators" = "Ցուցադրել բոլոր ադմինիստրատորներին";
"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>։";
"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_one" = "Միայն մեկ մասնակից";
"participants_few" = "$1 մասնակից";
"participants_many" = "$1 հատ մասնակից";
"participants_other" = "$1 հատ մասնակից";
"groups_zero" = "Ոչ մի խումբ";
"groups_one" = "Մեկ խումբ";
"groups_few" = "$1 խումբ";
"groups_many" = "$1 խումբ";
"groups_other" = "$1 խումբ";
"groups_list_zero" = "Դուք չկաք գեթ ոչ մի խմբում";
@ -333,12 +327,10 @@
"meetings_zero" = "Ոչ մի հանդիպում";
"meetings_one" = "Մեկ հանդիպում";
"meetings_few" = "$1 հանդիպում";
"meetings_many" = "$1 հանդիպում";
"meetings_other" = "$1 հանդիպում";
"open_new_group" = "Նոր խումբ բացել";
"open_group_desc" = "Չե՞ք կարող խումբ գտնել, բացեք ձերը․․․";
"open_group_desc" = "Չե՞ք կարողանում գտնել ճիշտ խումբը, բացե՛ք ձերը․․․";
"search_group" = "Խմբի որոնում";
"search_by_groups" = "Որոնում ըստ խմբերի";
"search_group_desc" = "Այստեղ դուք կարող եք փնտրել խմբեր և ընտրել ձեզ ամենահարմարը․․․";
@ -361,16 +353,36 @@
"albums_zero" = "Ոչ մի ալբոմ չկա";
"albums_one" = "Մեկ ալբոմ";
"albums_few" = "$1 ալբոմ";
"albums_many" = "$1 ալբոմ";
"albums_other" = "$1 ալբոմ";
"albums_list_zero" = "Դուք ոչ մի ալբոմ չունեք";
"albums_list_one" = "Դուք ունեք մեկ ալբոմ";
"albums_list_few" = "Դուք ունեք $1 ալբոմ";
"albums_list_many" = "Դուք ունեք $1 ալբոմ";
"albums_list_other" = "Դուք ունեք $1 ալբոմ";
"add_image" = "Ավելացնել պատկեր";
"add_image_group" = "Վերբեռնել պատկեր";
"upload_new_picture" = "Ավելացնել նոր պատկեր";
"uploading_new_image" = "Վերբեռնվում է նոր պատկերը․․․";
"friends_avatar" = "Այն ավելի կհեշտացնի ձեր ընկերներին ճանաչել Ձեզ, եթե տեղադրեք ձեր իրական լուսանկարը։";
"groups_avatar" = "Լավ պատկերը կարող է Ձեր խումբը ավելի ճանաչելի դարձնել։";
"formats_avatar" = "Դուք կարող եք վերբեռնել պատկեր միայն JPG, GIF կամ PNG ֆորմատով։";
"troubles_avatar" = "Եթե դժվարանում եք տեղադրելուց, փորձե՛ք ընտրել ավելի փոքր նկար։";
"webcam_avatar" = "Եթե Ձեր համակարգիչը ունի վեբ–տեսախցիկ, Դուք կարող եք <a href='javascript:'>վերցնել նկար</a>։";
"update_avatar_notification" = "Պրոֆիլի պատկերը փոփոխված է";
"update_avatar_description" = "Սեղմեք դիտելու համար";
"deleting_avatar" = "Պատկերը ջնջվում է";
"deleting_avatar_sure" = "Դուք վստա՞հ եք որ ցանկանում եք ջնջել պատկերը։";
"deleted_avatar_notification" = "Պատկերը հաջողությամբ ջնջվել է";
"save_changes" = "Պահպանել փոփոխությունները";
"upd_m" = "թարմացրել է իր պրոֆիլի պատկերը";
"upd_f" = "թարմացրել է իր պրոֆիլի պատկերը";
"upd_g" = "թարմացրել է իր խմբի պատկերը";
/* Notes */
"notes" = "Նշումներ";
@ -380,26 +392,35 @@
"create_note" = "Ստեղծել նշում";
"edit_note" = "Խմբագրել նշումը";
"actions" = "Գործողություններ";
"edited" = "Խմբագրված է";
"notes_zero" = "Ոչ մի նշում";
"notes_one" = "Մեկ նշում";
"notes_other" = "$1 նշում";
"notes_start_screen" = "Նշումների շնորհիվ Դուք կարող եք կիսվել ընկերների հետ տարբեր իրադարձություններով, և իմանալ թե ինչ է կատարվում իրենց մոտ։";
"note_preview" = "Նախադիտում";
"note_preview_warn" = "Սա ընդամենը նախադիտում է";
"note_preview_warn_details" = "Պահպանելուց հետո նշումները կարող են այլ տեսք ունենալ։ Ու մեկ էլ, այդքան հաճախ նախադիտում մի արեք։";
"note_preview_empty_err" = "Ինչու՞ նախադիտել նշումը առանց վերնագրի կամ բովանդակության։";
"edited" = "Խմբագրված է";
"notes_zero" = "Ոչ մի նշում";
"notes_one" = "Մեկ նշում";
"notes_few" = "$1 նշում";
"notes_many" = "$1 նշում";
"notes_other" = "$1 նշում";
"notes_list_zero" = "Ոչ մի նշում չի գտնվել";
"notes_list_one" = "Գտնվեց մեկ նշում";
"notes_list_few" = "Գտնվեց $1 նշում";
"notes_list_many" = "Գտնվեց $1 նշում";
"notes_list_other" = "Գտնվեց $1 նշում";
"select_note" = "Ընտրվում է նշումը";
"no_notes" = "Դուք չունե՛ք ոչ մի նշում";
"error_attaching_note" = "Խնդիր առաջացավ նշումը ընտրելիս";
"select_or_create_new" = "Ընտրե՛ք առկա նշումներից, կամ <a href='/notes/create'>ստեղծե՛ք նորը</a>";
"notes_closed" = "Դուք չե՛ք կարող ամրացնել նշումը հրապարակությանը, քանզի միայն Դուք եք տեսնում նրանք։<br> Դուք կարող եք փոխել դա <a href=\"/settings?act=privacy\">կարգավորումներում</a>։";
"do_not_attach_note" = "Չամրացնել նշում";
/* Notes: Article Viewer */
"aw_legacy_ui" = "Հին ինտերֆեյս";
/* Menus */
"edit_button" = "խմբ.";
@ -415,8 +436,10 @@
"my_settings" = "Իմ կարգավորումները";
"bug_tracker" = "Բագ–թրեքեր";
"menu_settings" = "Կարգավորումներ";
"menu_login" = "Մուտք";
"menu_registration" = "Գրանցում";
"menu_help" = "Օգնություն";
"menu_logout" = "Դուրս գալ";
@ -436,7 +459,7 @@
"left_menu_donate" = "Աջակցել";
"footer_about_instance" = "հոսքի մասին";
"footer_rules" = "կանոնները";
"footer_rules" = "կանոններ";
"footer_blog" = "բլոգ";
"footer_help" = "օգնություն";
"footer_developers" = "մշակողներին";
@ -452,9 +475,9 @@
"interface" = "Արտաքին տեսք";
"security" = "Անվտանգություն";
"profile_picture" = "Էջի նկար";
"profile_picture" = "Էջի պատկեր";
"picture" = "Նկար";
"picture" = "Պատկեր";
"change_password" = "Փոխել գաղտնաբառը";
"old_password" = "Հին գաղտնաբառը";
@ -473,13 +496,17 @@
"apply_style_for_this_device" = "Հաստատել տեսքը միայն այս սարքի համար";
"search_for_groups" = "Խմբերի որոնում";
"search_for_people" = "Մարդկանց որոնում";
"search_for_users" = "Մարդկանց որոնում";
"search_for_posts" = "Հրապարակումների որոնում";
"search_for_comments" = "Մեկնաբանությունների որոնում";
"search_for_videos" = "Վիդեոների որոնում";
"search_for_apps" = "Հավելվածների որոնում";
"search_for_notes" = "Նշումների որոնում";
"search_for_audios" = "Երաժշտության որոնում";
"search_button" = "Որոնել";
"search_placeholder" = "Գրեք ցանկացած անուն, անվանում կամ բառ";
"results_zero" = "Ոչ մի արդյունք";
"results_one" = "Մեկ արդյունք";
"results_few" = "$1 արդյունք";
"results_many" = "$1 արդյունք";
"results_other" = "$1 արդյունք";
"privacy_setting_access_page" = "Ով կարող է տեսնել ինտերնետում իմ էջը";
@ -504,9 +531,9 @@
"your_email_address" = "Ձեր էլեկտրոնային հասցեն";
"your_page_address" = "Ձեր էջի հասցեն";
"page_address" = "Էջի հասցեն";
"current_email_address" = "Ներկայիս հասցեն";
"new_email_address" = "Նոր հասցեն";
"save_email_address" = "Պահպանել հասցեն";
"current_email_address" = "Ներկայիս էլեկտրոնային հասցեն";
"new_email_address" = "Նոր էլեկտրոնային հասցեն";
"save_email_address" = "Պահպանել էլեկտրոնային հասցեն";
"page_id" = "Էջի IDն";
"you_can_also" = "Դուք նաև կարող եք";
"delete_your_page" = "ջնջել ձեր էջը";
@ -518,13 +545,14 @@
"ui_settings_rating_show" = "Ցուցադրել";
"ui_settings_rating_hide" = "Թաքցնել";
"ui_settings_nsfw_content" = "NSFW-կոնտենտ";
"ui_settings_nsfw_content_dont_show" = "Ցույց չտա՛լ գլոբալ ժապավենում";
"ui_settings_nsfw_content_dont_show" = "Ցույց չտա՛լ ընդհանուր ժապավենում";
"ui_settings_nsfw_content_blur" = "Միայն ներծծել";
"ui_settings_nsfw_content_show" = "Ցույց տալ";
"ui_settings_view_of_posts" = "Փոսթերի տեսակ";
"ui_settings_view_of_posts" = "Հրապարակումների տեսք";
"ui_settings_view_of_posts_old" = "Հին";
"ui_settings_view_of_posts_microblog" = "Միկրոբլոգ";
"ui_settings_main_page" = "Գլխավոր էջ";
"ui_settings_sessions" = "Այցելություններ";
"additional_links" = "Հավելյալ հղումներ";
"ad_poster" = "Գովազդային վահանակ";
@ -547,7 +575,7 @@
"profile_deactivate_reason_5_text" = "Ինձ այստեղ շան տեղ դնող չկա ու ես տխրում եմ։ Դուք կզղջաք որ ես հեռացա...";
"profile_deactivate_reason_6" = "Այլ պատճառ";
"profile_deactivated_msg" = "Ձեր էջը <b>ջնջված է</b>։<br/><br/>Եթե Դուք ուզենաք նորից օգտվել Ձեր էջով, կարող եք <a href='/settings/reactivate'>ապաակտիվացնել այն</a> մինչև $1:";
"profile_deactivated_msg" = "Ձեր էջը <b>ջնջված է</b>։<br/><br/>Եթե Դուք ուզենաք նորից օգտվել կայքով, ապա կարող եք <a href='/settings/reactivate'>ապաակտիվացնել այն</a> մինչև $1:";
"profile_deactivated_status" = "Էջը ջնջված է";
"profile_deactivated_info" = "Օգտատիրոջ էջը հեռացվել է։<br/>Մանրամասն տեղեկատվությունը բացակայում է։";
@ -557,6 +585,18 @@
"end_all_sessions_description" = "Եթե ցանկանում եք դուրս գալ $1ից ամեն դեվայսից, սեղմե՛ք ներքևի կոճակը";
"end_all_sessions_done" = "Բոլոր սեսսիաները նետված են, ներառյալ բջջային հավելվածները";
"backdrop_short" = "Ետնապատկեր";
"backdrop" = "Էջի ետնապատկեր";
"backdrop_desc" = "Դուք կարող եք տեղադրել երկու նկար, որպես Ձեր պրոֆիլի կամ խմբի նախանկար։ Նրանք կցուցադրվեն էջի ձախ և աջ ծայրերում։ Այս հարմարանքի շնորհիվ Դուք կարող եք ավելացնել հավելյալ անհատականություն Ձեր պրոֆիլին։";
"backdrop_warn" = "Նկարները կկազմակերպվեն ըստ վերևի դասակարգման։ Իրենց բարձրությունը ավտոմատ կընդլայնվի, ու նրանք կզբաղեցնեն էկրանի բարձրության 100%-ը, նաև կավելացվի մեջտեղում լղոզում։ Այն անհնար կլինի փոխարինել փոխարինել ետնապատկերը OpenVK-ի հիմնական ինտերֆեյսով կամ ավելացնել աուդիո։";
"backdrop_about_adding" = "Դուք կարող եք ավելացնել միայն մեկ նկար, կախված դիզայնից, վերջնական արդյունքը կարող է տգեղ տեսք ունենալ։ Դուք նաև կարող եք փոխել միայն մեկ նկար. եթե արդեն ունեք երկու տեղադրված նկար և ուզում եք փոխել մեկը վերբեռնեք միայն մեկ անգամ, ուսի մյուսները չեն ջնջվի։ Որպեսզի ջնջեք երկու նկարները, սեղմե՛ք ներքևի կոճակը, դուք չե՛ք կարող ջնջել նկարները առանձին։";
"backdrop_save" = "Պահպանել ետնապակներները";
"backdrop_remove" = "Ջնջել բոլոր ետնապակներները";
"backdrop_error_title" = "Խնդիր առաջացավ ՝ ետնապակներները պահպանելիս";
"backdrop_error_no_media" = "Նկարները վնասված են կամ լիարժեք չեն տեղադրվել";
"backdrop_succ" = "Ետնապատկերի կարգավորումները պահպանված են";
"backdrop_succ_rem" = "Ետնապատկերները ջնջվեցին";
"backdrop_succ_desc" = "Օգտատերերը կտեսնեն փոփոխությունները 5 րոպեյվա ընթացքում";
"browse" = "Վերանայում";
/* Two-factor authentication */
@ -612,11 +652,9 @@
"videos_zero" = "Ոչ մի տեսանյութ չկա";
"videos_one" = "Մեկ տեսանյութ";
"videos_few" = "$1 տեսանյութ";
"videos_many" = "$1 տեսանյութ";
"videos_other" = "$1 տեսանյութ";
"view_video" = "Դիտում";
"view_video" = "Դիտել";
/* Notifications */
@ -649,26 +687,34 @@
"nt_photo_instrumental" = "նկարով";
"nt_topic_instrumental" = "թեմայով";
"nt_you_were_mentioned_u" = "Ձեզ նշել է օգտատերը";
"nt_you_were_mentioned_g" = "Ձեզ նշել է խումբը";
"nt_mention_in_post_or_comms" = "իր քննարկման թեմաներից մեկում";
"nt_mention_in_photo" = "այս նկարի քննարկմանը";
"nt_mention_in_video" = "այս վիդեոյի քննարկմանը";
"nt_mention_in_note" = "այս նշման քննարկմանը";
"nt_mention_in_topic" = "այս քննարկմանը";
/* Time */
"time_at_sp" = " -ում ";
"time_at_sp" = " ՝ ";
"time_just_now" = "հենց նոր";
"time_exactly_five_minutes_ago" = "ուղիղ հինգ րոպե առաջ";
"time_minutes_ago" = "$1 րոպե առաջ";
"time_today" = "այսօր";
"time_yesterday" = "երեկ";
"points" = "Ձայն";
"points" = "Ձայներ";
"points_count" = "ձայն";
"on_your_account" = "ձեր հաշվում";
"top_up_your_account" = "Լիցքավորել բալանսը";
"top_up_your_account" = "Ստանալ ավելին";
"you_still_have_x_points" = "Դուք ունեք <b>$1</b> չօգտագործված ձայն։";
"vouchers" = "Վաուչերներ";
"have_voucher" = "Կա վաուչեր";
"voucher_token" = "Վաուչերի կոդ";
"voucher_activators" = "Օգտագործվածները";
"voucher_explanation" = "Գրե՛ք վաուչերի սերիական համարը։ Սովորաբար այն նշված է լինում կտրոնի կամ նամակի մեջ։";
"voucher_explanation" = "Ներմուծե՛ք վաուչերի սերիական համարը։ Սովորաբար այն նշված է լինում կտրոնի կամ նամակի մեջ։";
"voucher_explanation_ex" = "Ուշադրություն դարձրե՛ք, որ վաուչերները կարող են սպառվել և օգտագործվել միայն մեկ անգամ։";
"invalid_voucher" = "Անվավեր վաուչեր";
"voucher_bad" = "Հնարավոր է, դուք ներմուծել եք սխալ վաուչեր, արդեն օգտագործել եք այն կամ էլ այն սպառվել է։";
@ -677,14 +723,12 @@
"redeem" = "Ակտիվացնել վաուչերը";
"deactivate" = "Դեակտիվացնել";
"usages_total" = "Օգտագործումների քանակ";
"usages_left" = "Մնացին օգտագործումներ";
"usages_left" = "Մնաց օգտագործելու";
"points_transfer_dialog_header_1" = "Դուք կարող եք ուղարկել ձայները և նվերների մի մասը այլ մարդուն։";
"points_transfer_dialog_header_2" = "Ձեր ներկայիս բալանսը ";
"points_transfer_dialog_header_2" = "Ձեր ներկայիս բալանսը.";
"points_amount_one" = "Մեկ ձայն";
"points_amount_few" = "$1 ձայն";
"points_amount_many" = "$1 ձայն";
"points_amount_other" = "$1 ձայն";
"transfer_poins" = "Ձայների փոխանցում";
@ -732,13 +776,9 @@
"gifts" = "Նվերներ";
"gifts_zero" = "Նվերներ չկան";
"gifts_one" = "Մեկ նվեր";
"gifts_few" = "$1 նվեր";
"gifts_many" = "$1 նվեր";
"gifts_other" = "$1 նվեր";
"gifts_left" = "Մնաց $1 նվեր";
"gifts_left_one" = "Մնաց մեկ նվեր";
"gifts_left_few" = "$1 նվեր մնաց";
"gifts_left_many" = "$1 նվեր մնաց";
"gifts_left_other" = "$1 նվեր մնաց";
"send_gift" = "Ուղարկել նվեր";
@ -753,8 +793,6 @@
"coins" = "Ձայներ";
"coins_zero" = "0 ձայն";
"coins_one" = "Մեկ ձայն";
"coins_few" = "$1 ձայն";
"coins_many" = "$1 ձայն";
"coins_other" = "$1 ձայն";
"users_gifts" = "Նվերներ";
@ -838,7 +876,7 @@
"support_status_0" = "Հարցը դիտարկման տակ է";
"support_status_1" = "Կա պատասխան";
"support_status_2" = "Փակ է";
"support_greeting_hi" = "Բարև ձեզ, $1!";
"support_greeting_hi" = "Բարև՜ Ձեզ, $1";
"support_greeting_regards" = "Հարգանքով, <br/>$1 -ի աջակցման թիմ։";
"support_faq" = "Հաճախ տրվող հարցեր";
@ -860,6 +898,12 @@
"fast_answers" = "Արագ պատասխաններ";
"ignore_report" = "Արհամարել զեկույցը";
"report_number" = "Զեկույց #";
"list_of_reports" = "Զեկույցների ցանկ";
"text_of_the_post" = "Հրապարակման տեքստ";
"today" = "այսօր";
"comment" = "Մեկնաբանություն";
"sender" = "Ուղարկող";
@ -874,6 +918,13 @@
"banned_in_support_1" = "Կներե՛ք, <b>$1</b>, բայց հիմա Ձեզ թույլատրված չէ դիմումներ ստեղծել։";
"banned_in_support_2" = "Դրա պատճառաբանությունը սա է․ <b>$1</b>։ Ցավո՛ք, այդ հնարավորությունը մենք Ձեզնից վերցրել ենք առհավետ։";
"you_can_close_this_ticket_1" = "Եթե չունեք այլատիպ հարցեր, ապա կարող եք ";
"you_can_close_this_ticket_2" = "փակել այս դիմումը";
"agent_profile_created_1" = "Պրոֆիլը ստեղծված է";
"agent_profile_created_2" = "Հիմա օգտատերերը կարող են տեսնել Ձեր անհատականեցված անունը և ավատարը ՝ սովորականների փոխարեն։";
"agent_profile_edited" = "Պրոֆիլը ստեղծված է";
"agent_profile" = "Իմ Գործակալի քարտը";
/* Invite */
"invite" = "Հրավիրել";
@ -914,19 +965,47 @@
"messages_error_1" = "Նամակը չի ուղարկվել";
"messages_error_1_description" = "Այս նամակը ուղարկելու ժամանակ տեղի է ունեցել ընդհանրացված սխալ...";
/* Polls */
"poll" = "Քվեարկություն";
"create_poll" = "Ստեղծել քվեարկություն";
"poll_title" = "Հարց տալ";
"poll_add_option" = "Ավելացնել ընտրություն...";
"poll_anonymous" = "Գաղտնի քվեարկումներ";
"poll_multiple" = "Տարբեր պատասխաններ";
"poll_locked" = "Վիկտորինայի ռեժիմ (առանց վերանայման)";
"poll_edit_expires" = "Սպառվում է. ";
"poll_edit_expires_days" = "օր";
"poll_editor_tips" = "Backspace խփելը դատարկ ընտրությունը ջնջելու է։ Օգտագործե՛ք Tab/Enter դատարկ ընտրությանը, որպեսզի այն ավելի արագ ստեղծեք։";
"poll_embed" = "Ներկառուցված կոդ";
"poll_voter_count_zero" = "Եղեք <b>առաջի՛ն</b> քվեարկողը";
"poll_voter_count_one" = "<b>Միայն մեկ</b> օգտատեր է քվեարկել";
"poll_voter_count_few" = "Քվեարկեց <b>$1</b> հոգի";
"poll_voter_count_many" = "Քվեարկեց <b>$1</b> հոգի";
"poll_voter_count_other" = "Քվեարկեց <b>$1</b> հոգի";
"poll_voters_list" = "Քվեարկողներ";
"poll_anon" = "Գաղտնի";
"poll_public" = "Հանրային";
"poll_multi" = "տարբեր ընտրություններ";
"poll_lock" = "առանց հետ կանչելու";
"poll_until" = "մինչև $1";
"poll_err_to_much_options" = "Չափից շատ տարբերակ է տրված։";
"poll_err_anonymous" = "Չի լինում տեսնել քվեարկողների ցանկը. քվեարկությունը գաղտնի է";
"cast_vote" = "Քվեարկե՛լ";
"retract_vote" = "Չեղարկել իմ քվեարկումը";
/* 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" = "պատասխանել է";
@ -945,11 +1024,9 @@
"delete_topic" = "Ջնջել թեման";
"topics_one" = "Մեկ թեմա";
"topics_few" = "$1 թեմա";
"topics_many" = "$1 թեմա";
"topics_other" = "$1 թեմա";
"created" = "Ստեղծված է";
"created" = "Ստեղծվել է";
"everyone_can_create_topics" = "Բոլորը կարող են թեմաներ սարքել";
"display_list_of_topics_above_wall" = "Ցուցադրել պատի տակ թեմաների ցուցակը";
@ -978,8 +1055,10 @@
"error_upload_failed" = "Չհաջողվեց վերբեռնել նկարը";
"error_old_password" = "Հին գաղտնաբառը չի համընկնում";
"error_new_password" = "Նոր գաղտնաբառերը չեն համընկնում";
"error_weak_password" = "Գաղտնաբառը այդքան էլ խիստ չէ։ Այն առնվազն պետք է պարունակի 8 նիշ, մեկ մեծատառ տառ և մեկ թիվ։";
"error_shorturl_incorrect" = "Կարճ հասցեն ունի սխալ ֆորմատ";
"error_repost_fail" = "Չհաջողվեց կիսվել գրության հետ";
"error_repost_fail" = "Չհաջողվեց կիսվել գրությունով";
"error_data_too_big" = "'$1' ատտրիբուտը պետք է առնվազն լինի $2 –ը $3 –ի չափ երկար";
"forbidden" = "Հասանելիության սխալ";
"forbidden_comment" = "Այս օգտատիրոջ գաղտնիության կարգավորումները ձեզ թույլ չեն տալիս դիտել օգտատերի էջը։";
@ -1015,7 +1094,7 @@
"suspicious_registration_attempt_comment" = "Դուք մի տեսակ փորձել եք սխալ տեղից գրանցվել։";
"rate_limit_error" = "Հե՛յ, կարող ա՞ խառնել ես։";
"rate_limit_error_comment" = "Ա՛յ $1, չի՛ կարելի այսքան հաճախ սպամ հրապարակել։ Հո դու Կառլենը չե՞ս։ Բացառության կոդ․ $2։";
"rate_limit_error_comment" = "Ա՛յ $1 ջան, չի՛ կարելի այսքան հաճախ սպամել։ Հո դու Գրիգորիսը չե՞ս։ Բացառության կոդ․ $2։";
"not_enough_permissions" = "Այդքան իրավասություն չկա";
"not_enough_permissions_comment" = "Դուք բավական իրավասություն չունեք այս գործողությունը կատարելու համար։";
@ -1047,7 +1126,7 @@
/* Admin panel */
"admin" = "Ադմին-վահանակ";
"admin" = "Ադմինի վահանակ";
"admin_ownerid" = "Օգտատիրոջ ID";
"admin_author" = "Հեղինակ";
@ -1124,7 +1203,7 @@
"admin_banned_links" = "Արգելափակված հղումներ";
"admin_banned_link" = "Հղում";
"admin_banned_domain" = "Դոմեն";
"admin_banned_link_description" = "Պրոտոկոլով (https://example.com/)";
"admin_banned_link_description" = "Պրոտոկոլով (https://example.am/)";
"admin_banned_link_regexp" = "Ռեգուլյար արտահայտություն";
"admin_banned_link_regexp_description" = "Տեղադրվում է վերոնշյալ դոմենից հետո։ Մի լրացրե՛ք, եթե ցանկանում եք արգելափակել ամբողջ դոմենը";
"admin_banned_link_reason" = "Պատճառ";
@ -1132,6 +1211,15 @@
"admin_banned_link_not_specified" = "Հղումը նշված չէ";
"admin_banned_link_not_found" = "Հղումը չի գտնվել";
"logs_adding" = "Ստեղծում";
"logs_editing" = "Խմբագրում";
"logs_removing" = "Ջնջում";
"logs_restoring" = "Վերականգնում";
"logs_added" = "ստեղծվել է";
"logs_edited" = "խմբագրվել է";
"logs_removed" = "ջնջվել է";
"logs_restored" = "վերականգնվել է";
/* Paginator (deprecated) */
"paginator_back" = "Հետ";
@ -1150,29 +1238,20 @@
"instance_links" = "Հոսքերի հղումներ․";
"about_users_one" = "<b>Մեկ</b> օգտատեր";
"about_users_few" = "<b>$1</b> օգտատեր";
"about_users_many" = "<b>$1</b> օգտատեր";
"about_users_other" = "<b>$1</b> օգտատեր";
"about_online_users_one" = "<b>Մեկ</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>Մեկ</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>Մեկ</b> խումբ";
"about_groups_few" = "<b>$1</b> խումբ";
"about_groups_many" = "<b>$1</b> խումբ";
"about_groups_other" = "<b>$1</b> խումբ";
"about_wall_posts_one" = "<b>Մեկ</b> գրություն պատերի վրա";
"about_wall_posts_few" = "<b>$1</b> գրություն պատերի վրա";
"about_wall_posts_many" = "<b>$1</b> գրություն պատերի վրա";
"about_wall_posts_other" = "<b>$1</b> գրություն պատերի վրա";
"about_watch_rules" = "տես <a href='$1'>այստեղ</a>";
/* Dialogs */
@ -1191,10 +1270,11 @@
/* User alerts */
"user_alert_scam" = "Այս հաշվի վրա բազմաթիվ բողոքներ են եկել խարդախության հետ կապված։ Խնդրվում է զգույշ լինել, հատկապես եթե Ձեզնից փորձեն գումար խնդրել և շորթել։";
"user_may_not_reply" = "Այս օգտատերը կարող է Ձեզ չպատասխանել, ձեր անվտանգության կարգավորումների պատճառով։ <a href='/settings?act=privacy'>Բացել անվտանգության կարգավորումները</a>";
/* Cookies pop-up */
"cookies_popup_content" = "Cookie բառը անգլերենից նշանակում է թխվածքաբլիթ, իսկ թխվածքաբլիթը համեղ է։ Մեր կայքը չի ուտում թխվածք, բայց օգտագործում է այն ուղղակի սեսսիան կողմնորոշելու համար։ Ավելի մանրամասն կարող եք ծանոթանալ մեր <a href='/privacy'>գաղտնիության քաղաքականությանը</a> հավելյալ ինֆորմացիայի համար։";
"cookies_popup_content" = "Cookie բառը թարգմանաբար նշանակում է թխվածքաբլիթ, իսկ թխվածքաբլիթը լավ բան է։ Մեր կայքը չի ուտում թխվածք, բայց օգտագործում է այն ՝ այցելությունը կողմնորոշելու համար։ Ավելի մանրամասն կարող եք ծանոթանալ մեր <a href='/privacy'>գաղտնիության քաղաքականությանը</a> հավելյալ ինֆորմացիայի համար։";
"cookies_popup_agree" = "Համաձայն եմ";
/* Away */
@ -1206,6 +1286,42 @@
"url_is_banned_title" = "Հղում դեպի կասկածելի կայք";
"url_is_banned_proceed" = "Անցնել հղումով";
"recently" = "Վերջերս";
/* Helpdesk */
"helpdesk" = "Աջակցում";
"helpdesk_agent" = "Աջակցման գործակալ";
"helpdesk_agent_card" = "Գործակալի քարտ";
"helpdesk_positive_answers" = "դրական պատասխաններ";
"helpdesk_negative_answers" = "բացասական պատասխաններ";
"helpdesk_all_answers" = "բոլոր պատասխանները";
"helpdesk_showing_name" = "Ցուցադրվող անունը";
"helpdesk_show_number" = "Ցույց տալ թիվը";
"helpdesk_avatar_url" = "Ավատարի հղումը";
/* Chandler */
"c_user_removed_from_group" = "Այս օգտատերը հեռացվել է խմբից";
"c_permission_removed_from_group" = "Թույլտվությունը հեռացվել է խմբից";
"c_group_removed" = "Խումբը ջնջվել է";
"c_groups" = "Chandlerի Խմբեր";
"c_users" = "Chandlerի Օգտատերեր";
"c_group_permissions" = "Իրավասություններ";
"c_group_members" = "Մասնակիցներ";
"c_model" = "Մոդել";
"c_permission" = "Իրավասություն";
"c_permissions" = "Իրավասություններ";
"c_color" = "Գույն";
"add" = "Ավելացնել";
"c_edit_groups" = "Խմբագրել Խմբերը";
"c_user_is_not_in_group" = "Օգտատիրոջ և խմբի հանդեպ հարաբերությունները չգտնվեցին։";
"c_permission_not_found" = "Իրավասության և խմբի հանդեպ հարաբերությունները չգտնվեցին։";
"c_group_not_found" = "Խումբը չգտնվե՛ց։";
"c_user_is_already_in_group" = "Այս օգտատերը արդեն խմբի անդամ է։";
"c_add_to_group" = "Ավելացնել խմբին";
"c_remove_from_group" = "Հեռացնել խմբից";
/* Maintenance */
"global_maintenance" = "Տեխնիկական աշխատանքներ";
@ -1214,3 +1330,232 @@
"undergoing_section_maintenance" = "Ցավոք սրտի, <b>$1</b> բաժինը ժամանակավորապես անհասանելի է։ Մենք արդեն աշխատում ենք խնդիրները շտկելու ուղղությամբ։ Խնդրում ենք այցելել մի քիչ ուշ։";
"topics" = "Թեմաներ";
/* Tutorial */
"tour_title" = "Կայքի ճամփորդություն";
"reg_title" = "Գրանցում";
"ifnotlike_title" = " &quot;Ի՞նչ եթե ինձ այս կայքը դուր չի գալիս։&quot; ";
"tour_promo" = "Ինչ է Ձեզ սպասվում գրանցումից հետո";
"reg_text" = "<a href='/reg'>Օգտատիրոջ գրանցումը</a> լրիվ անվճար է և տևում է երկու րոպեյից ոչ ավել։";
"ifnotlike_text" = "Դուք միշտ կարող եք ջնջել Ձեր հաշիվը";
"tour_next" = "Հաջորդը →";
"tour_reg" = "Գրանցում →";
"tour_section_1" = "Սկիզբ";
"tour_section_2" = "Պրոֆիլ";
"tour_section_3" = "Նկարներ";
"tour_section_4" = "Որոնում";
"tour_section_5" = "Վիդեոներ";
"tour_section_6" = "Աուդիոներ";
"tour_section_7" = "Հիմնական լուրերի ժապավեն";
"tour_section_8" = "Ընդհանուր լուրերի ժապավեն";
"tour_section_9" = "Խմբեր";
"tour_section_10" = "Իրադարձություններ";
"tour_section_11" = "Թեմաներ";
"tour_section_12" = "Անհատականացում";
"tour_section_13" = "Պրոմոկոդեր";
"tour_section_14" = "Հեռախոսի տարբերակ";
"tour_section_1_title_1" = "Որտեղի՞ց սկսել";
"tour_section_1_text_1" = "Օգտատիրոջ գրանցումը ամենաառաջին քայլն է այստեղ Ձեր ճանապարհը սկսելու համար։";
"tour_section_1_text_2" = "Գրանցվելու համար պետք է ունենալ էլ. հասցե և գաղտնաբառ։";
"tour_section_1_text_3" = "<b>Հիշե՛ք.</b> Ձեր էլ. հասցեն կօգտագործվի կայք մուտք գործելու համար։ Դուք նաև կունենաք լիիրավ իրավունք չնշել Ձեր ազգանունը գրանցվելիս։ Եթե հանկարծ կորցնեք մուտք գործելու գաղտնաբառը, միշտ կարող եք օգտվել <a href='/restore'>վերականգնման էջից</a>։";
"tour_section_1_bottom_text_1" = "Գրանցվելով այս կայքում, Դուք համաձայնվում եք <a href='/terms'>կայքի կանոններին</a> և <a href='/privacy'>գաղտնիության քաղաքականությանը</a>։";
"tour_section_2_title_1" = "Ձեր պրոֆիլը";
"tour_section_2_text_1_1" = "Գրանցվելուց հետո Դուք ավտոմատ կերպով կվերահղվեք դեպի <b>ձեր</b> էջը:";
"tour_section_2_text_1_2" = "Դուք կարող եք խմբագրել այն որտեղ և երբ ցանկանաք։";
"tour_section_2_text_1_3" = "<b>Ակնարկ.</b> Որպեսզի Ձեր պրոֆիլը թույն ու ներկայանալի տեսք ունենա, կարող եք այն լրացնել տեղեկությամբ, կամ էլ տեղադրել լուսանկար, որը օրինակի համար ցույց է տալիս Ձեր վերաբերմունքը Կարգին Հաղորդմանը։";
"tour_section_2_bottom_text_1" = "Դուք եք միայն որոշում ինչքան տեղեկություն կարող են իմանալ Ձեր մասին ընկերները։";
"tour_section_2_title_2" = "Տեղադրել սեփական անվտանգության կարգավորումները։";
"tour_section_2_text_2_1" = "Դուք կարող եք սահմանել թե ինչ տեսակի տեղեկություն կարող է երևալ Ձեր էջում։";
"tour_section_2_text_2_2" = "Դուք իրավունք ունեք բլոկավորել հսանելիությունը Ձեր էջին որոնողական համակարգերից ու չգրանցված օգտատերերից։";
"tour_section_2_text_2_3" = "<b>Հիշե՛ք.</b> հետագայում անվտանգության կարգավորումները կընդլայնվեն։";
"tour_section_2_title_3" = "Պրոֆիլի URL";
"tour_section_2_text_3_1" = "էջը գրանցելուն պես Դուք ստանում եք անձնական ID, ասենք ՝ <b>@id12345</b>";
"tour_section_2_text_3_2" = "<b>Սովորական ID-ն</b>, որը ստացվում է գրանցումից հետո, <b>մնում է անփոփոխ</b>";
"tour_section_2_text_3_3" = "Բայց Ձեր էջի կարգավորումներում Դուք կարող եք տեղադրել անձնական հասցեն, և այն <b>կարող է փոխվել</b> երբ կամենաք";
"tour_section_2_text_3_4" = "<b>Ակնարկ.</b> Դուք կարող եք վերցնել ցանկացած հասցե, որը առնվազն 5 նիշանի է։ Փորձե՛ք վերցնել թույն URL :Ճ";
"tour_section_2_bottom_text_2" = "<i>Ցանկացած կարճ հասցե լատինատառ փոքրատառ տառերով սպասարկվում է; այն կարող է պարունակել թվեր (ոչ սկզբում), կետեր և ընդգծումնր (ոչ սկզբում կամ վերջում)</i>";
"tour_section_2_title_4" = "Պատ";
"tour_section_3_title_1" = "Կիսվե՛ք Ձեր կյանքի պահերով";
"tour_section_3_text_1" = "&quot;Լուսանկարների&quot; բաժինը հասանելի է Ձեզ անմիջապես գրանցումից հետո";
"tour_section_3_text_2" = "Դուք կարող եք դիտել օգտատիրոջ ալբոմները կամ էլ ստեղծել ձերը";
"tour_section_3_text_3" = "Հասանելիություն տալ բոլոր ալբոմներին ուրիշներին, ինչը կառավարվում է Ձեր էջի անվտանգության կարգավորումներով";
"tour_section_3_bottom_text_1" = "Դուք կարող եք ստեղծել անսահմանափակ քանակությամբ ալբոմներ, ճամփորդության կամ հանգստի համար, կամ էլ զուտ մեմերի համար";
"tour_section_4_title_1" = "Որոնում";
"tour_section_4_text_1" = "&quot;Որոնման&quot; բաժինը թույլ է տալիս փնտրել մարդկանց և խմբերը։";
"tour_section_4_text_2" = "Կայքի հենց այս բաժինը ժամանակի ընթացքում ընդլայնվում է";
"tour_section_4_text_3" = "Որպեսզի սկսեք որոնելը, Դուք պետք է իմանաք օգտատիրոջ անունը (կամ ազգանունը), և եթե Ձեզ հետաքրքիր ա խումբ ճարելը, ապա պետք է ճշտել իր անունը։";
"tour_section_4_title_2" = "Արագ որոնում";
"tour_section_4_text_4" = "Եթե ուզում եք խնայել ժամանակ, որոնման բարը միշտ հասանելի է կայքի վերնամասում";
"tour_section_5_title_1" = "Վերբեռնե՛ք և կիսվե՛ք վիդեոներով ընկերների հետ";
"tour_section_5_text_1" = "Դուք կարող եք տեղադրել անսահմանափակ վիդեոներ և կարճ հոլովակներ";
"tour_section_5_text_2" = "&quot;Վիդեոների&quot; բաժինը ղեկավարվում է անվտանգության կարգավորումներով";
"tour_section_5_bottom_text_1" = "Վիդեոները կարող են տեղադրվել անցնելով &quot;Վիդեոների&quot; բաժինը, ուղղակի կցելով դրանք պատին.";
"tour_section_5_title_2" = "YouTube-ից վիդեոների ներկրում";
"tour_section_5_text_3" = "Ուղիղ տեղադրումից բացի, նաև կարող եք ամրացնել Ձեր սիրելի YouTubeյան վիդեոների հղումները";
"tour_section_6_title_1" = "Աուդիոների բաժինը, որը հլը չկա բհահահսհդ xDDD հորս արևևև";
"tour_section_6_text_1" = "Ինչպես ասվում էր Կարգին Հաղորդումում. «ապե մի քիչ էլ պահի ստե բան չի երևում»։ Վատ չէր լինի պատմել այս բաժնի մասին, բայց Վրիսկա ախպերը բեսամթ ալարել ա էս սարքել (նենց լավ ա էլի :Ճ):";
"tour_section_7_title_1" = "Հետևե՛ք թե ինչ են գրում Ձեր ընկերներ";
"tour_section_7_text_1" = "&quot;Լուրերի&quot; բաժինը բաժանվում է երկու տիպի. հիմնական և ընդհանուր ժապավենների";
"tour_section_7_text_2" = "Հիմնական ժապավենը ցուցադրում է Ձեր ընկերների ու խմբերի նորությունները";
"tour_section_7_bottom_text_1" = "Մենք չենք սարքում Ձեր լուրերի ժապավենը։ <b>Դուք եք ստեղծում այն</b>։";
"tour_section_8_title_1" = "Հետևե՛ք այստեղ քննարկվող թեմաներին";
"tour_section_8_text_1" = "Ընդհանուր ժապավենը ցուցադրում է բոլոր օգտատերերի և խմբերի թեմաները";
"tour_section_8_text_2" = "Այս բաժինը խորհուրդ չի տրվում դիտել նյարդայիններին, հղիներին ու Վարդան Ղուկասյանին լսողներին";
"tour_section_8_bottom_text_1" = "Ընդհանուր ժապավենի տեսքը չի տարբերվում հիմնականից";
"tour_section_8_bottom_text_2" = "Ժապավենը ունի տարատեսակ կոնտենտ, սովորական նկարներից և վիդեոներից մինչև գաղտնի գրառումներ և քվեարկություններ";
"tour_section_9_title_1" = "Ստեղծե՛ք խմբե՛ր";
"tour_section_9_text_1" = "Կայքը արդեն վաղուց ունի հազարավոր խմբեր նվիրված տարբեր թեմաներին և երկրպագումներին";
"tour_section_9_text_2" = "Դուք կարող եք միանալ ցանկացած խմբին, եթե չեք գտնում Ձեր ուզածը, կարող եք ստեղծել այն";
"tour_section_9_text_3" = "Ամեն խումբ ունի իր վիքի էջերը, ալբոմները, հղումները և քննարկումները";
"tour_section_9_title_2" = "Կառավարեք խումբը ընկերների հետ";
"tour_section_9_text_2_1" = "Կառավարեք խումբը &quot;Խմբագրել Խումբը&quot; բաժնում հանրության ավատարի ներքո";
"tour_section_9_text_2_2" = "Ստեղծեք Ձեր ադմինիստրատորների ու մոդերատորների թիմը, ում Դուք վստահում եք";
"tour_section_9_text_2_3" = "Դուք կարող եք թաքցնել ադմինիստրատորին, և նա չի երևա Ձեր խմբի ոչ մի անկյունում";
"tour_section_9_bottom_text_1" = "&quot;Իմ Խմբերը&quot; բաժինը կայքի ձախ մենյույում է գտնվում";
"tour_section_9_bottom_text_2" = "Խմբի օրինակ";
"tour_section_9_bottom_text_3" = "Խմբերը իրական կազմակերպույուններ են, որոնց մասնակիցները ցանկանում են մնալ կապի հետ իրենց լսարանի հետ";
"tour_section_10_title_1" = "Վա՛յ";
"tour_section_10_text_1" = "Այս բաժնում էլ լավ կլիներ սարքել ծանոթություն, սակայն այն դեռ սարքվում է։ Եկե՛ք սիրուն ձևերով շրջանցեք այն և առաջ գնանք...";
"tour_section_11_title_1" = "Տեսքեր";
"tour_section_11_text_1" = "Գրանցվելուց հետո Ձեր էջում կիրառվում է սովորական տեսքը";
"tour_section_11_text_2" = "Որոշ նորեկները կարող է չսիրեն լռելյայն տեսքը, քանի որ այն անգամ հնության զգացում է տալիս";
"tour_section_11_text_3" = "<b>Բայց հլը հո՛պ.</b> Դուք կարող եք անգամ ստեղծել Ձեր տեսքը ՝ կարդալով <a href='https://docs.openvk.uk/'>դոկումենտացիան</a>, կամ էլ ընտրել եղածներից մեկը";
"tour_section_11_bottom_text_1" = "Տեսքերի ցանկը հասանելի է &quot;Իմ Կարգավորումներ&quot; –ի &quot;Ինտերֆեյս&quot; բաժնում;";
"tour_section_11_wordart" = "<img src='https://openvk.uk/assets/packages/static/openvk/img/tour/wordart_en.png' width='65%'>";
"tour_section_12_title_1" = "Պրոֆիլ և խմբի ետնապատկերներ";
"tour_section_12_text_1" = "Դուք կարող եք երկու ետնապատկեր տեղադրել";
"tour_section_12_text_2" = "Նրանք կցուցադրվեն Ձեր էջի ծայրամասերում";
"tour_section_12_text_3" = "<b>Ակնարկ.</b> նախքան ետնապատկեր տեղադրելը, փորձե՛ք էքսպերիմենտներ անել իր հետ. փոխել գույնը, հայելու էֆֆեկտ դնել կամ մի բան անել";
"tour_section_12_title_2" = "Ավատարներ";
"tour_section_12_text_2_1" = "Դուք կարող եք դնել տարբեր կարգավորումներ ավատարը տեսնելու համար. սովորական, շրջանաձև կամ քառակուսի (1:1)";
"tour_section_12_text_2_2" = "Այս կարգավորումները տեսանելի են միայն Ձեզ";
"tour_section_12_title_3" = "Ձախ մենյույի փոփոխումը";
"tour_section_12_text_3_1" = "Եթե պետք է, կարող եք թաքցնել էջում որոշակի բաժինները";
"tour_section_12_text_3_2" = "<b>Հիշե՛ք.</b> Հիմնական բաժինները (Իմ Էջը, Իմ Ընկերները, Իմ Պատասխանները, Իմ Կարգավորումները) չի լինի թաքցնել";
"tour_section_12_title_4" = "Գրառումների դիտարկում";
"tour_section_12_text_4_1" = "Եթե հոգնել եք պատի հին դիզայնից որը վաղեմի հայտնի ՎԿոնտակտե–ին էր հարիր, ապա միշտ էլ կարող եք փոխել այն սարքելով միկրոբլոգ";
"tour_section_12_text_4_2" = "Գրառումների տեսքը կարող է փոփոխվել երկու տարբերակի միջև ՝ ցանկացած ժամանակ";
"tour_section_12_text_4_3" = "<b>Հաշվի առեք</b>, որ եթե հին դիզայնն եք ընտրել, վերջին մեկնաբանությունները չեն ցուցադրվի";
"tour_section_12_bottom_text_1" = "Ետնապատկերի կարգավորման էջ";
"tour_section_12_bottom_text_2" = "Ետնապատկերներով էջերի օրինակներ";
"tour_section_12_bottom_text_3" = "Այս հարմարանքով կարող եք ավելի շատ անհատականացնել Ձեր էջը";
"tour_section_12_bottom_text_4" = "Հին տեսք";
"tour_section_12_bottom_text_5" = "Միկրոբլոգ";
"tour_section_13_title_1" = "Պրոմոկոդեր";
"tour_section_13_text_1" = "OpenVKն ունի պրոմոկոդերի համակարգ, որը ավելացնում է որոշակի արժույթ (գնահատման տոկոսներ, ձայներ և այլն)";
"tour_section_13_text_2" = "Որոշակի կուպոններ ստեղծվում են տոների ժամանակ։ Դրանք հայթհայթելու համար հետևե՛ք <a href='https://t.me/openvk'>OpenVKի Telegramյան ալիքին</a>";
"tour_section_13_text_3" = "Պրոմոկոդն ակտիվացնելուց հետո սահմանված արժույթը անմիջապես կփոխանցվի Ձեզ";
"tour_section_13_text_4" = "<b>Հիշե՛ք.</b> Բոլոր պրոմոկոդերի ակտիվացման ժամկետը խիստ սահմանափակ է";
"tour_section_13_bottom_text_1" = "Պրոմոկոդերն ունեն 24 տառ ու թիվ";
"tour_section_13_bottom_text_2" = "Հաջողված ակտիվացիա (խոսքի ՝ մրցանակաբաշխում ենք 100 ձայնով)";
"tour_section_13_bottom_text_3" = "<b>Ուշադի՛ր.</b> Պրոմոկոդի ակտիվացումից հետո կրկին չեք կարող այն օգտագործել";
"tour_section_14_title_1" = "Հեռախոսի տարբերակ";
"tour_section_14_text_1" = "Այս պահին կայքի հեռախոսի վերսիան դեռևս չկա, սակայն գոյություն ունի հավելվածը Android-ի համար";
"tour_section_14_text_2" = "OpenVK Legacyն OpenVK-ի ռետրո հավելվածն է, որը իմիտացնում է ՎԿոնտակտե–ի 2013թ. դիզայնը";
"tour_section_14_text_3" = "Մինիմալ սպասարկվող տարբերակը Android 2.1 Eclairն է, որը անգամ վաղ 2010ականների սարքերի վրա է աշխատում";
"tour_section_14_title_2" = "Որտեղի՞ց ես կարող եմ ներբեռնել այն";
"tour_section_14_text_2_1" = "Ռելիզային տարբերակները տեղադրվում են F-Droidի ռեպոզիտորիայում";
"tour_section_14_text_2_2" = "Եթե Դուք բետա թեստավորող եք, հավելվածի նոր տարբերակները հրապարակվում են առանձին թարմացումների ալիքում";
"tour_section_14_text_2_3" = "<b>Հաշվի՛ առեք.</b> Հավելվածը կարող է ունենալ բագեր և խնդիրներ, որոնց մասին խնդրվում է հայտնել <a href='/app'>հավելվածի պաշտոնական խմբում</a>";
"tour_section_14_bottom_text_1" = "Էկրանի նկարներ";
"tour_section_14_bottom_text_2" = "Սա ավարտում է կայքի ճամփորդությունը։ Եթե ցանկանում եք փորձարկել հեռախոսի հավելվածը, ստեղծել Ձեր խումբը, հրավիրել ընկերներին կամ նորերին գտնել, կամ էլ ուղղակի հավես ժամանակ անցկացնել, Դուք կարող եք անել դա հենց հիմա փոքրիկ <a href='/reg'>գրանցում անելով</a>";
"tour_section_14_bottom_text_3" = "Սա ավարտում է կայքի ճամփորդությունը";
/* Search */
"s_people" = "Մարդիկ";
"s_groups" = "Ակումբներ";
"s_events" = "Իրադարձություններ";
"s_apps" = "Հավելվածներ";
"s_questions" = "Հարցեր";
"s_notes" = "Նշումներ";
"s_themes" = "Տեսքեր";
"s_posts" = "Գրառումներ";
"s_comments" = "Մեկնաբանություններ";
"s_videos" = "Վիդեոներ";
"s_audios" = "Երաժշտություն";
"s_by_people" = "մարդկանց համար";
"s_by_groups" = "խմբերի համար";
"s_by_posts" = "գրառումների համար";
"s_by_comments" = "մեկնաբանությունների համար";
"s_by_videos" = "վիդեոների համար";
"s_by_apps" = "հավելվածների համար";
"s_by_audios" = "երգերի համար";
"s_order_by" = "Դասավորել ըստ...";
"s_order_by_id" = "Ըստ ID-ի";
"s_order_by_name" = "Ըստ անվան";
"s_order_by_random" = "Ըստ պատահականության";
"s_order_by_rating" = "Ըստ վարկանիշի";
"s_order_invert" = "Շրջել";
"s_by_date" = "Ըստ ամսաթվի";
"s_registered_before" = "Գրանցված մինչև";
"s_registered_after" = "Գրանցված հետո";
"s_date_before" = "Առաջ";
"s_date_after" = "Հետո";
"s_main" = "Հիմնական";
"s_now_on_site" = "հիմա կայքում";
"s_with_photo" = "նկարով";
"s_only_in_names" = "միայն անուններում";
"s_any" = "ցանկացած";
"reset" = "Վերականգնել";
"closed_group_post" = "Սա մասնավոր խմբի գրառում է";
"deleted_target_comment" = "Այս մեկնաբանությունը ջնջված գրառման տակ է եղել";
"no_results" = "Արդյունք չկա";
/* Mobile */
"mobile_friends" = "Ընկերներ";
"mobile_photos" = "Նկարներ";
"mobile_videos" = "Վիդեոներ";
"mobile_messages" = "Նամակներ";
"mobile_notes" = "Գրառումներ";
"mobile_groups" = "Խմբեր";
"mobile_search" = "Որոնում";
"mobile_settings" = "Կարգավորումներ";
"mobile_desktop_version" = "Համակարգչի տարբերակ";
"mobile_log_out" = "Դուրս գալ";
"mobile_menu" = "Մենյու";
"mobile_like" = "Հավանել";
"mobile_user_info_hide" = "Թաքցնել";
"mobile_user_info_show_details" = "Ցույց տալ մանրամասն";

View file

@ -196,6 +196,7 @@
"graffiti" = "Граффити";
"reply" = "Ответить";
"post_is_ad" = "Этот пост был размещён за взятку.";
"edited_short" = "ред.";
/* Friends */
@ -374,6 +375,25 @@
"upd_f" = "обновила фотографию на своей странице";
"upd_g" = "обновило фотографию группы";
"add_photos" = "Добавить фотографии";
"upload_picts" = "Загрузить фотографии";
"end_uploading" = "Завершить загрузку";
"photos_successfully_uploaded" = "Фотографии успешно загружены";
"click_to_go_to_album" = "Нажмите, чтобы перейти к альбому.";
"error_uploading_photo" = "Не удалось загрузить фотографию";
"too_many_pictures" = "Не больше 10 фотографий";
"drag_files_here" = "Перетащите файлы сюда";
"only_images_accepted" = "Файл \"$1\" не является изображением";
"max_filesize" = "Максимальный размер файла — $1 мегабайт";
"uploading_photos_from_computer" = "Загрузка фотографий с Вашего компьютера";
"supported_formats" = "Поддерживаемые форматы файлов: JPG, PNG и GIF.";
"max_load_photos" = "Вы можете загружать до 10 фотографий за один раз.";
"tip" = "Подсказка";
"tip_ctrl" = "для того, чтобы выбрать сразу несколько фотографий, удерживайте клавишу Ctrl при выборе файлов в ОС Windows или клавишу CMD в Mac OS.";
"album_poster" = "Обложка альбома";
/* Notes */
"notes" = "Заметки";
@ -1014,6 +1034,7 @@
"error_repost_fail" = "Не удалось поделиться записью";
"error_data_too_big" = "Аттрибут '$1' не может быть длиннее $2 $3";
"forbidden" = "Ошибка доступа";
"unknown_error" = "Неизвестная ошибка";
"forbidden_comment" = "Настройки приватности этого пользователя не разрешают вам смотреть на его страницу.";
"changes_saved" = "Изменения сохранены";
"changes_saved_comment" = "Новые данные появятся на вашей странице";
@ -1136,6 +1157,7 @@
"report_is_ignored" = "Жалоба проигнорирована.";
"group_owner_is_banned" = "Создатель сообщества успешно забанен.";
"group_is_banned" = "Сообщество успешно забанено";
"description_too_long" = "Описание слишком длинное.";
/* Admin actions */
@ -1149,6 +1171,7 @@
"warn_user_action" = "Предупредить пользователя";
"ban_in_support_user_action" = "Заблокировать в поддержке";
"unban_in_support_user_action" = "Разблокировать в поддержке";
"changes_history" = "История редактирования";
/* Admin panel */