diff --git a/Web/Models/Entities/Club.php b/Web/Models/Entities/Club.php index 2230b1a0..0c91b11e 100644 --- a/Web/Models/Entities/Club.php +++ b/Web/Models/Entities/Club.php @@ -40,7 +40,7 @@ class Club extends RowModel function getAvatarUrl(): string { - $serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"]; + $serverUrl = ovk_scheme(true) . $_SERVER["HTTP_HOST"]; $avPhoto = $this->getAvatarPhoto(); return is_null($avPhoto) ? "$serverUrl/assets/packages/static/openvk/img/camera_200.png" : $avPhoto->getURL(); @@ -64,16 +64,6 @@ class Club extends RowModel else return "/club" . $this->getId(); } - /* - function getAvatarUrl(): string - { - $avAlbum = (new Albums)->getUserAvatarAlbum($this); - $avCount = $avAlbum->getPhotosCount(); - $avPhotos = $avAlbum->getPhotos($avCount, 1); - $avPhoto = iterator_to_array($avPhotos)[0] ?? NULL; - - return is_null($avPhoto) ? "/assets/packages/static/openvk/img/camera_200.png" : $avPhoto->getURL(); - } */ function getName(): string { diff --git a/Web/Models/Entities/User.php b/Web/Models/Entities/User.php index 84e48041..36077375 100644 --- a/Web/Models/Entities/User.php +++ b/Web/Models/Entities/User.php @@ -5,6 +5,7 @@ use openvk\Web\Util\DateTime; use openvk\Web\Models\RowModel; use openvk\Web\Models\Entities\{Photo, Message, Correspondence, Gift}; use openvk\Web\Models\Repositories\{Users, Clubs, Albums, Gifts, Notifications}; +use openvk\Web\Models\Exceptions\InvalidUserNameException; use Nette\Database\Table\ActiveRow; use Chandler\Database\DatabaseConnection; use Chandler\Security\User as ChandlerUser; @@ -103,7 +104,7 @@ class User extends RowModel function getAvatarUrl(): string { - $serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"]; + $serverUrl = ovk_scheme(true) . $_SERVER["HTTP_HOST"]; if($this->getRecord()->deleted) return "$serverUrl/assets/packages/static/openvk/img/camera_200.png"; @@ -739,6 +740,24 @@ class User extends RowModel return true; } + function setFirst_Name(string $firstName): void + { + $firstName = mb_convert_case($firstName, MB_CASE_TITLE); + if(!preg_match('%^\p{Lu}\p{Mn}?(?:\p{L&}\p{Mn}?){1,16}$%u', $firstName)) + throw new InvalidUserNameException; + + $this->stateChanges("first_name", $firstName); + } + + function setLast_Name(string $lastName): void + { + $lastName = mb_convert_case($lastName, MB_CASE_TITLE); + if(!preg_match('%^\p{Lu}\p{Mn}?(\p{L&}\p{Mn}?){1,16}(\-\g<1>+)?$%u', $lastName)) + throw new InvalidUserNameException; + + $this->stateChanges("last_name", $lastName); + } + function setNsfwTolerance(int $tolerance): void { $this->stateChanges("nsfw_tolerance", $tolerance); diff --git a/Web/Models/Exceptions/InvalidUserNameException.php b/Web/Models/Exceptions/InvalidUserNameException.php new file mode 100644 index 00000000..12a595a6 --- /dev/null +++ b/Web/Models/Exceptions/InvalidUserNameException.php @@ -0,0 +1,7 @@ +id/mq3.jpg"; + return "https://img.youtube.com/vi/$this->id/mqdefault.jpg"; } function getURL(): string diff --git a/Web/Presenters/UserPresenter.php b/Web/Presenters/UserPresenter.php index b05f7843..77c80301 100644 --- a/Web/Presenters/UserPresenter.php +++ b/Web/Presenters/UserPresenter.php @@ -9,6 +9,7 @@ use openvk\Web\Models\Repositories\Albums; use openvk\Web\Models\Repositories\Videos; use openvk\Web\Models\Repositories\Notes; use openvk\Web\Models\Repositories\Vouchers; +use openvk\Web\Models\Exceptions\InvalidUserNameException; use openvk\Web\Util\Validator; use openvk\Web\Models\Entities\Notifications\CoinsTransferNotification; use Chandler\Security\Authenticator; @@ -137,8 +138,13 @@ final class UserPresenter extends OpenVKPresenter $this->willExecuteWriteAction($_GET['act'] === "status"); if($_GET['act'] === "main" || $_GET['act'] == NULL) { - $user->setFirst_Name(empty($this->postParam("first_name")) ? $user->getFirstName() : $this->postParam("first_name")); - $user->setLast_Name(empty($this->postParam("last_name")) ? "" : $this->postParam("last_name")); + try { + $user->setFirst_Name(empty($this->postParam("first_name")) ? $user->getFirstName() : $this->postParam("first_name")); + $user->setLast_Name(empty($this->postParam("last_name")) ? "" : $this->postParam("last_name")); + } catch(InvalidUserNameException $ex) { + $this->flashFail("err", tr("error"), tr("invalid_real_name")); + } + $user->setPseudo(empty($this->postParam("pseudo")) ? NULL : $this->postParam("pseudo")); $user->setStatus(empty($this->postParam("status")) ? NULL : $this->postParam("status")); if (strtotime($this->postParam("birthday")) < time()) diff --git a/Web/Presenters/templates/@layout.xml b/Web/Presenters/templates/@layout.xml index 9d723096..e6697c9d 100644 --- a/Web/Presenters/templates/@layout.xml +++ b/Web/Presenters/templates/@layout.xml @@ -262,7 +262,7 @@ {_footer_privacy}

OpenVK {php echo OPENVK_VERSION} | PHP: {phpversion()} | DB: {$dbVersion}

-

+

{php echo OPENVK_ROOT_CONF["openvk"]["appearance"]["motd"]}

diff --git a/Web/Presenters/templates/@listView.xml b/Web/Presenters/templates/@listView.xml index 9b47d992..e6d02350 100644 --- a/Web/Presenters/templates/@listView.xml +++ b/Web/Presenters/templates/@listView.xml @@ -9,58 +9,62 @@ {ifset size} {include size, x => $dat} {/ifset} + + {ifset specpage} + {include specpage, x => $dat} + {else} +
+ {var data = is_array($iterator) ? $iterator : iterator_to_array($iterator)} -
- {var data = is_array($iterator) ? $iterator : iterator_to_array($iterator)} - - {if sizeof($data) > 0} -
- - - - - + + + + +
- - {include preview, x => $dat} - - - {ifset infoTable} - {include infoTable, x => $dat} - {else} + {if sizeof($data) > 0} +
+ + + + - - - -
- - {include name, x => $dat} - + {include preview, x => $dat} -
- {include description, x => $dat} - {/ifset} -
-
- {include "components/paginator.xml", conf => (object) [ - "page" => $page, - "count" => $count, - "amount" => sizeof($data), - "perPage" => $perPage ?? OPENVK_DEFAULT_PER_PAGE, - "atBottom" => true, - ]} - {else} - {ifset customErrorMessage} - {include customErrorMessage} +
+ {ifset infoTable} + {include infoTable, x => $dat} + {else} + + + {include name, x => $dat} + + +
+ {include description, x => $dat} + {/ifset} +
+
+ {include "components/paginator.xml", conf => (object) [ + "page" => $page, + "count" => $count, + "amount" => sizeof($data), + "perPage" => $perPage ?? OPENVK_DEFAULT_PER_PAGE, + "atBottom" => true, + ]} {else} - {include "components/nothing.xml"} - {/ifset} - {/if} -
+ {ifset customErrorMessage} + {include customErrorMessage} + {else} + {include "components/nothing.xml"} + {/ifset} + {/if} +
+ {/ifset} {ifset bottom} {include bottom} {/ifset} -{/block} +{/block} \ No newline at end of file diff --git a/Web/Presenters/templates/Notes/List.xml b/Web/Presenters/templates/Notes/List.xml index 44d831f5..2fb31c0c 100644 --- a/Web/Presenters/templates/Notes/List.xml +++ b/Web/Presenters/templates/Notes/List.xml @@ -5,12 +5,25 @@ {block title}{_notes}{/block} {block header} - {$owner->getCanonicalName()} - » - {_notes} - -
- {_create_note} + {if isset($thisUser) && $thisUser->getId() == $owner->getId()} + {_my_notes} + {else} + + {$owner->getCanonicalName()} + » + {_notes} + {/if} +{/block} + +{block size} +
+
+ {tr("notes_list", $count)} + +  |  + {_create_note} + +
{/block} @@ -20,18 +33,66 @@ {* BEGIN ELEMENTS DESCRIPTION *} -{block link|strip|stripHtml} - /note{$x->getPrettyId()} -{/block} +{block specpage} +
-{block preview} -
{_note}
-{/block} + {var data = is_array($iterator) ? $iterator : iterator_to_array($iterator)} + {if sizeof($data) > 0} -{block name} - {$x->getName()} -{/block} +
+
+ + + +
+ +
+ + {else} + {if isset($thisUser) && $thisUser->getId() == $owner->getId()} + +

{_welcome}

{_notes_start_screen}
+ + {else} + {ifset customErrorMessage} + {include ../customErrorMessage} + {else} + {include ../components/nothing.xml} + {/ifset} + {/if} + {/if} +
{/block} diff --git a/Web/Presenters/templates/User/Groups.xml b/Web/Presenters/templates/User/Groups.xml index 26c7b7e1..f1926d1e 100644 --- a/Web/Presenters/templates/User/Groups.xml +++ b/Web/Presenters/templates/User/Groups.xml @@ -51,6 +51,8 @@ Фотография группы {/block} +{block name}{/block} + {block infoTable} @@ -72,19 +74,19 @@ {block actions} {var clubPinned = $thisUser->isClubPinned($x)} - {if $x->canBeModifiedBy($thisUser ?? NULL) && ($clubPinned || $thisUser->getPinnedClubCount() <= 10)} + {if $x->canBeModifiedBy($thisUser ?? NULL)} {_check_community} - - - {if $clubPinned} - {_remove_from_left_menu} - {else} - {_add_to_left_menu} - {/if} - - + {if ($clubPinned || $thisUser->getPinnedClubCount() <= 10)} + + {if $clubPinned} + {_remove_from_left_menu} + {else} + {_add_to_left_menu} + {/if} + + {/if} diff --git a/Web/Presenters/templates/Videos/List.xml b/Web/Presenters/templates/Videos/List.xml index 0f04b482..be9e3cad 100644 --- a/Web/Presenters/templates/Videos/List.xml +++ b/Web/Presenters/templates/Videos/List.xml @@ -8,9 +8,17 @@ {block header} {$user->getCanonicalName()} » {_"videos"} - -
- {_"upload_video"} +{/block} + +{block size} +
+
+ {tr("videos", $count)} + +  |  + {_upload_video} + +
{/block} diff --git a/Web/static/css/style.css b/Web/static/css/style.css index cf40d339..b10bd125 100644 --- a/Web/static/css/style.css +++ b/Web/static/css/style.css @@ -1866,6 +1866,17 @@ body.scrolled .toTop:hover { padding-right: 5px; } +table td[width="120"] { + text-align: right; +} + +.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; @@ -1874,4 +1885,4 @@ body.scrolled .toTop:hover { .center { margin: 0 auto; -} +} \ No newline at end of file diff --git a/locales/en.strings b/locales/en.strings index 55b6ba28..b4a97cd3 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -323,6 +323,7 @@ "notes_zero" = "No notes"; "notes_one" = "$1 note"; "notes_other" = "$1 notes"; +"notes_start_screen" = "With notes, you can share your events with friends and see what's going on with them."; /* Menus */ @@ -750,6 +751,8 @@ "invalid_email_address" = "Invalid Email address"; "invalid_email_address_comment" = "The Email you entered is not correct."; +"invalid_real_name" = "Please, enter your real name. It'll be easier for your friends to find you like this."; + "invalid_birth_date" = "Invalid date of birth"; "invalid_birth_date_comment" = "The date of birth you entered is not correct."; diff --git a/locales/kk.strings b/locales/kk.strings index 4a985071..a90bbba4 100644 --- a/locales/kk.strings +++ b/locales/kk.strings @@ -9,6 +9,8 @@ "home" = "Басты бет"; "welcome" = "Қош келдіңіз!"; +"to_top" = "Жоғарыға"; + /* Login */ "log_in" = "Логин"; @@ -36,6 +38,13 @@ "password_reset_error" = "Құпиясөзді қалпына келтіру кезінде күтпеген қате орын алды."; "password_reset_rate_limit_error" = "Кешіріңіз, бірақ осы әрекетті сонай жиі жасай алмайсыз."; +"email_sent" = "Хат сәтті жіберілді."; +"email_sent_desc" = "Сіз енгізген электрондық пошта бар болса оған нұсқаулар келеді."; +"email_error" = "Электрондық хатты жіберу кезінде күтпеген қате орын алды."; +"email_rate_limit_error" = "Бұл әрекетті жиі жасай алмайсыз."; + +"email_verify_success" = "Электрондық поштаңыз расталды. Осы әлеуметтік желіде жақсы уақыт өткізуді тілейміз!"; + "registration_disabled_info" = "Жүйе әкімшісі тіркеуді өшірді. Мүмкіндігінше, егер досыңыз сайтта тіркелген болса одан шақыру сілтемесін сұраңыз."; "registration_closed" = "Тіркелу жабық"; "invites_you_to" = "$1 сізді $2 желіне шақырады."; @@ -216,6 +225,7 @@ "subscriptions" = "Жазылымдар"; "join_community" = "Топқа кіру"; "leave_community" = "Топтан шығу"; +"check_community" = "Топты қарау"; "min_6_community" = "Топтың аты тым болмаса 6 әріптен көп болу керек"; "participants" = "Қатысушылар"; "groups" = "Топтар"; @@ -232,6 +242,8 @@ "all_followers" = "Барлық жазылмандар"; "only_administrators" = "Тек әкімшілер"; "website" = "Сайт"; +"managed" = "Басқаратын"; +"size" = "Көлемі"; "administrators_one" = "$1 әкімші"; "administrators_other" = "$1 әкімші"; @@ -245,6 +257,7 @@ "hidden_yes" = "Жасырылған: Ия"; "hidden_no" = "Жасырылған: Жоқ"; "group_allow_post_for_everyone" = "Бәріне жазба жазуға рұқсат ету"; +"group_hide_from_global_feed" = "Жаһандық арнада жазбаларды көрсетпеу"; "statistics" = "Статистика"; "group_administrators_list" = "Әкімшілер тізімі"; "group_display_only_creator" = "Тек топты құрған кісіні көрсету"; @@ -263,10 +276,20 @@ "groups_one" = "$1 топ"; "groups_other" = "$1 топ"; +"groups_list_zero" = "Сіз ешқандай топқа қатыспайсыз."; +"groups_list_one" = "Сіз бір топқа қатысасыз"; +"groups_list_other" = "Сіз $1 топтардың қатысушысысыз"; + "meetings_zero" = "Кездесулер жоқ"; "meetings_one" = "$1 кездесу"; "meetings_other" = "$1 кездесу"; +"open_new_group" = "Жаңа топ ашу"; +"open_group_desc" = "Өзіңізге сай топ таба алмай жүрсіз бе? Өзіңіз ашып алыңыз!"; +"search_group" = "Топ іздеу"; +"search_by_groups" = "Топтардан іздеу"; +"search_group_desc" = "Мұнда сіз бар топтарға шолу жасай аласыз және қажеттіліктеріңізге сай топты таңдай аласыз..."; + /* Albums */ "create" = "Жасау"; @@ -294,10 +317,13 @@ "name_note" = "Тақырыбы"; "text_note" = "Мазмұны"; "create_note" = "Жолжазба жазу"; +"edit_note" = "Жолжазбаны өндеу"; "actions" = "Әрекеттер"; "feed" = "Жаңалықтар"; "publish_post" = "Жазба қосу"; +"edited" = "Өнделген"; + "notes_zero" = "Жолжазбалар жоқ"; "notes_one" = "$1 жолжазба"; "notes_other" = "$1 жолжазба"; @@ -337,6 +363,7 @@ "left_menu_donate" = "Қайырымдылық жасау"; +"footer_about_instance" = "инстанция туралы"; "footer_blog" = "блог"; "footer_help" = "көмек"; "footer_developers" = "әзірлеушілерге"; @@ -367,6 +394,8 @@ "cut" = "Кесілген"; "round_avatars" = "Дөңгелектелген"; +"apply_style_for_this_device" = "Стильді тек осы девайс үшін қосу"; + "search_for_groups" = "Топтар іздеу"; "search_for_people" = "Кісілер іздеу"; "search_button" = "Іздеу"; @@ -391,6 +420,7 @@ "ui_settings_rating_hide" = "Жасыру"; "additional_links" = "Қосымша сілтемелер"; +"ad_poster" = "Жарнама постері"; "two_factor_authentication" = "Екі факторлы аутентификация"; "two_factor_authentication_disabled" = "Бұзылудан сенімді қорғаныс қызметін қамтамасыз етеді: парақшаға кіру үшін 2FA қосымшасында алынған кодты енгізу керек."; @@ -637,6 +667,14 @@ "banned_2" = "Мұның себебі қарапайым: $1. Өкінішке орай, осы жолы сізді мәңгілікке блоктауға мәжбүр болдық."; "banned_3" = "Егер сізді қателесіп блоктады деп ойласаңыз, қолдау қызметіне жаза аласыз немесе жүйеден шыға аласыз."; +/* Registration confirm */ + +"ec_header" = "Тіркеуді растау"; +"ec_title" = "Рахмет!"; +"ec_1" = "$1, тіркелуіңіз аяқталуға жақын. Бірнеше минуттан кейін электрондық поштаңызға растау сілтемесі бар хат келуі керек."; +"ec_2" = "Егер қандай да бір себептермен хат келмесе, спам қалтасын тексеріңіз. Хатты ол жерден таппасаңыз, оны қайта жіберуге болады."; +"ec_resend" = "Қайта жіберу"; + /* Discussions */ "discussions" = "Талқылаулар"; @@ -718,7 +756,7 @@ "invalid_telegram_name" = "Telegram парақшаның аты қате"; "invalid_telegram_name_comment" = "Сіз енгізген Telegram-дағы парақшаның аты дұрыс емес."; -"token_manipulation_error" = "Токенді өңдеу қатесі"; +"token_manipulation_error" = "Токенді өндеу қатесі"; "token_manipulation_error_comment" = "Токен жарамсыз немесе мерзімі өтіп кеткен"; "profile_changed" = "Парақша өзгерілді"; @@ -758,6 +796,26 @@ "about_openvk" = "OpenVK туралы"; +"about_this_instance" = "Инстанция туралы"; +"rules" = "Ережелер"; +"most_popular_groups" = "Ең танымал топтар"; +"on_this_instance_are" = "Осы инстанцияда:"; + +"about_users_one" = "1 қолданушы"; +"about_users_other" = "$1 қолданушы"; + +"about_online_users_one" = "1 желідегі пайдаланушы"; +"about_online_users_other" = "$1 желідегі пайдаланушы"; + +"about_active_users_one" = "1 белсенді пайдаланушы"; +"about_active_users_other" = "$1 белсенді пайдаланушы"; + +"about_groups_one" = "1 топ"; +"about_groups_other" = "$1 топ"; + +"about_wall_posts_one" = "1 жазба"; +"about_wall_posts_other" = "$1 жазба"; + /* Dialogs */ "ok" = "ОК"; diff --git a/locales/ru.strings b/locales/ru.strings index 085d9fae..ce456b6c 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -332,9 +332,10 @@ "note" = "Заметка"; "name_note" = "Название"; "text_note" = "Содержание"; -"create_note" = "Создать заметку"; +"create_note" = "Добавить запись"; "edit_note" = "Редактировать заметку"; "actions" = "Действия"; +"notes_start_screen" = "С помощью заметок Вы можете делиться событиями из жизни с друзьями, а так же быть в курсе того, что происходит у них."; "edited" = "Отредактировано"; @@ -344,6 +345,12 @@ "notes_many" = "$1 заметок"; "notes_other" = "$1 заметок"; +"notes_list_zero" = "Не найдено ни одной заметки"; +"notes_list_one" = "Найдена одна заметка"; +"notes_list_few" = "Найдено $1 заметки"; +"notes_list_many" = "Найдено $1 заметок"; +"notes_list_other" = "Найдено $1 заметок"; + /* Menus */ "edit_button" = "ред."; @@ -510,7 +517,7 @@ "info_uploaded_by" = "Загрузил"; "info_upload_date" = "Дата загрузки"; -"videos_zero" = "Ни одной видеозаписи"; +"videos_zero" = "Нет видео"; "videos_one" = "Одна видеозапись"; "videos_few" = "$1 видеозаписи"; "videos_many" = "$1 видеозаписей"; @@ -785,6 +792,8 @@ "invalid_email_address" = "Неверный Email адрес"; "invalid_email_address_comment" = "Email, который вы ввели, не является корректным."; +"invalid_real_name" = "Пожалуйста, используйте реальные имена. Так вашим тульпам будет легче найти вас."; + "invalid_telegram_name" = "Неверное имя Telegram аккаунта"; "invalid_telegram_name_comment" = "Вы ввели неверное имя аккаунта Telegram.";