Compare commits

...

5 commits

Author SHA1 Message Date
ayato
cc0ddecb60
Merge d4f14ba09d into bbef3a8518 2024-09-23 06:16:29 +03:00
veselcraft
bbef3a8518
feat(friends): delete leftovers 2024-09-18 22:07:17 +03:00
veselcraft
c5644a51d6
feat(friends): add ajax 2024-09-18 01:02:56 +03:00
veselcraft
4c78617a9c
feat(friends)!: reject request 2024-09-16 02:11:28 +03:00
ayato
d4f14ba09d
locales: English: fix grammar 2024-03-13 21:47:27 +06:00
16 changed files with 219 additions and 106 deletions

View file

@ -147,7 +147,7 @@ final class Friends extends VKAPIRequestHandler
return $response; return $response;
} }
function getRequests(string $fields = "", int $offset = 0, int $count = 100, int $extended = 0): object function getRequests(string $fields = "", int $out = 0, int $offset = 0, int $count = 100, int $extended = 0): object
{ {
if ($count >= 1000) if ($count >= 1000)
$this->fail(100, "One of the required parameters was not passed or is invalid."); $this->fail(100, "One of the required parameters was not passed or is invalid.");
@ -158,10 +158,19 @@ final class Friends extends VKAPIRequestHandler
$offset++; $offset++;
$followers = []; $followers = [];
if ($out != 0) {
foreach($this->getUser()->getFollowers($offset, $count) as $follower) { foreach($this->getUser()->getFollowers($offset, $count) as $follower) {
$followers[$i] = $follower->getId(); $followers[$i] = $follower->getId();
$i++; $i++;
} }
}
else
{
foreach($this->getUser()->getRequests($offset, $count) as $follower) {
$followers[$i] = $follower->getId();
$i++;
}
}
$response = $followers; $response = $followers;
$usersApi = new Users($this->getUser()); $usersApi = new Users($this->getUser());

View file

@ -39,4 +39,25 @@ trait TSubscribable
$sub->delete(); $sub->delete();
return false; return false;
} }
function changeFlags(User $user, int $flags, bool $reverse): bool
{
$ctx = DatabaseConnection::i()->getContext();
$data = [
"follower" => $reverse ? $this->getId() : $user->getId(),
"model" => static::class,
"target" => $reverse ? $user->getId() : $this->getId(),
];
$sub = $ctx->table("subscriptions")->where($data);
bdump($data);
if (!$sub)
return false;
$sub->update([
'flags' => $flags
]);
return true;
}
} }

View file

@ -592,6 +592,16 @@ class User extends RowModel
return $this->_abstractRelationCount("get-followers"); return $this->_abstractRelationCount("get-followers");
} }
function getRequests(int $page = 1, int $limit = 6): \Traversable
{
return $this->_abstractRelationGenerator("get-requests", $page, $limit);
}
function getRequestsCount(): int
{
return $this->_abstractRelationCount("get-requests");
}
function getSubscriptions(int $page = 1, int $limit = 6): \Traversable function getSubscriptions(int $page = 1, int $limit = 6): \Traversable
{ {
return $this->_abstractRelationGenerator("get-subscriptions-user", $page, $limit); return $this->_abstractRelationGenerator("get-subscriptions-user", $page, $limit);

View file

@ -1,5 +1,5 @@
(SELECT DISTINCT(follower) AS __id FROM (SELECT DISTINCT(follower) AS __id FROM
(SELECT follower FROM subscriptions WHERE target=? AND model="openvk\\Web\\Models\\Entities\\User") u0 (SELECT follower, flags FROM subscriptions WHERE target=? AND model="openvk\\Web\\Models\\Entities\\User") u0
LEFT JOIN LEFT JOIN
(SELECT target FROM subscriptions WHERE follower=? AND model="openvk\\Web\\Models\\Entities\\User") u1 (SELECT target FROM subscriptions WHERE follower=? AND model="openvk\\Web\\Models\\Entities\\User") u1
ON u0.follower = u1.target WHERE u1.target IS NULL) u2 ON u0.follower = u1.target WHERE u1.target IS NULL) u2

View file

@ -0,0 +1,6 @@
(SELECT DISTINCT(follower) AS __id FROM
(SELECT follower FROM subscriptions WHERE target=? AND flags=0 AND model="openvk\\Web\\Models\\Entities\\User") u0
LEFT JOIN
(SELECT target FROM subscriptions WHERE follower=? AND flags=0 AND model="openvk\\Web\\Models\\Entities\\User") u1
ON u0.follower = u1.target WHERE u1.target IS NULL) u2
INNER JOIN profiles ON profiles.id = u2.__id

View file

@ -329,9 +329,12 @@ final class UserPresenter extends OpenVKPresenter
$user = $this->users->get((int) $this->postParam("id")); $user = $this->users->get((int) $this->postParam("id"));
if(!$user) exit("Invalid state"); if(!$user) exit("Invalid state");
if ($this->postParam("act") == "rej")
$user->changeFlags($this->user->identity, 0b10000000, true);
else
$user->toggleSubscription($this->user->identity); $user->toggleSubscription($this->user->identity);
$this->redirect($user->getURL()); $this->redirect($_SERVER['HTTP_REFERER']);
} }
function renderSetAvatar() function renderSetAvatar()

View file

@ -178,9 +178,9 @@
<a href="/edit" class="link edit-button">{_edit_button}</a> <a href="/edit" class="link edit-button">{_edit_button}</a>
<a href="{$thisUser->getURL()}" class="link" title="{_my_page} [Alt+Shift+.]" accesskey=".">{_my_page}</a> <a href="{$thisUser->getURL()}" class="link" title="{_my_page} [Alt+Shift+.]" accesskey=".">{_my_page}</a>
<a href="/friends{$thisUser->getId()}" class="link">{_my_friends} <a href="/friends{$thisUser->getId()}" class="link">{_my_friends}
<object type="internal/link" n:if="$thisUser->getFollowersCount() > 0"> <object type="internal/link" n:if="$thisUser->getRequestsCount() > 0">
<a href="/friends{$thisUser->getId()}?act=incoming" class="linkunderline"> <a href="/friends{$thisUser->getId()}?act=incoming" class="linkunderline">
(<b>{$thisUser->getFollowersCount()}</b>) (<b>{$thisUser->getRequestsCount()}</b>)
</a> </a>
</object> </object>
</a> </a>

View file

@ -49,7 +49,7 @@
{include description, x => $dat} {include description, x => $dat}
{/ifset} {/ifset}
</td> </td>
<td n:ifset="actions" valign="top" class="action_links" style="width: 150px;"> <td n:ifset="actions" valign="top" class="action_links" style="min-width: 150px;">
{include actions, x => $dat} {include actions, x => $dat}
</td> </td>
</tr> </tr>

View file

@ -4,11 +4,14 @@
{var $act = $_GET["act"] ?? "friends"} {var $act = $_GET["act"] ?? "friends"}
{if $act == "incoming"} {if $act == "incoming"}
{var $iterator = iterator_to_array($user->getFollowers($page))} {var $iterator = iterator_to_array($user->getRequests($page))}
{var $count = $user->getFollowersCount()} {var $count = $user->getRequestsCount()}
{elseif $act == "outcoming"} {elseif $act == "outcoming"}
{var $iterator = iterator_to_array($user->getSubscriptions($page))} {var $iterator = iterator_to_array($user->getSubscriptions($page))}
{var $count = $user->getSubscriptionsCount()} {var $count = $user->getSubscriptionsCount()}
{elseif $act == "followers"}
{var $iterator = iterator_to_array($user->getFollowers($page))}
{var $count = $user->getFollowersCount()}
{elseif $act == "online"} {elseif $act == "online"}
{var $iterator = iterator_to_array($user->getFriendsOnline($page))} {var $iterator = iterator_to_array($user->getFriendsOnline($page))}
{var $count = $user->getFriendsOnlineCount()} {var $count = $user->getFriendsOnlineCount()}
@ -22,6 +25,8 @@
{_incoming_req} {_incoming_req}
{elseif $act == "outcoming"} {elseif $act == "outcoming"}
{_outcoming_req} {_outcoming_req}
{elseif $act == "followers"}
{_followers}
{elseif $act == "online"} {elseif $act == "online"}
{_friends_online} {_friends_online}
{else} {else}
@ -38,6 +43,8 @@
{_incoming_req} {_incoming_req}
{elseif $act == "outcoming"} {elseif $act == "outcoming"}
{_outcoming_req} {_outcoming_req}
{elseif $act == "followers"}
{_followers}
{elseif $act == "online"} {elseif $act == "online"}
{_friends_online} {_friends_online}
{else} {else}
@ -53,18 +60,23 @@
<div n:attr="id => ($act === 'online' ? 'activetabs' : 'ki')" class="tab"> <div n:attr="id => ($act === 'online' ? 'activetabs' : 'ki')" class="tab">
<a n:attr="id => ($act === 'online' ? 'act_tab_a' : 'ki')" href="?act=online">{_online}</a> <a n:attr="id => ($act === 'online' ? 'act_tab_a' : 'ki')" href="?act=online">{_online}</a>
</div> </div>
<div n:if="!is_null($thisUser) && $user->getId() === $thisUser->getId()" n:attr="id => ($act === 'incoming' || $act === 'outcoming' ? 'activetabs' : 'ki')" class="tab"> <div n:if="!is_null($thisUser) && $user->getId() === $thisUser->getId()" n:attr="id => ($act === 'incoming' || $act === 'followers' || $act === 'outcoming' ? 'activetabs' : 'ki')" class="tab">
<a n:attr="id => ($act === 'incoming' || $act === 'outcoming' ? 'act_tab_a' : 'ki')" href="?act=incoming">{_req}</a> <a n:attr="id => ($act === 'incoming' || $act === 'followers' || $act === 'outcoming' ? 'act_tab_a' : 'ki')" href="?act=incoming">{_req}</a>
</div> </div>
{/block} {/block}
{block size} {block size}
<div n:if="$act === 'incoming' || $act === 'outcoming'" class="mb_tabs"> <div n:if="$act === 'incoming' || $act === 'followers' || $act === 'outcoming'" class="mb_tabs">
<div n:attr="id => ($act === 'incoming' ? 'active' : 'ki')" class="mb_tab"> <div n:attr="id => ($act === 'incoming' ? 'active' : 'ki')" class="mb_tab">
<div> <div>
<a href="?act=incoming">{_incoming_req}</a> <a href="?act=incoming">{_incoming_req}</a>
</div> </div>
</div> </div>
<div n:attr="id => ($act === 'followers' ? 'active' : 'ki')" class="mb_tab">
<div>
<a href="?act=followers">{_followers}</a>
</div>
</div>
<div n:attr="id => ($act === 'outcoming' ? 'active' : 'ki')" class="mb_tab"> <div n:attr="id => ($act === 'outcoming' ? 'active' : 'ki')" class="mb_tab">
<div> <div>
<a href="?act=outcoming">{_outcoming_req}</a> <a href="?act=outcoming">{_outcoming_req}</a>
@ -78,6 +90,8 @@
{tr("req", $count)} {tr("req", $count)}
{elseif $act == "outcoming"} {elseif $act == "outcoming"}
{tr("req", $count)} {tr("req", $count)}
{elseif $act == "followers"}
{tr("followers", $count)}
{elseif $act == "online"} {elseif $act == "online"}
{tr("friends_list_online", $count)} {tr("friends_list_online", $count)}
{else} {else}
@ -131,21 +145,29 @@
{if ($x->getId() !== $thisUser->getId()) && ($thisUser->getId() === $user->getId())} {if ($x->getId() !== $thisUser->getId()) && ($thisUser->getId() === $user->getId())}
{var $subStatus = $x->getSubscriptionStatus($thisUser)} {var $subStatus = $x->getSubscriptionStatus($thisUser)}
{if $subStatus === 0} {if $subStatus === 0}
<form action="/setSub/user" method="post" class="profile_link_form"> <form action="/setSub/user" method="post" class="profile_link_form" id="_submitUserSubscriptionAction">
<input type="hidden" name="act" value="add" /> <input type="hidden" name="act" value="add" />
<input type="hidden" name="id" value="{$x->getId()}" /> <input type="hidden" name="id" value="{$x->getId()}" />
<input type="hidden" name="hash" value="{$csrfToken}" /> <input type="hidden" name="hash" value="{$csrfToken}" />
<input type="submit" class="profile_link" value="{_friends_add}" /> <input type="submit" class="profile_link" value="{_friends_add}" />
</form> </form>
{elseif $subStatus === 1} {elseif $subStatus === 1}
<form action="/setSub/user" method="post" class="profile_link_form"> <form action="/setSub/user" method="post" class="profile_link_form" id="_submitUserSubscriptionAction">
<input type="hidden" name="act" value="add" /> <input type="hidden" name="act" value="add" />
<input type="hidden" name="id" value="{$x->getId()}" /> <input type="hidden" name="id" value="{$x->getId()}" />
<input type="hidden" name="hash" value="{$csrfToken}" /> <input type="hidden" name="hash" value="{$csrfToken}" />
<input type="submit" class="profile_link" value="{_friends_accept}" /> <input type="submit" class="profile_link" value="{_friends_accept}" />
</form> </form>
{if $act !== 'followers'}
<form action="/setSub/user" method="post" class="profile_link_form" id="_submitUserSubscriptionAction">
<input type="hidden" name="act" value="rej" />
<input type="hidden" name="id" value="{$x->getId()}" />
<input type="hidden" name="hash" value="{$csrfToken}" />
<input type="submit" class="profile_link" value="{_friends_leave_in_flw}" />
</form>
{/if}
{elseif $subStatus === 2} {elseif $subStatus === 2}
<form action="/setSub/user" method="post" class="profile_link_form"> <form action="/setSub/user" method="post" class="profile_link_form" id="_submitUserSubscriptionAction">
<input type="hidden" name="act" value="rem" /> <input type="hidden" name="act" value="rem" />
<input type="hidden" name="id" value="{$x->getId()}" /> <input type="hidden" name="id" value="{$x->getId()}" />
<input type="hidden" name="hash" value="{$csrfToken}" /> <input type="hidden" name="hash" value="{$csrfToken}" />
@ -153,7 +175,7 @@
</form> </form>
{elseif $subStatus === 3} {elseif $subStatus === 3}
<a href="/im?sel={$x->getId()}" class="profile_link">{_send_message}</a> <a href="/im?sel={$x->getId()}" class="profile_link">{_send_message}</a>
<form action="/setSub/user" method="post" class="profile_link_form"> <form action="/setSub/user" method="post" class="profile_link_form" id="_submitUserSubscriptionAction">
<input type="hidden" name="act" value="rem" /> <input type="hidden" name="act" value="rem" />
<input type="hidden" name="id" value="{$x->getId()}" /> <input type="hidden" name="id" value="{$x->getId()}" />
<input type="hidden" name="hash" value="{$csrfToken}" /> <input type="hidden" name="hash" value="{$csrfToken}" />

View file

@ -427,6 +427,22 @@ h1 {
text-transform: lowercase; text-transform: lowercase;
} }
.action_links.disable>a,
.action_links.disable>form>input,
.action_links.disable {
cursor: not-allowed;
color: grey;
}
.action_links.loading::after {
content: "";
display: inline-block;
background-image: url('/assets/packages/static/openvk/img/loading_mini.gif');
width: 30px;
height: 7px;
margin-left: 5px;
}
.profile_link.disable>a, .profile_link.disable>a,
.profile_link.disable { .profile_link.disable {
cursor: not-allowed; cursor: not-allowed;
@ -2068,20 +2084,17 @@ table td[width="120"] {
font-weight: bold; font-weight: bold;
margin-right: 10px; margin-right: 10px;
display: inline-block; display: inline-block;
border-radius: 2px;
} }
.mb_tab div { .mb_tab div {
padding: 3px 7px; padding: 5px 9px;
} }
.mb_tab#active { .mb_tab#active {
background-color: #898989; background-color: #898989;
} }
.mb_tab#active div {
border: 2px solid #5f5f5f;
}
.mb_tab#active a { .mb_tab#active a {
color: white; color: white;
} }

View file

@ -167,6 +167,23 @@ document.addEventListener("DOMContentLoaded", function() { //BEGIN
return false; return false;
}); });
u("#_submitUserSubscriptionAction").handle("submit", async function(e) {
u(this).nodes[0].parentElement.classList.add('loading');
u(this).nodes[0].parentElement.classList.add('disable');
console.log(e.target);
const data = await fetch(u(this).attr('action'), { method: 'POST', body: new FormData(e.target) });
if (data.ok) {
u(this).nodes[0].parentElement.classList.remove('loading');
u(this).nodes[0].parentElement.classList.remove('disable');
if (e.target[0].value == "add") {
u(this).nodes[0].parentElement.innerHTML = tr("friends_add_msg");
} else if (e.target[0].value == "rej") {
u(this).nodes[0].parentElement.innerHTML = tr("friends_rej_msg");
} else if (e.target[0].value == "rem") {
u(this).nodes[0].parentElement.innerHTML = tr("friends_rem_msg");
}
}
})
}); //END ONREADY DECLS }); //END ONREADY DECLS
async function repostPost(id, hash) { async function repostPost(id, hash) {

View file

@ -0,0 +1 @@
ALTER TABLE `subscriptions` ADD `flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `target`

View file

@ -131,6 +131,7 @@
"friends_delete" = "Выдаліць з сяброў"; "friends_delete" = "Выдаліць з сяброў";
"friends_reject" = "Адмяніць заяўку"; "friends_reject" = "Адмяніць заяўку";
"friends_accept" = "Прыняць заяўку"; "friends_accept" = "Прыняць заяўку";
"friends_leave_in_flw" = "Пакінуть у падпісчыках";
"send_message" = "Адправіць паведамленне"; "send_message" = "Адправіць паведамленне";
"incoming_req" = "Падпісанты"; "incoming_req" = "Падпісанты";
"outcoming_req" = "Заяўкі"; "outcoming_req" = "Заяўкі";

View file

@ -111,7 +111,7 @@
"relationship_4" = "Married"; "relationship_4" = "Married";
"relationship_5" = "In a civil marriage"; "relationship_5" = "In a civil marriage";
"relationship_6" = "In love"; "relationship_6" = "In love";
"relationship_7" = "Everything is complicated"; "relationship_7" = "It's complicated";
"relationship_8" = "Actively searching"; "relationship_8" = "Actively searching";
/* xd */ /* xd */
@ -122,7 +122,7 @@
"relationship_6_prefix" = "with"; "relationship_6_prefix" = "with";
"relationship_7_prefix" = "with"; "relationship_7_prefix" = "with";
"politViews" = "Polit. Views"; "politViews" = "Political views";
"politViews_0" = "Not Selected"; "politViews_0" = "Not Selected";
"politViews_1" = "Indifferent"; "politViews_1" = "Indifferent";
@ -156,7 +156,7 @@
"updated_at" = "Updated at $1"; "updated_at" = "Updated at $1";
"user_banned" = "Unfortunately, we had to block the <b>$1</b> user page."; "user_banned" = "Unfortunately, we had to block <b>$1's</b> user page.";
"user_banned_comment" = "Moderator's comment:"; "user_banned_comment" = "Moderator's comment:";
"verified_page" = "Verified page"; "verified_page" = "Verified page";
"user_is_blocked" = "User is blocked"; "user_is_blocked" = "User is blocked";
@ -201,7 +201,7 @@
"pin" = "Pin"; "pin" = "Pin";
"unpin" = "Unpin"; "unpin" = "Unpin";
"pinned" = "pinned"; "pinned" = "pinned";
"comments_tip" = "Be first, who leaves a comment at this post!"; "comments_tip" = "Be the first to leave a comment on this post!";
"your_comment" = "Your comment"; "your_comment" = "Your comment";
"auditory" = "Auditory"; "auditory" = "Auditory";
"in_wall" = "to user's wall"; "in_wall" = "to user's wall";
@ -236,7 +236,7 @@
"no_posts_abstract" = "Nobody wrote anything here... So far."; "no_posts_abstract" = "Nobody wrote anything here... So far.";
"attach_no_longer_available" = "This attachment is no longer available."; "attach_no_longer_available" = "This attachment is no longer available.";
"open_post" = "Open post"; "open_post" = "Open post";
"version_incompatibility" = "This attachment could not be displayed. Probably the database is incompatible with the current version of OpenVK."; "version_incompatibility" = "This attachment could not be displayed. Probably because the database is incompatible with the current version of OpenVK.";
"graffiti" = "Graffiti"; "graffiti" = "Graffiti";
@ -259,6 +259,10 @@
"friends_delete" = "Remove from friends"; "friends_delete" = "Remove from friends";
"friends_reject" = "Reject request"; "friends_reject" = "Reject request";
"friends_accept" = "Accept request"; "friends_accept" = "Accept request";
"friends_leave_in_flw" = "Leave in followers";
"friends_add_msg" = "Now you're friends.";
"friends_rej_msg" = "You left this user as subscriber.";
"friends_rem_msg" = "You deleted this user from your friend list.";
"send_message" = "Send a message"; "send_message" = "Send a message";
"incoming_req" = "Pending"; "incoming_req" = "Pending";
"outcoming_req" = "Outgoing"; "outcoming_req" = "Outgoing";
@ -311,8 +315,8 @@
"create_group" = "Create group"; "create_group" = "Create group";
"group_managers" = "Managers"; "group_managers" = "Managers";
"group_type" = "Group type"; "group_type" = "Group type";
"group_type_open" = "This is an open group, anyone can enter it."; "group_type_open" = "This is an open group. Anyone can enter it.";
"group_type_closed" = "This is an closed group. To enter, you must submit an request."; "group_type_closed" = "This is a closed group. To enter, you must submit a request.";
"creator" = "Creator"; "creator" = "Creator";
"administrators" = "Administrators"; "administrators" = "Administrators";
"add_to_left_menu" = "Add to left menu"; "add_to_left_menu" = "Add to left menu";
@ -351,12 +355,12 @@
"suggested_by_everyone_many" = "$1 suggested posts"; "suggested_by_everyone_many" = "$1 suggested posts";
"suggested_by_everyone_other" = "$1 suggested posts"; "suggested_by_everyone_other" = "$1 suggested posts";
"group_hide_from_global_feed" = "Don't display posts in the global feed"; "group_hide_from_global_feed" = "Don't display posts in global feed";
"suggested_posts_by_you" = "Suggested posts by you"; "suggested_posts_by_you" = "Your suggested posts";
"suggested_posts_by_everyone" = "Suggested posts"; "suggested_posts_by_everyone" = "Suggested posts";
"suggested" = "Suggested"; "suggested" = "Suggested";
"suggested_posts_everyone" = "Suggested by users posts"; "suggested_posts_everyone" = "Posts suggested by users";
"no_suggested_posts_by_you" = "You haven't suggested posts to this group yet."; "no_suggested_posts_by_you" = "You haven't suggested any post to this group yet.";
"no_suggested_posts_by_people" = "No posts have been suggested to this group yet."; "no_suggested_posts_by_people" = "No posts have been suggested to this group yet.";
"publish_suggested" = "Accept"; "publish_suggested" = "Accept";
@ -371,23 +375,24 @@
"suggested_posts_in_group_many" = "This group has $1 suggested posts"; "suggested_posts_in_group_many" = "This group has $1 suggested posts";
"suggested_posts_in_group_other" = "This group has $1 suggested posts"; "suggested_posts_in_group_other" = "This group has $1 suggested posts";
"suggested_posts_in_group_by_you_zero" = "You haven't suggested any posts to this group"; "suggested_posts_in_group_by_you_zero" = "You haven't suggested any post to this group";
"suggested_posts_in_group_by_you_one" = "You suggested one post to this group"; "suggested_posts_in_group_by_you_one" = "You suggested one post to this group";
"suggested_posts_in_group_by_you_few" = "You suggested $1 posts to this group"; "suggested_posts_in_group_by_you_few" = "You suggested $1 posts to this group";
"suggested_posts_in_group_by_you_many" = "You suggested $1 posts to this group"; "suggested_posts_in_group_by_you_many" = "You suggested $1 posts to this group";
"suggested_posts_in_group_by_you_other" = "You suggested $1 posts to this group"; "suggested_posts_in_group_by_you_other" = "You suggested $1 posts to this group";
"suggestion_succefully_published" = "Post successfully published"; "suggestion_successfully_published" = "Post successfully published";
"suggestion_succefully_declined" = "Post successfully declined"; "suggestion_successfully_declined" = "Post successfully declined";
"suggestion_press_to_go" = "Click to show it"; "suggestion_press_to_go" = "Go to post";
"error_declining_invalid_post" = "Error when declining post: post does not exists"; "error_declining_invalid_post" = "The suggested post you attempted to decline is invalid";
"error_declining_not_suggested_post" = "Error when declining post: post is not suggested"; "error_declining_not_suggested_post" = "The post you attempted to decline is not suggested";
"error_declining_declined_post" = "Error when declining post: post is already declined"; "error_declining_declined_post" = "This suggested post has already been declined";
"error_accepting_invalid_post" = "The suggested post you attempted to accept is invalid";
"error_accepting_not_suggested_post" = "The post you attempted to accept is not suggested";
"error_accepting_declined_post" = "This suggested post has already been declined";
"error_accepting_invalid_post" = "Error when accepting post: post does not exists";
"error_accepting_not_suggested_post" = "Error when accepting post: post is not suggested";
"error_accepting_declined_post" = "Error when accepting post: cant accept declined post";
"statistics" = "Statistics"; "statistics" = "Statistics";
"group_administrators_list" = "Admins list"; "group_administrators_list" = "Admins list";
"group_display_only_creator" = "Display only group creator"; "group_display_only_creator" = "Display only group creator";
@ -473,7 +478,7 @@
"deleting_avatar" = "Deleting photo"; "deleting_avatar" = "Deleting photo";
"deleting_avatar_sure" = "Do you sure you want to delete avatar?"; "deleting_avatar_sure" = "Do you sure you want to delete avatar?";
"deleted_avatar_notification" = "Picture successfully deleted"; "deleted_avatar_notification" = "Picture deleted successfully";
"save_changes" = "Save changes"; "save_changes" = "Save changes";
@ -485,7 +490,7 @@
"add_photos" = "Add photos"; "add_photos" = "Add photos";
"upload_picts" = "Upload photos"; "upload_picts" = "Upload photos";
"end_uploading" = "Finish uploading"; "end_uploading" = "Finish uploading";
"photos_successfully_uploaded" = "Photos successfully uploaded"; "photos_successfully_uploaded" = "Photos uploaded successfully";
"click_to_go_to_album" = "Click here to go to album."; "click_to_go_to_album" = "Click here to go to album.";
"error_uploading_photo" = "Error when uploading photo"; "error_uploading_photo" = "Error when uploading photo";
"too_many_pictures" = "No more than 10 pictures"; "too_many_pictures" = "No more than 10 pictures";
@ -545,10 +550,10 @@
"error_attaching_note" = "Error when attaching note"; "error_attaching_note" = "Error when attaching note";
"select_or_create_new" = "Select existing note or <a href='/notes/create'>create new one</a>"; "select_or_create_new" = "Select an existing note or <a href='/notes/create'>create a new one</a>";
"notes_closed" = "You can't attach note to post, because only you can see them.<br> You can change it in <a href=\"/settings?act=privacy\">settings</a>."; "notes_closed" = "You can't attach a note to the post because only you can see them.<br> You can change this in <a href=\"/settings?act=privacy\">settings</a>.";
"do_not_attach_note" = "Do not attach note"; "do_not_attach_note" = "Do not attach a note";
"something" = "Something"; "something" = "Something";
"supports_xhtml" = "from (X)HTML supported."; "supports_xhtml" = "from (X)HTML supported.";
@ -571,15 +576,15 @@
"my_feed" = "My Feed"; "my_feed" = "My Feed";
"my_feedback" = "My Feedback"; "my_feedback" = "My Feedback";
"my_settings" = "My Settings"; "my_settings" = "My Settings";
"bug_tracker" = "Bug-tracker"; "bug_tracker" = "Bug Tracker";
"menu_settings" = "Settings"; "menu_settings" = "Settings";
"menu_login" = "Login"; "menu_login" = "Login";
"menu_registration" = "Registration"; "menu_registration" = "Register";
"menu_help" = "Help"; "menu_help" = "Help";
"menu_logout" = "Logout"; "menu_logout" = "Log out";
"menu_support" = "Support"; "menu_support" = "Support";
"header_home" = "home"; "header_home" = "home";
@ -840,16 +845,16 @@
"limits" = "Limits"; "limits" = "Limits";
"select_audio" = "Select audio from your computer"; "select_audio" = "Select audio from your computer";
"audio_requirements" = "Audio must be between $1 seconds to $2 minutes, weights to $3 MB and contain audio stream."; "audio_requirements" = "Audio must be between $1 seconds and $2 minutes, with a file size up to $3 MB, and contain an audio stream.";
"audio_requirements_2" = "Audio must not infringe copyright and related rights"; "audio_requirements_2" = "Audio must not infringe copyright and related rights.";
"you_can_also_add_audio_using" = "You can also add audio from among the files you have already downloaded using"; "you_can_also_add_audio_using" = "You can also add audio from files you have already downloaded using";
"search_audio_inst" = "audios search"; "search_audio_inst" = "audios search";
"audio_embed_not_found" = "Audio not found"; "audio_embed_not_found" = "Audio not found";
"audio_embed_deleted" = "Audio was deleted"; "audio_embed_deleted" = "Audio has been deleted";
"audio_embed_withdrawn" = "The audio was withdrawn at the request of the copyright holder"; "audio_embed_withdrawn" = "The audio has been withdrawn at the request of the copyright holder";
"audio_embed_forbidden" = "The user's privacy settings do not allow this audio to be embedded"; "audio_embed_forbidden" = "The user's privacy settings do not allow this audio to be embedded";
"audio_embed_processing" = "Audio is still being processed, or has not been processed correctly."; "audio_embed_processing" = "Audio is still being processed or has not been processed correctly.";
"audios_count_zero" = "No audios"; "audios_count_zero" = "No audios";
"audios_count_one" = "One audio"; "audios_count_one" = "One audio";
@ -862,7 +867,7 @@
"my_music" = "My music"; "my_music" = "My music";
"music_user" = "User's music"; "music_user" = "User's music";
"music_club" = "Club's music"; "music_club" = "Group's music";
"audio_new" = "New"; "audio_new" = "New";
"audio_popular" = "Popular"; "audio_popular" = "Popular";
"audio_search" = "Search"; "audio_search" = "Search";
@ -904,19 +909,19 @@
"delete_playlist" = "Delete playlist"; "delete_playlist" = "Delete playlist";
"playlist_cover" = "Playlist cover"; "playlist_cover" = "Playlist cover";
"playlists_user" = "Users playlists"; "playlists_user" = "User's playlists";
"playlists_club" = "Groups playlists"; "playlists_club" = "Group's playlists";
"change_cover" = "Change cover"; "change_cover" = "Change cover";
"playlist_cover" = "Playlist's cover"; "playlist_cover" = "Playlist's cover";
"minutes_count_zero" = "lasts no minutes"; "minutes_count_zero" = "Lasts no minutes";
"minutes_count_one" = "lasts one minute"; "minutes_count_one" = "Lasts one minute";
"minutes_count_few" = "lasts $1 minutes"; "minutes_count_few" = "Lasts $1 minutes";
"minutes_count_many" = "lasts $1 minutes"; "minutes_count_many" = "Lasts $1 minutes";
"minutes_count_other" = "lasts $1 minutes"; "minutes_count_other" = "Lasts $1 minutes";
"listens_count_zero" = "no listens"; "listens_count_zero" = "No listens";
"listens_count_one" = "one listen"; "listens_count_one" = "One listen";
"listens_count_few" = "$1 listens"; "listens_count_few" = "$1 listens";
"listens_count_many" = "$1 listens"; "listens_count_many" = "$1 listens";
"listens_count_other" = "$1 listens"; "listens_count_other" = "$1 listens";
@ -932,7 +937,7 @@
"audio_successfully_uploaded" = "Audio has been successfully uploaded and is currently being processed."; "audio_successfully_uploaded" = "Audio has been successfully uploaded and is currently being processed.";
"broadcast_audio" = "Broadcast audio to status"; "broadcast_audio" = "Broadcast audio to status";
"sure_delete_playlist" = "Do you sure want to delete this playlist?"; "sure_delete_playlist" = "Are you sure you want to delete this playlist?";
"edit_audio" = "Edit audio"; "edit_audio" = "Edit audio";
"audios_group" = "Audios from group"; "audios_group" = "Audios from group";
"playlists_group" = "Playlists from group"; "playlists_group" = "Playlists from group";
@ -1038,7 +1043,7 @@
"coins_count" = "Number of votes"; "coins_count" = "Number of votes";
"message" = "Message"; "message" = "Message";
"failed_to_tranfer_points" = "Failed to transfer votes"; "failed_to_transfer_points" = "Failed to transfer votes";
"points_transfer_successful" = "You have successfully transferred <b>$1</b> to <b><a href=\"$2\">$3</a></b>."; "points_transfer_successful" = "You have successfully transferred <b>$1</b> to <b><a href=\"$2\">$3</a></b>.";
"not_all_information_has_been_entered" = "Not all information has been entered."; "not_all_information_has_been_entered" = "Not all information has been entered.";
@ -1057,8 +1062,8 @@
"apply_voucher" = "Apply voucher"; "apply_voucher" = "Apply voucher";
"failed_to_increase_rating" = "Failed to increase rating"; "failed_to_increase_rating" = "Failed to increase rating";
"rating_increase_successful" = "You have successfully increased rating of <b><a href=\"$1\">$2</a></b> by <b>$3%</b>."; "rating_increase_successful" = "You have successfully increased the rating of <b><a href=\"$1\">$2</a></b> by <b>$3%</b>.";
"negative_rating_value" = "We cannot steal rating from another person, sorry."; "negative_rating_value" = "You can't steal ratings from another person.";
"increased_your_rating_by" = "increased your rating by"; "increased_your_rating_by" = "increased your rating by";
@ -1119,43 +1124,43 @@
"app_withdrawal_empty" = "Sorry, withdrawal of emptiness is not possible."; "app_withdrawal_empty" = "Sorry, withdrawal of emptiness is not possible.";
"app_withdrawal_created" = "A request to withdraw $1 votes has been created. Awaiting crediting."; "app_withdrawal_created" = "A request to withdraw $1 votes has been created. Awaiting crediting.";
"appjs_payment" = "Purchase payment"; "appjs_payment" = "Purchase Payment";
"appjs_payment_intro" = "You are about to pay for an order in the application"; "appjs_payment_intro" = "You are about to pay for an order in the application";
"appjs_order_items" = "Order items"; "appjs_order_items" = "Order items";
"appjs_payment_total" = "Total amount payable"; "appjs_payment_total" = "Total amount payable";
"appjs_payment_confirm" = "Pay"; "appjs_payment_confirm" = "Pay";
"appjs_err_funds" = "Failed to pay: insufficient funds."; "appjs_err_funds" = "Failed to pay: insufficient funds.";
"appjs_wall_post" = "Publish a post"; "appjs_wall_post" = "Publish a Post";
"appjs_wall_post_desc" = "wants to publish a post on your wall"; "appjs_wall_post_desc" = "wants to publish a post on your wall";
"appjs_act_friends" = "your Friends"; "appjs_act_friends" = "Your Friends";
"appjs_act_friends_desc" = "add users as friends and read your friends list"; "appjs_act_friends_desc" = "add users as friends and read your friends list";
"appjs_act_wall" = "your Wall"; "appjs_act_wall" = "Your Wall";
"appjs_act_wall_desc" = "see your news, your wall and create posts on it"; "appjs_act_wall_desc" = "see your news, your wall and create posts on it";
"appjs_act_messages" = "your Messages"; "appjs_act_messages" = "Your Messages";
"appjs_act_messages_desc" = "read and write messages on your behalf"; "appjs_act_messages_desc" = "read and write messages on your behalf";
"appjs_act_groups" = "your Groups"; "appjs_act_groups" = "Your Groups";
"appjs_act_groups_desc" = "see a list of your groups and subscribe you to other"; "appjs_act_groups_desc" = "see a list of your groups and subscribe you to others";
"appjs_act_likes" = "Likes feature"; "appjs_act_likes" = "Likes Feature";
"appjs_act_likes_desc" = "give and take away likes to posts"; "appjs_act_likes_desc" = "give and take away likes to posts";
"appjs_act_request" = "Access request"; "appjs_act_request" = "Access Request";
"appjs_act_requests" = "requests access to"; "appjs_act_requests" = "requests access to";
"appjs_act_can" = "The app will be able to"; "appjs_act_can" = "The app will be able to";
"appjs_act_allow" = "Allow"; "appjs_act_allow" = "Allow";
"appjs_act_disallow" = "Disallow"; "appjs_act_disallow" = "Disallow";
"app_uninstalled" = "Application is disabled"; "app_uninstalled" = "Application Disabled";
"app_uninstalled_desc" = "It will no longer be able to perform actions on your behalf."; "app_uninstalled_desc" = "It will no longer be able to perform actions on your behalf.";
"app_err_not_found" = "Application not found"; "app_err_not_found" = "Application Not Found";
"app_err_not_found_desc" = "Incorrect identifier or it has been disabled."; "app_err_not_found_desc" = "Incorrect identifier or it has been disabled.";
"app_err_forbidden_desc" = "This application is not yours."; "app_err_forbidden_desc" = "This application does not belong to you.";
"app_err_url" = "Incorrect address"; "app_err_url" = "Incorrect Address";
"app_err_url_desc" = "The address of the application did not pass the check, make sure it is correct."; "app_err_url_desc" = "The address of the application did not pass the check; make sure it is correct.";
"app_err_ava" = "Unable to upload an avatar"; "app_err_ava" = "Unable to Upload an Avatar";
"app_err_ava_desc" = "Avatar too big or wrong: general error #$res."; "app_err_ava_desc" = "Avatar is too big or incorrect: general error #$res.";
"app_err_note" = "Failed to attach a news note"; "app_err_note" = "Failed to Attach a News Note";
"app_err_note_desc" = "Make sure the link is correct and the note belongs to you."; "app_err_note_desc" = "Make sure the link is correct and the note belongs to you.";
"learn_more" = "Learn more"; "learn_more" = "Learn more";
@ -1163,7 +1168,7 @@
/* Support */ /* Support */
"support_opened" = "Opened"; "support_opened" = "Opened";
"support_answered" = "With a response"; "support_answered" = "Has a response";
"support_closed" = "Closed"; "support_closed" = "Closed";
"support_ticket" = "Ticket"; "support_ticket" = "Ticket";
"support_tickets" = "Tickets"; "support_tickets" = "Tickets";
@ -1171,28 +1176,28 @@
"support_status_1" = "There's a response"; "support_status_1" = "There's a response";
"support_status_2" = "Closed"; "support_status_2" = "Closed";
"support_greeting_hi" = "Greetings, $1!"; "support_greeting_hi" = "Greetings, $1!";
"support_greeting_regards" = "Best regards,<br/>$1 support team."; "support_greeting_regards" = "Best regards,<br/>$1 Support Team.";
"support_faq" = "Frequently Asked Questions"; "support_faq" = "Frequently Asked Questions";
"support_list" = "List of tickets"; "support_list" = "List of Tickets";
"support_new" = "New ticket"; "support_new" = "New Ticket";
"support_new_title" = "Enter the topic of your ticket"; "support_new_title" = "Enter the topic of your ticket";
"support_new_content" = "Describe the issue or suggestion"; "support_new_content" = "Describe the issue or suggestion";
"reports" = "Reports"; "reports" = "Reports";
"support_rate_good_answer" = "This is good answer"; "support_rate_good_answer" = "This is a good answer";
"support_rate_bad_answer" = "This is bad answer"; "support_rate_bad_answer" = "This is a bad answer";
"support_good_answer_user" = "You left a positive feedback."; "support_good_answer_user" = "You left positive feedback.";
"support_bad_answer_user" = "You left a negative feedback."; "support_bad_answer_user" = "You left negative feedback.";
"support_good_answer_agent" = "User left a positive feedback."; "support_good_answer_agent" = "User left positive feedback.";
"support_bad_answer_agent" = "User left a negative feedback."; "support_bad_answer_agent" = "User left negative feedback.";
"support_rated_good" = "You left a positive feedback about the answer."; "support_rated_good" = "You left positive feedback about the answer.";
"support_rated_bad" = "You left a negative feedback about the answer."; "support_rated_bad" = "You left negative feedback about the answer.";
"wrong_parameters" = "Invalid request parameters."; "wrong_parameters" = "Invalid request parameters.";
"fast_answers" = "Fast answers"; "fast_answers" = "Quick Answers";
"ignore_report" = "Ignore report"; "ignore_report" = "Ignore report";
"report_number" = "Report #"; "report_number" = "Report #";
@ -1287,7 +1292,7 @@
"poll_editor_tips" = "Pressing backspace in empty option will remove it. Use Tab/Enter (in last option) to create new options faster."; "poll_editor_tips" = "Pressing backspace in empty option will remove it. Use Tab/Enter (in last option) to create new options faster.";
"poll_embed" = "Embed code"; "poll_embed" = "Embed code";
"poll_voter_count_zero" = "Be <b>the first one</b> to vote!"; "poll_voter_count_zero" = "Be <b>the first</b> to vote!";
"poll_voter_count_one" = "<b>Only one</b> user voted."; "poll_voter_count_one" = "<b>Only one</b> user voted.";
"poll_voter_count_few" = "<b>$1</b> users voted."; "poll_voter_count_few" = "<b>$1</b> users voted.";
"poll_voter_count_many" = "<b>$1</b> users voted."; "poll_voter_count_many" = "<b>$1</b> users voted.";
@ -1314,7 +1319,7 @@
"messages_other" = "$1 messages"; "messages_other" = "$1 messages";
"topic_messages_count_zero" = "Topic has no messages"; "topic_messages_count_zero" = "Topic has no messages";
"topic_messages_count_one" = "There are one message in the topic"; "topic_messages_count_one" = "There is one message in the topic";
"topic_messages_count_other" = "There are $1 messages in the topic"; "topic_messages_count_other" = "There are $1 messages in the topic";
"replied" = "replied"; "replied" = "replied";
@ -1380,7 +1385,7 @@
"photo_saved" = "Photo saved"; "photo_saved" = "Photo saved";
"photo_saved_comment" = "New profile picture will appear on your page"; "photo_saved_comment" = "New profile picture will appear on your page";
"shared_succ" = "The post will appear on your wall. Click on the notification to go to your wall."; "shared_succ" = "The post will appear on your wall. Click on this notification to go there.";
"invalid_email_address" = "Invalid Email address"; "invalid_email_address" = "Invalid Email address";
"invalid_email_address_comment" = "The Email you entered is not correct."; "invalid_email_address_comment" = "The Email you entered is not correct.";

View file

@ -239,6 +239,10 @@
"friends_delete" = "Удалить из друзей"; "friends_delete" = "Удалить из друзей";
"friends_reject" = "Отменить заявку"; "friends_reject" = "Отменить заявку";
"friends_accept" = "Принять заявку"; "friends_accept" = "Принять заявку";
"friends_leave_in_flw" = "Оставить в подписчиках";
"friends_add_msg" = "Теперь вы друзья.";
"friends_rej_msg" = "Вы оставили пользователя в подписчиках.";
"friends_rem_msg" = "Вы удалили пользователя из списка своих друзей.";
"send_message" = "Отправить сообщение"; "send_message" = "Отправить сообщение";
"incoming_req" = "Входящие"; "incoming_req" = "Входящие";
"outcoming_req" = "Исходящие"; "outcoming_req" = "Исходящие";

View file

@ -213,6 +213,7 @@
"friends_delete" = "Видалити з друзів"; "friends_delete" = "Видалити з друзів";
"friends_reject" = "Скасувати заявку"; "friends_reject" = "Скасувати заявку";
"friends_accept" = "Прийняти заявку"; "friends_accept" = "Прийняти заявку";
"friends_leave_in_flw" = "Залишити у підписниках";
"send_message" = "Відправити повідомлення"; "send_message" = "Відправити повідомлення";
"incoming_req" = "Підписники"; "incoming_req" = "Підписники";
"outcoming_req" = "Вихідні"; "outcoming_req" = "Вихідні";