mirror of
https://github.com/openvk/openvk
synced 2025-04-23 00:23:01 +03:00
Merge branch 'master' into lo_kal_es
This commit is contained in:
commit
5b162fda06
32 changed files with 1446 additions and 357 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()]);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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()
|
||||
]]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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(`
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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"}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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}
|
||||
|
|
||||
{if $comment->canBeDeletedBy($thisUser)}
|
||||
<a href="/comment{$comment->getId()}/delete">{_delete}</a> |
|
||||
{/if}
|
||||
{if $comment->canBeEditedBy($thisUser)}
|
||||
<a id="editPost" data-id="{$comment->getId()}">{_edit}</a> |
|
||||
{/if}
|
||||
<a class="comment-reply">{_reply}</a>
|
||||
{if $thisUser->getId() != $comment->getOwner()->getId()}
|
||||
{var $canReport = true}
|
||||
|
|
|
@ -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)}
|
||||
|
||||
|
||||
|
||||
<a n:if="!($forceNoCommentsLink ?? false) && $commentsCount == 0" href="javascript:expand_comment_textarea({$commentTextAreaId})">{_comment}</a>
|
||||
|
||||
<div class="like_wrap">
|
||||
|
|
|
@ -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> |
|
||||
{/if}
|
||||
|
||||
{if !($forceNoDeleteLink ?? false) && $post->canBeDeletedBy($thisUser)}
|
||||
<a href="/wall{$post->getPrettyId()}/delete">{_delete}</a> |
|
||||
{/if}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
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
198
Web/static/js/al_photos.js
Normal 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")
|
||||
}
|
||||
})
|
|
@ -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"
|
||||
}
|
||||
})
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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" = " "Ի՞նչ եթե ինձ այս կայքը դուր չի գալիս։" ";
|
||||
"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" = ""Լուսանկարների" բաժինը հասանելի է Ձեզ անմիջապես գրանցումից հետո";
|
||||
"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" = ""Որոնման" բաժինը թույլ է տալիս փնտրել մարդկանց և խմբերը։";
|
||||
"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" = ""Վիդեոների" բաժինը ղեկավարվում է անվտանգության կարգավորումներով";
|
||||
"tour_section_5_bottom_text_1" = "Վիդեոները կարող են տեղադրվել անցնելով "Վիդեոների" բաժինը, ուղղակի կցելով դրանք պատին.";
|
||||
"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" = ""Լուրերի" բաժինը բաժանվում է երկու տիպի. հիմնական և ընդհանուր ժապավենների";
|
||||
"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" = "Կառավարեք խումբը "Խմբագրել Խումբը" բաժնում հանրության ավատարի ներքո";
|
||||
"tour_section_9_text_2_2" = "Ստեղծեք Ձեր ադմինիստրատորների ու մոդերատորների թիմը, ում Դուք վստահում եք";
|
||||
"tour_section_9_text_2_3" = "Դուք կարող եք թաքցնել ադմինիստրատորին, և նա չի երևա Ձեր խմբի ոչ մի անկյունում";
|
||||
"tour_section_9_bottom_text_1" = ""Իմ Խմբերը" բաժինը կայքի ձախ մենյույում է գտնվում";
|
||||
"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" = "Տեսքերի ցանկը հասանելի է "Իմ Կարգավորումներ" –ի "Ինտերֆեյս" բաժնում;";
|
||||
"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" = "Ցույց տալ մանրամասն";
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in a new issue