diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index e69de29b..00000000
diff --git a/README.md b/README.md
index f00a179c..72991be0 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ To be honest, we don't even know whether it even works. However, this version is
Please use the master branch, as it has the most changes.
-Updating the source code is done with this command: `git pull --recurse-submodules`
+Updating the source code is done with this command: `git pull`
## Instances
@@ -29,7 +29,7 @@ If you want, you can add your instance to the list above so that people can regi
* PHP 8 has **not** yet been tested, so you should not expect it to work.
2. Install [commitcaptcha](https://github.com/openvk/commitcaptcha) and OpenVK as Chandler extensions like this:
```
-git clone --recursive https://github.com/openvk/openvk /path/to/chandler/extensions/available/openvk
+git clone https://github.com/openvk/openvk /path/to/chandler/extensions/available/openvk
git clone https://github.com/openvk/commitcaptcha /path/to/chandler/extensions/available/commitcaptcha
```
3. And enable them:
@@ -44,8 +44,6 @@ ln -s /path/to/chandler/extensions/available/openvk /path/to/chandler/extensions
8. Move to `Web/static/js` and execute `yarn install`
9. Set `openvk` as your root app in `chandler.yml`
-**Note**: If OVK submodules were not downloaded beforehand (i.e. `--recursive` was not used during cloning), this command *must be* executed in the `openvk` folder: `git submodule update --init`
-
Once you are done, you can login as a system administrator on the network itself (no registration required):
* **Login**: `admin@localhost.localdomain6`
* **Password**: `admin`
diff --git a/Web/Models/Entities/Club.php b/Web/Models/Entities/Club.php
index 26748d73..fff811f4 100644
--- a/Web/Models/Entities/Club.php
+++ b/Web/Models/Entities/Club.php
@@ -135,6 +135,11 @@ class Club extends RowModel
return (bool) $this->getRecord()->everyone_can_create_topics;
}
+ function isDisplayTopicsAboveWallEnabled(): bool
+ {
+ return (bool) $this->getRecord()->display_topics_above_wall;
+ }
+
function getType(): int
{
return $this->getRecord()->type;
diff --git a/Web/Models/Entities/Notifications/CoinsTransferNotification.php b/Web/Models/Entities/Notifications/CoinsTransferNotification.php
new file mode 100644
index 00000000..d515631a
--- /dev/null
+++ b/Web/Models/Entities/Notifications/CoinsTransferNotification.php
@@ -0,0 +1,13 @@
+isAd() ? "sponsored" : "ugc";
$text = $this->formatLinks($text);
$text = preg_replace("%@([A-Za-z0-9]++) \(([\p{L} 0-9]+)\)%Xu", "[$1|$2]", $text);
- $text = preg_replace("%@([A-Za-z0-9]++)%Xu", "[$1|@$1]", $text);
+ $text = preg_replace("%([\n\r\s]|^)(@([A-Za-z0-9]++))%Xu", "$1[$3|@$3]", $text);
$text = preg_replace("%\[([A-Za-z0-9]++)\|([\p{L} 0-9@]+)\]%Xu", "$2", $text);
$text = preg_replace("%(#([\p{L}_-]++[0-9]*[\p{L}_-]*))%Xu", "$1", $text);
$text = $this->formatEmojis($text);
diff --git a/Web/Models/Repositories/Users.php b/Web/Models/Repositories/Users.php
index 0beefdb1..9342b647 100644
--- a/Web/Models/Repositories/Users.php
+++ b/Web/Models/Repositories/Users.php
@@ -52,6 +52,23 @@ class Users
"online" => sizeof((clone $this->users)->where("online >= ?", time() - 900)),
];
}
+
+ function getByAddress(string $address): ?User
+ {
+ if(substr_compare($address, "/", -1) === 0)
+ $address = substr($address, 0, iconv_strlen($address) - 1);
+
+ $serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"];
+ if(strpos($address, $serverUrl . "/") === 0)
+ $address = substr($address, iconv_strlen($serverUrl) + 1);
+
+ if(strpos($address, "id") === 0) {
+ $user = $this->get((int) substr($address, 2));
+ if($user) return $user;
+ }
+
+ return $this->getByShortUrl($address);
+ }
use \Nette\SmartObject;
}
diff --git a/Web/Presenters/GroupPresenter.php b/Web/Presenters/GroupPresenter.php
index 1af8ef28..7788c09e 100644
--- a/Web/Presenters/GroupPresenter.php
+++ b/Web/Presenters/GroupPresenter.php
@@ -208,6 +208,7 @@ final class GroupPresenter extends OpenVKPresenter
$club->setWall(empty($this->postParam("wall")) ? 0 : 1);
$club->setAdministrators_List_Display(empty($this->postParam("administrators_list_display")) ? 0 : $this->postParam("administrators_list_display"));
$club->setEveryone_Can_Create_Topics(empty($this->postParam("everyone_can_create_topics")) ? 0 : 1);
+ $club->setDisplay_Topics_Above_Wall(empty($this->postParam("display_topics_above_wall")) ? 0 : 1);;
$website = $this->postParam("website") ?? "";
if(empty($website))
diff --git a/Web/Presenters/PhotosPresenter.php b/Web/Presenters/PhotosPresenter.php
index 24531222..56247bde 100644
--- a/Web/Presenters/PhotosPresenter.php
+++ b/Web/Presenters/PhotosPresenter.php
@@ -138,12 +138,13 @@ final class PhotosPresenter extends OpenVKPresenter
}
$this->template->album = $album;
- $this->template->photos = iterator_to_array( $album->getPhotos( (int) ($this->queryParam("p") ?? 1) ) );
+ $this->template->photos = iterator_to_array( $album->getPhotos( (int) ($this->queryParam("p") ?? 1), 20) );
$this->template->paginatorConf = (object) [
"count" => $album->getPhotosCount(),
"page" => $this->queryParam("p") ?? 1,
"amount" => sizeof($this->template->photos),
- "perPage" => OPENVK_DEFAULT_PER_PAGE,
+ "perPage" => 20,
+ "atBottom" => true
];
}
diff --git a/Web/Presenters/UserPresenter.php b/Web/Presenters/UserPresenter.php
index f2d1921a..52e1bfee 100644
--- a/Web/Presenters/UserPresenter.php
+++ b/Web/Presenters/UserPresenter.php
@@ -10,6 +10,7 @@ use openvk\Web\Models\Repositories\Videos;
use openvk\Web\Models\Repositories\Notes;
use openvk\Web\Models\Repositories\Vouchers;
use openvk\Web\Util\Validator;
+use openvk\Web\Models\Entities\Notifications\CoinsTransferNotification;
use Chandler\Security\Authenticator;
use lfkeitel\phptotp\{Base32, Totp};
use chillerlan\QRCode\{QRCode, QROptions};
@@ -465,4 +466,42 @@ final class UserPresenter extends OpenVKPresenter
$this->user->identity->save();
$this->flashFail("succ", tr("information_-1"), tr("two_factor_authentication_disabled_message"));
}
+
+ function renderCoinsTransfer(): void
+ {
+ $this->assertUserLoggedIn();
+ $this->willExecuteWriteAction();
+
+ $receiverAddress = $this->postParam("receiver");
+ $value = (int) $this->postParam("value");
+ $message = $this->postParam("message");
+
+ if(!$receiverAddress || !$value)
+ $this->flashFail("err", tr("failed_to_tranfer_points"), tr("not_all_information_has_been_entered"));
+
+ if($value < 0)
+ $this->flashFail("err", tr("failed_to_tranfer_points"), tr("negative_transfer_value"));
+
+ if(iconv_strlen($message) > 255)
+ $this->flashFail("err", tr("failed_to_tranfer_points"), tr("message_is_too_long"));
+
+ $receiver = $this->users->getByAddress($receiverAddress);
+ if(!$receiver)
+ $this->flashFail("err", tr("failed_to_tranfer_points"), tr("receiver_not_found"));
+
+ if($this->user->identity->getCoins() < $value)
+ $this->flashFail("err", tr("failed_to_tranfer_points"), tr("you_dont_have_enough_points"));
+
+ if($this->user->id !== $receiver->getId()) {
+ $this->user->identity->setCoins($this->user->identity->getCoins() - $value);
+ $this->user->identity->save();
+
+ $receiver->setCoins($receiver->getCoins() + $value);
+ $receiver->save();
+
+ (new CoinsTransferNotification($receiver, $this->user->identity, $value, $message))->emit();
+ }
+
+ $this->flashFail("succ", tr("information_-1"), tr("points_transfer_successful", tr("points_amount", $value), $receiver->getURL(), htmlentities($receiver->getCanonicalName())));
+ }
}
diff --git a/Web/Presenters/templates/@listView.xml b/Web/Presenters/templates/@listView.xml
index 58d51dff..35c9a2f0 100644
--- a/Web/Presenters/templates/@listView.xml
+++ b/Web/Presenters/templates/@listView.xml
@@ -29,6 +29,9 @@
{include description, x => $dat}
+
+ {include actions, x => $dat}
+ |
diff --git a/Web/Presenters/templates/About/Version.xml b/Web/Presenters/templates/About/Version.xml
index 4974c5dd..ab181dce 100644
--- a/Web/Presenters/templates/About/Version.xml
+++ b/Web/Presenters/templates/About/Version.xml
@@ -1,9 +1,9 @@
{extends "../@layout.xml"}
-{block title}Об OpenVK{/block}
+{block title}{_about_openvk}{/block}
{block header}
- Об OpenVK
+ {_about_openvk}
{/block}
{block content}
@@ -343,7 +343,7 @@
Name |
- Status |
+ Status |
Version |
Description |
Author |
diff --git a/Web/Presenters/templates/Gifts/UserGifts.xml b/Web/Presenters/templates/Gifts/UserGifts.xml
index da73e1fb..e6672bf7 100644
--- a/Web/Presenters/templates/Gifts/UserGifts.xml
+++ b/Web/Presenters/templates/Gifts/UserGifts.xml
@@ -24,7 +24,7 @@
{/block}
{block description}
-
- {var followersCount = $club->getFollowersCount()}
-
-
- {_participants}
-
-
-
- {tr("participants", $followersCount)}
-
+ {var followersCount = $club->getFollowersCount()}
+
+
+ {_participants}
+
+
+
+ {tr("participants", $followersCount)}
+
-
+
+
+
+
+ {_discussions}
+
+
+
+ {tr("topics", $topicsCount)}
+
+
+
+
+
{presenter "openvk!Wall->wallEmbedded", -$club->getId()}
-
-
+
{_discussions}
diff --git a/Web/Presenters/templates/Notification/Feed.xml b/Web/Presenters/templates/Notification/Feed.xml
index 848d55e8..cb2474da 100644
--- a/Web/Presenters/templates/Notification/Feed.xml
+++ b/Web/Presenters/templates/Notification/Feed.xml
@@ -19,13 +19,6 @@
{/block}
-{block actions}
-
-{/block}
-
{* BEGIN ELEMENTS DESCRIPTION *}
{block link|strip|stripHtml}
diff --git a/Web/Presenters/templates/Photos/Album.xml b/Web/Presenters/templates/Photos/Album.xml
index d4fe819a..9927c297 100644
--- a/Web/Presenters/templates/Photos/Album.xml
+++ b/Web/Presenters/templates/Photos/Album.xml
@@ -27,23 +27,24 @@
|
{_"edit_album"}
{/if}
-
+
{if $album->getPhotosCount() > 0}
- {foreach $photos as $photo}
- {php if($photo->isDeleted()) continue; }
-
- {/foreach}
-
+
+ {foreach $photos as $photo}
+ {php if($photo->isDeleted()) continue; }
+
+ {/foreach}
+
{include "../components/paginator.xml", conf => $paginatorConf}
{else}
{include "../components/nothing.xml"}
diff --git a/Web/Presenters/templates/Support/AnswerTicket.xml b/Web/Presenters/templates/Support/AnswerTicket.xml
index 025474c9..7ca11217 100644
--- a/Web/Presenters/templates/Support/AnswerTicket.xml
+++ b/Web/Presenters/templates/Support/AnswerTicket.xml
@@ -110,7 +110,7 @@
{/if}
- {if $comment->getUType() === 1}
+ {if $comment->getUType() === 1 && !is_null($comment->isLikedByUser())}
{/block}
+
+{block actions}
+ {if $x->getId() !== $thisUser->getId()}
+ {var subStatus = $x->getSubscriptionStatus($thisUser)}
+ {if $subStatus === 0}
+
+ {elseif $subStatus === 1}
+
+ {elseif $subStatus === 2}
+
+ {elseif $subStatus === 3}
+ {_"send_message"}
+
+ {/if}
+ {/if}
+{/block}
diff --git a/Web/Presenters/templates/User/Groups.xml b/Web/Presenters/templates/User/Groups.xml
index e740694d..ad80222c 100644
--- a/Web/Presenters/templates/User/Groups.xml
+++ b/Web/Presenters/templates/User/Groups.xml
@@ -49,23 +49,17 @@
{block description}
{$x->getDescription()}
- {if $x->canBeModifiedBy($thisUser ?? NULL)}
- {var clubPinned = $thisUser->isClubPinned($x)}
-
- {/if}
{/block}
+
+{var clubPinned = $thisUser->isClubPinned($x)}
+{if $x->canBeModifiedBy($thisUser ?? NULL) || $clubPinned || $thisUser->getPinnedClubCount() <= 10}
+ {block actions}
+
+ {if $clubPinned}
+ {_remove_from_left_menu}
+ {else}
+ {_add_to_left_menu}
+ {/if}
+
+ {/block}
+{/if}
\ No newline at end of file
diff --git a/Web/Presenters/templates/User/Settings.xml b/Web/Presenters/templates/User/Settings.xml
index 948af6eb..daa7a0c3 100644
--- a/Web/Presenters/templates/User/Settings.xml
+++ b/Web/Presenters/templates/User/Settings.xml
@@ -332,6 +332,7 @@
{presenter "openvk!Support->knowledgeBaseArticle", "points"}
+
{tr("also_you_can_transfer_points", $thisUser->getCoins(), rawurlencode($csrfToken))|noescape}
diff --git a/Web/Presenters/templates/User/View.xml b/Web/Presenters/templates/User/View.xml
index be1dc914..46a50eb6 100644
--- a/Web/Presenters/templates/User/View.xml
+++ b/Web/Presenters/templates/User/View.xml
@@ -91,25 +91,25 @@
{/if}
- {_send_gift}
-
+ {_send_gift}
+
{var subStatus = $user->getSubscriptionStatus($thisUser)}
{if $subStatus === 0}
-
{elseif $subStatus === 1}
-
{elseif $subStatus === 2}
-
{elseif $subStatus === 3}
{_"send_message"}
-
{/if}
{/if}
+
{tr("followers", $user->getFollowersCount())}
-
-
- {_gifts}
-
-
-
- {tr("gifts", $giftCount)}
-
-
-
-
- {var hideInfo = !is_null($thisUser) ? ($giftDescriptor->anon ? $thisUser->getId() !== $user->getId() : false) : false}
-
-
-
-
-
-
-
-
{var friendCount = $user->getFriendsCount()}
@@ -196,37 +173,17 @@
{_"all_title"}
-
-
-
-
- {var followersCount = $user->getFollowersCount()}
-
-
- {_followers}
-
-
-
- {tr("followers", $followersCount)}
-
-
-
+
+
+
+ {_gifts}
+
+
+
+ {tr("gifts", $giftCount)}
+
+
+
+
+ {var hideInfo = !is_null($thisUser) ? ($giftDescriptor->anon ? $thisUser->getId() !== $user->getId() : false) : false}
+
+
+
+
+
{presenter "openvk!Wall->wallEmbedded", $user->getId()}
diff --git a/Web/Presenters/templates/components/comment.xml b/Web/Presenters/templates/components/comment.xml
index 94122ac7..445f60fb 100644
--- a/Web/Presenters/templates/components/comment.xml
+++ b/Web/Presenters/templates/components/comment.xml
@@ -33,7 +33,7 @@
{if $comment->canBeDeletedBy($thisUser)}
{_"delete"} |
{/if}
-
+
diff --git a/Web/Presenters/templates/components/notifications/9602/_18_18_.xml b/Web/Presenters/templates/components/notifications/9602/_18_18_.xml
new file mode 100644
index 00000000..6f3e045b
--- /dev/null
+++ b/Web/Presenters/templates/components/notifications/9602/_18_18_.xml
@@ -0,0 +1,8 @@
+{var sender = $notification->getModel(1)}
+{var value = (int) explode(" ", $notification->getData(), 2)[0]}
+{var message = explode(" ", $notification->getData(), 2)[1]}
+
+{$sender->getCanonicalName()} {_transferred_to_you} {tr("points_amount", $value)}.
+{if !empty($message)}
+ {_message}: "{$message}".
+{/if}
diff --git a/Web/Presenters/templates/components/post/microblogpost.xml b/Web/Presenters/templates/components/post/microblogpost.xml
index 5606f790..8c22b51b 100644
--- a/Web/Presenters/templates/components/post/microblogpost.xml
+++ b/Web/Presenters/templates/components/post/microblogpost.xml
@@ -10,7 +10,8 @@
+ width="{ifset $compact}25{else}50{/ifset}"
+ {ifset $compact}class="cCompactAvatars"{/ifset} />
{if !$post->isPostedOnBehalfOfGroup() && !$compact}
{_online}
diff --git a/Web/Util/Localizator.php b/Web/Util/Localizator.php
index fb25b370..d73bec13 100644
--- a/Web/Util/Localizator.php
+++ b/Web/Util/Localizator.php
@@ -57,7 +57,7 @@ class Localizator
$lang = is_null($lang) ? static::DEFAULT_LANG : $lang;
$array = @self::parse(dirname(__FILE__) . "/../../locales/$lang.strings");
- return $array[$id] ?? (!empty($array["__fallback"]) ? $this->_($id, $array["__fallback"]) : "@$id");
+ return $array[$id] ?? "@$id";
}
function export($lang = NULL): ?array
diff --git a/Web/routes.yml b/Web/routes.yml
index e4bd8215..9ef0389a 100644
--- a/Web/routes.yml
+++ b/Web/routes.yml
@@ -59,6 +59,8 @@ routes:
handler: "User->twoFactorAuthSettings"
- url: "/settings/2fa/disable"
handler: "User->disableTwoFactorAuth"
+ - url: "/coins_transfer"
+ handler: "User->coinsTransfer"
- url: "/id{num}"
handler: "User->view"
- url: "/friends{num}"
diff --git a/Web/static/css/style.css b/Web/static/css/style.css
index dd2ea30c..f5abe0c6 100644
--- a/Web/static/css/style.css
+++ b/Web/static/css/style.css
@@ -257,23 +257,29 @@ a {
.album-photo {
position: relative;
- background-color: darkgrey;
- margin: 4pt;
- width: calc(33% - 10pt);
- height: 82px;
+ width: 25%;
+ max-height: 140px;
+ margin-bottom: 8px;
text-align: center;
- vertical-align: text-top;
+ display: flex;
+ align-items: center;
+ justify-content: center;
}
.album-photo img {
- width: 100%;
- max-height: 82px;
+ width: unset;
+ max-height: 120px !important;
+ max-width: 83%;
vertical-align: top;
+ border: 1px #ccc solid;
+ padding: 8px;
+ background-color: #fff;
}
.album-photo > .album-photo--delete {
position: absolute;
right: 0;
+ top: 0;
padding: 5px;
margin: 4px;
color: #fff;
@@ -289,6 +295,11 @@ a {
opacity: 1;
}
+.album-flex {
+ display: flex;
+ flex-wrap: wrap;
+}
+
.name-checkmark {
margin-left: 2pt;
}
@@ -307,6 +318,10 @@ a {
cursor: pointer;
}
+.profile_link_form {
+ margin-bottom: 0;
+}
+
#profile_links {
margin: 10px 0;
}
@@ -315,6 +330,10 @@ a {
background: #ECECEC;
}
+.action_links > .profile_link, .action_links > .profile_link_form > .profile_link {
+ width: 150px;
+}
+
.page_footer {
margin-left: 95px;
padding-top: 5px;
@@ -683,6 +702,44 @@ span {
max-height: 63px;
}
+.content_list {
+ display: flex;
+ width: 200px;
+ flex-wrap: wrap;
+}
+
+.content_list.long {
+ width: 397px;
+}
+
+.content_list .cl_element {
+ width: 33%;
+}
+
+.content_list.long .cl_element {
+ width: 16.5%;
+}
+
+.content_list .cl_element .cl_avatar {
+ padding: 7px 7px 0 7px;
+ text-align: center;
+}
+
+.content_list .cl_element .cl_name {
+ padding: 0 3px;
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+}
+
+.content_list .cl_element .cl_name .cl_lname {
+ font-size: 7pt;
+}
+
+.ava {
+ width: 45px;
+}
+
table.User {
vertical-align: text-top;
}
@@ -696,6 +753,10 @@ table.User {
margin-bottom: -12px;
}
+.container_gray.bottom {
+ border-bottom: #ebebeb solid 1px;
+}
+
#auth .container_gray {
margin-left: -10px;
margin-bottom: -10px;
@@ -1687,3 +1748,9 @@ body.scrolled .toTop:hover {
border-bottom: #e6e6e6 solid 1px;
padding: 4px;
}
+
+.messagebox-content-header {
+ background: #F7F7F7;
+ margin: -20px;
+ padding: 10px;
+}
diff --git a/Web/static/js/l10n.js b/Web/static/js/l10n.js
index 8fb53d20..f24801b8 100755
--- a/Web/static/js/l10n.js
+++ b/Web/static/js/l10n.js
@@ -1,36 +1,37 @@
-function tr(string, ...arg) {
+function tr(string, ...args) {
let output = window.lang[string];
- if(arg.length > 0) {
- if(typeof arg[0] == 'number') {
- let numberedStringId;
- let cardinal = arg[0];
+ if(args.length > 0) {
+ if(typeof args[0] === "number") {
+ const cardinal = args[0];
+ let numberedString;
+
switch(cardinal) {
case 0:
- numberedString = string + '_zero';
+ numberedString = string + "_zero";
break;
case 1:
- numberedString = string + '_one';
+ numberedString = string + "_one";
break;
default:
- numberedString = string + (cardinal < 5 ? '_few' : '_other');
+ numberedString = string + (cardinal < 5 ? "_few" : "_other");
}
- let newoutput = window.lang[numberedString];
- if(newoutput === null) {
- newoutput = window.lang[string + '_other'];
- if(newoutput === null) {
- newoutput = output;
- }
- }
+ let newOutput = window.lang[numberedString];
+ if(newOutput === null)
+ newOutput = window.lang[string + "_other"];
- output = newoutput;
+ if(newOutput === null)
+ newOutput = output;
+
+ output = newOutput;
}
}
-
- let i = 1;
- arg.forEach(element => {
- output = output.replace(RegExp('(\\$' + i + ')'), element);
- i++;
- });
+
+ if(output == null)
+ return "@" + string;
+
+ for(const [ i, element ] of Object.entries(args))
+ output = output.replace(RegExp("(\\$" + (Number(i) + 1) + ")"), element);
+
return output;
-}
\ No newline at end of file
+}
diff --git a/Web/static/js/openvk.cls.js b/Web/static/js/openvk.cls.js
index 4195e5e7..13bdafc4 100644
--- a/Web/static/js/openvk.cls.js
+++ b/Web/static/js/openvk.cls.js
@@ -171,3 +171,49 @@ function setClubAdminComment(clubId, adminId, hash) {
Function.noop
]);
}
+
+function showCoinsTransferDialog(coinsCount, hash) {
+ MessageBox(tr("transfer_poins"), `
+
+
+ `, [tr("transfer_poins_button"), tr("cancel")], [
+ () => {
+ document.querySelector("#coins_transfer_form").submit();
+ },
+ Function.noop
+ ]);
+}
+
diff --git a/docs/centos8_install.md b/docs/centos8_install.md
index 91770a05..97437858 100644
--- a/docs/centos8_install.md
+++ b/docs/centos8_install.md
@@ -154,7 +154,7 @@ composer2 install
```bash
cd ..
-git clone --recursive https://github.com/openvk/openvk.git
+git clone https://github.com/openvk/openvk.git
cd openvk/
composer2 install
cd Web/static/js
diff --git a/install/sqls/00016-place-oftopic-list-setting.sql b/install/sqls/00016-place-oftopic-list-setting.sql
new file mode 100644
index 00000000..500f6dff
--- /dev/null
+++ b/install/sqls/00016-place-oftopic-list-setting.sql
@@ -0,0 +1 @@
+ALTER TABLE `groups` ADD COLUMN `display_topics_above_wall` BOOLEAN NOT NULL DEFAULT FALSE AFTER `everyone_can_create_topics`;
diff --git a/locales/am.strings b/locales/am.strings
index 0c284722..437f30a9 100644
--- a/locales/am.strings
+++ b/locales/am.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "hy_AM.utf8;hy_AM.UTF-8;Arm";
"__WinEncoding" = "Windows-1251";
diff --git a/locales/by.strings b/locales/by.strings
index 65e44588..edf272f6 100644
--- a/locales/by.strings
+++ b/locales/by.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "be_BY.UTF-8;Bel";
/* Check for https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html */
diff --git a/locales/by_lat.strings b/locales/by_lat.strings
index 9b77c312..4056999f 100644
--- a/locales/by_lat.strings
+++ b/locales/by_lat.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "be_BY@latin;Bel_Lat";
"__WinEncoding" = "Windows-1251";
diff --git a/locales/de.strings b/locales/de.strings
index ad7e5614..0fdf1b38 100644
--- a/locales/de.strings
+++ b/locales/de.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "de_DE.UTF-8;Deu";
/* Check for https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html */
diff --git a/locales/en.strings b/locales/en.strings
index 06c8da0d..8410abf7 100644
--- a/locales/en.strings
+++ b/locales/en.strings
@@ -179,6 +179,8 @@
"open_post" = "Open post";
"version_incompatibility" = "This attachment could not be displayed. Probably the database is incompatible with the current version of OpenVK.";
+"reply" = "Reply";
+
/* Friends */
"friends" = "Friends";
@@ -522,6 +524,31 @@
"usages_total" = "Number of uses";
"usages_left" = "Uses left";
+"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 votes";
+
+"transfer_poins" = "Transfer votes";
+"transfer_poins_button" = "Transfer votes";
+"also_you_can_transfer_points" = "You can also transfer votes to another person.";
+
+"transferred_to_you" = "transferred to you";
+
+"receiver_address" = "Receiver address";
+"coins_count" = "Number of votes";
+"message" = "Message";
+
+"failed_to_tranfer_points" = "Failed to transfer votes";
+
+"points_transfer_successful" = "You have successfully transferred $1 to $3.";
+"not_all_information_has_been_entered" = "Not all information has been entered.";
+"negative_transfer_value" = "We cannot steal votes from another person, sorry.";
+"message_is_too_long" = "The message is too long.";
+"receiver_not_found" = "The receiver was not found.";
+"you_dont_have_enough_points" = "You don't have enough votes.";
+
/* Gifts */
"gift" = "Gift";
@@ -641,6 +668,7 @@
"created" = "Created";
"everyone_can_create_topics" = "Everyone can create topics";
+"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.";
@@ -724,6 +752,10 @@
"paginator_page" = "Page $1";
"paginator_next" = "Next";
+/* About */
+
+"about_openvk" = "About OpenVK";
+
/* Dialogs */
"ok" = "OK";
diff --git a/locales/eo.strings b/locales/eo.strings
index 8ae94810..14ac78cb 100644
--- a/locales/eo.strings
+++ b/locales/eo.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "eo.utf8";
/* Check for https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html */
diff --git a/locales/kk.strings b/locales/kk.strings
index 33fd406f..6bb9f5aa 100644
--- a/locales/kk.strings
+++ b/locales/kk.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "kk_KZ.UTF-8;Kaz";
/* Check for https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html */
diff --git a/locales/pl.strings b/locales/pl.strings
index 4c236bc1..1fe5fd0b 100644
--- a/locales/pl.strings
+++ b/locales/pl.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "pl_PL.utf8;pl_PL.UTF-8;Pol";
"__WinEncoding" = "Windows-1251";
diff --git a/locales/ru.strings b/locales/ru.strings
index 7a37653a..3e90c5c5 100644
--- a/locales/ru.strings
+++ b/locales/ru.strings
@@ -182,6 +182,8 @@
"open_post" = "Открыть запись";
"version_incompatibility" = "Не удалось отобразить это вложение. Возможно, база данных несовместима с текущей версией OpenVK.";
+"reply" = "Ответить";
+
/* Friends */
"friends" = "Друзья";
@@ -544,6 +546,33 @@
"usages_total" = "Количество использований";
"usages_left" = "Осталось использований";
+"points_transfer_dialog_header_1" = "Вы можете отправить в подарок или передать часть голосов другому человеку.";
+"points_transfer_dialog_header_2" = "Ваш текущий баланс:";
+
+"points_amount_one" = "1 голос";
+"points_amount_few" = "$1 голоса";
+"points_amount_many" = "$1 голосов";
+"points_amount_other" = "$1 голосов";
+
+"transfer_poins" = "Передача голосов";
+"transfer_poins_button" = "Передать голоса";
+"also_you_can_transfer_points" = "Также вы можете передать голоса другому человеку.";
+
+"transferred_to_you" = "передал вам";
+
+"receiver_address" = "Адрес получателя";
+"coins_count" = "Количество голосов";
+"message" = "Сообщение";
+
+"failed_to_tranfer_points" = "Не удалось передать голоса";
+
+"points_transfer_successful" = "Вы успешно передали $1 $3.";
+"not_all_information_has_been_entered" = "Введена не вся информация.";
+"negative_transfer_value" = "Мы не можем украсть голоса у другого человека, извините.";
+"message_is_too_long" = "Сообщение слишком длинное.";
+"receiver_not_found" = "Получатель не найден.";
+"you_dont_have_enough_points" = "У вас недостаточно голосов.";
+
/* Gifts */
"gift" = "Подарок";
@@ -674,6 +703,7 @@
"created" = "Создано";
"everyone_can_create_topics" = "Все могут создавать темы";
+"display_list_of_topics_above_wall" = "Отображать список тем над стеной";
"topic_changes_saved_comment" = "Обновлённый заголовок и настройки появятся на странице с темой.";
@@ -757,6 +787,10 @@
"paginator_page" = "Страница $1";
"paginator_next" = "Дальше";
+/* About */
+
+"about_openvk" = "Об OpenVK";
+
/* Dialogs */
"ok" = "ОК";
diff --git a/locales/ru_old.strings b/locales/ru_old.strings
index e4893ade..f4c0193c 100644
--- a/locales/ru_old.strings
+++ b/locales/ru_old.strings
@@ -1,6 +1,7 @@
+#include
+
"__locale" = "ru_UA.utf8;ru_RU.UTF-8;Rus";
"__WinEncoding" = "Windows-1251";
-"__fallback" = "ru";
/* Check for https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html */
diff --git a/locales/sr_cyr.strings b/locales/sr_cyr.strings
index a25ab905..55937634 100644
--- a/locales/sr_cyr.strings
+++ b/locales/sr_cyr.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "sr_CS.UTF-8;Srb";
/* Check for https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html */
diff --git a/locales/sr_lat.strings b/locales/sr_lat.strings
index c34cd3fb..4fd69b31 100644
--- a/locales/sr_lat.strings
+++ b/locales/sr_lat.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "sr_CS.UTF-8;Srb_Latin";
/* Check for https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html */
diff --git a/locales/tr.strings b/locales/tr.strings
index 35648294..1172c4da 100644
--- a/locales/tr.strings
+++ b/locales/tr.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "tr_TR.UTF-8;Tur";
/* Check for https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html */
diff --git a/locales/ua.strings b/locales/ua.strings
index fac74089..a5d45456 100644
--- a/locales/ua.strings
+++ b/locales/ua.strings
@@ -1,3 +1,5 @@
+#include
+
"__locale" = "uk_UA.utf8;Ukr";
"__WinEncoding" = "Windows-1251";
|