Merge remote-tracking branch 'origin/master' into feature-reports

This commit is contained in:
Ilya Prokopenko 2022-03-23 16:55:18 +03:00
commit 8ee4c9c037
No known key found for this signature in database
GPG key ID: 7736BBBB05F14A56
44 changed files with 1720 additions and 286 deletions

View file

@ -17,8 +17,8 @@ Updating the source code is done with this command: `git pull`
## Instances
* **[openvk.su](https://openvk.su/)**
* **[openvk.uk](https://openvk.uk)** - official mirror of openvk.su (<https://t.me/openvkch/1609>)
* [social.fetbuk.ru](http://social.fetbuk.ru/)
* [openvk.zavsc.pw](https://openvk.zavsc.pw/)
## Can I create my own OpenVK instance?

View file

@ -17,8 +17,8 @@ _[English](README.md)_
## Инстанции
* **[openvk.su](https://openvk.su/)**
* **[openvk.uk](https://openvk.uk)** - официальное зеркало openvk.su (<https://t.me/openvkch/1609>)
* [social.fetbuk.ru](http://social.fetbuk.ru/)
* [openvk.zavsc.pw](https://openvk.zavsc.pw/)
## Могу ли я создать свою собственную инстанцию OpenVK?
@ -80,8 +80,8 @@ ln -s /path/to/chandler/extensions/available/openvk /path/to/chandler/extensions
* [Обсуждения](https://github.com/openvk/openvk/discussions)
* Чат в Matrix: #ovk:matrix.org
**Внимание**: баг-трекер, телеграм- и matrix-чат являются публичными местами, и жалобы в OVK обслуживается волонтерами. Если вам нужно сообщить о чем-то, что не должно быть раскрыто широкой публике (например, сообщение об уязвимости), пожалуйста, свяжитесь с нами напрямую по этому адресу: **openvk [at] tutanota [dot] com**.
**Внимание**: баг-трекер, телеграм- и matrix-чат являются публичными местами, и жалобы в OVK обслуживается волонтерами. Если вам нужно сообщить о чем-то, что не должно быть раскрыто широкой публике (например, сообщение об уязвимости), пожалуйста, свяжитесь с нами напрямую по этому адресу: **openvk [собака] tutanota [точка] com**.
<a href="https://codeberg.org/OpenVK/openvk">
<img alt="Get it on Codeberg" src="https://codeberg.org/Codeberg/GetItOnCodeberg/media/branch/main/get-it-on-blue-on-white.png" height="60">
<img alt="Получить на Codeberg" src="https://codeberg.org/Codeberg/GetItOnCodeberg/media/branch/main/get-it-on-blue-on-white.png" height="60">
</a>

View file

@ -88,4 +88,100 @@ final class Groups extends VKAPIRequestHandler
"items" => $rClubs
];
}
function getById(string $group_ids = "", string $group_id = "", string $fields = ""): ?array
{
$this->requireUser();
$clubs = new ClubsRepo;
if ($group_ids == null && $group_id != null)
$group_ids = $group_id;
if ($group_ids == null && $group_id == null)
$this->fail(100, "One of the parameters specified was missing or invalid: group_ids is undefined");
$clbs = explode(',', $group_ids);
$response;
$ic = sizeof($clbs);
for ($i=0; $i < $ic; $i++) {
if($i > 500)
break;
if($clbs[$i] < 0)
$this->fail(100, "ты ошибся чутка, у айди группы убери минус");
$clb = $clubs->get((int) $clbs[$i]);
if(is_null($clb))
{
$response[$i] = (object)[
"id" => intval($clbs[$i]),
"name" => "DELETED",
"screen_name" => "club".intval($clbs[$i]),
"type" => "group",
"description" => "This group was deleted or it doesn't exist"
];
}else if($clbs[$i] == null){
}else{
$response[$i] = (object)[
"id" => $clb->getId(),
"name" => $clb->getName(),
"screen_name" => $clb->getShortCode() ?? "club".$clb->getId(),
"is_closed" => false,
"type" => "group",
"can_access_closed" => true,
];
$flds = explode(',', $fields);
foreach($flds as $field) {
switch ($field) {
case 'verified':
$response[$i]->verified = intval($clb->isVerified());
break;
case 'has_photo':
$response[$i]->has_photo = is_null($clb->getAvatarPhoto()) ? 0 : 1;
break;
case 'photo_max_orig':
$response[$i]->photo_max_orig = $clb->getAvatarURL();
break;
case 'photo_max':
$response[$i]->photo_max = $clb->getAvatarURL();
break;
case 'members_count':
$response[$i]->members_count = $clb->getFollowersCount();
break;
case 'site':
$response[$i]->site = $clb->getWebsite();
break;
case 'description':
$response[$i]->desctiption = $clb->getDescription();
break;
case 'contacts':
$contacts;
$contactTmp = $clb->getManagers(1, true);
foreach($contactTmp as $contact) {
$contacts[] = array(
'user_id' => $contact->getUser()->getId(),
'desc' => $contact->getComment()
);
}
$response[$i]->contacts = $contacts;
break;
case 'can_post':
if($clb->canBeModifiedBy($this->getUser()))
$response[$i]->can_post = true;
else
$response[$i]->can_post = $clb->canPost();
break;
}
}
}
}
return $response;
}
}

View file

@ -0,0 +1,42 @@
<?php declare(strict_types=1);
namespace openvk\VKAPI\Handlers;
use openvk\Web\Models\Entities\User;
use openvk\Web\Models\Entities\Post;
use openvk\Web\Models\Entities\Postable;
use Chandler\Database\DatabaseConnection;
use openvk\Web\Models\Repositories\Posts as PostsRepo;
use openvk\VKAPI\Handlers\Wall;
final class Newsfeed extends VKAPIRequestHandler
{
function get(string $fields = "", int $start_from = 0, int $offset = 0, int $count = 30, int $extended = 0)
{
$this->requireUser();
if($offset != 0) $start_from = $offset;
$id = $this->getUser()->getId();
$subs = DatabaseConnection::i()
->getContext()
->table("subscriptions")
->where("follower", $id);
$ids = array_map(function($rel) {
return $rel->target * ($rel->model === "openvk\Web\Models\Entities\User" ? 1 : -1);
}, iterator_to_array($subs));
$ids[] = $this->getUser()->getId();
$posts = DatabaseConnection::i()
->getContext()
->table("posts")
->select("id")
->where("wall IN (?)", $ids)
->where("deleted", 0)
->order("created DESC");
$rposts = [];
foreach($posts->page((int) ($offset + 1), $count) as $post)
$rposts[] = (new PostsRepo)->get($post->id)->getPrettyId();
return (new Wall)->getById(implode(',', $rposts), $extended, $fields, $this->getUser());
}
}

View file

@ -110,6 +110,110 @@ final class Wall extends VKAPIRequestHandler
];
}
function getById(string $posts, int $extended = 0, string $fields = "", User $user = null)
{
if($user == null) $user = $this->getUser(); // костыли костыли крылышки
$items = [];
$profiles = [];
$groups = [];
# $count = $posts->getPostCountOnUserWall((int) $owner_id);
$psts = explode(",", $posts);
foreach($psts as $pst)
{
$id = explode("_", $pst);
$post = (new PostsRepo)->getPostById(intval($id[0]), intval($id[1]));
if($post) {
$from_id = get_class($post->getOwner()) == "openvk\Web\Models\Entities\Club" ? $post->getOwner()->getId() * (-1) : $post->getOwner()->getId();
$items[] = (object)[
"id" => $post->getVirtualId(),
"from_id" => $from_id,
"owner_id" => $post->getTargetWall(),
"date" => $post->getPublicationTime()->timestamp(),
"post_type" => "post",
"text" => $post->getText(),
"can_edit" => 0, // TODO
"can_delete" => $post->canBeDeletedBy($user),
"can_pin" => $post->canBePinnedBy($user),
"can_archive" => false, // TODO MAYBE
"is_archived" => false,
"is_pinned" => $post->isPinned(),
"post_source" => (object)["type" => "vk"],
"comments" => (object)[
"count" => $post->getCommentsCount(),
"can_post" => 1
],
"likes" => (object)[
"count" => $post->getLikesCount(),
"user_likes" => (int) $post->hasLikeFrom($user),
"can_like" => 1,
"can_publish" => 1,
],
"reposts" => (object)[
"count" => $post->getRepostCount(),
"user_reposted" => 0
]
];
if ($from_id > 0)
$profiles[] = $from_id;
else
$groups[] = $from_id * -1;
}
}
if($extended == 1)
{
$profiles = array_unique($profiles);
$groups = array_unique($groups);
$profilesFormatted = [];
$groupsFormatted = [];
foreach ($profiles as $prof) {
$user = (new UsersRepo)->get($prof);
$profilesFormatted[] = (object)[
"first_name" => $user->getFirstName(),
"id" => $user->getId(),
"last_name" => $user->getLastName(),
"can_access_closed" => false,
"is_closed" => false,
"sex" => $user->isFemale() ? 1 : 2,
"screen_name" => $user->getShortCode(),
"photo_50" => $user->getAvatarUrl(),
"photo_100" => $user->getAvatarUrl(),
"online" => $user->isOnline()
];
}
foreach($groups as $g) {
$group = (new ClubsRepo)->get($g);
$groupsFormatted[] = (object)[
"id" => $group->getId(),
"name" => $group->getName(),
"screen_name" => $group->getShortCode(),
"is_closed" => 0,
"type" => "group",
"photo_50" => $group->getAvatarUrl(),
"photo_100" => $group->getAvatarUrl(),
"photo_200" => $group->getAvatarUrl(),
];
}
return (object)[
"items" => (array)$items,
"profiles" => (array)$profilesFormatted,
"groups" => (array)$groupsFormatted
];
}
else
return (object)[
"items" => (array)$items
];
}
function post(string $owner_id, string $message = "", int $from_group = 0, int $signed = 0): object
{
$this->requireUser();

View file

@ -48,6 +48,7 @@ class Note extends Postable
"acronym",
"blockquote",
"cite",
"span",
]);
$config->set("HTML.AllowedAttributes", [
"table.summary",
@ -59,6 +60,8 @@ class Note extends Postable
"img.style",
"div.style",
"div.title",
"span.class",
"p.class",
]);
$config->set("CSS.AllowedProperties", [
"float",
@ -68,6 +71,9 @@ class Note extends Postable
"max-width",
"font-weight",
]);
$config->set("Attr.AllowedClasses", [
"underline",
]);
$purifier = new HTMLPurifier($config);
return $purifier->purify($this->getRecord()->source);

View file

@ -41,7 +41,9 @@ class Video extends Media
mkdir($dirId);
$dir = $this->getBaseDir();
Shell::bash(__DIR__ . "/../shell/processVideo.sh", OPENVK_ROOT, $filename, $dir, $hash)->start(); #async :DDD
$ext = Shell::isPowershell() ? "ps1" : "sh";
$cmd = Shell::isPowershell() ? "powershell" : "bash";
Shell::$cmd(__DIR__ . "/../shell/processVideo.$ext", OPENVK_ROOT, $filename, $dir, $hash)->start(); #async :DDD
} catch(ShellUnavailableException $suex) {
exit(OPENVK_ROOT_CONF["openvk"]["debug"] ? "Shell is unavailable" : VIDEOS_FRIENDLY_ERROR);
} catch(UnknownCommandException $ucex) {

View file

@ -29,7 +29,7 @@ class Notes
function getUserNotes(User $user, int $page = 1, ?int $perPage = NULL): \Traversable
{
$perPage = $perPage ?? OPENVK_DEFAULT_PER_PAGE;
foreach($this->notes->where("owner", $user->getId())->where("deleted", 0)->page($page, $perPage) as $album)
foreach($this->notes->where("owner", $user->getId())->where("deleted", 0)->order("created DESC")->page($page, $perPage) as $album)
yield new Note($album);
}

View file

@ -0,0 +1,20 @@
$ovkRoot = $args[0]
$file = $args[1]
$dir = $args[2]
$hash = $args[3]
$hashT = $hash.substring(0, 2)
$temp = [System.IO.Path]::GetTempFileName()
$temp2 = [System.IO.Path]::GetTempFileName()
$shell = Get-WmiObject Win32_process -filter "ProcessId = $PID"
$shell.SetPriority(16384)
Move-Item $file $temp
# video stub logic was implicitly deprecated, so we start processing at once
ffmpeg -i $temp -ss 00:00:01.000 -vframes 1 "$dir$hashT/$hash.gif"
ffmpeg -i $temp -c:v libtheora -q:v 7 -c:a libvorbis -q:a 4 -vf scale=640x360,setsar=1:1 -y $temp2
Move-Item $temp2 "$dir$hashT/$hash.ogv"
Remove-Item $temp
Remove-Item $temp2

View file

@ -31,7 +31,7 @@ final class UserPresenter extends OpenVKPresenter
{
$user = $this->users->get($id);
if(!$user || $user->isDeleted())
$this->notFound();
$this->template->_template = "User/deleted.xml";
else {
if($user->getShortCode())
if(parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH) !== "/" . $user->getShortCode())

View file

@ -99,7 +99,7 @@
<div class="layout">
<div id="xhead" class="dm"></div>
<div class="page_header{if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME} page_custom_header{/if}">
<a href="/" class="home_button {if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME}home_button_custom{/if}" title="{$instance_name}">{$instance_name}</a>
<a href="/" class="home_button{if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME} home_button_custom{/if}" title="{$instance_name}">{if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME}{$instance_name}{/if}</a>
<div n:if="isset($thisUser) ? (!$thisUser->isBanned() XOR !$thisUser->isActivated()) : true" class="header_navigation">
{ifset $thisUser}
<div class="link">
@ -129,7 +129,7 @@
<div class="link">
<a href="/login">{_header_login}</a>
</div>
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" class="link">
<div class="link">
<a href="/reg">{_header_registration}</a>
</div>
<div class="link">
@ -213,7 +213,7 @@
<input type="hidden" name="jReturnTo" value="{$_SERVER['REQUEST_URI']}" />
<input type="hidden" name="hash" value="{$csrfToken}" />
<input type="submit" value="{_log_in}" class="button" style="display: inline-block;" />
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" href="/reg" class="button" style="display: inline-block;">{_registration}</a><br><br>
<a href="/reg" class="button" style="display: inline-block;">{_registration}</a><br><br>
<a href="/restore">{_forgot_password}</a>
</form>
{/ifset}

View file

@ -1,8 +1,10 @@
{extends "@layout.xml"}
{block wrap}
<div class="page_wrap">
<div n:ifset="tabs" n:ifcontent class="tabs">
<div class="wrap2">
<div class="wrap1">
<div class="page_wrap padding_top">
<div n:ifset="tabs" class="tabs">
{include tabs}
</div>
@ -27,8 +29,8 @@
</a>
</td>
<td valign="top" style="width: 100%">
{ifset infoTable}
{include infoTable, x => $dat}
{ifset infotable}
{include infotable, x => $dat}
{else}
<a href="{include link, x => $dat}">
<b>
@ -67,4 +69,6 @@
{include bottom}
{/ifset}
</div>
</div>
</div>
{/block}

View file

@ -9,7 +9,7 @@
{presenter "openvk!Support->knowledgeBaseArticle", "about"}
<center>
<a class="button" style="margin-right: 5px;cursor: pointer;" href="/login">{_"log_in"}</a>
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" class="button" style="cursor: pointer;" href="/reg">{_"registration"}</a>
<a class="button" style="cursor: pointer;" href="/reg">{_"registration"}</a>
</center>
{* TO-DO: Add statistics about this instance as on mastodon.social *}
{/block}

View file

@ -33,6 +33,12 @@
</label>
<input class="text medium-field" id="guid" disabled value="{$user->getChandlerUser()->getId()}" />
</div>
<div class="field-group">
<label for="registration_ip">
Первый IP
</label>
<input class="text medium-field" id="registration_ip" disabled value="{$user->getRegistrationIP()}" />
</div>
<div class="field-group">
<label for="first_name">
Имя

View file

@ -34,6 +34,32 @@
{* BEGIN ELEMENTS DESCRIPTION *}
{block specpage}
<style>
#userContent img {
max-width: 245pt;
max-height: 200pt;
}
#userContent blockquote {
background-color: #f3f3f3;
border-bottom: 5px solid #969696;
padding: 1;
}
#userContent cite {
margin-top: 1em;
display: block;
}
#userContent cite::before {
content: "— ";
}
#userContent .underline {
text-decoration: underline;
}
</style>
<div class="container_gray" style="background: white; border-top: none;">
{var data = is_array($iterator) ? $iterator : iterator_to_array($iterator)}

View file

@ -33,6 +33,10 @@
#userContent cite::before {
content: "— ";
}
#userContent .underline {
text-decoration: underline;
}
</style>
<article id="userContent" style="margin: 10px 10px 0;">

View file

@ -5,12 +5,29 @@
{block title}{_"albums"} {$owner->getCanonicalName()}{/block}
{block header}
<a href="{$owner->getURL()}">{$owner->getCanonicalName()}</a>
» {_"albums"}
{if isset($thisUser) && $thisUser->getId() == $owner->getId()}
{_my_photos}
{else}
<a href="{$owner->getURL()}">
{$owner->getCanonicalName()}</a>
»
{_albums}
{/if}
{/block}
<div n:if="$canEdit" style="float: right;">
{var isClub = ($owner instanceof openvk\Web\Models\Entities\Club)}
<a href="/albums/create{$isClub ? '?gpid=' . $owner->getId() : ''}">{_"create_album"}</a>
{block size}
<div style="padding-bottom: 0px; padding-top: 0;" class="summaryBar">
<div class="summary">
{if !is_null($thisUser) && $owner->getId() === $thisUser->getId()}
{tr("albums_list", $count)}
{else}
{tr("albums", $count)}
{/if}
<span n:if="isset($thisUser) && $thisUser->getId() == $owner->getId()">
&nbsp;|&nbsp;
<a href="/albums/create">{_create_album}</a>
</span>
</div>
</div>
{/block}

View file

@ -25,6 +25,9 @@
{/block}
{block header}
{if isset($thisUser) && $thisUser->getId() == $user->getId()}
{_my_friends}
{else}
<a href="{$user->getURL()}">{$user->getCanonicalName()}</a> »
{if $act == "incoming"}
{_"incoming_req"}
@ -33,17 +36,45 @@
{else}
{_"friends"}
{/if}
{/if}
{/block}
{block tabs}
<div n:attr="id => ($act === 'friends' ? 'activetabs' : 'ki')" class="tab">
<a n:attr="id => ($act === 'friends' ? 'act_tab_a' : 'ki')" href="?">{_friends}</a>
</div>
<div n:attr="id => ($act === 'incoming' ? 'activetabs' : 'ki')" class="tab">
<a n:attr="id => ($act === 'incoming' ? 'act_tab_a' : 'ki')" href="?act=incoming">{_incoming_req}</a>
<div n:attr="id => ($act === 'incoming' || $act === 'outcoming' ? 'activetabs' : 'ki')" class="tab">
<a n:attr="id => ($act === 'incoming' || $act === 'outcoming' ? 'act_tab_a' : 'ki')" href="?act=incoming">{_req}</a>
</div>
{/block}
{block size}
<div n:if="$act === 'incoming' || $act === 'outcoming'" class="mb_tabs">
<div n:attr="id => ($act === 'incoming' ? 'active' : 'ki')" class="mb_tab">
<div>
<a href="?act=incoming">{_incoming_req}</a>
</div>
</div>
<div n:attr="id => ($act === 'outcoming' ? 'active' : 'ki')" class="mb_tab">
<div>
<a href="?act=outcoming">{_outcoming_req}</a>
</div>
</div>
</div>
<div style="padding-bottom: 0px;" class="summaryBar">
<div class="summary">
{if !is_null($thisUser) && $user->getId() === $thisUser->getId()}
{if $act == "incoming"}
{tr("req", $count)}
{elseif $act == "outcoming"}
{tr("req", $count)}
{else}
{tr("friends_list", $count)}
{/if}
{else}
{tr("friends", $count)}
{/if}
</div>
<div n:attr="id => ($act === 'outcoming' ? 'activetabs' : 'ki')" class="tab">
<a n:attr="id => ($act === 'outcoming' ? 'act_tab_a' : 'ki')" href="?act=outcoming">{_outcoming_req}</a>
</div>
{/block}

View file

@ -32,7 +32,7 @@
{/block}
{block size}
<div n:if="!is_null($thisUser) && $user->getId() === $thisUser->getId()" style="padding-bottom: 0px; border-bottom: 0;" class="summaryBar">
<div style="padding-bottom: 0px;" class="summaryBar">
<div class="summary">
{if !is_null($thisUser) && $user->getId() === $thisUser->getId()}
{tr("groups_list", $thisUser->getClubCount())}
@ -53,7 +53,7 @@
{block name}{/block}
{block infoTable}
{block infotable}
<table id="basicInfo" class="ugc-table group_info" cellspacing="0" cellpadding="0" border="0">
<tbody>
<tr>
@ -75,11 +75,12 @@
{block actions}
{var clubPinned = $thisUser->isClubPinned($x)}
{if $x->canBeModifiedBy($thisUser ?? NULL)}
<a style="width: 140px;" class="profile_link" href="{$x->getURL()}">
<div class="navigation" style="width: 140px;">
<a class="link" href="{$x->getURL()}">
{_check_community}
</a>
{if ($clubPinned || $thisUser->getPinnedClubCount() <= 10)}
<a style="width: 140px;" class="profile_link" href="/groups_pin?club={$x->getId()}&hash={rawurlencode($csrfToken)}" id="_pinGroup" data-group-name="{$x->getName()}" data-group-url="{$x->getUrl()}">
<a class="link" href="/groups_pin?club={$x->getId()}&hash={rawurlencode($csrfToken)}" id="_pinGroup" data-group-name="{$x->getName()}" data-group-url="{$x->getUrl()}">
{if $clubPinned}
{_remove_from_left_menu}
{else}
@ -91,8 +92,9 @@
<input type="hidden" name="act" value="rem" />
<input type="hidden" name="id" value="{$x->getId()}" />
<input type="hidden" name="hash" value="{$csrfToken}" />
<input style="width: 140px; text-transform: lowercase;" type="submit" id="profile_link" value="{_leave_community}" />
<input style="text-transform: lowercase; width: 100%;" class="link" type="submit" value="{_"leave_community"}" />
</form>
</div>
{/if}
{/block}

View file

@ -407,7 +407,7 @@
</td>
<td>
<select name="style_avatar">
<option value="0" {if $user->getStyleAvatar() == 0}selected{/if}>{_"default"}</option>
<option value="0" {if $user->getStyleAvatar() == 0}selected{/if}>{_"arbitrary_avatars"} ({_"default"})</option>
<option value="1" {if $user->getStyleAvatar() == 1}selected{/if}>{_"cut"}</option>
<option value="2" {if $user->getStyleAvatar() == 2}selected{/if}>{_"round_avatars"}</option>
</select>

View file

@ -0,0 +1,14 @@
{extends "../@layout.xml"}
{block title}{_information}{/block}
{block header}
{_information}
{/block}
{block content}
<center style="background: white;border: #DEDEDE solid 1px;">
<span style="color: #707070;margin: 60px 0;display: block;">
{_profile_not_found_text}
</span>
</center>
{/block}

View file

@ -11,7 +11,7 @@
{/block}
{block size}
<div style="padding-bottom: 0px;border-bottom: 0; padding-top: 0;" class="summaryBar">
<div style="padding-bottom: 0px; padding-top: 0;" class="summaryBar">
<div class="summary">
{tr("videos", $count)}
<span n:if="isset($thisUser) && $thisUser->getId() == $user->getId()">
@ -33,9 +33,11 @@
{/block}
{block preview}
<div class="video-preview">
<img src="{$x->getThumbnailURL()}"
alt="{$x->getName()}"
style="max-height: 43pt; max-width: 140px; height: unset; width: unset; border-radius: unset;" />
style="max-width: 170px; max-height: 127px; margin: auto;" />
</div>
{/block}
{block name}
@ -43,7 +45,13 @@
{/block}
{block description}
<span>{$x->getDescription() ?? ""}</span><br/>
<p>
<span>{$x->getDescription() ?? ""}</span>
</p>
<span style="color: grey;">{_"video_uploaded"} {$x->getPublicationTime()}</span><br/>
<span style="color: grey;">{_"video_updated"} {$x->getEditTime() ?? $x->getPublicationTime()}</span>
<p>
<a href="/video{$x->getPrettyId()}">{_view_video}</a>
{if $x->getCommentsCount() > 0}| <a href="/video{$x->getPrettyId()}#comments">{_"comments"} ({$x->getCommentsCount()})</a>{/if}
</p>
{/block}

View file

@ -1,6 +1,6 @@
<center style="background: white;border: #DEDEDE solid 1px;">
<span style="color: #707070;margin: 60px 0;display: block;">
<b>{$title}</b><br><br>
<b n:if="!empty($title)">{$title}<br><br></b>
{$description}
</span>
</center>

View file

@ -1 +1 @@
{include "error.xml", title => tr("no_data"), description => tr("no_data_description")}
{include "error.xml", description => tr("no_data_description")}

View file

@ -11,7 +11,22 @@ class Shell
$functions = array_map(function($x) {
return trim($x);
}, explode(" ", ini_get("disable_functions")));
return !in_array("system", $functions);
if(in_array("system", $functions))
return FALSE;
if(Shell::isPowershell()) {
exec("WHERE powershell", $_x, $_c);
unset($_x);
return $_c === 0;
}
return TRUE;
}
static function isPowershell(): bool
{
return strncasecmp(PHP_OS, 'WIN', 3) === 0;
}
static function commandAvailable(string $name): bool
@ -19,6 +34,13 @@ class Shell
if(!Shell::shellAvailable())
throw new Exceptions\ShellUnavailableException;
if(Shell::isPowershell()) {
exec("WHERE $name", $_x, $_c);
unset($_x);
return $_c === 0;
}
return !is_null(`command -v $name`);
}
@ -41,14 +63,25 @@ class Shell
function execute(?int &$result = nullptr): string
{
$stdout = [];
if(Shell::isPowershell()) {
$cmd = escapeshellarg($this->command);
exec("powershell -Command $this->command", $stdout, $result);
} else {
exec($this->command, $stdout, $result);
}
return implode(PHP_EOL, $stdout);
}
function start(): string
{
if(Shell::isPowershell()) {
$cmd = escapeshellarg($this->command);
pclose(popen("start /b powershell -Command $this->command", "r"));
} else {
system("nohup " . $this->command . " > /dev/null 2>/dev/null &");
}
return $this->command;
}

View file

@ -19,7 +19,8 @@ span {
font-weight: bold;
}
.nobold, nobold {
.nobold,
nobold {
font-weight: normal;
color: gray;
}
@ -34,6 +35,10 @@ a {
cursor: pointer;
}
p {
margin: 5px 0;
}
.layout {
width: 791px;
margin: 0 auto;
@ -63,7 +68,6 @@ a {
.home_button {
position: absolute;
width: 145px;
text-indent: -999px;
height: 42px;
}
@ -159,7 +163,8 @@ a {
display: block;
padding: 3px 3px 3px 6px;
text-decoration: none;
border-top: 1px solid #fff; /* fix */
border-top: 1px solid #fff;
/* fix */
color: #000;
}
@ -226,9 +231,10 @@ a {
border-bottom: solid 1px #c3cad2;
border-left: solid 1px #d5dde6;
border-right: solid 1px #d5dde6;
padding: 12px;
width: 604px;
margin-left: 1px;
}
.page_wrap.padding_top {
padding-top: 12px;
}
.content-main-tile {
@ -304,7 +310,8 @@ a {
margin-left: 2pt;
}
#profile_link, .profile_link {
#profile_link,
.profile_link {
display: block;
box-sizing: border-box;
padding: 3px;
@ -326,20 +333,24 @@ a {
margin: 10px 0;
}
#profile_link:hover, .profile_link:hover {
#profile_link:hover,
.profile_link:hover {
background: #ECECEC;
}
.action_links > .profile_link, .action_links > .profile_link_form > .profile_link {
.action_links>.profile_link,
.action_links>.profile_link_form>.profile_link {
width: 150px;
}
.profile_link.disable > a, .profile_link.disable {
.profile_link.disable>a,
.profile_link.disable {
cursor: not-allowed;
color: grey;
}
.profile_link.loading > a::after, .profile_link.loading::after {
.profile_link.loading>a::after,
.profile_link.loading::after {
content: "";
display: inline-block;
background-image: url('/assets/packages/static/openvk/img/loading_mini.gif');
@ -413,7 +424,7 @@ table {
position: absolute;
border: 1px solid #CCC;
background-color: #f7f7f7;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
padding: 10px;
float: right;
margin-top: 5px;
@ -455,7 +466,8 @@ input[class=button] {
padding: 5px 7px 4px;
}
input[type=checkbox], input[type=radio] {
input[type=checkbox],
input[type=radio] {
background-color: transparent;
-webkit-appearance: none;
-moz-appearance: none;
@ -476,11 +488,13 @@ input[type=radio] {
background-image: url("../img/radio.png");
}
input[type=checkbox]:hover, input[type=radio]:hover {
input[type=checkbox]:hover,
input[type=radio]:hover {
background-position: 0 -28px;
}
input[type=checkbox]:checked, input[type=radio]:checked {
input[type=checkbox]:checked,
input[type=radio]:checked {
background-position: 0 -14px;
}
@ -557,7 +571,17 @@ input[type=checkbox]:checked, input[type=radio]:checked {
padding-top: 0px;
}
input[type="text"], input[type="password"], input[type~="text"], input[type~="password"], input[type="email"], input[type="phone"], input[type~="email"], input[type~="phone"], input[type="search"], input[type~="search"], select {
input[type="text"],
input[type="password"],
input[type~="text"],
input[type~="password"],
input[type="email"],
input[type="phone"],
input[type~="email"],
input[type~="phone"],
input[type="search"],
input[type~="search"],
select {
border: 1px solid #C0CAD5;
padding: 3px;
font-size: 11px;
@ -704,7 +728,8 @@ span {
margin-top: 5px;
}
#fastlogin input[type=text], #fastlogin input[type=password] {
#fastlogin input[type=text],
#fastlogin input[type=password] {
width: 100%;
}
@ -768,12 +793,8 @@ table.User {
}
.container_gray {
background: #F7F7F7;
width: 604px;
background: #F6F6F6;
padding: 12px;
border-top: #EBEBEB solid 1px;
margin-left: -12px;
margin-bottom: -12px;
}
.container_gray.bottom {
@ -795,13 +816,11 @@ table.User {
.tabs {
border-bottom: 1px solid #707070;
margin-right: -12px;
margin-left: -12px;
padding: 0 10px;
}
#activetabs {
background: #707070;
border-radius: 3px 3px 0px 0px;
}
@ -811,8 +830,13 @@ table.User {
.tab {
display: inline-block;
padding: 4px 6px;
margin-left: 15px;
padding: 5px 10px;
margin-right: 3px;
border-radius: 3px 3px 0px 0px;
}
.tab:hover {
background: #E4E4E4;
}
#act_tab_a {
@ -840,7 +864,8 @@ table.User {
width: 100%;
}
.ovk-album:not(:first-child), .ovk-note:not(:first-child) {
.ovk-album:not(:first-child),
.ovk-note:not(:first-child) {
display: inline-block;
margin-top: 10px;
}
@ -901,7 +926,8 @@ table.User {
border-top: 1px solid #d6d6d6;
}
.crp-entry--image, .crp-entry--info {
.crp-entry--image,
.crp-entry--info {
margin-right: 15px;
}
@ -951,7 +977,8 @@ table.User {
max-width: 42px;
}
.crp-entry--message---av, .crp-entry--message---text {
.crp-entry--message---av,
.crp-entry--message---text {
display: inline-block;
vertical-align: top;
}
@ -963,15 +990,18 @@ table.User {
text-overflow: ellipsis;
}
.crp-entry--message---text, .messenger-app--messages---message .time {
.crp-entry--message---text,
.messenger-app--messages---message .time {
color: #404036;
}
.messenger-app--messages, .messenger-app--input {
.messenger-app--messages,
.messenger-app--input {
padding: 10px;
}
.messenger-app--messages, .messenger-app--input {
.messenger-app--messages,
.messenger-app--input {
padding: 10px 70px;
}
@ -980,7 +1010,8 @@ table.User {
overflow-y: auto;
}
.messenger-app--messages---message, .messenger-app--input {
.messenger-app--messages---message,
.messenger-app--input {
display: flex;
align-items: flex-start;
justify-content: space-between;
@ -990,11 +1021,13 @@ table.User {
margin-bottom: 1.2rem;
}
.messenger-app--messages---message .ava, .messenger-app--input > .ava {
.messenger-app--messages---message .ava,
.messenger-app--input>.ava {
max-width: 64px;
}
.messenger-app--messages---message .ava, .messenger-app--input > .ava {
.messenger-app--messages---message .ava,
.messenger-app--input>.ava {
width: 52px;
height: 52px;
}
@ -1004,7 +1037,8 @@ table.User {
width: 300px;
}
.messenger-app--messages---message ._content span, .messenger-app--messages---message ._content > a {
.messenger-app--messages---message ._content span,
.messenger-app--messages---message ._content>a {
display: block;
}
@ -1090,7 +1124,9 @@ table.User {
border-bottom-style: dashed;
}
.music-app--player .play, .music-app--player .perv, .music-app--player .next {
.music-app--player .play,
.music-app--player .perv,
.music-app--player .next {
-webkit-appearance: none;
-moz-appearance: none;
background-color: #507597;
@ -1507,11 +1543,13 @@ body.scrolled .toTop:hover {
cursor: not-allowed;
}
.gift_sel > .gift_price, .gift_sel > .gift_limit {
.gift_sel>.gift_price,
.gift_sel>.gift_limit {
visibility: hidden;
}
.gift_sel:hover > .gift_price, .gift_sel:hover > .gift_limit {
.gift_sel:hover>.gift_price,
.gift_sel:hover>.gift_limit {
visibility: unset;
}
@ -1524,13 +1562,14 @@ body.scrolled .toTop:hover {
padding: 0 6px;
}
.ovk-video > .preview {
.ovk-video>.preview, .video-preview {
width: 170px;
height: 127px;
border: 1px solid #ccc;
align-content: center;
display: flex;
padding: 1px;
padding: 2px;
box-shadow: inset 0 0 0px 1px #ccc, inset 0 0 0px 2px #fff;
background-color: #000;
}
#wallAttachmentMenu {
@ -1567,16 +1606,19 @@ body.scrolled .toTop:hover {
border-radius: 0;
}
#ovkDraw .literally .lc-picker, .literally .lc-options.horz-toolbar {
#ovkDraw .literally .lc-picker,
.literally .lc-options.horz-toolbar {
background-color: #f7f7f7;
border-color: rgba(0, 0, 0, 0.15);
}
#ovkDraw .literally .lc-picker .toolbar-button.selected:not(.disabled), #ovkDraw .literally .horz-toolbar .square-toolbar-button.selected:not(.disabled) {
#ovkDraw .literally .lc-picker .toolbar-button.selected:not(.disabled),
#ovkDraw .literally .horz-toolbar .square-toolbar-button.selected:not(.disabled) {
background-color: #cdcdcd;
}
#ovkDraw .literally .lc-picker .toolbar-button:hover:not(.disabled), #ovkDraw .literally .horz-toolbar .square-toolbar-button:hover:not(.disabled) {
#ovkDraw .literally .lc-picker .toolbar-button:hover:not(.disabled),
#ovkDraw .literally .horz-toolbar .square-toolbar-button:hover:not(.disabled) {
border-color: #cdcdcd;
}
@ -1598,7 +1640,8 @@ body.scrolled .toTop:hover {
}
.knowledgeBaseArticle {
margin-top: -11px; /* this is very stupid fix but nah */
margin-top: -11px;
/* this is very stupid fix but nah */
}
.avatar-list {
@ -1787,14 +1830,11 @@ body.scrolled .toTop:hover {
}
.summaryBar {
border-bottom: 1px solid #DAE2E8;
border-bottom: #DEDEDE solid 1px;
clear: both;
padding: 11px 10px;
color: black;
font-weight: normal;
padding-bottom: 11px;
line-height: normal;
margin-left: -12px;
margin-right: -12px;
}
.summaryBar .summary {
@ -1835,9 +1875,6 @@ body.scrolled .toTop:hover {
.groups_options {
padding: 10px 20px 20px;
border-top: #DEDEDE solid 1px;
margin-top: 12px;
margin-left: -12px;
margin-right: -12px;
}
#gp_container {
@ -1877,6 +1914,59 @@ table td[width="120"] {
vertical-align: top;
}
.mb_tabs {
background-color: #F6F6F6;
border-bottom: #DEDEDE solid 1px;
padding: 10px;
}
.mb_tab {
cursor: pointer;
font-weight: bold;
margin-right: 10px;
display: inline-block;
}
.mb_tab div {
padding: 3px 7px;
}
#gp_container span {
display: block;
margin: 10px 0 15px;
}
#gp_container h4 {
font-size: 11px;
}
.container_gray .content:last-child {
margin-bottom: 0;
}
.group_info {
padding: 0 0 0 5px !important;
}
.mb_tab#active {
background-color: #898989;
}
.mb_tab#active div {
border: 2px solid #5f5f5f;
}
.mb_tab#active a {
color: white;
}
.profile_thumb {
padding: 0px 10px 0px 0px;
width: 50px;
display: inline-block;
vertical-align: top;
}
.border-block {
box-shadow: inset 0px 0 0px 1px #b6bfca, inset 0px 0 0px 10px #d8dfe7;
width: 300px;

View file

@ -208,7 +208,7 @@
"outcoming_req" = "Հայցեր";
"req" = "Հայցեր";
"firends_zero" = "Ոչ մի ընկեր չկա";
"friends_zero" = "Ոչ մի ընկեր չկա";
"friends_one" = "$1 ընկեր";
"friends_few" = "$1 ընկեր";
"friends_many" = "$1 հատ ընկեր";

View file

@ -124,7 +124,7 @@
"outcoming_req" = "Заяўкі";
"req" = "Заяўкі";
"firends_zero" = "Няма сяброў";
"friends_zero" = "Няма сяброў";
"friends_one" = "$1 сябар";
"friends_few" = "$1 аднаго";
"friends_many" = "$1 сяброў";

View file

@ -132,7 +132,7 @@
"outcoming_req" = "Zajavy";
"req" = "Zajavy";
"firends_zero" = "Niama siabroŭ";
"friends_zero" = "Niama siabroŭ";
"friends_one" = "$1 siabar";
"friends_few" = "$1 siabra";
"friends_many" = "$1 siabroŭ";

View file

@ -151,7 +151,7 @@
"outcoming_req" = "Anfragen";
"req" = "Anfragen";
"firends_zero" = "Keine Freunde";
"friends_zero" = "Keine Freunde";
"friends_one" = "$1 Freund";
"friends_other" = "$1 Freunde";

View file

@ -199,14 +199,22 @@
"friends_reject" = "Reject request";
"friends_accept" = "Accept request";
"send_message" = "Send a message";
"incoming_req" = "Subscribers";
"outcoming_req" = "Requests";
"incoming_req" = "Pending";
"outcoming_req" = "Outgoing";
"req" = "Requests";
"firends_zero" = "No friends";
"req_zero" = "No requests were found...";
"req_one" = "Found $1 request";
"req_other" = "Found $1 requests";
"friends_zero" = "No friends";
"friends_one" = "$1 friend";
"friends_other" = "$1 friends";
"friends_list_zero" = "You have no friends yet";
"friends_list_one" = "You have $1 friend";
"friends_list_other" = "You have $1 friends";
"followers_zero" = "No followers";
"followers_one" = "$1 follower";
"followers_other" = "$1 followers";
@ -308,6 +316,10 @@
"albums_one" = "$1 album";
"albums_other" = "$1 albums";
"albums_list_zero" = "You don't have any albums";
"albums_list_one" = "You have one album";
"albums_list_other" = "You have $1 albums";
/* Notes */
"notes" = "Notes";
@ -393,7 +405,9 @@
"avatars_style" = "Avatar style";
"style" = "Style";
"default" = "Arbitrary (default)";
"default" = "default";
"arbitrary_avatars" = "Arbitrary";
"cut" = "Square";
"round_avatars" = "Round";
@ -499,6 +513,8 @@
"videos_one" = "$1 video";
"videos_other" = "$1 videos";
"view_video" = "View";
/* Notifications */
"feedback" = "Feedback";
@ -750,7 +766,7 @@
"information_-2" = "Login success";
"no_data" = "No data";
"no_data_description" = "There is no data.";
"no_data_description" = "There is nothing here... yet...";
"error" = "Error";
"error_shorturl" = "This short address is already owned.";
@ -762,7 +778,7 @@
"error_repost_fail" = "Failed to share post";
"forbidden" = "Access error";
"forbidden_comment" = "This user\'s privacy settings do not allow you to look at his page.";
"forbidden_comment" = "This user's privacy settings do not allow you to look at his page.";
"changes_saved" = "Changes saved";
"changes_saved_comment" = "New data will appear on your page";
@ -789,6 +805,7 @@
"profile_changed" = "Profile changed";
"profile_changed_comment" = "Your active profile has been changed.";
"profile_not_found" = "User is not found.";
"profile_not_found_text" = "This profile has either been deleted or not been created yet.";
"suspicious_registration_attempt" = "Suspicious registration attempt";
"suspicious_registration_attempt_comment" = "You tried to register from a suspicious location.";

View file

@ -189,7 +189,7 @@
"outcoming_req" = "Petoj";
"req" = "Petoj";
"firends_zero" = "Neniuj amikoj";
"friends_zero" = "Neniuj amikoj";
"friends_one" = "$1 amiko";
"friends_few" = "$1 amikoj";
"friends_many" = "$1 amikoj";

880
locales/id.strings Normal file
View file

@ -0,0 +1,880 @@
"__locale" = "en_ID.UTF-8;Id";
/* Check for https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html */
/* Main page */
"home" = "Home";
"welcome" = "Selamat datang";
"to_top" = "Ke awal";
/* Login */
"log_in" = "Masuk";
"password" = "Kata Sandi";
"registration" = "Buat Akun Baru";
"forgot_password" = "Lupa Kata Sandi?";
"login_failed" = "Masuk Gagal";
"invalid_username_or_password" = "Nama pengguna atau Sandi yang kamu masukan tidak benar. <a href='/restore'>Lupa Kata Sandimu?</a>";
"failed_to_register" = "Pendaftaran Akun Baru Gagal";
"referral_link_invalid" = "Tautan rujukan tidak valid.";
"registration_disabled" = "Pendaftaran dinonaktifkan oleh sistem administrator.";
"user_already_exists" = "Pengguna dengan email ini sudah ada.";
"access_recovery" = "Akses pemulihan";
"page_access_recovery" = "Pulihkan akses ke halaman";
"access_recovery_info" = "lupa kata sandimu? Jangan khawatir, masukkan rincianmu dan kami akan mengirimkan email berisi petunjuk tentang bagaimana cara memulihkan akunmu.";
"access_recovery_info_2" = "Masukkan kata sandi barumu. Semua sesi saat ini akan ditangguhkan dan token akses akan dicabut.";
"reset_password" = "Atur Ulang Sandi";
"2fa_code_2" = "Pengamanan Otentikasi dua faktor";
"password_successfully_reset" = "Kata sandimu berhasil diatur ulang.";
"password_reset_email_sent" = "Jika kamu telah terdaftar, kamu akan menerima instruksi melalui surelmu.";
"password_reset_error" = "Terjadi kesalahan saat mengatur ulang kata sandi.";
"password_reset_rate_limit_error" = "Kamu tidak dapat melakukan hal ini terlalu sering,akses ditangguhkan sementara, maaf.";
"email_sent" = "Pesan ke Surel telah berhasil dikirimkan.";
"email_sent_desc" = "Jika kamu telah terdaftar, kamu akan menerima instruksi melalui surelmu.";
"email_error" = "Terjadi kesalahan saat mengkirimkan pesan ke surel";
"email_rate_limit_error" = "Kamu tidak dapat melakukan hal ini terlalu sering,akses ditangguhkan sementara, maaf.";
"email_verify_success" = "Surelmu telah diverifikasi. Selamat bersenang-senang!";
"registration_disabled_info" = "Pendaftaran dinonaktifkan oleh sistem administrator . Jika memungkinkan, mintalah undangan dari temanmu lagi, jika dia terdaftar di situs ini.";
"registration_closed" = "Pendaftaran ditutup.";
"invites_you_to" = "<strong>$1</strong> mengundangmu ke $2";
"register_meta_desc" = "Register in $1 sekarang!";
"register_referer_meta_title" = "$1 mengundangmu ke $2!";
"register_referer_meta_desc" = "Bergabunglah $1 dan banyak pengguna lainnya di $2!";
"users" = "Pengguna";
/* Profile information */
"select_language" = "Pilih Bahasa";
"edit" = "Sunting";
"birth_date" = "Tanggal lahir";
"registration_date" = "Bergabung sejak";
"hometown" = "Tempat Asal";
"this_is_you" = "ini kamu";
"edit_page" = "Sunting halaman";
"edit_group" = "Sunting grup";
"change_status" = "Ubah status";
"name" = "Nama";
"surname" = "Nama Belakang";
"gender" = "Jenis kelamin";
"male" = "Pria";
"female" = "Wanita";
"description" = "Deskripsi";
"save" = "Simpan";
"main_information" = "Informasi Utama";
"nickname" = "Nama Panggilan";
"online" = "Aktif";
"was_online" = "Terakhir kali terlihat";
"was_online_m" = "Terakhir kali terlihat";
"was_online_f" = "Terakhir kali terlihat";
/* For male and female */
"all_title" = "Semua";
"information" = "Informasi";
"status" = "Status";
"no_information_provided" = "Tidak ada informasi yang diberikan.";
"deceased_person" = "mendiang";
"none" = "nihil";
"send" = "Kirim";
"years_zero" = "berumur 0 tahun";
"years_one" = "berumur 1 tahun";
"years_other" = "berumur $1 tahun";
"relationship" = "Status Hubungan";
"relationship_0" = "Tidak ada yang dipilih";
"relationship_1" = "Belum Menikah";
"relationship_2" = "Berpacaran";
"relationship_3" = "Engaged";
"relationship_4" = "Menikah";
"relationship_5" = "In a civil marriage";
"relationship_6" = "In love";
"relationship_7" = "Rumit";
"relationship_8" = "Sedang Aktif mencari";
"politViews" = "Pandangan Politik";
"politViews_0" = "Tidak ada yang dipilih";
"politViews_1" = "Indifferent";
"politViews_2" = "Kommunisme";
"politViews_3" = "Sosialisme";
"politViews_4" = "Moderatisme";
"politViews_5" = "Liberalisme";
"politViews_6" = "konservatisme";
"politViews_7" = "Monarkisme";
"politViews_8" = "Ultra-Conservative";
"politViews_9" = "Libertarianisme";
"contact_information" = "Informasi Kontak";
"email" = "Surel";
"phone" = "Telp.";
"telegram" = "Telegram";
"personal_website" = "Situs";
"city" = "Kota";
"address" = "Alamat";
"personal_information" = "Informasi personal ";
"interests" = "Minat";
"favorite_music" = "Musik favorit";
"favorite_films" = "Film favorit";
"favorite_shows" = "Acara TV favorit";
"favorite_books" = "Buku favorit";
"favorite_quotes" = "Kutipan favorit";
"information_about" = "Personalia";
"updated_at" = "Diperbarui pada $1";
"user_banned" = "Sayangnya, kami harus memblokir pengguna halaman <b>$1</b> .";
"user_banned_comment" = "Komentar moderator:";
/* Wall */
"feed" = "Beranda";
"post_writes_m" = "Kirim";
"post_writes_f" = "Kirim";
"post_writes_g" = "Kirim";
"wall" = "dinding";
"post" = "Post";
"write" = "tulis";
"publish" = "publikasikan";
"delete" = "Hapus";
"comments" = "Komentar";
"share" = "Bagikan";
"pin" = "sematkan";
"unpin" = "batalkan sematkan";
"pinned" = "disematkan";
"comments_tip" = "Jadilah yang pertama yang berkomentar,pada postingan ini!";
"your_comment" = "Komentarmu";
"shown" = "Tampil";
"x_out_of" = "$1 dari";
"wall_zero" = "tidak ada postingan";
"wall_one" = "$1 postingan";
"wall_other" = "$1 postingan";
"publish_post" = "Tambah";
"view_other_comments" = "Lihat komentar lain.";
"no_comments" = "Tidak ada Komentar";
"all_news" = "All news";
"posts_per_page" = "Number of posts per page";
"attachment" = "Lampiran";
"post_as_group" = "Post sebagai grup";
"comment_as_group" = "Komen sebagai group";
"add_signature" = "Tambahkan Teken";
/* ^ can be translated as "author's signature". ^ */
"contains_nsfw" = "Konten Dewasa (NSFW)";
"nsfw_warning" = "Postingan ini mungkin terdapat konten Dewasa (NSFW)";
"report" = "Lapor";
"attach" = "Lampiran";
"attach_photo" = "Lampirkan foto";
"attach_video" = "Lampirkan video";
"draw_graffiti" = "Lampirankan graffiti";
"no_posts_abstract" = "belum ada yang tertulis disini...";
"attach_no_longer_available" = "Lampiran ini tidak lagi tersedia.";
"open_post" = "Buka postingan";
"version_incompatibility" = "Lampiran ini tidak dapat ditampilkan. Mungkin databasenya tidak kompatibel dengan versi OpenVK saat ini .";
"reply" = "Balas";
/* Friends */
"friends" = "Teman";
"followers" = "Pengikut";
"follower" = "Pengikut";
"friends_add" = "Tambahkan sebagai teman";
"friends_delete" = "Hapus pertemanan";
"friends_reject" = "Tolak Permintaan";
"friends_accept" = "Terima Permintaan";
"send_message" = "Kirim Pesan";
"incoming_req" = "Menunggu";
"outcoming_req" = "Keluar";
"req" = "Permintaan";
"req_zero" = "Tidak ada permintaan ditemukan...";
"req_one" = "Terdapat $1 permintaan";
"req_other" = "Terdapat $1 permintaan";
"friends_zero" = "Tidak ada pertemanan";
"friends_one" = "$1 teman";
"friends_other" = "$1 teman";
"friends_list_zero" = "Kamu belum memiliki pertemanan";
"friends_list_one" = "Kamu memiliki $1 pertemanan";
"friends_list_other" = "Kamu memiliki $1 pertemanan";
"followers_zero" = "Tidak ada pengikut";
"followers_one" = "$1 pengikut";
"followers_other" = "$1 pengikut";
"subscriptions_zero" = "Tidak ada Langganan";
"subscriptions_one" = "$1 Langganan";
"subscriptions_other" = "$1 Langganan";
/* Group */
"name_group" = "Nama";
"subscribe" = "Berlangganan";
"unsubscribe" = "Berhenti berlangganan";
"subscriptions" = "Langganan";
"join_community" = "Gabung komunitas";
"leave_community" = "Tinggalkan Komunitas";
"check_community" = "Lihat komunitas";
"min_6_community" = "Nama grup setidaknya minimal memiliki 6 digit huruf";
"participants" = "Partisipan";
"groups" = "Grup";
"meetings" = "Rapat";
"create_group" = "Buat Grup";
"group_managers" = "Pengurus";
"group_type" = "Tipe Grup";
"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.";
"creator" = "Pembuat";
"administrators" = "Administrator";
"add_to_left_menu" = "Add to left menu";
"remove_from_left_menu" = "Remove from left menu";
"all_followers" = "Seluruh pengikut";
"only_administrators" = "Hanya administrator";
"website" = "Situs";
"managed" = "Managed";
"size" = "Jumlah";
"administrators_one" = "$1 administrator";
"administrators_other" = "$1 administrator";
"role" = "Role";
"administrator" = "Administrator";
"promote_to_admin" = "Promosikan sebagai admin";
"promote_to_owner" = "Promosikan sebagai pemilik";
"devote" = "Devote";
"set_comment" = "Atur Komentar";
"hidden_yes" = "Sembunyikan: Ya";
"hidden_no" = "Sembunyikan: No";
"group_allow_post_for_everyone" = "Izinkan semua dapat memposting";
"group_hide_from_global_feed" = "Don't display posts in the global feed";
"statistics" = "Statistik";
"group_administrators_list" = "Lis Admin";
"group_display_only_creator" = "Tampilkan hanya pembuat grup";
"group_display_all_administrators" = "Tampilkan seluruh administrator";
"group_dont_display_administrators_list" = "Jangan tampilkan apapun";
"group_changeowner_modal_title" = "Owner's permissions transfer";
"group_changeowner_modal_text" = "Attention! You are transferring owner rights to user $1. This action is irreversible. After the transfer, you will remain an administrator, but you can easily stop being one.";
"group_owner_setted" = "The new owner ($1) has been successfully assigned to the community $2. You have been granted administrator rights in the community. If you want to return the owner role, contact <a href='/support?act=new'>site technical support</a>.";
"participants_zero" = "Tidak ada partisipan";
"participants_one" = "$1 partisipan";
"participants_other" = "$1 partisipan";
"groups_zero" = "Tidak ada grup";
"groups_one" = "$1 grup";
"groups_other" = "$1 grup";
"groups_list_zero" = "Kamu belum berpatisipasi dalam grup manapun";
"groups_list_one" = "Kamu berpatisipasi dalam satu grup";
"groups_list_other" = "Kamu berpatisipasi dalam of $1 grup";
"meetings_zero" = "tidak terdapat rapat/pertemuan";
"meetings_one" = "$1 rapat/pertemuan";
"meetings_other" = "$1 rapat/pertemuan";
"open_new_group" = "Open a new group";
"open_group_desc" = "Can't find the right group? Open your own...";
"search_group" = "Cari grup";
"search_by_groups" = "Search by groups";
"search_group_desc" = "Here you can browse through the existing groups and choose a group to suit your needs...";
/* Albums */
"create" = "Buat";
"albums" = "Album";
"create_album" = "Buat album";
"edit_album" = "Sunting album";
"creating_album" = "Membuat album";
"upload_photo" = "Unggah foto";
"photo" = "Foto";
"upload_button" = "Unggah";
"open_original" = "Buka ukuran file asli";
"avatar_album" = "Foto Profil";
"wall_album" = "Foto dingdings";
"albums_zero" = "tidak ada album";
"albums_one" = "$1 album";
"albums_other" = "$1 album";
"albums_list_zero" = "Kamu belum mempunya album apapun";
"albums_list_one" = "Kamu hanya memiliki satu album";
"albums_list_other" = "Kamu memiliki $1 album";
/* Notes */
"notes" = "Catatan";
"note" = "Catatan";
"name_note" = "Judul";
"text_note" = "Isi";
"create_note" = "Tambahkan catatan";
"edit_note" = "Sunting catatan";
"actions" = "Aksi";
"edited" = "Tersunting";
"notes_zero" = "Tidak ada catatan";
"notes_one" = "$1 catatan";
"notes_other" = "$1 catatan";
"notes_start_screen" = "With notes, you can share your events with friends and see what's going on with them.";
"notes_list_zero" = "No notes found";
"notes_list_one" = "$1 note found";
"notes_list_other" = "$1 notes found";
/* Menus */
/* Note that is string need to fit into the "My Page" link */
"edit_button" = "sunting";
"my_page" = "Halamanku";
"my_friends" = "Pertemanan";
"my_photos" = "Foto";
"my_videos" = "Video";
"my_messages" = "Perpesanan";
"my_notes" = "Catatan";
"my_groups" = "Grup";
"my_feed" = "Beranda";
"my_feedback" = "Pemberandaan";
"my_settings" = "Pengaturan";
"bug_tracker" = "Bug-tracker";
"menu_login" = "Masuk";
"menu_registration" = "Pendaftaran";
"menu_help" = "Bantuan";
"menu_logout" = "Keluar";
"menu_support" = "Dukungan";
"header_home" = "beranda";
"header_groups" = "grup";
"header_people" = "orang";
"header_invite" = "undang";
"header_help" = "bantuan";
"header_log_out" = "keluar";
"header_search" = "Cari";
"header_login" = "masuk";
"header_registration" = "pendaftaran";
"left_menu_donate" = "Donasi";
"footer_about_instance" = "Tentang";
"footer_blog" = "blog";
"footer_help" = "bantuan";
"footer_developers" = "developers";
"footer_choose_language" = "pilih bahasa";
"footer_privacy" = "privasi";
/* Settings */
"main" = "Main";
"contacts" = "kontak";
"avatar" = "Avatar";
"privacy" = "Privasi";
"interface" = "Antarmuka";
"profile_picture" = "Gambar Foto Profil";
"picture" = "Gambar";
"change_password" = "Ubah kata sandi";
"old_password" = "Kata Sandi Lama";
"new_password" = "Kata Sandi Baru";
"repeat_password" = "Ulang Kata Sandi Baru";
"avatars_style" = "Tampilan Gaya Avatar";
"style" = "Gaya";
"default" = "bawaan";
"arbitrary_avatars" = "acak";
"cut" = "Kotak";
"round_avatars" = "Bulat";
"apply_style_for_this_device" = "Hanya terapkan gaya ini pada perangkat ini";
"search_for_groups" = "Cari grup";
"search_for_people" = "Cari orang";
"search_button" = "Cari";
"search_placeholder" = "Masukkan nama,judul atau suatu kata.";
"results_zero" = "Tidak ada hasil";
"results_one" = "$1 hasil";
"results_other" = "$1 hasil";
"privacy_setting_access_page" = "Siapa saja yang dapat melihat halamanku";
"privacy_setting_read_info" = "Siapa saja yang dapat melihat informasi utama halamanku";
"privacy_setting_see_groups" = "Who can see my groups and meetings";
"privacy_setting_see_photos" = "Siapa saja yang dapat melihat fotoku";
"privacy_setting_see_videos" = "Siapa saja yang dapat melihat videosku";
"privacy_setting_see_notes" = "Siapa saja yang dapat melihat catatanku";
"privacy_setting_see_friends" = "Siapa saja yang dapat melihat pertemananku";
"privacy_setting_add_to_friends" = "Siapa saja yang dapat menambahkan pertemanan ke saya";
"privacy_setting_write_wall" = "Siapa saja yang dapat menuliskan postingan kedinding saya";
"privacy_setting_write_messages" = "Siapa saja yang dapat mengirim pesan ke saya";
"privacy_value_anybody" = "Siapa saja";
"privacy_value_anybody_dative" = "Siapa saja";
"privacy_value_users" = "Pengguna OpenVK";
"privacy_value_friends" = "Teman";
"privacy_value_friends_dative" = "Teman";
"privacy_value_only_me" = "Hanya saya";
"privacy_value_only_me_dative" = "Hanya saya";
"privacy_value_nobody" = "Tidak ada";
"your_email_address" = "Alamat Surelmu";
"your_page_address" = "Alamat halamanmu";
"page_address" = "Address page";
"current_email_address" = "Alamat surel sekarang";
"page_id" = "ID Halaman";
"you_can_also" = "Kamu juga dapat";
"delete_your_page" = "hapus halamanmu";
"delete_album" = "hapus album";
"ui_settings_interface" = "Antarmuka";
"ui_settings_sidebar" = "Left menu";
"ui_settings_rating" = "Rating";
"ui_settings_rating_show" = "Tampilkan";
"ui_settings_rating_hide" = "Sembunyikan";
"additional_links" = "Tautan tambahan";
"ad_poster" = "Periklanan";
/* Two-factor authentication */
"two_factor_authentication" = "Keamanan autentikasi dua faktor";
"two_factor_authentication_disabled" = "Memberikan perlindungan keamanan yang lebih andal terhadap peretasan: untuk memasuki halaman, Anda harus memasukkan kode yang diperoleh dalam aplikasi 2FA.";
"two_factor_authentication_enabled" = "Keamanan autentikasi dua faktor diaktifkan. Halaman Anda dilindungi.";
"two_factor_authentication_login" = "Anda mengaktifkan autentikasi dua faktor, saat masuk masukkan kode yang diterima dalam aplikasi.";
"two_factor_authentication_settings_1" = "Two-factor authentication via TOTP can be used even without internet. To do this, you need a code generation app. For example, <b>Google Authenticator</b> for Android and iOS or <b>FOSS Aegis and andOTP</b> for Android. Make sure the date and time is set correctly on your phone.";
"two_factor_authentication_settings_2" = "Using the app for two-factor authentication, scan the QR code below:";
"two_factor_authentication_settings_3" = "or manually enter the given secret key: <b>$1</b>.";
"two_factor_authentication_settings_4" = "Now enter the code that the application gave you and the password for your page so that we can confirm that you really are.";
"connect" = "Hubungkan";
"enable" = "Aktifkan";
"disable" = "nonaktifkan";
"code" = "Kode";
"2fa_code" = "Kode 2FA";
"incorrect_password" = "kata sandi tidak sesuai";
"incorrect_code" = "kode tidak sesuai";
"incorrect_2fa_code" = "Keamanan autentikasi dua faktor tidak sesuai";
"two_factor_authentication_enabled_message" = "Two-factor authentication enabled";
"two_factor_authentication_enabled_message_description" = "Your page has become more difficult to hack. We recommend that you download <a href='javascript:viewBackupCodes()'>backup codes</a>";
"two_factor_authentication_disabled_message" = "Keamanan autentikasi dua faktor dinon-aktifkan";
"view_backup_codes" = "lihat kode cadang";
"backup_codes" = "Backup codes for login confirmation";
"two_factor_authentication_backup_codes_1" = "Backup codes allow you to validate your login when you don't have access to your phone, for example, while traveling.";
"two_factor_authentication_backup_codes_2" = "You have <b>10 more codes</b>, each code can only be used once. Print them out, put them away in a safe place and use them when you need codes to validate your login.";
"two_factor_authentication_backup_codes_3" = "You can get new codes if they run out. Only the last created backup codes are valid.";
/* Sorting */
"sort_randomly" = "Urutkan secara acak";
"sort_up" = "Urutkan berdasarkan ID terawal";
"sort_down" = "Urutkan berdasarkan ID terakhir";
/* Videos */
"videos" = "Video";
"video" = "Video";
"upload_video" = "Unggah video";
"video_uploaded" = "Uploaded";
"video_updated" = "Updated";
"video_link_to_yt" = "Pintaskan ke YouTube";
"info_name" = "Judul";
"info_description" = "Deskripsi";
"info_uploaded_by" = "Diunggah oleh";
"info_upload_date" = "Tanggal unggah";
"videos_zero" = "Tidak ada video";
"videos_one" = "$1 video";
"videos_other" = "$1 video";
"view_video" = "Lihat Video";
/* Notifications */
"feedback" = "Pemberandaan";
"unread" = "Belum dibaca";
"archive" = "Arsip";
"notifications_like" = "$1 liked your $2post$3 from $4";
"notifications_repost" = "$1 shared your $2post$3 from $4";
"notifications_comment_under" = "$1 leaved a comment on $2";
"notifications_under_note" = "your $3note$4";
"notifications_under_photo" = "your $3photo$4";
"notifications_under_post" = "your $3post$4 from $5";
"notifications_under_video" = "your $3video$4";
"notifications_post" = "$1 published $2a post$3 on your wall: $4";
"notifications_appoint" = "$1 appointed you as community manager $2";
"nt_liked_yours" = "liked yours";
"nt_shared_yours" = "shared yours";
"nt_commented_yours" = "commented";
"nt_written_on_your_wall" = "wrote on your wall";
"nt_made_you_admin" = "appointed you in the community";
"nt_from" = "dari";
"nt_yours_adjective" = "kamu";
"nt_yours_feminitive_adjective" = "kamu";
"nt_post_nominative" = "post";
"nt_post_instrumental" = "post";
"nt_note_instrumental" = "catatan";
"nt_photo_instrumental" = "foto";
"nt_topic_instrumental" = "topik";
/* Time */
"time_at_sp" = " pada ";
"time_just_now" = "baru saja";
"time_exactly_five_minutes_ago" = "5 menit yang lalu";
"time_minutes_ago" = "$1 menit yang lalu";
"time_today" = "hari ini";
"time_yesterday" = "kemarin";
"points" = "Votes";
"points_count" = "votes";
"on_your_account" = "Pada akunmu";
"vouchers" = "Voucher";
"have_voucher" = "voucher dimiliki";
"voucher_token" = "Voucher token";
"voucher_activators" = "Pengguna";
"voucher_explanation" = "Masukkan nomor seri pada voucher. Biasanya tercantum pada tanda terima atau dalam suatu pesan.";
"voucher_explanation_ex" = "Perlu diketahui bahwa voucher dapat kedaluwarsa dan hanya dapat digunakan sekali.";
"invalid_voucher" = "Voucher tidak valid";
"voucher_bad" = "Kamu mungkin memasukkan nomor seri yang tidak valid atau voucher sudah digunakan, atau juga voucher sudah kedaluwarsa.";
"voucher_good" = "Voucher telah diaktifkan";
"voucher_redeemed" = "Voucher telah berhasil diaktifkan.poin akan segera diterima, tetapi kamu tidak lagi dapat mengaktifkannya dengan kode ini.";
"redeem" = "Gunakan voucher";
"deactivate" = "Nonaktifkan";
"usages_total" = "Total telah digunakan";
"usages_left" = "Sisa penggunaan";
"points_transfer_dialog_header_1" = "You can send as a gift or transfer part of the votes to another person.";
"points_transfer_dialog_header_2" = "Your current balance:";
"points_amount_one" = "1 vote";
"points_amount_other" = "$1 vote";
"transfer_poins" = "Transfer vote";
"transfer_poins_button" = "Transfer vote";
"also_you_can_transfer_points" = "Kamu juga dapat <a href=\"javascript:showCoinsTransferDialog($1, '$2')\">membagikan vote</a>ke orang lain.";
"transferred_to_you" = "transferred to you";
"receiver_address" = "Receiver address";
"coins_count" = "Jumlah of vote";
"message" = "Pesan";
"failed_to_tranfer_points" = "Gagal mentransfer vote";
"points_transfer_successful" = "You have successfully transferred <b>$1</b> to <b><a href=\"$2\">$3</a></b>.";
"not_all_information_has_been_entered" = "Informasi tidak lengkap";
"negative_transfer_value" = "Maaf,kami tidak bisa mencuri atau menggelapkan votes dari orang lain.";
"message_is_too_long" = "Pesan terlalu panjang";
"receiver_not_found" = "Penerima tidak ditemukan / tidak ada";
"you_dont_have_enough_points" = "Kamu tidak memiliki cukup vote";
"increase_rating" = "Increase rating";
"increase_rating_button" = "Increase";
"to_whom" = "Kepada ";
"increase_by" = "Increase by";
"price" = "Harga";
"you_have_unused_votes" = "Kamu memiliki $1 vote yang belum digunakan.";
"apply_voucher" = "Apply voucher";
"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>.";
"negative_rating_value" = "We cannot steal rating from another person, sorry.";
"increased_your_rating_by" = "increased your rating by";
/* Gifts */
"gift" = "Hadiah";
"gifts" = "Hadiah";
"gifts_zero" = "0 Hadiah";
"gifts_one" = "1 Hadiah";
"gifts_other" = "$1 Hadiah";
"gifts_left" = "Hadiah tersedia: $1";
"gifts_left_zero" = "tidak ada Hadiah tersedia";
"gifts_left_one" = "satu Hadiah tersedia";
"gifts_left_other" = "$1 Hadiah tersisa";
"send_gift" = "Beri Hadiah";
"gift_select" = "Pilih Hadiah";
"collections" = "Koleksi";
"confirm" = "Konfirmasi";
"as_anonymous" = "sebagai anonim";
"gift_your_message" = "Pesanmu";
"free_gift" = "Gratis";
"coins" = "Vote";
"coins_zero" = "0 vote";
"coins_one" = "1 vote";
"coins_other" = "$1 vote";
"users_gifts" = "Hadiah";
/* Support */
"support_opened" = "Opened";
"support_answered" = "With a response";
"support_closed" = "Closed";
"support_ticket" = "Tiket";
"support_tickets" = "Tiket";
"support_status_0" = "Issue under consideration";
"support_status_1" = "There's a response";
"support_status_2" = "Closed";
"support_greeting_hi" = "Greetings, $1!";
"support_greeting_regards" = "Best regards,<br/>$1 support team.";
"support_faq" = "Pertanyaan yang sering diajukan";
"support_list" = "Lis tiket";
"support_new" = "Tiket baru";
"support_faq_title" = "Who is this website for?";
"support_faq_content" = "The site is designed to find friends and acquaintances, as well as view user data. It is like a city directory, through which people can quickly find relevant information about a person.";
"support_new_title" = "Masukkkan topik tiketmu";
"support_new_content" = "Deskripsikan keluh kesahmu atau sugesti ataupun kritik dan saranmu";
"support_rate_good_answer" = "Jawaban yang baik";
"support_rate_bad_answer" = "Jawaban yang tidak baik";
"support_good_answer_user" = "Kamu memberikan umpan balik positif.";
"support_bad_answer_user" = "Kamu memberikan umpan balik negatif.";
"support_good_answer_agent" = "Pengguna memberikan umpan balik positif.";
"support_bad_answer_agent" = "Pengguna memberikan umpan balik negatif.";
"support_rated_good" = "Kamu memberikan umpan balik positif terhadap jawabannya.";
"support_rated_bad" = "Kamu memberikan umpan balik negatif terhadap jawabannya.";
"wrong_parameters" = "Parameter permintaan tidak valid.";
"fast_answers" = "Balasan cepat";
"comment" = "Komen";
"sender" = "Pengirim";
"author" = "Pembuat";
"you_have_not_entered_text" = "Kamu belum memasukkan teks apa pun";
"you_have_not_entered_name_or_text" = "Kamu tidak memasukkan nama atau teks";
"ticket_changed" = "Tiket diubah";
"ticket_changed_comment" = "Perubahan akan berlaku dalam beberapa saat.";
/* Invite */
"invite" = "Undang";
"you_can_invite" = "You can invite your friends or acquaintances to the network using an individual link:";
"you_can_invite_2" = "Attach this link to your post. When the user signs up, he will immediately appear in your friends.";
/* Banned */
"banned_title" = "Kamu dibanned";
"banned_header" = "Kamu dibanned";
"banned_alt" = "Pengguna diblokir.";
"banned_1" = "Maaf <b>$1</b>, tapi kamu telah dibanned.";
"banned_2" = "dan alasannya cukup sederhana: <b>$1</b>. namun, saat ini kamu diblokir selamanya.";
"banned_3" = "Kamu masih dapat <a href=\"/support?act=new\">menulis dukungan,masukkan,atau banding</a> jika kamu berpikir bahwa itu adalah kesalahan atau kamu bisa <a href=\"/logout?hash=$1\">keluar</a>.";
/* Registration confirm */
"ec_header" = "Konfirmasi Pendaftaran";
"ec_title" = "Terima kasih!";
"ec_1" = "<b>$1</b>, pendaftaranmu hampir selesai. Dalam beberapa saat kamu akan menerima pesan pada surel dengan tautan untuk mengonfirmasi alamat surelmnu.";
"ec_2" = "Apabila kamu dengan alasan tertentu tidak menerima pesan ke surelmu, coba periksa folder spam surelmu.namun apabila tidak menemukan pesan apapun, kamu dapat mengirimnya ulang.";
"ec_resend" = "Kirim ulang";
/* Discussions */
"discussions" = "Diskusi";
"messages_one" = "Satu Pesan";
"messages_other" = "$1 Pesan";
"topic_messages_count_zero" = "Topic has no messages";
"topic_messages_count_one" = "There are one message in the topic";
"topic_messages_count_other" = "There are $1 messages in the topic";
"replied" = "balas";
"create_topic" = "Buat topik";
"new_topic" = "Topik baru";
"title" = "Judul";
"text" = "Teks";
"view_topic" = "Lihat topik";
"edit_topic_action" = "Sunting topik";
"edit_topic" = "Sunting topik";
"topic_settings" = "Pengaturan topik";
"pin_topic" = "Sematkan Topik";
"close_topic" = "Tutup topik";
"delete_topic" = "Hapus topik";
"topics_one" = "Satu topik";
"topics_other" = "$1 topik";
"created" = "Dibuat";
"everyone_can_create_topics" = "Siapa saja dapat membuat topik";
"display_list_of_topics_above_wall" = "Display a list of topics above the wall";
"topic_changes_saved_comment" = "The updated title and settings will appear on the topic page.";
"failed_to_create_topic" = "Pembuatan topik gagal";
"failed_to_change_topic" = "Pergantian topik gagal";
"no_title_specified" = "No title specified.";
/* Errors */
"error_1" = "Incorrect query";
"error_2" = "Incorrect login and password";
"error_3" = "Non authorized";
"error_4" = "User does not exist";
"information_-1" = "Sukses";
"information_-2" = "Masuk sukses";
"no_data" = "Tidaka ada data";
"no_data_description" = "Belum ada apa-apa disini... ";
"error" = "Error";
"error_shorturl" = "Alamat tidak tersedia atau telah dimiliki.";
"error_segmentation" = "terjadi kesalahan";
"error_upload_failed" = "Gagal mengunggah foto";
"error_old_password" = "Kata sandi lama tidak cocok";
"error_new_password" = "Kata sandi baru tidak cocok";
"error_shorturl_incorrect" = "Alamat singkat memiliki format yang salah.";
"error_repost_fail" = "Gagal membagikan postingan";
"forbidden" = "Access error";
"forbidden_comment" = "This user\'s privacy settings do not allow you to look at his page.";
"changes_saved" = "Perubahan tersimpan";
"changes_saved_comment" = "Data baru akan muncul di halamanmu";
"photo_saved" = "Foto berhasil disimpan";
"photo_saved_comment" = "Gambar / foto profil baru akan muncul di halamanmu";
"shared_succ" = "Postingan akan tampil pada dindingmu,klik notifikasi untuk menuju dinding halamanmu.";
"invalid_email_address" = "Alamat sural tidak valid";
"invalid_email_address_comment" = "Surel yang kamu masukkan tidak benar atau tidak sesuai penulisan yang benar.";
"invalid_real_name" = "Silakan, masukkan nama aslimu. Akan lebih mudah bagi temanmu atau kenalanmu untuk menemukanmu seperti ini.";
"invalid_birth_date" = "Tanggal lahir tidak valid";
"invalid_birth_date_comment" = "Tanggal lahir yang kamu masukkan tidak benar atau tidak sesuai penulisan yang benar.";
"invalid_telegram_name" = "Akun Telegram tidak valid";
"invalid_telegram_name_comment" = "Akun Telegram yang kamu masukkan tidak benar atau tidak sesuai penulisan yang benar.";
"token_manipulation_error" = "Token manipulation error";
"token_manipulation_error_comment" = "The token is invalid or expired";
"profile_changed" = "Profile changed";
"profile_changed_comment" = "Your active profile has been changed.";
"profile_not_found" = "Pengguna tidak ditemukan.";
"suspicious_registration_attempt" = "Upaya yang mencurigakan / asing";
"suspicious_registration_attempt_comment" = "Kamu mencoba mendaftar dari lokasi yang mencurigakan atau sesuai dengan kebijakan";
"rate_limit_error" = "Choomba, are you completely fucked up?";
"rate_limit_error_comment" = "Go to the brainwrap, drink the wheels. In $1, you cannot drop shitposts as often. Exception code: $2.";
"not_enough_permissions" = "izin / akses diperlukan";
"not_enough_permissions_comment" = "Kamu tidak memiliki izin / akses yang memadai untuk melakukan tindakan ini.";
"login_required_error" = "Akses masuk diperlukan";
"login_required_error_comment" = "Untuk melihat halaman ini, kamu harus masuk terlebih dahulu.";
"captcha_error" = "captcha error";
"captcha_error_comment" = "Pastikan Kamu mengisi kolom captcha dengan benar.";
"failed_to_publish_post" = "Gagal memposting postingan";
"failed_to_delete_post" = "Gagal menghapus postingan";
"media_file_corrupted" = "File konten media rusak / korup.";
"media_file_corrupted_or_too_large" = "File konten media rusak atau terlalu besar.";
"post_is_empty_or_too_big" = "Postingan nihil atau ukurannya terlalu besar.";
"post_is_too_big" = "ukuran postingan terlalu besar";
/* Admin actions */
"login_as" = "Masuk sebagai $1";
"manage_user_action" = "Atur pengguna";
"manage_group_action" = "Atur grup";
"ban_user_action" = "Ban pengguna";
"warn_user_action" = "peringatkan pengguna";
/* Paginator (deprecated) */
"paginator_back" = "Sebelumnya";
"paginator_page" = "Halaman $1";
"paginator_next" = "Selanjutnya";
/* About */
"about_openvk" = "Tentang OpenVK";
"about_this_instance" = "About this instance";
"rules" = "Rules";
"most_popular_groups" = "Most popular groups";
"on_this_instance_are" = "On this instance are:";
"about_users_one" = "<b>1</b> pengguna";
"about_users_other" = "<b>$1</b> pengguna";
"about_online_users_one" = "<b>1</b> pengguna aktif";
"about_online_users_other" = "<b>$1</b> pengguna aktif";
"about_active_users_one" = "<b>1</b> pengguna aktif";
"about_active_users_other" = "<b>$1</b> pengguna aktif";
"about_groups_one" = "<b>1</b> grup";
"about_groups_other" = "<b>$1</b> grup";
"about_wall_posts_one" = "<b>1</b> wall post";
"about_wall_posts_other" = "<b>$1</b> wall posts";
/* Dialogs */
"ok" = "OK";
"yes" = "Ya";
"no" = "Tidak";
"cancel" = "Batal";
"edit_action" = "Ubah";
"transfer" = "Transfer";
"close" = "Tutup";
"warning" = "Peringatan";
"question_confirm" = "Tindakan ini tidak dapat diurungkan. Apakah kamu yakin ?";
/* User alerts */
"user_alert_scam" = "Akun ini telah banyak dilaporkan melakukan penipuan. Berhati-hatilah, terutama jika ia meminta uang.";

View file

@ -206,7 +206,7 @@
"outcoming_req" = "Өтінімдер";
"req" = "Өтінімдер";
"firends_zero" = "Достарыңыз жоқ";
"friends_zero" = "Достарыңыз жоқ";
"friends_one" = "$1 дос";
"friends_other" = "$1 дос";
@ -396,7 +396,9 @@
"avatars_style" = "Аватарлардың стилі";
"style" = "Стилі";
"default" = "Ерікті (әдепкі)";
"default" = "әдепкі";
"arbitrary_avatars" = "Ерікті"
"cut" = "Шаршы";
"round_avatars" = "Дөңгелек";

View file

@ -79,3 +79,8 @@ list:
name: "Udmurtskiy"
native_name: "Удмуртский"
author: "mohooks"
- code: "id"
flag: "id"
name: "Indonesian"
native_name: "Bahasa Indonesia"
author: "loliconazter"

View file

@ -200,7 +200,7 @@
"outcoming_req" = "Zgłoszenie";
"req" = "Zgłoszenie";
"firends_zero" = "Ani jednego przyjaciela";
"friends_zero" = "Ani jednego przyjaciela";
"friends_one" = "$1 przyjaciel";
"friends_few" = "$1 przyjaciela";
"friends_many" = "$1 przyjaciół";

View file

@ -202,16 +202,28 @@
"friends_reject" = "Отменить заявку";
"friends_accept" = "Принять заявку";
"send_message" = "Отправить сообщение";
"incoming_req" = "Подписчики";
"outcoming_req" = "Заявки";
"incoming_req" = "Входящие";
"outcoming_req" = "Исходящие";
"req" = "Заявки";
"firends_zero" = "Ни одного друга";
"req_zero" = "Не найдено ни одной заявки...";
"req_one" = "Найдена $1 заявка";
"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" = "У Вас $1 друг";
"friends_list_few" = "У Вас $1 друга";
"friends_list_many" = "У Вас $1 друзей";
"friends_list_other" = "У Вас $1 друзей";
"followers_zero" = "Ни одного подписчика";
"followers_one" = "$1 подписчик";
"followers_few" = "$1 подписчика";
@ -326,6 +338,12 @@
"albums_many" = "$1 альбомов";
"albums_other" = "$1 альбомов";
"albums_list_zero" = "У Вас нет ни одного альбома";
"albums_list_one" = "У Вас один альбом";
"albums_list_few" = "У Вас $1 альбома";
"albums_list_many" = "У Вас $1 альбомов";
"albums_list_other" = "У Вас $1 альбомов";
/* Notes */
"notes" = "Заметки";
@ -413,7 +431,9 @@
"avatars_style" = "Отображение аватаров";
"style" = "Стиль";
"default" = "Произвольные (по умолчанию)";
"default" = "по умолчанию";
"arbitrary_avatars" = "Произвольные";
"cut" = "Квадратные";
"round_avatars" = "Круглые";
@ -523,6 +543,8 @@
"videos_many" = "$1 видеозаписей";
"videos_other" = "$1 видеозаписей";
"view_video" = "Просмотр";
/* Notifications */
"feedback" = "Ответы";
@ -787,7 +809,7 @@
"information_-2" = "Вход выполнен успешно";
"no_data" = "Нет данных";
"no_data_description" = "В этом представлении отсутствуют данные.";
"no_data_description" = "Тут ничего нет... Пока...";
"error" = "Ошибка";
"error_shorturl" = "Данный короткий адрес уже занят.";
@ -826,6 +848,7 @@
"profile_changed" = "Профиль изменён";
"profile_changed_comment" = "Ваш активный профиль был изменён.";
"profile_not_found" = "Пользователь не найден.";
"profile_not_found_text" = "Страница удалена либо ещё не создана.";
"suspicious_registration_attempt" = "Подозрительная попытка регистрации";
"suspicious_registration_attempt_comment" = "Вы пытались зарегистрироваться из подозрительного места.";

View file

@ -190,7 +190,7 @@
"outcoming_req" = "Входящіе прошенія";
"req" = "Исходящіе прошенія";
"firends_zero" = "Ни одного знакомца";
"friends_zero" = "Ни одного знакомца";
"friends_one" = "$1 знакомецъ";
"friends_few" = "$1 знакомца";
"friends_many" = "$1 знакомцевъ";
@ -364,7 +364,9 @@
"avatars_style" = "Отображеніе портрета";
"style" = "Стиль";
"default" = "Произвольный (по умолчанію)";
"default" = "по умолчанію";
"arbitrary_avatars" = "Произвольные​";
"cut" = "Квадратные​";
"round_avatars" = "Круглые";

View file

@ -124,7 +124,7 @@
"outcoming_req" = "Захтеви";
"req" = "Захтеви";
"firends_zero" = "Нема ниједног пријатеља";
"friends_zero" = "Нема ниједног пријатеља";
"friends_one" = "$1 пријатељ";
"friends_few" = "$1 пријатеља";
"friends_many" = "$1 пријатеља";

View file

@ -124,7 +124,7 @@
"outcoming_req" = "Zahtevi";
"req" = "Zahtevi";
"firends_zero" = "Nema nijednog prijatelja";
"friends_zero" = "Nema nijednog prijatelja";
"friends_one" = "$1 prijatelj";
"friends_few" = "$1 prijatelja";
"friends_many" = "$1 prijatelja";

View file

@ -198,7 +198,7 @@
"outcoming_req" = "Заявки";
"req" = "Заявки";
"firends_zero" = "Ни одного товарища";
"friends_zero" = "Ни одного товарища";
"friends_one" = "$1 товарищ";
"friends_few" = "$1 товарища";
"friends_many" = "$1 товарищей";

View file

@ -153,7 +153,7 @@
"outcoming_req" = "İstekler";
"req" = "İstekler";
"firends_zero" = "Arkadaş yok";
"friends_zero" = "Arkadaş yok";
"friends_one" = "$1 arkadaş";
"friends_other" = "$1 arkadaş";

View file

@ -190,7 +190,7 @@
"outcoming_req" = "Заявки";
"req" = "Заявки";
"firends_zero" = "Жодного друга";
"friends_zero" = "Жодного друга";
"friends_one" = "$1 друг";
"friends_few" = "$1 друга";
"friends_many" = "$1 друзів";

View file

@ -196,7 +196,7 @@
"outcoming_req" = "Заявки";
"req" = "Заявки";
"firends_zero" = "Одӥг но эшъёс";
"friends_zero" = "Одӥг но эшъёс";
"friends_one" = "$1 эшъёс";
"friends_few" = "$1 эшъёс";
"friends_many" = "$1 эшъёс";