From 4b2a2769997e86b71847b22c685838f7003dbd09 Mon Sep 17 00:00:00 2001 From: MaksimMohooks Date: Thu, 30 Dec 2021 23:37:45 +0300 Subject: [PATCH 01/81] Soviet & Udm locales --- locales/su.strings | 814 ++++++++++++++++++++++++++++++++++++++++++++ locales/udm.strings | 813 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1627 insertions(+) create mode 100644 locales/su.strings create mode 100644 locales/udm.strings diff --git a/locales/su.strings b/locales/su.strings new file mode 100644 index 00000000..ed2b7b26 --- /dev/null +++ b/locales/su.strings @@ -0,0 +1,814 @@ +"__locale" = "su_SU.utf8;su_SU.UTF-8;Rus"; +"__WinEncoding" = "Windows-1251"; + +/* Check for https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html */ + +/* Main page */ + +"home" = "Главная"; +"welcome" = "Добро пожаловать"; + +/* Login */ + +"log_in" = "Вход"; +"password" = "Пароль"; +"registration" = "Регистрация"; +"forgot_password" = "Забыли пароль?"; + +"login_failed" = "Не удалось войти"; +"invalid_username_or_password" = "Неверное имя пользователя или пароль. Забыли пароль?"; + +"failed_to_register" = "Не удалось зарегистрироваться"; +"referral_link_invalid" = "Пригласительная ссылка недействительна."; +"registration_disabled" = "Регистрация отключена системным администратором."; +"user_already_exists" = "Пользователь с таким email уже существует."; + +"access_recovery" = "Восстановление доступа"; +"page_access_recovery" = "Восстановить доступ к странице"; +"access_recovery_info" = "Забыли пароль? Не волнуйтесь, введите ваши данные и мы отправим вам email с инструкциями по восстановлению аккаунта."; +"access_recovery_info_2" = "Введите ваш новый пароль. Все текущие сеансы будут приостановлены и токены доступа будут аннулированы."; +"reset_password" = "Сбросить пароль"; +"2fa_code_2" = "Код двухфакторной аутентификации"; + +"password_successfully_reset" = "Ваш пароль был успешно сброшен."; +"password_reset_email_sent" = "Если вы зарегистрированы, вы получите инструкции на email."; +"password_reset_error" = "Непредвиденная ошибка при сбросе пароля."; +"password_reset_rate_limit_error" = "Нельзя делать это так часто, извините."; + +"registration_disabled_info" = "Регистрация отключена системным администратором. При возможности попросите приглашение у вашего знакомого, если он зарегистрирован на этом сайте."; +"registration_closed" = "Регистрация закрыта."; +"invites_you_to" = "$1 приглашает вас в $2"; + +"register_meta_desc" = "Зарегистрируйтесь в $1 прямо сейчас!"; +"register_referer_meta_title" = "$1 приглашает вас в $2!"; +"register_referer_meta_desc" = "Присоединяйтесь к $1 и множеству других пользователей в $2!"; + +"users" = "Пользователи"; + +/* Profile information */ + +"select_language" = "Выбрать язык"; +"edit" = "Изменить"; +"birth_date" = "День рождения"; +"registration_date" = "Дата регистрации"; +"hometown" = "Родной город"; +"this_is_you" = "это Вы"; +"edit_page" = "Изменить информацию паспорта"; +"edit_group" = "Изменить информацию клуба"; +"change_status" = "изменить "; +"name" = "Имя"; +"surname" = "Фамилия"; +"gender" = "Пол"; +"male" = "мужской"; +"female" = "женский"; +"description" = "Описание"; +"save" = "Сохранить"; +"main_information" = "Основная информация"; +"nickname" = "Прозвище"; +"online" = "Онлайн"; +"was_online" = "заходил в орган"; +"was_online_m" = "заходил в орган"; +"was_online_f" = "заходила в орган"; +"all_title" = "Все"; +"information" = "Информация"; +"status" = "Статус"; +"no_information_provided" = "Информация отсутствует."; +"deceased_person" = "Страница покойного человека"; +"none" = "отсутствует"; +"send" = "Отправить"; + +"years_zero" = "0 лет"; +"years_one" = "1 год"; +"years_few" = "$1 года"; +"years_many" = "$1 лет"; +"years_other" = "$1 лет"; + +"relationship" = "Семейное положение"; + +"relationship_0" = "Не выбрано"; +"relationship_1" = "Не женат"; +"relationship_2" = "Встречаюсь"; +"relationship_3" = "Помолвлен"; +"relationship_4" = "Женат"; +"relationship_5" = "В гражданском браке"; +"relationship_6" = "Влюблен"; +"relationship_7" = "Всё сложно"; +"relationship_8" = "В активном поиске"; + +"politViews" = "Полит. взгляды"; + +"politViews_0" = "Не выбраны"; +"politViews_1" = "Индифферентные"; +"politViews_2" = "Коммунистические"; +"politViews_3" = "Социалистические"; +"politViews_4" = "Умеренные"; +"politViews_5" = "Либеральные"; +"politViews_6" = "Консервативные"; +"politViews_7" = "Монархические"; +"politViews_8" = "Ультраконсервативные"; +"politViews_9" = "Либертарианские"; + +"contact_information" = "Контактная информация"; + +"email" = "Почтовый ящик"; +"phone" = "Телефон"; +"telegram" = "Telegram"; +"personal_website" = "Личная визитка"; +"city" = "Город"; +"address" = "Адрес"; + +"personal_information" = "Личная информация"; + +"interests" = "Интересы"; +"favorite_music" = "Любимые аудиозаписи"; +"favorite_films" = "Любимые киноленты"; +"favorite_shows" = "Любимые программы"; +"favorite_books" = "Любимые книги"; +"favorite_quotes" = "Любимые цитаты"; +"information_about" = "О себе"; + +"updated_at" = "Обновлено $1"; + +"user_banned" = "Органу управления пришлось отправить $1 под стражу."; +"user_banned_comment" = "Комментарий милиции:"; + +/* Wall */ + +"feed" = "Новостная газета"; + +"post_writes_m" = "написал"; +"post_writes_f" = "написала"; +"post_writes_g" = "опубликовали"; +"wall" = "Доска"; +"post" = "Запись"; +"write" = "Написать"; +"publish" = "Опубликовать"; +"delete" = "Удалить"; +"comments" = "Отзывы"; +"share" = "Поделиться"; +"pin" = "Закрепить"; +"unpin" = "Открепить"; +"pinned" = "закреплено"; +"comments_tip" = "Гражданин, будьте первым, кто напишет отзыв!"; +"your_comment" = "Ваш отзыв"; +"shown" = "Показано"; +"x_out_of" = "$1 из"; +"wall_zero" = "нет записей"; +"wall_one" = "единственная запись"; +"wall_few" = "$1 записи"; +"wall_many" = "$1 записей"; +"wall_other" = "$1 записей"; +"publish_post" = "Добавить запись"; +"view_other_comments" = "Посмотреть остальные комментарии"; + +"no_comments" = "Отзывы отсутствуют"; + +"all_news" = "Все новостные газеты"; +"posts_per_page" = "Количество записей в паспорте"; + +"attachment" = "Вложение"; +"post_as_group" = "От имени клуба"; +"comment_as_group" = "От имени клуба"; +"add_signature" = "Подпись участника клуба"; +"contains_nsfw" = "Содержит запрещённый контент"; +"nsfw_warning" = "Товарищ, данная запись не прошла цензуру органом записи, мы не рекомендуем данную запись просматривать."; +"report" = "Пожаловаться"; +"attach" = "Прикрепить"; +"attach_photo" = "Прикрепить картинку"; +"attach_video" = "Прикрепить киноленту"; +"draw_graffiti" = "Нарисовать иллюстрацию"; +"no_posts_abstract" = "Товарищ, здесь пока никто ничего не оставил."; +"attach_no_longer_available" = "Этот материал больше не подлежит к просмотру."; +"open_post" = "Открыть запись"; +"version_incompatibility" = "Товарищ, органу управления не удалось достать из библиотеки данный материал. Возможно, он был порван или бибилотека не совместима с версией OpenVK"; + +"reply" = "Ответить"; + +/* Friends */ + +"friends" = "Товарищи"; +"followers" = "Подписчики"; +"follower" = "Подписчик"; +"friends_add" = "Добавить в друзья"; +"friends_delete" = "Удалить из друзей"; +"friends_reject" = "Отменить заявку"; +"friends_accept" = "Принять заявку"; +"send_message" = "Отправить сообщение"; +"incoming_req" = "Подписчики"; +"outcoming_req" = "Заявки"; +"req" = "Заявки"; + +"firends_zero" = "Ни одного друга"; +"friends_one" = "$1 друг"; +"friends_few" = "$1 друга"; +"friends_many" = "$1 друзей"; +"friends_other" = "$1 друзей"; + +"followers_zero" = "Ни одного подписчика"; +"followers_one" = "$1 подписчик"; +"followers_few" = "$1 подписчика"; +"followers_many" = "$1 подписчиков"; +"followers_other" = "$1 подписчиков"; + +"subscriptions_zero" = "Ни одной подписки"; +"subscriptions_one" = "$1 подписка"; +"subscriptions_few" = "$1 подписки"; +"subscriptions_many" = "$1 подписок"; +"subscriptions_other" = "$1 подписок"; + +/* Group */ + +"name_group" = "Название"; +"subscribe" = "Подписаться"; +"unsubscribe" = "Отписаться"; +"subscriptions" = "Подписки"; +"join_community" = "Вступить в группу"; +"leave_community" = "Выйти из группы"; +"min_6_community" = "Название должно быть не менее 6 символов"; +"participants" = "Участники"; +"groups" = "Группы"; +"meetings" = "Встречи"; +"create_group" = "Создать группу"; +"group_managers" = "Руководство"; +"group_type" = "Тип группы"; +"group_type_open" = "Это открытая группа. В неё может вступить любой желающий."; +"group_type_closed" = "Это закрытая группа. Для вступления необходимо подавать заявку."; +"creator" = "Создатель"; +"administrators" = "Администраторы"; +"add_to_left_menu" = "Добавить в левое меню"; +"remove_from_left_menu" = "Удалить из левого меню"; +"all_followers" = "Все подписчики"; +"only_administrators" = "Только администраторы"; +"website" = "Сайт"; +"managed" = "Управляемые"; + +"administrators_one" = "$1 администратор"; +"administrators_few" = "$1 администратора"; +"administrators_other" = "$1 администраторов"; + +"role" = "Роль"; +"administrator" = "Администратор"; +"promote_to_admin" = "Повысить до администратора"; +"promote_to_owner" = "Назначить владельцем"; +"devote" = "Разжаловать"; +"set_comment" = "Изменить комментарий"; +"hidden_yes" = "Скрыт: Да"; +"hidden_no" = "Скрыт: Нет"; +"group_allow_post_for_everyone" = "Разрешить публиковать записи всем"; +"statistics" = "Статистика"; +"group_administrators_list" = "Список админов"; +"group_display_only_creator" = "Отображать только создателя группы"; +"group_display_all_administrators" = "Отображать всех администраторов"; +"group_dont_display_administrators_list" = "Ничего не отображать"; + +"group_changeowner_modal_title" = "Передача прав владельца"; +"group_changeowner_modal_text" = "Внимание! Вы передаёте права владельца пользователю $1. Это действие необратимо. После передави вы останетесь адмиинстратором, но сможете легко перестать им быть."; +"group_owner_setted" = "Новый владелец ($1) успешно назначен в сообщество $2. Вам выданы права администратора в сообществе. Если Вы хотите вернуть роль владельца, обратитесь в техническую поддержку сайта."; + +"participants_zero" = "Ни одного участника"; +"participants_one" = "Один участник"; +"participants_few" = "$1 участника"; +"participants_many" = "$1 участников"; +"participants_other" = "$1 участников"; + +"groups_zero" = "Ни одной группы"; +"groups_one" = "Одна группа"; +"groups_few" = "$1 группы"; +"groups_many" = "$1 групп"; +"groups_other" = "$1 групп"; + +"meetings_zero" = "Ни одной встречи"; +"meetings_one" = "Одна встреча"; +"meetings_few" = "$1 встречи"; +"meetings_many" = "$1 встреч"; +"meetings_other" = "$1 встреч"; + +/* Albums */ + +"create" = "Создать"; +"albums" = "Альбомы"; +"create_album" = "Создать альбом"; +"edit_album" = "Редактировать альбом"; +"creating_album" = "Создание альбома"; +"upload_photo" = "Загрузить фотографию"; +"photo" = "Фотография"; +"upload_button" = "Загрузить"; + +"open_original" = "Открыть оригинал"; + +"avatar_album" = "Фотографии со страницы"; +"wall_album" = "Фотографии со стены"; + +"albums_zero" = "Ни одного альбома"; +"albums_one" = "Один альбом"; +"albums_few" = "$1 альбома"; +"albums_many" = "$1 альбомов"; +"albums_other" = "$1 альбомов"; + +/* Notes */ + +"notes" = "Заметки"; +"note" = "Заметка"; +"name_note" = "Название"; +"text_note" = "Содержание"; +"create_note" = "Создать заметку"; +"actions" = "Действия"; + +"notes_zero" = "Ни одной заметки"; +"notes_one" = "Одна заметка"; +"notes_few" = "$1 заметки"; +"notes_many" = "$1 заметок"; +"notes_other" = "$1 заметок"; + +/* Menus */ + +"edit_button" = "ред."; +"my_page" = "Мой Паспорт"; +"my_friends" = "Мои Товарищи"; +"my_photos" = "Мои Фотокартинки"; +"my_videos" = "Мои Киноленты"; +"my_messages" = "Мои Письма"; +"my_notes" = "Мои Черновики"; +"my_groups" = "Мои Клубы"; +"my_feed" = "Мои Газеты"; +"my_feedback" = "Мои Ответы"; +"my_settings" = "Мои Настройки"; +"bug_tracker" = "Доска задач"; + +"menu_login" = "Вход"; +"menu_registration" = "Регистрация"; +"menu_help" = "Помощь"; + +"menu_logout" = "Выйти"; +"menu_support" = "Поддержка"; + +"header_home" = "главная"; +"header_groups" = "клубы"; +"header_people" = "граждане"; +"header_invite" = "пригласить"; +"header_help" = "помощь"; +"header_log_out" = "выйти"; +"header_search" = "Поиск"; + +"header_login" = "вход"; +"header_registration" = "регистрация"; + +"left_menu_donate" = "Поддержать"; + +"footer_blog" = "доска новостей"; +"footer_help" = "помощь"; +"footer_developers" = "госслужащим"; +"footer_choose_language" = "выбрать язык"; +"footer_privacy" = "приватность"; + +/* Settings */ + +"main" = "Основное"; +"contacts" = "Контакты"; +"avatar" = Картинка"; +"privacy" = "Приватность"; +"interface" = "Внешний вид"; + +"profile_picture" = "Изображение страницы"; + +"picture" = "Изображение"; + +"change_password" = "Изменить кодовое слово"; +"old_password" = "Старое кодовое слово"; +"new_password" = "Новое кодовое слово"; +"repeat_password" = "Повторите кодовое слово"; + +"avatars_style" = "Отображение картинок"; +"style" = "Стиль"; + +"default" = "По умолчанию"; +"cut" = "Обрезка"; +"round_avatars" = "Круглая картинка"; + +"search_for_groups" = "Поиск клубов"; +"search_for_people" = "Поиск гражданинов"; +"search_button" = "Найти"; +"search_placeholder" = "Начните вводить любое имя, название или слово"; +"results_zero" = "Ни одного результата"; +"results_one" = "Один результат"; +"results_few" = "$1 результата"; +"results_many" = "$1 результатов"; +"results_other" = "$1 результатов"; + +"privacy_setting_access_page" = "Кому из граждан виден мой паспорт"; +"privacy_setting_read_info" = "Кому видно основную информацию моей страницы"; +"privacy_setting_see_groups" = "Кому разрешено просматривать мои картинки и встречи"; +"privacy_setting_see_photos" = "Кому разрешено просматривать мои картинки"; +"privacy_setting_see_videos" = "Кому разрешено смотреть мои киноленты"; +"privacy_setting_see_notes" = "Кому разрешено просматривать мои черновики"; +"privacy_setting_see_friends" = "Кому видно моих товарщией"; +"privacy_setting_add_to_friends" = "Кто может звать меня товарищем"; +"privacy_setting_write_wall" = "Кто может оставлять записи на доске"; +"privacy_setting_write_messages" = "Кто может отправлять мне телеграммы"; +"privacy_value_anybody" = "Все граждане"; +"privacy_value_anybody_dative" = "Всем гражданинам"; +"privacy_value_users" = "Участникам органа OpenVK"; +"privacy_value_friends" = "Товарищи"; +"privacy_value_friends_dative" = "Товарищам"; +"privacy_value_only_me" = "Только я"; +"privacy_value_only_me_dative" = "Только мне"; +"privacy_value_nobody" = "Никто"; + +"your_email_address" = "Адрес Вашего почтового ящика"; +"your_page_address" = "Адрес Вашего паспорта"; +"page_address" = "Адрес паспорта"; +"current_email_address" = "Текущий адрес"; +"page_id" = "Номер паспорта"; +"you_can_also" = "Вы также можете"; +"delete_your_page" = "порвать свой паспорт"; +"delete_album" = "выкинуть свой альбом с картинками"; + +"ui_settings_interface" = "Интерфейс"; +"ui_settings_sidebar" = "Левое меню"; +"ui_settings_rating" = "Рейтинг"; +"ui_settings_rating_show" = "Показывать"; +"ui_settings_rating_hide" = "Скрывать"; + +"additional_links" = "Дополнительные ссылки"; + +/* Two-factor authentication */ + +"two_factor_authentication" = "Двухфакторная аутентификация"; +"two_factor_authentication_disabled" = "Обеспечивает надежную защиту от взлома: для входа на страницу необходимо ввести код, полученный в приложении 2FA."; +"two_factor_authentication_enabled" = "Двухфакторная аутентификация включена. Ваша страница защищена."; +"two_factor_authentication_login" = "У вас включена двухфакторная аутентификация. Для входа введите код полученный в приложении."; + +"two_factor_authentication_settings_1" = "Двухфакторную аутентификацию через TOTP можно использовать даже без интернета. Для этого вам понадобится приложение для генерации кодов. Например, Google Authenticator для Android и iOS или свободные Aegis и andOTP для Android. Убедитесь, что на телефоне точно установлена дата и время."; +"two_factor_authentication_settings_2" = "Используя приложение для двухфакторной аутентификации, отсканируйте приведенный ниже QR-код:"; +"two_factor_authentication_settings_3" = "или вручную введите секретный ключ: $1."; +"two_factor_authentication_settings_4" = "Теперь введите код, который вам предоставило приложение, и пароль от вашей страницы, чтобы мы могли подтвердить, что вы действительно вы."; + +"connect" = "Подключить"; +"enable" = "Включить"; +"disable" = "Отключить"; +"code" = "Код"; +"2fa_code" = "Код 2FA"; + +"incorrect_password" = "Неверный пароль"; +"incorrect_code" = "Неверный код"; +"incorrect_2fa_code" = "Неверный код двухфакторной аутентификации"; +"two_factor_authentication_enabled_message" = "Двухфакторная аутентификация включена"; +"two_factor_authentication_enabled_message_description" = "Вашу страницу стало труднее взломать. Рекомендуем вам скачать резервные коды"; +"two_factor_authentication_disabled_message" = "Двухфакторная аутентификация отключена"; + +"view_backup_codes" = "Посмотреть резервные коды"; +"backup_codes" = "Резервные коды для подтверждения входа"; +"two_factor_authentication_backup_codes_1" = "Резервные коды позволяют подтверждать вход, когда у вас нет доступа к телефону, например, в путешествии."; +"two_factor_authentication_backup_codes_2" = "У вас есть ещё 10 кодов, каждым кодом можно воспользоваться только один раз. Распечатайте их, уберите в надежное место и используйте, когда потребуются коды для подтверждения входа."; +"two_factor_authentication_backup_codes_3" = "Вы можете получить новые коды, если они заканчиваются. Действительны только последние созданные резервные коды."; + +/* Sorting */ + +"sort_randomly" = "Сортировать случайно"; +"sort_up" = "Сортировать по дате создания вверх"; +"sort_down" = "Сортировать по дате создания вниз"; + +/* Videos */ + +"videos" = "Киноленты"; +"video" = "Кинолента"; +"upload_video" = "Отправить киноленту"; +"video_uploaded" = "Отправлено"; +"video_updated" = "Изменено"; +"video_link_to_yt" = "Номер на YouTube"; + +"info_name" = "Название"; +"info_description" = "Описание"; +"info_uploaded_by" = "Отправил"; +"info_upload_date" = "Дата отправки киноленты"; + +"videos_zero" = "Ни однойкиноленты"; +"videos_one" = "Одна кинолента"; +"videos_few" = "$1 киноленты"; +"videos_many" = "$1 кинолент"; +"videos_other" = "$1 кинолент"; + +/* Notifications */ + +"feedback" = "Ответы"; +"unread" = "Непрочитанное"; +"archive" = "Архив"; + +"notifications_like" = "$1 оценил вашу $2запись$3 от $4"; +"notifications_repost" = "$1 поделился(-лась) вашей $2записью$3 от $4"; +"notifications_comment_under" = "$1 оставил(-ла) комментарий под $2"; +"notifications_under_note" = "вашей $3заметкой$4"; +"notifications_under_photo" = "вашим $3фото$4"; +"notifications_under_post" = "вашей $3записью$4 от $5"; +"notifications_under_video" = "вашей $3кинолентой$4"; +"notifications_post" = "$1 написал(-ла) $2запись$3 на вашей стене: $4"; +"notifications_appoint" = "$1 назвачил вас руководителем сообщества $2"; + +"nt_liked_yours" = "понравился ваш"; +"nt_shared_yours" = "поделился(-ась) вашим"; +"nt_commented_yours" = "оставил(а) комментарий под"; +"nt_written_on_your_wall" = "написал(а) на вашей стене"; +"nt_made_you_admin" = "назначил(а) вас руководителем сообщества"; + +"nt_from" = "от"; +"nt_yours_adjective" = "вашим"; +"nt_yours_feminitive_adjective" = "вашей"; +"nt_post_nominative" = "пост"; +"nt_post_instrumental" = "постом"; +"nt_note_instrumental" = "заметкой"; +"nt_photo_instrumental" = "фотографией"; +"nt_topic_instrumental" = "темой"; + +/* Time */ + +"time_at_sp" = " в "; +"time_just_now" = "только что"; +"time_exactly_five_minutes_ago" = "ровно 5 минут назад"; +"time_minutes_ago" = "$1 минут назад"; +"time_today" = "сегодня"; +"time_yesterday" = "вчера"; + +"points" = "Голоса"; +"points_count" = "голосов"; +"on_your_account" = "на вашем счету"; + +"vouchers" = "Ваучеры"; +"have_voucher" = "Есть ваучер"; +"voucher_token" = "Код ваучера"; +"voucher_activators" = "Воспользовавшиеся"; +"voucher_explanation" = "Введите серийный номер ваучера. Обычно он указан в чеке или в сообщении."; +"voucher_explanation_ex" = "Обратите внимание, что ваучеры могут истекать и воспользоваться ими можно только один раз."; +"invalid_voucher" = "Ваучер недействительный"; +"voucher_bad" = "Возможно, вы ввели неверный серийный номер, уже использовали данный ваучер или же он просто истёк."; +"voucher_good" = "Ваучер активирован"; +"voucher_redeemed" = "Ваучер был успешно активирован. Вам будут начислены голоса, но этим кодом вы больше не сможете активировать его."; +"redeem" = "Активировать ваучер"; +"deactivate" = "Деактивировать"; +"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" = "Подарок"; +"gifts" = "Подарки"; +"gifts_zero" = "Нет подарков"; +"gifts_one" = "Один подарок"; +"gifts_few" = "$1 подарка"; +"gifts_many" = "$1 подарков"; +"gifts_other" = "$1 подарков"; +"gifts_left" = "Подарков осталось: $1"; +"gifts_left_one" = "Один подарок остался"; +"gifts_left_few" = "$1 подарка осталось"; +"gifts_left_many" = "$1 подарков осталось"; +"gifts_left_other" = "$1 подарков осталось"; + +"send_gift" = "Отправить подарок"; + +"gift_select" = "Выбрать подарок"; +"collections" = "Коллекции"; +"confirm" = "Подтверждение"; +"as_anonymous" = "Анонимно"; +"gift_your_message" = "Ваше сообщение"; + +"free_gift" = "Бесплатно"; +"coins" = "Голоса"; +"coins_zero" = "0 голосов"; +"coins_one" = "Один голос"; +"coins_few" = "$1 голоса"; +"coins_many" = "$1 голосов"; +"coins_other" = "$1 голосов"; + +"users_gifts" = "Подарки"; + +/* Support */ + +"support_opened" = "Открытые"; +"support_answered" = "С ответом"; +"support_closed" = "Закрытые"; +"support_ticket" = "Обращение"; +"support_tickets" = "Обращения"; +"support_status_0" = "Вопрос на рассмотрении"; +"support_status_1" = "Есть ответ"; +"support_status_2" = "Закрыто"; +"support_greeting_hi" = "Здравствуйте, $1!"; +"support_greeting_regards" = "С уважением,
команда поддержки $1."; + +"support_faq" = "Часто задаваемые вопросы"; +"support_list" = "Список обращений"; +"support_new" = "Новое обращение"; + +"support_faq_title" = "Для кого этот сайт?"; +"support_faq_content" = "Сайт предназначен для поиска друзей и знакомых, а также для просмотра данных пользователя. Это как справочник города, с помощью которого люди могут быстро найти актуальную информацию о человеке."; + +"support_new_title" = "Введите тему вашего обращения"; +"support_new_content" = "Опишите проблему или предложение"; + +"support_rate_good_answer" = "Это хороший ответ"; +"support_rate_bad_answer" = "Это плохой ответ"; +"support_good_answer_user" = "Вы оставили положительный отзыв."; +"support_bad_answer_user" = "Вы оставили негативный отзыв."; +"support_good_answer_agent" = "Пользователь оставил положительный отзыв"; +"support_bad_answer_agent" = "Пользователь оставил негативный отзыв"; +"support_rated_good" = "Вы оставили положительный отзыв об ответе."; +"support_rated_bad" = "Вы оставили негативный отзыв об ответе."; +"wrong_parameters" = "Неверные параметры запроса."; + +"fast_answers" = "Быстрые ответы"; + +"comment" = "Комментарий"; +"sender" = "Отправитель"; + +"author" = "Автор"; + +"you_have_not_entered_text" = "Вы не ввели текст"; +"you_have_not_entered_name_or_text" = "Вы не ввели имя или текст"; + +"ticket_changed" = "Тикет изменён"; +"ticket_changed_comment" = "Изменения вступят силу через несколько секунд."; + +/* Invite */ + +"invite" = "Позвать"; +"you_can_invite" = "Товарищ, вы можете позвать своих товарщией в орган с помощью индивидуального номера ссылки:"; +"you_can_invite_2" = "Приложите номер ссылки к вашей телеграмме. Гражданин вступит в орган и вы сразу станете товарищами."; + + +/* Banned */ + +"banned_title" = "Вам бан"; +"banned_header" = "Вы были отправлены в тюрьму"; +"banned_alt" = "Гражданин был отправлен в тюрьму."; +"banned_1" = "Извините, $1, но вы были отправлены в тюрьму."; +"banned_2" = "А причина этому проста: $1. Органу в этот раз пришлось отправить вас под стражу навсегда."; +"banned_3" = "Вы всё ещё можете написать в службу поддержки, если считаете что произошла ошибка или выйти."; + +/* Discussions */ + +"discussions" = "Обсуждения"; + +"messages_one" = "Одна телеграмма"; +"messages_few" = "$1 телеграмм"; +"messages_many" = "$1 телеграмм"; +"messages_other" = "$1 телеграмм"; + +"topic_messages_count_zero" = "В теме нет телеграмм"; +"topic_messages_count_one" = "В теме одна телеграмма"; +"topic_messages_count_few" = "В теме $1 телеграмм"; +"topic_messages_count_many" = "В теме $1 телеграмм"; +"topic_messages_count_other" = "В теме $1 телеграмм"; + +"replied" = "ответил"; +"create_topic" = "Создать тему"; + +"new_topic" = "Новая тема"; +"title" = "Заголовок"; +"text" = "Текст"; + +"view_topic" = "Просмотр темы"; +"edit_topic_action" = "Редактировать тему"; +"edit_topic" = "Редактирование темы"; +"topic_settings" = "Настройки темы"; +"pin_topic" = "Закрепить тему"; +"close_topic" = "Закрыть тему"; +"delete_topic" = "Удалить тему"; + +"topics_one" = "Одна тема"; +"topics_few" = "$1 темы"; +"topics_many" = "$1 тема"; +"topics_other" = "$1 тем"; + +"created" = "Создано"; + +"everyone_can_create_topics" = "Все могут создавать темы"; +"display_list_of_topics_above_wall" = "Отображать список тем над стеной"; + +"topic_changes_saved_comment" = "Обновлённый заголовок и настройки появятся на странице с темой."; + +"failed_to_create_topic" = "Не удалось создать тему"; +"failed_to_change_topic" = "Не удалось изменить тему"; +"no_title_specified" = "Заголовок не указан."; + +/* Errors */ + +"error_1" = "Некорректный запрос"; +"error_2" = "Неверный логин или пароль"; +"error_3" = "Не авторизован"; +"error_4" = "Пользователь не существует"; +"information_-1" = "Операция выполнена успешно"; +"information_-2" = "Вход выполнен успешно"; + +"no_data" = "Нет данных"; +"no_data_description" = "Товарищ, на этой доске нету записей."; + +"error" = "Ошибка"; +"error_shorturl" = "Данный короткий адрес уже занят."; +"error_segmentation" = "Ошибка сегментации"; +"error_upload_failed" = "Не удалось загрузить фото"; +"error_old_password" = "Старый пароль не совпадает"; +"error_new_password" = "Новые пароли не совпадает"; +"error_shorturl_incorrect" = "Короткий адрес имеет некорректный формат."; +"error_repost_fail" = "Не удалось поделиться записью"; + +"forbidden" = "Ошибка доступа"; +"forbidden_comment" = "Настройки приватности этого пользователя не разрешают вам смотреть на его страницу."; + +"changes_saved" = "Изменения сохранены"; +"changes_saved_comment" = "Новый данные появятся на вашей странице"; + +"photo_saved" = "Фотография сохранена"; +"photo_saved_comment" = "Новое изображние профиля появится у вас на странице"; + +"shared_succ" = "Запись появится на вашей стене. Нажмите на уведомление, чтобы перейти к своей стене."; + +"invalid_email_address" = "Неверный Email адрес"; +"invalid_email_address_comment" = "Email, который вы ввели, не является корректным."; + +"invalid_telegram_name" = "Неверное имя Telegram аккаунта"; +"invalid_telegram_name_comment" = "Вы ввели неверное имя аккаунта Telegram."; + +"invalid_birth_date" = "Неверная дата рождения"; +"invalid_birth_date_comment" = "Дата рождения, которую вы ввели, не является корректной."; + +"token_manipulation_error" = "Ошибка манипулирования токеном"; +"token_manipulation_error_comment" = "Токен недействителен или истёк"; + +"profile_changed" = "Профиль изменён"; +"profile_changed_comment" = "Ваш активный профиль был изменён."; +"profile_not_found" = "Пользователь не найден."; + +"suspicious_registration_attempt" = "Подозрительная попытка регистрации"; +"suspicious_registration_attempt_comment" = "Вы пытались зарегистрироваться из подозрительного места."; + +"rate_limit_error" = "Чумба, ты совсем ёбнутый?"; +"rate_limit_error_comment" = "Сходи к мозгоправу, попей колёсики. В $1 нельзя вбрасывать щитпосты так часто. Код исключения: $2."; + +"not_enough_permissions" = "Недостаточно прав"; +"not_enough_permissions_comment" = "У вас недостаточно прав чтобы выполнять это действие."; + +"login_required_error" = "Недостаточно прав"; +"login_required_error_comment" = "Чтобы просматривать эту страницу, нужно зайти на сайт."; + +"captcha_error" = "Неправильно введены символы"; +"captcha_error_comment" = "Пожалуйста, убедитесь, что вы правильно заполнили поле с капчей."; + +/* Admin actions */ + +"login_as" = "Войти как $1"; +"manage_user_action" = "Управление пользователем"; +"manage_group_action" = "Управление группой"; +"ban_user_action" = "Заблокировать пользователя"; +"warn_user_action" = "Предупредить пользователя"; + +/* Paginator (deprecated) */ + +"paginator_back" = "Назад"; +"paginator_page" = "Страница $1"; +"paginator_next" = "Дальше"; + +/* About */ + +"about_openvk" = "Об органе OpenVK"; + +/* Dialogs */ + +"ok" = "ОК"; +"yes" = "Да"; +"no" = "Нет"; +"cancel" = "Отмена"; +"edit_action" = "Изменить"; +"transfer" = "Передать"; +"close" = "Закрыть"; + +"warning" = "Внимание"; +"question_confirm" = "Товарищ, будьте внимательны с выбором. Вы согласны с вашим выбором? Отменить не представляется возможным."; + +/* User alerts */ + +"user_alert_scam" = "Органу управления было дозволено, что данный гражданин обманывает товарищей на денежные средства. Будьте осторожны при разговоре с ним."; diff --git a/locales/udm.strings b/locales/udm.strings new file mode 100644 index 00000000..09a09bd4 --- /dev/null +++ b/locales/udm.strings @@ -0,0 +1,813 @@ +"__locale" = "ru_UDM.utf8;ru_UDM.UTF-8;Udm"; +"__WinEncoding" = "Windows-1251"; + +/* + +/* Main page */ + +"home" = "Валтӥсь"; +"welcome" = "Гажаса ӧтиськом"; + +/* Login */ + +"log_in" = "Пырон"; +"password" = "Пароль"; +"registration" = "Регистрация"; +"forgot_password" = "Вунэтоно пароль?"; + +"login_failed" = "Пырыса ӧз удалты"; +"invalid_username_or_password" = "Пользователь пароль ним яке мыдлань. Забыли пароль?"; + +"failed_to_register" = "Не удалось зарегистрироваться"; +"referral_link_invalid" = "Недействительный ссылка ӧтён."; +"registration_disabled" = "Регистрация радлы отключена администратором."; +"user_already_exists" = "Пользователь email сыӵе ини ӵош улӥськом."; + +"access_recovery" = "Восстановление доступа"; +"page_access_recovery" = "Восстановя доступ к странице"; +"access_recovery_info" = "Забыли пароль? Бугыръяське, тонэн ӵош тон мыным но келялозы валэктон восстановление email to юри сямен пырозы."; +"access_recovery_info_2" = "Введите выль пароль. Все текущие сеансы будут приостановлены и токены доступа будут аннулированы."; +"reset_password" = "Сбросить пароль"; +"2fa_code_2" = "Код двухфакторной аутентификации"; + +"password_successfully_reset" = "Ваш пароль был успешно сброшен."; +"password_reset_email_sent" = "Если вы зарегистрированы, вы получите инструкции на email."; +"password_reset_error" = "Непредвиденная ошибка при сбросе пароля."; +"password_reset_rate_limit_error" = "Нельзя делать это так часто, извините."; + +"registration_disabled_info" = "Регистрация отключена системным администратором. При возможности попросите приглашение у вашего знакомого, если он зарегистрирован на этом сайте."; +"registration_closed" = "Регистрация закрыта."; +"invites_you_to" = "$1 приглашает вас в $2"; + +"register_meta_desc" = "Зарегистрируйтесь в $1 прямо сейчас!"; +"register_referer_meta_title" = "$1 приглашает вас в $2!"; +"register_referer_meta_desc" = "Присоединяйтесь к $1 и множеству других пользователей в $2!"; + +"users" = "Пользователи"; + +/* Profile information */ + +"select_language" = "Быръе кыл"; +"edit" = "Воштыны"; +"birth_date" = "Вордӥськем нунал"; +"registration_date" = "Дата регистрации"; +"hometown" = "Вордскем город"; +"this_is_you" = "та Тон"; +"edit_page" = "Редактировать страницу"; +"edit_group" = "Редактировать группу"; +"change_status" = "воштыны инлыкез"; +"name" = "Нимыз"; +"surname" = "Фамилиосты"; +"gender" = "Выж"; +"male" = "пиосмурт"; +"female" = "нылкышно"; +"description" = "Описание"; +"save" = "Утьыны"; +"main_information" = "Основная ивортодэт"; +"nickname" = "Никнейм"; +"online" = "Вотэсын"; +"was_online" = "был вотэсын"; +"was_online_m" = "был вотэсын"; +"was_online_f" = "была вотэсын"; +"all_title" = "Все"; +"information" = "Ивортодэт"; +"status" = "Статус"; +"no_information_provided" = "Ивортодэт отсутствует."; +"deceased_person" = "Бам кышка адями"; +"none" = "отсутствует"; +"send" = "Ыстыны"; + +"years_zero" = "0 ар"; +"years_one" = "1 ар"; +"years_few" = "$1 ар"; +"years_many" = "$1 ар"; +"years_other" = "$1 ар"; + +"relationship" = "Семейное положение"; + +"relationship_0" = "Ӧз быръе"; +"relationship_1" = "Кышнояськыны уг"; +"relationship_2" = "Пумиськизы"; +"relationship_3" = "Помолвлен"; +"relationship_4" = "Кышнояськи"; +"relationship_5" = "Гражданской брак-ын"; +"relationship_6" = "Ог-огзэс яратыса"; +"relationship_7" = "Сложной вань"; +"relationship_8" = "В активном поиске"; + +"politViews" = "Политической учке"; + +"politViews_0" = "Ӧз быръе"; +"politViews_1" = "Индифферентные"; +"politViews_2" = "Коммунистические"; +"politViews_3" = "Социалистические"; +"politViews_4" = "Зӥбломыт"; +"politViews_5" = "Либеральные"; +"politViews_6" = "Консервативные"; +"politViews_7" = "Монархические"; +"politViews_8" = "Ультраконсервативные"; +"politViews_9" = "Либертарианские"; + +"contact_information" = "Тодэтъёс"; + +"email" = "Электронная почта"; +"phone" = "Телефон"; +"telegram" = "Telegram"; +"personal_website" = "Личной сайт"; +"city" = "Город"; +"address" = "Адресъёсын"; + +"personal_information" = "Личной информация"; + +"interests" = "Тунсыкъёссэс"; +"favorite_music" = "Яратоно крезьгурез"; +"favorite_films" = "Яратоно фильмы"; +"favorite_shows" = "Яратоно ТВ-шоу"; +"favorite_books" = "Яратоно книги"; +"favorite_quotes" = "Яратоно цитаты"; +"information_about" = "Ачим сярысь"; + +"updated_at" = "Обновлено $1"; + +"user_banned" = "Жаляса верано луэ, мон луэ заблокировать пользователя $1."; +"user_banned_comment" = "Комментарий модератора:"; + +/* Wall */ + +"feed" = "Иворъёс"; + +"post_writes_m" = "гожтыны"; +"post_writes_f" = "гожтыны"; +"post_writes_g" = "опубликовало"; +"wall" = "Борддор"; +"post" = "Запись"; +"write" = "Гожтыны"; +"publish" = "Опубликовать"; +"delete" = "Палэнтыны"; +"comments" = "Комментарии"; +"share" = "Поделиться"; +"pin" = "Вери"; +"unpin" = "Открепить"; +"pinned" = "вери"; +"comments_tip" = "Лу нырысетӥ, кин кельтыны комментарий!"; +"your_comment" = "Тон комментарий"; +"shown" = "Возьмалэ"; +"x_out_of" = "$1 из"; +"wall_zero" = "записей ӧвӧл"; +"wall_one" = "одӥг запись"; +"wall_few" = "$1 записи"; +"wall_many" = "$1 записей"; +"wall_other" = "$1 записей"; +"publish_post" = "Ватсан записи"; +"view_other_comments" = "Учке мукет комментарий"; + +"no_comments" = "Комментариев ӧвӧл"; + +"all_news" = "Вань иворъёс"; +"posts_per_page" = "Количество записей на странице"; + +"attachment" = "Вложение"; +"post_as_group" = "От имени сообщества"; +"comment_as_group" = "От имени сообщества"; +"add_signature" = "Подпись автора"; +"contains_nsfw" = "Содержит NSFW-контент"; +"nsfw_warning" = "Данный пост может содержать 18+ контент"; +"report" = "Пожаловаться"; +"attach" = "Прикрепить"; +"attach_photo" = "Прикрепить фото"; +"attach_video" = "Прикрепить видео"; +"draw_graffiti" = "Нарисовать граффити"; +"no_posts_abstract" = "Здесь никто ничего не написал... Пока."; +"attach_no_longer_available" = "Это вложение больше недоступно."; +"open_post" = "Открыть запись"; +"version_incompatibility" = "Не удалось отобразить это вложение. Возможно, база данных несовместима с текущей версией OpenVK."; + +"reply" = "Ответить"; + +/* Friends */ + +"friends" = "Друзья"; +"followers" = "Подписчики"; +"follower" = "Подписчик"; +"friends_add" = "Добавить в друзья"; +"friends_delete" = "Удалить из друзей"; +"friends_reject" = "Отменить заявку"; +"friends_accept" = "Принять заявку"; +"send_message" = "Отправить сообщение"; +"incoming_req" = "Подписчики"; +"outcoming_req" = "Заявки"; +"req" = "Заявки"; + +"firends_zero" = "Ни одного друга"; +"friends_one" = "$1 друг"; +"friends_few" = "$1 друга"; +"friends_many" = "$1 друзей"; +"friends_other" = "$1 друзей"; + +"followers_zero" = "Ни одного подписчика"; +"followers_one" = "$1 подписчик"; +"followers_few" = "$1 подписчика"; +"followers_many" = "$1 подписчиков"; +"followers_other" = "$1 подписчиков"; + +"subscriptions_zero" = "Ни одной подписки"; +"subscriptions_one" = "$1 подписка"; +"subscriptions_few" = "$1 подписки"; +"subscriptions_many" = "$1 подписок"; +"subscriptions_other" = "$1 подписок"; + +/* Group */ + +"name_group" = "Название"; +"subscribe" = "Подписаться"; +"unsubscribe" = "Отписаться"; +"subscriptions" = "Подписки"; +"join_community" = "Вступить в группу"; +"leave_community" = "Выйти из группы"; +"min_6_community" = "Название должно быть не менее 6 символов"; +"participants" = "Участники"; +"groups" = "Группы"; +"meetings" = "Встречи"; +"create_group" = "Создать группу"; +"group_managers" = "Руководство"; +"group_type" = "Тип группы"; +"group_type_open" = "Это открытая группа. В неё может вступить любой желающий."; +"group_type_closed" = "Это закрытая группа. Для вступления необходимо подавать заявку."; +"creator" = "Создатель"; +"administrators" = "Администраторы"; +"add_to_left_menu" = "Добавить в левое меню"; +"remove_from_left_menu" = "Удалить из левого меню"; +"all_followers" = "Все подписчики"; +"only_administrators" = "Только администраторы"; +"website" = "Сайт"; +"managed" = "Управляемые"; + +"administrators_one" = "$1 администратор"; +"administrators_few" = "$1 администратора"; +"administrators_other" = "$1 администраторов"; + +"role" = "Роль"; +"administrator" = "Администратор"; +"promote_to_admin" = "Повысить до администратора"; +"promote_to_owner" = "Назначить владельцем"; +"devote" = "Разжаловать"; +"set_comment" = "Изменить комментарий"; +"hidden_yes" = "Скрыт: Да"; +"hidden_no" = "Скрыт: Нет"; +"group_allow_post_for_everyone" = "Разрешить публиковать записи всем"; +"statistics" = "Статистика"; +"group_administrators_list" = "Список админов"; +"group_display_only_creator" = "Отображать только создателя группы"; +"group_display_all_administrators" = "Отображать всех администраторов"; +"group_dont_display_administrators_list" = "Ничего не отображать"; + +"group_changeowner_modal_title" = "Передача прав владельца"; +"group_changeowner_modal_text" = "Внимание! Вы передаёте права владельца пользователю $1. Это действие необратимо. После передави вы останетесь адмиинстратором, но сможете легко перестать им быть."; +"group_owner_setted" = "Новый владелец ($1) успешно назначен в сообщество $2. Вам выданы права администратора в сообществе. Если Вы хотите вернуть роль владельца, обратитесь в техническую поддержку сайта."; + +"participants_zero" = "Ни одного участника"; +"participants_one" = "Один участник"; +"participants_few" = "$1 участника"; +"participants_many" = "$1 участников"; +"participants_other" = "$1 участников"; + +"groups_zero" = "Ни одной группы"; +"groups_one" = "Одна группа"; +"groups_few" = "$1 группы"; +"groups_many" = "$1 групп"; +"groups_other" = "$1 групп"; + +"meetings_zero" = "Ни одной встречи"; +"meetings_one" = "Одна встреча"; +"meetings_few" = "$1 встречи"; +"meetings_many" = "$1 встреч"; +"meetings_other" = "$1 встреч"; + +/* Albums */ + +"create" = "Создать"; +"albums" = "Альбомы"; +"create_album" = "Создать альбом"; +"edit_album" = "Редактировать альбом"; +"creating_album" = "Создание альбома"; +"upload_photo" = "Загрузить фотографию"; +"photo" = "Фотография"; +"upload_button" = "Загрузить"; + +"open_original" = "Открыть оригинал"; + +"avatar_album" = "Фотографии со страницы"; +"wall_album" = "Фотографии со стены"; + +"albums_zero" = "Ни одного альбома"; +"albums_one" = "Один альбом"; +"albums_few" = "$1 альбома"; +"albums_many" = "$1 альбомов"; +"albums_other" = "$1 альбомов"; + +/* Notes */ + +"notes" = "Заметки"; +"note" = "Заметка"; +"name_note" = "Название"; +"text_note" = "Содержание"; +"create_note" = "Создать заметку"; +"actions" = "Действия"; + +"notes_zero" = "Ни одной заметки"; +"notes_one" = "Одна заметка"; +"notes_few" = "$1 заметки"; +"notes_many" = "$1 заметок"; +"notes_other" = "$1 заметок"; + +/* Menus */ + +"edit_button" = "ред."; +"my_page" = "Мынам Бам"; +"my_friends" = "Мынам Эшъёсы"; +"my_photos" = "Мынам Туспуктэм"; +"my_videos" = "Мынам Видеозаписи"; +"my_messages" = "Мынам Сообщения"; +"my_notes" = "Мынам Заметки"; +"my_groups" = "Мынам Группы"; +"my_feed" = "Мынам Новости"; +"my_feedback" = "Мынам Ответы"; +"my_settings" = "Мынам Настройки"; +"bug_tracker" = "Баг-трекер"; + +"menu_login" = "Пырон"; +"menu_registration" = "Регистрация"; +"menu_help" = "Юрттэт"; + +"menu_logout" = "Потӥз"; +"menu_support" = "Юрттэт"; + +"header_home" = "кутскон"; +"header_groups" = "группы"; +"header_people" = "адями"; +"header_invite" = "ӧтем"; +"header_help" = "юрттэт"; +"header_log_out" = "потӥз"; +"header_search" = "Утчан"; + +"header_login" = "пырон"; +"header_registration" = "регистрация"; + +"left_menu_donate" = "юрттоз"; + +"footer_blog" = "блог"; +"footer_help" = "помощь"; +"footer_developers" = "разработчикам"; +"footer_choose_language" = "выбрать язык"; +"footer_privacy" = "приватность"; + +/* Settings */ + +"main" = "Основное"; +"contacts" = "Контакты"; +"avatar" = "Аватар"; +"privacy" = "Приватность"; +"interface" = "Внешний вид"; + +"profile_picture" = "Изображение страницы"; + +"picture" = "Изображение"; + +"change_password" = "Изменить пароль"; +"old_password" = "Старый пароль"; +"new_password" = "Новый пароль"; +"repeat_password" = "Повторите пароль"; + +"avatars_style" = "Отображение аватар"; +"style" = "Стиль"; + +"default" = "По умолчанию"; +"cut" = "Обрезка"; +"round_avatars" = "Круглый аватар"; + +"search_for_groups" = "Поиск групп"; +"search_for_people" = "Поиск людей"; +"search_button" = "Найти"; +"search_placeholder" = "Начните вводить любое имя, название или слово"; +"results_zero" = "Ни одного результата"; +"results_one" = "Один результат"; +"results_few" = "$1 результата"; +"results_many" = "$1 результатов"; +"results_other" = "$1 результатов"; + +"privacy_setting_access_page" = "Кому в интернете видно мою страницу"; +"privacy_setting_read_info" = "Кому видно основную информацию моей страницы"; +"privacy_setting_see_groups" = "Кому видно мои группы и встречи"; +"privacy_setting_see_photos" = "Кому видно мои фотографии"; +"privacy_setting_see_videos" = "Кому видно мои видеозаписи"; +"privacy_setting_see_notes" = "Кому видно мои заметки"; +"privacy_setting_see_friends" = "Кому видно моих друзей"; +"privacy_setting_add_to_friends" = "Кто может называть меня другом"; +"privacy_setting_write_wall" = "Кто может писать у меня на стене"; +"privacy_setting_write_messages" = "Кто может писать мне сообщения"; +"privacy_value_anybody" = "Все желающие"; +"privacy_value_anybody_dative" = "Всем желающим"; +"privacy_value_users" = "Пользователям OpenVK"; +"privacy_value_friends" = "Друзья"; +"privacy_value_friends_dative" = "Друзьям"; +"privacy_value_only_me" = "Только я"; +"privacy_value_only_me_dative" = "Только мне"; +"privacy_value_nobody" = "Никто"; + +"your_email_address" = "Адрес Вашей электронной почты"; +"your_page_address" = "Адрес Вашей страницы"; +"page_address" = "Адрес страницы"; +"current_email_address" = "Текущий адрес"; +"page_id" = "ID страницы"; +"you_can_also" = "Вы также можете"; +"delete_your_page" = "удалить свою страницу"; +"delete_album" = "удалить альбом"; + +"ui_settings_interface" = "Интерфейс"; +"ui_settings_sidebar" = "Левое меню"; +"ui_settings_rating" = "Рейтинг"; +"ui_settings_rating_show" = "Показывать"; +"ui_settings_rating_hide" = "Скрывать"; + +"additional_links" = "Дополнительные ссылки"; + +/* Two-factor authentication */ + +"two_factor_authentication" = "Двухфакторная аутентификация"; +"two_factor_authentication_disabled" = "Обеспечивает надежную защиту от взлома: для входа на страницу необходимо ввести код, полученный в приложении 2FA."; +"two_factor_authentication_enabled" = "Двухфакторная аутентификация включена. Ваша страница защищена."; +"two_factor_authentication_login" = "У вас включена двухфакторная аутентификация. Для входа введите код полученный в приложении."; + +"two_factor_authentication_settings_1" = "Двухфакторную аутентификацию через TOTP можно использовать даже без интернета. Для этого вам понадобится приложение для генерации кодов. Например, Google Authenticator для Android и iOS или свободные Aegis и andOTP для Android. Убедитесь, что на телефоне точно установлена дата и время."; +"two_factor_authentication_settings_2" = "Используя приложение для двухфакторной аутентификации, отсканируйте приведенный ниже QR-код:"; +"two_factor_authentication_settings_3" = "или вручную введите секретный ключ: $1."; +"two_factor_authentication_settings_4" = "Теперь введите код, который вам предоставило приложение, и пароль от вашей страницы, чтобы мы могли подтвердить, что вы действительно вы."; + +"connect" = "Подключить"; +"enable" = "Включить"; +"disable" = "Отключить"; +"code" = "Код"; +"2fa_code" = "Код 2FA"; + +"incorrect_password" = "Неверный пароль"; +"incorrect_code" = "Неверный код"; +"incorrect_2fa_code" = "Неверный код двухфакторной аутентификации"; +"two_factor_authentication_enabled_message" = "Двухфакторная аутентификация включена"; +"two_factor_authentication_enabled_message_description" = "Вашу страницу стало труднее взломать. Рекомендуем вам скачать резервные коды"; +"two_factor_authentication_disabled_message" = "Двухфакторная аутентификация отключена"; + +"view_backup_codes" = "Посмотреть резервные коды"; +"backup_codes" = "Резервные коды для подтверждения входа"; +"two_factor_authentication_backup_codes_1" = "Резервные коды позволяют подтверждать вход, когда у вас нет доступа к телефону, например, в путешествии."; +"two_factor_authentication_backup_codes_2" = "У вас есть ещё 10 кодов, каждым кодом можно воспользоваться только один раз. Распечатайте их, уберите в надежное место и используйте, когда потребуются коды для подтверждения входа."; +"two_factor_authentication_backup_codes_3" = "Вы можете получить новые коды, если они заканчиваются. Действительны только последние созданные резервные коды."; + +/* Sorting */ + +"sort_randomly" = "Сортировать случайно"; +"sort_up" = "Сортировать по дате создания вверх"; +"sort_down" = "Сортировать по дате создания вниз"; + +/* Videos */ + +"videos" = "Видеозаписи"; +"video" = "Видеозапись"; +"upload_video" = "Загрузить видео"; +"video_uploaded" = "Загружено"; +"video_updated" = "Обновлено"; +"video_link_to_yt" = "Ссылка на YouTube"; + +"info_name" = "Название"; +"info_description" = "Описание"; +"info_uploaded_by" = "Загрузил"; +"info_upload_date" = "Дата загрузки"; + +"videos_zero" = "Ни одной видеозаписи"; +"videos_one" = "Одна видеозапись"; +"videos_few" = "$1 видеозаписи"; +"videos_many" = "$1 видеозаписей"; +"videos_other" = "$1 видеозаписей"; + +/* Notifications */ + +"feedback" = "Ответы"; +"unread" = "Непрочитанное"; +"archive" = "Архив"; + +"notifications_like" = "$1 оценил вашу $2запись$3 от $4"; +"notifications_repost" = "$1 поделился(-лась) вашей $2записью$3 от $4"; +"notifications_comment_under" = "$1 оставил(-ла) комментарий под $2"; +"notifications_under_note" = "вашей $3заметкой$4"; +"notifications_under_photo" = "вашим $3фото$4"; +"notifications_under_post" = "вашей $3записью$4 от $5"; +"notifications_under_video" = "вашим $3видео$4"; +"notifications_post" = "$1 написал(-ла) $2запись$3 на вашей стене: $4"; +"notifications_appoint" = "$1 назвачил вас руководителем сообщества $2"; + +"nt_liked_yours" = "понравился ваш"; +"nt_shared_yours" = "поделился(-ась) вашим"; +"nt_commented_yours" = "оставил(а) комментарий под"; +"nt_written_on_your_wall" = "написал(а) на вашей стене"; +"nt_made_you_admin" = "назначил(а) вас руководителем сообщества"; + +"nt_from" = "от"; +"nt_yours_adjective" = "вашим"; +"nt_yours_feminitive_adjective" = "вашей"; +"nt_post_nominative" = "пост"; +"nt_post_instrumental" = "постом"; +"nt_note_instrumental" = "заметкой"; +"nt_photo_instrumental" = "фотографией"; +"nt_topic_instrumental" = "темой"; + +/* Time */ + +"time_at_sp" = " в "; +"time_just_now" = "только что"; +"time_exactly_five_minutes_ago" = "ровно 5 минут назад"; +"time_minutes_ago" = "$1 минут назад"; +"time_today" = "сегодня"; +"time_yesterday" = "вчера"; + +"points" = "Голоса"; +"points_count" = "голосов"; +"on_your_account" = "на вашем счету"; + +"vouchers" = "Ваучеры"; +"have_voucher" = "Есть ваучер"; +"voucher_token" = "Код ваучера"; +"voucher_activators" = "Воспользовавшиеся"; +"voucher_explanation" = "Введите серийный номер ваучера. Обычно он указан в чеке или в сообщении."; +"voucher_explanation_ex" = "Обратите внимание, что ваучеры могут истекать и воспользоваться ими можно только один раз."; +"invalid_voucher" = "Ваучер недействительный"; +"voucher_bad" = "Возможно, вы ввели неверный серийный номер, уже использовали данный ваучер или же он просто истёк."; +"voucher_good" = "Ваучер активирован"; +"voucher_redeemed" = "Ваучер был успешно активирован. Вам будут начислены голоса, но этим кодом вы больше не сможете активировать его."; +"redeem" = "Активировать ваучер"; +"deactivate" = "Деактивировать"; +"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" = "Подарок"; +"gifts" = "Подарки"; +"gifts_zero" = "Нет подарков"; +"gifts_one" = "Один подарок"; +"gifts_few" = "$1 подарка"; +"gifts_many" = "$1 подарков"; +"gifts_other" = "$1 подарков"; +"gifts_left" = "Подарков осталось: $1"; +"gifts_left_one" = "Один подарок остался"; +"gifts_left_few" = "$1 подарка осталось"; +"gifts_left_many" = "$1 подарков осталось"; +"gifts_left_other" = "$1 подарков осталось"; + +"send_gift" = "Отправить подарок"; + +"gift_select" = "Выбрать подарок"; +"collections" = "Коллекции"; +"confirm" = "Подтверждение"; +"as_anonymous" = "Анонимно"; +"gift_your_message" = "Ваше сообщение"; + +"free_gift" = "Бесплатно"; +"coins" = "Голоса"; +"coins_zero" = "0 голосов"; +"coins_one" = "Один голос"; +"coins_few" = "$1 голоса"; +"coins_many" = "$1 голосов"; +"coins_other" = "$1 голосов"; + +"users_gifts" = "Подарки"; + +/* Support */ + +"support_opened" = "Открытые"; +"support_answered" = "С ответом"; +"support_closed" = "Закрытые"; +"support_ticket" = "Обращение"; +"support_tickets" = "Обращения"; +"support_status_0" = "Вопрос на рассмотрении"; +"support_status_1" = "Есть ответ"; +"support_status_2" = "Закрыто"; +"support_greeting_hi" = "Здравствуйте, $1!"; +"support_greeting_regards" = "С уважением,
команда поддержки $1."; + +"support_faq" = "Часто задаваемые вопросы"; +"support_list" = "Список обращений"; +"support_new" = "Новое обращение"; + +"support_faq_title" = "Для кого этот сайт?"; +"support_faq_content" = "Сайт предназначен для поиска друзей и знакомых, а также для просмотра данных пользователя. Это как справочник города, с помощью которого люди могут быстро найти актуальную информацию о человеке."; + +"support_new_title" = "Введите тему вашего обращения"; +"support_new_content" = "Опишите проблему или предложение"; + +"support_rate_good_answer" = "Это хороший ответ"; +"support_rate_bad_answer" = "Это плохой ответ"; +"support_good_answer_user" = "Вы оставили положительный отзыв."; +"support_bad_answer_user" = "Вы оставили негативный отзыв."; +"support_good_answer_agent" = "Пользователь оставил положительный отзыв"; +"support_bad_answer_agent" = "Пользователь оставил негативный отзыв"; +"support_rated_good" = "Вы оставили положительный отзыв об ответе."; +"support_rated_bad" = "Вы оставили негативный отзыв об ответе."; +"wrong_parameters" = "Неверные параметры запроса."; + +"fast_answers" = "Быстрые ответы"; + +"comment" = "Комментарий"; +"sender" = "Отправитель"; + +"author" = "Автор"; + +"you_have_not_entered_text" = "Вы не ввели текст"; +"you_have_not_entered_name_or_text" = "Вы не ввели имя или текст"; + +"ticket_changed" = "Тикет изменён"; +"ticket_changed_comment" = "Изменения вступят силу через несколько секунд."; + +/* Invite */ + +"invite" = "Пригласить"; +"you_can_invite" = "Вы можете пригласить своих друзей или знакомых в сеть с помощью индивидуальной ссылки:"; +"you_can_invite_2" = "Приложите эту ссылку к вашему сообщению. Пользователь зарегистрируется, и он сразу появится у вас в друзьях."; + +/* Banned */ + +"banned_title" = "Вам бан"; +"banned_header" = "Вы были верискокнуты"; +"banned_alt" = "Пользователь заблокирован."; +"banned_1" = "Извините, $1, но вы были верискокнуты."; +"banned_2" = "А причина этому проста: $1. К сожалению, на этот раз нам пришлось заблокировать вас навсегда."; +"banned_3" = "Вы всё ещё можете написать в службу поддержки, если считаете что произошла ошибка или выйти."; + +/* Discussions */ + +"discussions" = "Обсуждения"; + +"messages_one" = "Одно сообщение"; +"messages_few" = "$1 сообщения"; +"messages_many" = "$1 сообщений"; +"messages_other" = "$1 сообщений"; + +"topic_messages_count_zero" = "В теме нет сообщений"; +"topic_messages_count_one" = "В теме одно сообщение"; +"topic_messages_count_few" = "В теме $1 сообщения"; +"topic_messages_count_many" = "В теме $1 сообщений"; +"topic_messages_count_other" = "В теме $1 сообщений"; + +"replied" = "ответил"; +"create_topic" = "Создать тему"; + +"new_topic" = "Новая тема"; +"title" = "Заголовок"; +"text" = "Текст"; + +"view_topic" = "Просмотр темы"; +"edit_topic_action" = "Редактировать тему"; +"edit_topic" = "Редактирование темы"; +"topic_settings" = "Настройки темы"; +"pin_topic" = "Закрепить тему"; +"close_topic" = "Закрыть тему"; +"delete_topic" = "Удалить тему"; + +"topics_one" = "Одна тема"; +"topics_few" = "$1 темы"; +"topics_many" = "$1 тема"; +"topics_other" = "$1 тем"; + +"created" = "Создано"; + +"everyone_can_create_topics" = "Все могут создавать темы"; +"display_list_of_topics_above_wall" = "Отображать список тем над стеной"; + +"topic_changes_saved_comment" = "Обновлённый заголовок и настройки появятся на странице с темой."; + +"failed_to_create_topic" = "Не удалось создать тему"; +"failed_to_change_topic" = "Не удалось изменить тему"; +"no_title_specified" = "Заголовок не указан."; + +/* Errors */ + +"error_1" = "Некорректный запрос"; +"error_2" = "Неверный логин или пароль"; +"error_3" = "Не авторизован"; +"error_4" = "Пользователь не существует"; +"information_-1" = "Операция выполнена успешно"; +"information_-2" = "Вход выполнен успешно"; + +"no_data" = "Нет данных"; +"no_data_description" = "Ивортодэт татын ӧвӧл татын."; + +"error" = "Янгыше"; +"error_shorturl" = "Данный короткий адрес уже занят."; +"error_segmentation" = "Янгышъёс сегментация"; +"error_upload_failed" = "Не удалось загрузить фото"; +"error_old_password" = "Старый пароль не совпадает"; +"error_new_password" = "Новые пароли не совпадает"; +"error_shorturl_incorrect" = "Короткий адрес имеет некорректный формат."; +"error_repost_fail" = "Не удалось поделиться записью"; + +"forbidden" = "Ошибка доступа"; +"forbidden_comment" = "Настройки приватности этого пользователя не разрешают вам смотреть на его страницу."; + +"changes_saved" = "Изменения сохранены"; +"changes_saved_comment" = "Новый данные появятся на вашей странице"; + +"photo_saved" = "Фотография сохранена"; +"photo_saved_comment" = "Новое изображние профиля появится у вас на странице"; + +"shared_succ" = "Запись появится на вашей стене. Нажмите на уведомление, чтобы перейти к своей стене."; + +"invalid_email_address" = "Неверный Email адрес"; +"invalid_email_address_comment" = "Email, который вы ввели, не является корректным."; + +"invalid_telegram_name" = "Неверное имя Telegram аккаунта"; +"invalid_telegram_name_comment" = "Вы ввели неверное имя аккаунта Telegram."; + +"invalid_birth_date" = "Неверная дата рождения"; +"invalid_birth_date_comment" = "Дата рождения, которую вы ввели, не является корректной."; + +"token_manipulation_error" = "Ошибка манипулирования токеном"; +"token_manipulation_error_comment" = "Токен недействителен или истёк"; + +"profile_changed" = "Профиль изменён"; +"profile_changed_comment" = "Ваш активный профиль был изменён."; +"profile_not_found" = "Пользователь не найден."; + +"suspicious_registration_attempt" = "Подозрительная попытка регистрации"; +"suspicious_registration_attempt_comment" = "Вы пытались зарегистрироваться из подозрительного места."; + +"rate_limit_error" = "Чумба, ты совсем ёбнутый?"; +"rate_limit_error_comment" = "Сходи к мозгоправу, попей колёсики. В $1 нельзя вбрасывать щитпосты так часто. Код исключения: $2."; + +"not_enough_permissions" = "Недостаточно прав"; +"not_enough_permissions_comment" = "У вас недостаточно прав чтобы выполнять это действие."; + +"login_required_error" = "Недостаточно прав"; +"login_required_error_comment" = "Чтобы просматривать эту страницу, нужно зайти на сайт."; + +"captcha_error" = "Неправильно введены символы"; +"captcha_error_comment" = "Пожалуйста, убедитесь, что вы правильно заполнили поле с капчей."; + +/* Admin actions */ + +"login_as" = "Войти как $1"; +"manage_user_action" = "Управление пользователем"; +"manage_group_action" = "Управление группой"; +"ban_user_action" = "Заблокировать пользователя"; +"warn_user_action" = "Предупредить пользователя"; + +/* Paginator (deprecated) */ + +"paginator_back" = "Назад"; +"paginator_page" = "Страница $1"; +"paginator_next" = "Дальше"; + +/* About */ + +"about_openvk" = "Об OpenVK"; + +/* Dialogs */ + +"ok" = "ОК"; +"yes" = "Да"; +"no" = "Нет"; +"cancel" = "Отмена"; +"edit_action" = "Изменить"; +"transfer" = "Передать"; +"close" = "Закрыть"; + +"warning" = "Внимание"; +"question_confirm" = "Это действие нельзя отменить. Вы действительно уверены в том что хотите сделать?"; + +/* User alerts */ + +"user_alert_scam" = "На этот аккаунт много жаловались в связи с мошенничеством. Пожалуйста, будьте осторожны, особенно если у вас попросят денег."; From 666427758126dc0fb9d98a516e519e82a861f860 Mon Sep 17 00:00:00 2001 From: MaksimMohooks Date: Thu, 30 Dec 2021 23:43:37 +0300 Subject: [PATCH 02/81] Update su.strings --- locales/su.strings | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locales/su.strings b/locales/su.strings index ed2b7b26..1b14bd7d 100644 --- a/locales/su.strings +++ b/locales/su.strings @@ -189,11 +189,11 @@ "friends" = "Товарищи"; "followers" = "Подписчики"; "follower" = "Подписчик"; -"friends_add" = "Добавить в друзья"; -"friends_delete" = "Удалить из друзей"; -"friends_reject" = "Отменить заявку"; -"friends_accept" = "Принять заявку"; -"send_message" = "Отправить сообщение"; +"friends_add" = "Добавить в товарищи"; +"friends_delete" = "Удалить из товарищей"; +"friends_reject" = "Порвать приглашение в товарищи"; +"friends_accept" = "Прочитать приглашение в товарищи"; +"send_message" = "Отправить телеграмму"; "incoming_req" = "Подписчики"; "outcoming_req" = "Заявки"; "req" = "Заявки"; From 380c4093a71b344ff4286212e6600183bcaaebe8 Mon Sep 17 00:00:00 2001 From: MaksimMohooks Date: Fri, 31 Dec 2021 04:35:44 +0300 Subject: [PATCH 03/81] Fix list.yml, Soviet & Udm fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправление файла list.yml и перевод новых строк на Советский и Удмуртский языки. --- locales/list.yml | 10 +++ locales/su.strings | 160 ++++++++++++++++++++++---------------------- locales/udm.strings | 44 ++++++------ 3 files changed, 112 insertions(+), 102 deletions(-) diff --git a/locales/list.yml b/locales/list.yml index bf3e07fb..62bd2ee0 100644 --- a/locales/list.yml +++ b/locales/list.yml @@ -69,3 +69,13 @@ list: name: "Esperanto" native_name: "Esperanto" author: "n1rwana" + - code: "su" + flag: "su" + name: "Soviet" + native_name: "Советский" + author: "mohooks" + - code: "udm" + flag: "udm" + name: "Udmurtskiy" + native_name: "Удмуртский" + author: "mohooks" diff --git a/locales/su.strings b/locales/su.strings index 1b14bd7d..e6d995d9 100644 --- a/locales/su.strings +++ b/locales/su.strings @@ -198,10 +198,10 @@ "outcoming_req" = "Заявки"; "req" = "Заявки"; -"firends_zero" = "Ни одного друга"; -"friends_one" = "$1 друг"; -"friends_few" = "$1 друга"; -"friends_many" = "$1 друзей"; +"firends_zero" = "Ни одного товарища"; +"friends_one" = "$1 товарищ"; +"friends_few" = "$1 товарища"; +"friends_many" = "$1 товарищей"; "friends_other" = "$1 друзей"; "followers_zero" = "Ни одного подписчика"; @@ -287,38 +287,38 @@ "create" = "Создать"; "albums" = "Альбомы"; -"create_album" = "Создать альбом"; -"edit_album" = "Редактировать альбом"; -"creating_album" = "Создание альбома"; -"upload_photo" = "Загрузить фотографию"; -"photo" = "Фотография"; -"upload_button" = "Загрузить"; +"create_album" = "Создать альбом с картинками"; +"edit_album" = "Поправить альбом с картинками"; +"creating_album" = "Создание альбома с картинками"; +"upload_photo" = "Отправить картинку"; +"photo" = "Картинка"; +"upload_button" = "Картинка"; -"open_original" = "Открыть оригинал"; +"open_original" = "Посмотреть оригинал картинки"; -"avatar_album" = "Фотографии со страницы"; -"wall_album" = "Фотографии со стены"; +"avatar_album" = "Картинки с паспорта"; +"wall_album" = "Картинки с доски"; -"albums_zero" = "Ни одного альбома"; -"albums_one" = "Один альбом"; -"albums_few" = "$1 альбома"; -"albums_many" = "$1 альбомов"; -"albums_other" = "$1 альбомов"; +"albums_zero" = "Ни одного альбома с картинками"; +"albums_one" = "Один альбом с картинками"; +"albums_few" = "$1 альбома с картинками"; +"albums_many" = "$1 альбомов с картинками"; +"albums_other" = "$1 альбомов с картинками"; /* Notes */ -"notes" = "Заметки"; -"note" = "Заметка"; +"notes" = "Черновики"; +"note" = "Черновик"; "name_note" = "Название"; "text_note" = "Содержание"; -"create_note" = "Создать заметку"; +"create_note" = "Написать новый черновик"; "actions" = "Действия"; -"notes_zero" = "Ни одной заметки"; -"notes_one" = "Одна заметка"; -"notes_few" = "$1 заметки"; -"notes_many" = "$1 заметок"; -"notes_other" = "$1 заметок"; +"notes_zero" = "Ни одного черновика"; +"notes_one" = "Один черновик"; +"notes_few" = "$1 черновика"; +"notes_many" = "$1 черновиков"; +"notes_other" = "$1 черновиков"; /* Menus */ @@ -513,10 +513,10 @@ "nt_from" = "от"; "nt_yours_adjective" = "вашим"; "nt_yours_feminitive_adjective" = "вашей"; -"nt_post_nominative" = "пост"; -"nt_post_instrumental" = "постом"; -"nt_note_instrumental" = "заметкой"; -"nt_photo_instrumental" = "фотографией"; +"nt_post_nominative" = "запись"; +"nt_post_instrumental" = "записью"; +"nt_note_instrumental" = "черновиком"; +"nt_photo_instrumental" = "картинкой"; "nt_topic_instrumental" = "темой"; /* Time */ @@ -528,51 +528,51 @@ "time_today" = "сегодня"; "time_yesterday" = "вчера"; -"points" = "Голоса"; -"points_count" = "голосов"; +"points" = "Советские рубли"; +"points_count" = "советских рублей"; "on_your_account" = "на вашем счету"; -"vouchers" = "Ваучеры"; -"have_voucher" = "Есть ваучер"; -"voucher_token" = "Код ваучера"; +"vouchers" = "Лотерейные карточки"; +"have_voucher" = "Есть лотерейная карточка"; +"voucher_token" = "Код лотерейной карточки"; "voucher_activators" = "Воспользовавшиеся"; -"voucher_explanation" = "Введите серийный номер ваучера. Обычно он указан в чеке или в сообщении."; -"voucher_explanation_ex" = "Обратите внимание, что ваучеры могут истекать и воспользоваться ими можно только один раз."; -"invalid_voucher" = "Ваучер недействительный"; -"voucher_bad" = "Возможно, вы ввели неверный серийный номер, уже использовали данный ваучер или же он просто истёк."; -"voucher_good" = "Ваучер активирован"; -"voucher_redeemed" = "Ваучер был успешно активирован. Вам будут начислены голоса, но этим кодом вы больше не сможете активировать его."; -"redeem" = "Активировать ваучер"; -"deactivate" = "Деактивировать"; +"voucher_explanation" = "Товарищ, введите сюда кодовый номер лотерейной карточки. Орган указывает его в вашем чеке или телеграмме."; +"voucher_explanation_ex" = "Мы забираем лотерейные карточки, дубликаты отклоняются."; +"invalid_voucher" = "Такуя лоетрейную карточку мы уже приняли"; +"voucher_bad" = "Товращи, мы уже принимали такую карточку, либо её срок истёк."; +"voucher_good" = "Лотерейная карточка активирован"; +"voucher_redeemed" = "Товарищ, благодарим за отправку карточки! Мы жуе начислили по ней рубли, но вы больше не сможете их повторно получить по той карточке."; +"redeem" = "Активировать лотерейную карточку"; +"deactivate" = "Порвать"; "usages_total" = "Количество использований"; "usages_left" = "Осталось использований"; -"points_transfer_dialog_header_1" = "Вы можете отправить в подарок или передать часть голосов другому человеку."; +"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 голосов"; +"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" = "Также вы можете передать голоса другому человеку."; +"transfer_poins" = "Передача рублей"; +"transfer_poins_button" = "Передать рубли"; +"also_you_can_transfer_points" = "Также вы можете передать рубли другому гражданину."; "transferred_to_you" = "передал вам"; -"receiver_address" = "Адрес получателя"; -"coins_count" = "Количество голосов"; +"receiver_address" = "Адрес паспорта получателя"; +"coins_count" = "Количество рублей"; "message" = "Сообщение"; -"failed_to_tranfer_points" = "Не удалось передать голоса"; +"failed_to_tranfer_points" = "Не удалось передать рубли"; "points_transfer_successful" = "Вы успешно передали $1 $3."; "not_all_information_has_been_entered" = "Введена не вся информация."; -"negative_transfer_value" = "Мы не можем украсть голоса у другого человека, извините."; +"negative_transfer_value" = "Орган не подразумевает нарушения закона, чтобы украсть чужие деньги."; "message_is_too_long" = "Сообщение слишком длинное."; -"receiver_not_found" = "Получатель не найден."; -"you_dont_have_enough_points" = "У вас недостаточно голосов."; +"receiver_not_found" = "Гражданин не найден."; +"you_dont_have_enough_points" = "У вас недостаточно рублей."; /* Gifts */ @@ -599,11 +599,11 @@ "free_gift" = "Бесплатно"; "coins" = "Голоса"; -"coins_zero" = "0 голосов"; -"coins_one" = "Один голос"; -"coins_few" = "$1 голоса"; -"coins_many" = "$1 голосов"; -"coins_other" = "$1 голосов"; +"coins_zero" = "0 рублей"; +"coins_one" = "Один рубль"; +"coins_few" = "$1 рубля"; +"coins_many" = "$1 рублей"; +"coins_other" = "$1 рублей"; "users_gifts" = "Подарки"; @@ -634,15 +634,15 @@ "support_rate_bad_answer" = "Это плохой ответ"; "support_good_answer_user" = "Вы оставили положительный отзыв."; "support_bad_answer_user" = "Вы оставили негативный отзыв."; -"support_good_answer_agent" = "Пользователь оставил положительный отзыв"; -"support_bad_answer_agent" = "Пользователь оставил негативный отзыв"; +"support_good_answer_agent" = "Гражданин оставил положительный отзыв"; +"support_bad_answer_agent" = "Гражданин оставил негативный отзыв"; "support_rated_good" = "Вы оставили положительный отзыв об ответе."; "support_rated_bad" = "Вы оставили негативный отзыв об ответе."; "wrong_parameters" = "Неверные параметры запроса."; "fast_answers" = "Быстрые ответы"; -"comment" = "Комментарий"; +"comment" = "Отзыв"; "sender" = "Отправитель"; "author" = "Автор"; @@ -740,15 +740,15 @@ "forbidden_comment" = "Настройки приватности этого пользователя не разрешают вам смотреть на его страницу."; "changes_saved" = "Изменения сохранены"; -"changes_saved_comment" = "Новый данные появятся на вашей странице"; +"changes_saved_comment" = "Товарищ, обоновлённые данные появятся на вашем паспорте."; -"photo_saved" = "Фотография сохранена"; -"photo_saved_comment" = "Новое изображние профиля появится у вас на странице"; +"photo_saved" = "Картинка сохранена"; +"photo_saved_comment" = "Товарищ, орган одобрил новую картинку в вашем паспорте."; -"shared_succ" = "Запись появится на вашей стене. Нажмите на уведомление, чтобы перейти к своей стене."; +"shared_succ" = "Запись появится на вашей доске. Нажмите на уведомление, чтобы перейти к своей стене."; -"invalid_email_address" = "Неверный Email адрес"; -"invalid_email_address_comment" = "Email, который вы ввели, не является корректным."; +"invalid_email_address" = "Неверный адрес почтового ящика"; +"invalid_email_address_comment" = "Товарищ, нам не удалось найти ваш почтовый ящик."; "invalid_telegram_name" = "Неверное имя Telegram аккаунта"; "invalid_telegram_name_comment" = "Вы ввели неверное имя аккаунта Telegram."; @@ -759,12 +759,12 @@ "token_manipulation_error" = "Ошибка манипулирования токеном"; "token_manipulation_error_comment" = "Токен недействителен или истёк"; -"profile_changed" = "Профиль изменён"; -"profile_changed_comment" = "Ваш активный профиль был изменён."; -"profile_not_found" = "Пользователь не найден."; +"profile_changed" = "Паспорт изменён"; +"profile_changed_comment" = Товарищ, орган одобрил изменение вашего паспорта."; +"profile_not_found" = "Гражданин не найден."; -"suspicious_registration_attempt" = "Подозрительная попытка регистрации"; -"suspicious_registration_attempt_comment" = "Вы пытались зарегистрироваться из подозрительного места."; +"suspicious_registration_attempt" = "Подозрительная попытка регистрации в орган"; +"suspicious_registration_attempt_comment" = "Товарищ, а вы откуда к нам пришли? Вы очень подозрительно себя ведёте."; "rate_limit_error" = "Чумба, ты совсем ёбнутый?"; "rate_limit_error_comment" = "Сходи к мозгоправу, попей колёсики. В $1 нельзя вбрасывать щитпосты так часто. Код исключения: $2."; @@ -781,10 +781,10 @@ /* Admin actions */ "login_as" = "Войти как $1"; -"manage_user_action" = "Управление пользователем"; -"manage_group_action" = "Управление группой"; -"ban_user_action" = "Заблокировать пользователя"; -"warn_user_action" = "Предупредить пользователя"; +"manage_user_action" = "Управление гражданином"; +"manage_group_action" = "Управление клубом"; +"ban_user_action" = "Заблокировать гражданина"; +"warn_user_action" = "Предупредить гражданина"; /* Paginator (deprecated) */ diff --git a/locales/udm.strings b/locales/udm.strings index 09a09bd4..2c3d41c3 100644 --- a/locales/udm.strings +++ b/locales/udm.strings @@ -167,30 +167,30 @@ "posts_per_page" = "Количество записей на странице"; "attachment" = "Вложение"; -"post_as_group" = "От имени сообщества"; -"comment_as_group" = "От имени сообщества"; -"add_signature" = "Подпись автора"; -"contains_nsfw" = "Содержит NSFW-контент"; -"nsfw_warning" = "Данный пост может содержать 18+ контент"; -"report" = "Пожаловаться"; -"attach" = "Прикрепить"; -"attach_photo" = "Прикрепить фото"; -"attach_video" = "Прикрепить видео"; -"draw_graffiti" = "Нарисовать граффити"; -"no_posts_abstract" = "Здесь никто ничего не написал... Пока."; -"attach_no_longer_available" = "Это вложение больше недоступно."; -"open_post" = "Открыть запись"; -"version_incompatibility" = "Не удалось отобразить это вложение. Возможно, база данных несовместима с текущей версией OpenVK."; +"post_as_group" = "Нимысьтыз сообщество"; +"comment_as_group" = "Нимысьтыз сообщество"; +"add_signature" = "Авторен гожтэм"; +"contains_nsfw" = "Вордскем NSFW-контент"; +"nsfw_warning" = "Сётэм визь сюдыны-вордыны быгато 18+ контент"; +"report" = "Урттылӥськиз"; +"attach" = "Юнматӥзы"; +"attach_photo" = "Туспуктэмез юнматэмын"; +"attach_video" = "Видео юнматӥзы"; +"draw_graffiti" = "Граффити суредамын"; +"no_posts_abstract" = "Татын нокин номыр уг гожтӥськы."; +"attach_no_longer_available" = "Та вложение трос валантэмез."; +"open_post" = "Усьты запись"; +"version_incompatibility" = "Та вложение возьматытэк ӧйлась. Оло, юри несовместимый версия OpenVK базаын бызиз."; "reply" = "Ответить"; /* Friends */ -"friends" = "Друзья"; +"friends" = "Эшъёс"; "followers" = "Подписчики"; "follower" = "Подписчик"; -"friends_add" = "Добавить в друзья"; -"friends_delete" = "Удалить из друзей"; +"friends_add" = "Ог ватсаны"; +"friends_delete" = "Эшъёсы пӧлысь палэнтыны"; "friends_reject" = "Отменить заявку"; "friends_accept" = "Принять заявку"; "send_message" = "Отправить сообщение"; @@ -198,11 +198,11 @@ "outcoming_req" = "Заявки"; "req" = "Заявки"; -"firends_zero" = "Ни одного друга"; -"friends_one" = "$1 друг"; -"friends_few" = "$1 друга"; -"friends_many" = "$1 друзей"; -"friends_other" = "$1 друзей"; +"firends_zero" = "Одӥг но эшъёс"; +"friends_one" = "$1 эшъёс"; +"friends_few" = "$1 эшъёс"; +"friends_many" = "$1 эшъёс"; +"friends_other" = "$1 эшъёс"; "followers_zero" = "Ни одного подписчика"; "followers_one" = "$1 подписчик"; From 222621ebaf3683b78f2e09e99f20bc2874da4f00 Mon Sep 17 00:00:00 2001 From: MaksimMohooks Date: Fri, 31 Dec 2021 15:52:35 +0300 Subject: [PATCH 04/81] Update Udm locales --- Web/static/img/flags/su.gif | Bin 0 -> 186 bytes Web/static/img/flags/udm.gif | Bin 0 -> 546 bytes locales/udm.strings | 428 +++++++++++++++++------------------ 3 files changed, 214 insertions(+), 214 deletions(-) create mode 100644 Web/static/img/flags/su.gif create mode 100644 Web/static/img/flags/udm.gif diff --git a/Web/static/img/flags/su.gif b/Web/static/img/flags/su.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea32536e27f38f4be902a3bba397b538374513d0 GIT binary patch literal 186 zcmZ?wbhEHb6kyU}LZoia%LcxqwnSAZd`D46No4RQi&> z&N;J5WwPtOCyeKnly-f|*kZZ!`w}PBM-u|7TDS_P#B{OnK38Gz)D_`qNsLwyU}EMB~F<;qpc0=s0`cPR@TJ9g}Zj?|fL z8_u3RdtOEG^5x67l=z;pGJpO0_51hlKNuK({`~pt!~5SK-v9db>-X>9e;644vNHVn z^XKp1zyDYn{;@Os<6`*7&G4U#;Xe<5YEv*^**jSjEKJ)YQe&^)jVrS=QWUvMREE%1% literal 0 HcmV?d00001 diff --git a/locales/udm.strings b/locales/udm.strings index 2c3d41c3..2a8f7bf8 100644 --- a/locales/udm.strings +++ b/locales/udm.strings @@ -204,13 +204,13 @@ "friends_many" = "$1 эшъёс"; "friends_other" = "$1 эшъёс"; -"followers_zero" = "Ни одного подписчика"; +"followers_zero" = "Одӥг но подписчика"; "followers_one" = "$1 подписчик"; "followers_few" = "$1 подписчика"; "followers_many" = "$1 подписчиков"; "followers_other" = "$1 подписчиков"; -"subscriptions_zero" = "Ни одной подписки"; +"subscriptions_zero" = "Одӥг но подписки"; "subscriptions_one" = "$1 подписка"; "subscriptions_few" = "$1 подписки"; "subscriptions_many" = "$1 подписок"; @@ -218,25 +218,25 @@ /* Group */ -"name_group" = "Название"; +"name_group" = "Нимыз"; "subscribe" = "Подписаться"; "unsubscribe" = "Отписаться"; "subscriptions" = "Подписки"; -"join_community" = "Вступить в группу"; -"leave_community" = "Выйти из группы"; -"min_6_community" = "Название должно быть не менее 6 символов"; -"participants" = "Участники"; +"join_community" = "Группаязы пыре"; +"leave_community" = "Группаысь потытэк"; +"min_6_community" = "6 символэз возиськыны уг луы куло ӧжыт"; +"participants" = "Пыриськисьёс"; "groups" = "Группы"; -"meetings" = "Встречи"; -"create_group" = "Создать группу"; -"group_managers" = "Руководство"; +"meetings" = "Пумиськон"; +"create_group" = "Кылдӥз группу"; +"group_managers" = "Кивалтонни"; "group_type" = "Тип группы"; -"group_type_open" = "Это открытая группа. В неё может вступить любой желающий."; -"group_type_closed" = "Это закрытая группа. Для вступления необходимо подавать заявку."; -"creator" = "Создатель"; +"group_type_open" = "Та группа усьтыны. Отчы пырыны быгатэ котькудӥз мылкыд карись."; +"group_type_closed" = "Та ӵогам группа. Заявка сётыны кулэ пырон понна."; +"creator" = "Кылдӥз"; "administrators" = "Администраторы"; -"add_to_left_menu" = "Добавить в левое меню"; -"remove_from_left_menu" = "Удалить из левого меню"; +"add_to_left_menu" = "Паллян менюысь ватсаны"; +"remove_from_left_menu" = "Паллян менюысь палэнтыны"; "all_followers" = "Все подписчики"; "only_administrators" = "Только администраторы"; "website" = "Сайт"; @@ -246,61 +246,61 @@ "administrators_few" = "$1 администратора"; "administrators_other" = "$1 администраторов"; -"role" = "Роль"; +"role" = "Рольёсты"; "administrator" = "Администратор"; -"promote_to_admin" = "Повысить до администратора"; -"promote_to_owner" = "Назначить владельцем"; +"promote_to_admin" = "Озь будэтӥз администратора"; +"promote_to_owner" = "Дасямын владельцем"; "devote" = "Разжаловать"; -"set_comment" = "Изменить комментарий"; -"hidden_yes" = "Скрыт: Да"; -"hidden_no" = "Скрыт: Нет"; -"group_allow_post_for_everyone" = "Разрешить публиковать записи всем"; +"set_comment" = "Воштыны комментарий"; +"hidden_yes" = "Ватэм: Мед"; +"hidden_no" = "Ватэм: Ӧвӧл"; +"group_allow_post_for_everyone" = "Вань гожъямъёссэ поттыса лэзе"; "statistics" = "Статистика"; "group_administrators_list" = "Список админов"; -"group_display_only_creator" = "Отображать только создателя группы"; -"group_display_all_administrators" = "Отображать всех администраторов"; -"group_dont_display_administrators_list" = "Ничего не отображать"; +"group_display_only_creator" = "Возьмаса гинэ создателя группы"; +"group_display_all_administrators" = "Администратор вань возьмалэ"; +"group_dont_display_administrators_list" = "Номыр но уг возьматы"; -"group_changeowner_modal_title" = "Передача прав владельца"; -"group_changeowner_modal_text" = "Внимание! Вы передаёте права владельца пользователю $1. Это действие необратимо. После передави вы останетесь адмиинстратором, но сможете легко перестать им быть."; -"group_owner_setted" = "Новый владелец ($1) успешно назначен в сообщество $2. Вам выданы права администратора в сообществе. Если Вы хотите вернуть роль владельца, обратитесь в техническую поддержку сайта."; +"group_changeowner_modal_title" = "Передача право кузё"; +"group_changeowner_modal_text" = "Сак! Тыныд право сётӥз кузёйыръёс пользователь $1. Та ужрад необратимый. Передача бере, тӥледлы кыле на администраторлэсь но, со капчиен быгатэ луыны дугдӥз."; +"group_owner_setted" = "Выль кузё ($1) пусъемын йыг сообщество $2. Администратор сообществоын тыныд право сётӥз. Рольёсъя Тон кузёйыр берыктэмед потэ ке, пӧрмиз техническую поддержку сайта."; -"participants_zero" = "Ни одного участника"; -"participants_one" = "Один участник"; -"participants_few" = "$1 участника"; -"participants_many" = "$1 участников"; -"participants_other" = "$1 участников"; +"participants_zero" = "Но одӥг пыриськисьёс"; +"participants_one" = "Одӥг пыриськисьёс"; +"participants_few" = "$1 пыриськисьёс"; +"participants_many" = "$1 пыриськисьёс"; +"participants_other" = "$1 пыриськисьёс"; -"groups_zero" = "Ни одной группы"; -"groups_one" = "Одна группа"; -"groups_few" = "$1 группы"; -"groups_many" = "$1 групп"; -"groups_other" = "$1 групп"; +"groups_zero" = "Но одӥг группа"; +"groups_one" = "Одӥг группаын"; +"groups_few" = "$1 группаын"; +"groups_many" = "$1 группаын"; +"groups_other" = "$1 группаын"; -"meetings_zero" = "Ни одной встречи"; -"meetings_one" = "Одна встреча"; -"meetings_few" = "$1 встречи"; -"meetings_many" = "$1 встреч"; -"meetings_other" = "$1 встреч"; +"meetings_zero" = "Но одӥг пумиськон"; +"meetings_one" = "Одӥг пумиськон"; +"meetings_few" = "$1 пумиськон"; +"meetings_many" = "$1 пумиськон"; +"meetings_other" = "$1 пумиськон"; /* Albums */ -"create" = "Создать"; +"create" = "Кылдӥз"; "albums" = "Альбомы"; -"create_album" = "Создать альбом"; +"create_album" = "Кылдӥз альбом"; "edit_album" = "Редактировать альбом"; "creating_album" = "Создание альбома"; -"upload_photo" = "Загрузить фотографию"; -"photo" = "Фотография"; -"upload_button" = "Загрузить"; +"upload_photo" = "Туспуктэм etkileşimli"; +"photo" = "Туспуктэм"; +"upload_button" = "Etkileşimli"; "open_original" = "Открыть оригинал"; -"avatar_album" = "Фотографии со страницы"; -"wall_album" = "Фотографии со стены"; +"avatar_album" = "Ӵош туспуктэм бам"; +"wall_album" = "Борддорысь туспуктэмъёсты"; -"albums_zero" = "Ни одного альбома"; -"albums_one" = "Один альбом"; +"albums_zero" = "Одӥг но альбом"; +"albums_one" = "Одӥг альбом; "albums_few" = "$1 альбома"; "albums_many" = "$1 альбомов"; "albums_other" = "$1 альбомов"; @@ -309,10 +309,10 @@ "notes" = "Заметки"; "note" = "Заметка"; -"name_note" = "Название"; +"name_note" = "Нимыз"; "text_note" = "Содержание"; -"create_note" = "Создать заметку"; -"actions" = "Действия"; +"create_note" = "Кылдӥз заметку"; +"actions" = "Ужъёс"; "notes_zero" = "Ни одной заметки"; "notes_one" = "Одна заметка"; @@ -356,9 +356,9 @@ "left_menu_donate" = "юрттоз"; "footer_blog" = "блог"; -"footer_help" = "помощь"; +"footer_help" = "юрттэт"; "footer_developers" = "разработчикам"; -"footer_choose_language" = "выбрать язык"; +"footer_choose_language" = "быръе кыл"; "footer_privacy" = "приватность"; /* Settings */ @@ -367,11 +367,11 @@ "contacts" = "Контакты"; "avatar" = "Аватар"; "privacy" = "Приватность"; -"interface" = "Внешний вид"; +"interface" = "Педпал туссы"; -"profile_picture" = "Изображение страницы"; +"profile_picture" = "Суредъя бам"; -"picture" = "Изображение"; +"picture" = "Суред"; "change_password" = "Изменить пароль"; "old_password" = "Старый пароль"; @@ -385,51 +385,51 @@ "cut" = "Обрезка"; "round_avatars" = "Круглый аватар"; -"search_for_groups" = "Поиск групп"; -"search_for_people" = "Поиск людей"; -"search_button" = "Найти"; -"search_placeholder" = "Начните вводить любое имя, название или слово"; -"results_zero" = "Ни одного результата"; +"search_for_groups" = "Группа утчан"; +"search_for_people" = "Адями утчан"; +"search_button" = "Шедьтӥзы"; +"search_placeholder" = "Котькудӥныз нимысьтыз пырыны кутске, нимыз яке кыл"; +"results_zero" = "Одӥг но результатъёсыз"; "results_one" = "Один результат"; "results_few" = "$1 результата"; "results_many" = "$1 результатов"; "results_other" = "$1 результатов"; -"privacy_setting_access_page" = "Кому в интернете видно мою страницу"; -"privacy_setting_read_info" = "Кому видно основную информацию моей страницы"; -"privacy_setting_see_groups" = "Кому видно мои группы и встречи"; -"privacy_setting_see_photos" = "Кому видно мои фотографии"; -"privacy_setting_see_videos" = "Кому видно мои видеозаписи"; -"privacy_setting_see_notes" = "Кому видно мои заметки"; -"privacy_setting_see_friends" = "Кому видно моих друзей"; -"privacy_setting_add_to_friends" = "Кто может называть меня другом"; -"privacy_setting_write_wall" = "Кто может писать у меня на стене"; -"privacy_setting_write_messages" = "Кто может писать мне сообщения"; -"privacy_value_anybody" = "Все желающие"; -"privacy_value_anybody_dative" = "Всем желающим"; -"privacy_value_users" = "Пользователям OpenVK"; -"privacy_value_friends" = "Друзья"; -"privacy_value_friends_dative" = "Друзьям"; -"privacy_value_only_me" = "Только я"; -"privacy_value_only_me_dative" = "Только мне"; -"privacy_value_nobody" = "Никто"; +"privacy_setting_access_page" = "Кин милемыз адӟыса интернетын бам"; +"privacy_setting_read_info" = "кин милемыз адӟоз информациез валтӥсь бам"; +"privacy_setting_set_groups" = "группаен но мон адӟиськи, Кин пумитан"; +"privacy_setting_see_photos" = "кин милемыз адӟоз туспуктэм"; +"privacy_setting_see_videos" = "кин милемыз адӟоз видеозапись"; +"privacy_setting_see_notes" = "кин милемыз адӟоз заметка"; +"privacy_setting_see_friends" = "кин милемыз адӟыса, эшъёсы"; +"privacy_setting_add_to_friends" = "кин луо мон мукетыз нимаське"; +"privacy_setting_write_wall" = "Кин гожъяны быгатэ, мон вылэ борддор"; +"privacy_setting_write_messages" = "Кин мон луись ивортонъёсты гожъяны"; +"privacy_value_anybody" = "вань мылкыд карисьёс"; +"privacy_value_anybody_dative" = "вань мылкыд карисьёс"; +"privacy_value_users" = "Пользователь OpenVK"; +"privacy_value_friends" = "Эшъёс"; +"privacy_value_friends_dative" = "Эшъёс"; +"privacy_value_only_me" = "мон Гинэ"; +"privacy_value_only_me_dative" = "мон Гинэ"; +"privacy_value_nobody" = "Нокин"; -"your_email_address" = "Адрес Вашей электронной почты"; -"your_page_address" = "Адрес Вашей страницы"; -"page_address" = "Адрес страницы"; -"current_email_address" = "Текущий адрес"; -"page_id" = "ID страницы"; -"you_can_also" = "Вы также можете"; -"delete_your_page" = "удалить свою страницу"; -"delete_album" = "удалить альбом"; +"your_email_address" = "тон электронной почта адрес"; +"your_page_address" = "Тон Адресъёсын бам"; +"page_address" = "Адресъёсын бам"; +"current_email_address" = "Бызьыны адресъёсын"; +"page_id" = "бам ID"; +"you_can_also" = "тӥ озьы быгатӥськоды"; +"delete_your_page" = "баме асьсэлэсь палэнтыны"; +"delete_album" = "альбом палэнтыны"; -"ui_settings_interface" = "Интерфейс"; -"ui_settings_sidebar" = "Левое меню"; +"ui_settings_interface" = "Интерфейсэз"; +"ui_settings_sidebar" = "паллян менюысь"; "ui_settings_rating" = "Рейтинг"; -"ui_settings_rating_show" = "Показывать"; -"ui_settings_rating_hide" = "Скрывать"; +"ui_settings_rating_show" = "Возьматэ"; +"ui_settings_rating_hide" = "Ватэм"; -"additional_links" = "Дополнительные ссылки"; +"additional_links" = "Ватсаса чӧлсконъёсыз"; /* Two-factor authentication */ @@ -443,11 +443,11 @@ "two_factor_authentication_settings_3" = "или вручную введите секретный ключ: $1."; "two_factor_authentication_settings_4" = "Теперь введите код, который вам предоставило приложение, и пароль от вашей страницы, чтобы мы могли подтвердить, что вы действительно вы."; -"connect" = "Подключить"; -"enable" = "Включить"; +"connect" = "Подключать"; +"enable" = "Ӝуаз"; "disable" = "Отключить"; -"code" = "Код"; -"2fa_code" = "Код 2FA"; +"code" = "Кода"; +"2fa_code" = "Кода 2FA"; "incorrect_password" = "Неверный пароль"; "incorrect_code" = "Неверный код"; @@ -470,82 +470,82 @@ /* Videos */ -"videos" = "Видеозаписи"; +"videos" = "Видеозапись"; "video" = "Видеозапись"; -"upload_video" = "Загрузить видео"; -"video_uploaded" = "Загружено"; -"video_updated" = "Обновлено"; -"video_link_to_yt" = "Ссылка на YouTube"; +"upload_video" = "video Etkileşimli"; +"video_uploaded" = "Etkileşimli"; +"video_updated" = "- лэн выльдэм"; +"video_link_to_yt" = "вылэ Ссылка YouTube"; -"info_name" = "Название"; -"info_description" = "Описание"; -"info_uploaded_by" = "Загрузил"; -"info_upload_date" = "Дата загрузки"; +"info_name" = "Нимыза"; +"info_description" = "Кылсуред"; +"info_uploaded_by" = "Etkileşimli"; +"info_upload_date" = "загрузка Дыр"; -"videos_zero" = "Ни одной видеозаписи"; -"videos_one" = "Одна видеозапись"; -"videos_few" = "$1 видеозаписи"; -"videos_many" = "$1 видеозаписей"; -"videos_other" = "$1 видеозаписей"; +"videos_zero" = "одӥг но видеозапись"; +"videos_one" = "Одӥг видеозапись"; +"videos_few" = "$1 видеозапись"; +"videos_many" = "$1 видеозапись"; +"videos_other" = "$1 видеозапись"; /* Notifications */ -"feedback" = "Ответы"; -"unread" = "Непрочитанное"; +"feedback" = "Ответ"; +"unread" = "Непрочитанный"; "archive" = "Архив"; -"notifications_like" = "$1 оценил вашу $2запись$3 от $4"; -"notifications_repost" = "$1 поделился(-лась) вашей $2записью$3 от $4"; -"notifications_comment_under" = "$1 оставил(-ла) комментарий под $2"; -"notifications_under_note" = "вашей $3заметкой$4"; -"notifications_under_photo" = "вашим $3фото$4"; -"notifications_under_post" = "вашей $3записью$4 от $5"; -"notifications_under_video" = "вашим $3видео$4"; -"notifications_post" = "$1 написал(-ла) $2запись$3 на вашей стене: $4"; -"notifications_appoint" = "$1 назвачил вас руководителем сообщества $2"; +"notifications_like" = "$1 "тон дунъяны $2 гожъямъёсыз$3 $4"; +"notifications_repost" = "$1 paylaş(-лася) тон $2 гожъямъёсыз$3 $4"; +"notifications_comment_under" = "$1 кельтыса(-ла) улэ комментарий $2"; +"notifications_under_note" = "тон $3заметкой$4"; +"notifications_under_photo" = "тон $туспуктэм 3$4"; +"notifications_under_post" = "тон $гожъян 3$4 $5" - лы"; +"notifications_under_video" = "тон $video 3$4"; +"notifications_post" = "$1 гожтэ(-ла) $2 гожъямъёсыз$борддоръёсыз вылэ-тонэ 3: $4"; +"notifications_appoint" = "$1 сообщество тон дасямын кивалтӥсез $2"; -"nt_liked_yours" = "понравился ваш"; -"nt_shared_yours" = "поделился(-ась) вашим"; -"nt_commented_yours" = "оставил(а) комментарий под"; -"nt_written_on_your_wall" = "написал(а) на вашей стене"; -"nt_made_you_admin" = "назначил(а) вас руководителем сообщества"; +"nt_liked_yours" = "тыныд кельше"; +"nt_shared_yours" = "paylaş(-аса) тон"; +"nt_commented_yours" = "кельты(а) комментарий улын"; +"nt_written_on_your_wall" = "гожтыны(а) ас вылэ борддор"; +"nt_made_you_admin" = "висъяськы(нош) тон кивалтӥсез сообщество"; -"nt_from" = "от"; -"nt_yours_adjective" = "вашим"; -"nt_yours_feminitive_adjective" = "вашей"; -"nt_post_nominative" = "пост"; -"nt_post_instrumental" = "постом"; -"nt_note_instrumental" = "заметкой"; -"nt_photo_instrumental" = "фотографией"; -"nt_topic_instrumental" = "темой"; +"nt_from" = "дор"; +"nt_yours_adjective" = "тон"; +"nt_yours_feminitive_adjective" = "тон"; +"nt_post_nominative" = "кӧс"; +"nt_post_instrumental" = "кӧс"; +"nt_note_instrumental" = "заметка"; +"nt_photo_instrumental" = "туспуктэмъёс"; +"nt_topic_instrumental" = "темая"; /* Time */ -"time_at_sp" = " в "; -"time_just_now" = "только что"; -"time_exactly_five_minutes_ago" = "ровно 5 минут назад"; -"time_minutes_ago" = "$1 минут назад"; -"time_today" = "сегодня"; -"time_yesterday" = "вчера"; +"time_at_sp" = " ын "; +"time_just_now" = "гинэ мар"; +"time_exactly_five_minutes_ago" = "5 минутлы азьло ӵапак"; +"time_minutes_ago" = "$1 минутэ учке"; +"time_today" = "туннэ"; +"time_yesterday" = "толон"; "points" = "Голоса"; "points_count" = "голосов"; "on_your_account" = "на вашем счету"; -"vouchers" = "Ваучеры"; -"have_voucher" = "Есть ваучер"; -"voucher_token" = "Код ваучера"; -"voucher_activators" = "Воспользовавшиеся"; -"voucher_explanation" = "Введите серийный номер ваучера. Обычно он указан в чеке или в сообщении."; -"voucher_explanation_ex" = "Обратите внимание, что ваучеры могут истекать и воспользоваться ими можно только один раз."; -"invalid_voucher" = "Ваучер недействительный"; -"voucher_bad" = "Возможно, вы ввели неверный серийный номер, уже использовали данный ваучер или же он просто истёк."; -"voucher_good" = "Ваучер активирован"; -"voucher_redeemed" = "Ваучер был успешно активирован. Вам будут начислены голоса, но этим кодом вы больше не сможете активировать его."; -"redeem" = "Активировать ваучер"; +"vouchers" = "Ваучеръёсты"; +"have_voucher" = "Вал, ваучеръёсты"; +"voucher_token" = "Кода ваучеръёсты"; +"voucher_activators" = "Бен"; +"voucher_explanation" = "ваучеръёс серийный номеръёс пыртылэмын. Ӵогын яке огшоры верам соосыз возьмало."; +"voucher_explanation_ex" = "учкы, мар со луыны быгатоз одӥг пол гинэ но ваучеръёсмес луонлык быриз."; +"invalid_voucher" = "недействительный ваучеръёсты"; +"voucher_bad" = "оло, тӥ пыр серийный номерзэ шонертэм, бырыны-а сётэм яке со ваучеръёсыз огшоры ик кутэ ини."; +"voucher_good" = "активировать ваучеръёсты"; +"voucher_redeemed" = "активировать Ваучеръёс-йыг вал. Тон куара начислить карем вал, уг быгаты тынэсьтыд сое но та активировать кода."; +"redeem" = "Активировать ваучеръёсты"; "deactivate" = "Деактивировать"; -"usages_total" = "Количество использований"; -"usages_left" = "Осталось использований"; +"usages_total" = "ужатонъя лыд"; +"usages_left" = "Кылем ужатонъя"; "points_transfer_dialog_header_1" = "Вы можете отправить в подарок или передать часть голосов другому человеку."; "points_transfer_dialog_header_2" = "Ваш текущий баланс:"; @@ -576,18 +576,18 @@ /* Gifts */ -"gift" = "Подарок"; -"gifts" = "Подарки"; -"gifts_zero" = "Нет подарков"; -"gifts_one" = "Один подарок"; -"gifts_few" = "$1 подарка"; -"gifts_many" = "$1 подарков"; -"gifts_other" = "$1 подарков"; -"gifts_left" = "Подарков осталось: $1"; -"gifts_left_one" = "Один подарок остался"; -"gifts_left_few" = "$1 подарка осталось"; -"gifts_left_many" = "$1 подарков осталось"; -"gifts_left_other" = "$1 подарков осталось"; +"gift" = "Кузьым"; +"gifts" = "Кузьым"; +"gifts_zero" = "кузьым Ӧвӧл"; +"gifts_one" = "одӥг кузьым"; +"gifts_few" = "$1 кузьым"; +"gifts_many" = "$1 кузьым"; +"gifts_other" = "$1 кузьым"; +"gifts_left" = "Кузьым кыльы: $1"; +"gifts_left_one" = "кылиз одӥг кузьым"; +"gifts_left_few" = "$1 кылем кузьым"; +"gifts_left_menu" = "$1 кылем кузьым"; +"gifts_left_other" = "$1 кылем кузьым"; "send_gift" = "Отправить подарок"; @@ -609,16 +609,16 @@ /* Support */ -"support_opened" = "Открытые"; -"support_answered" = "С ответом"; -"support_closed" = "Закрытые"; -"support_ticket" = "Обращение"; -"support_tickets" = "Обращения"; -"support_status_0" = "Вопрос на рассмотрении"; -"support_status_1" = "Есть ответ"; -"support_status_2" = "Закрыто"; -"support_greeting_hi" = "Здравствуйте, $1!"; -"support_greeting_regards" = "С уважением,
команда поддержки $1."; +"support_opened" = "Буш"; +"support_answered" = "Ӵош ответ"; +"support_closed" = "Ворсамын"; +"support_ticket" = "Обращениез"; +"support_tickets" = "Обращениез"; +"support_status_0" = "Юан эскеремын"; +"support_status_1" = "Луэ ответ"; +"support_status_2" = "Ворсамын"; +"support_greeting_hi" = "ӟеч-а, бур - $1!"; +"support_greeting_regards" = "гажамысь,
команда юрттэт $1."; "support_faq" = "Часто задаваемые вопросы"; "support_list" = "Список обращений"; @@ -630,15 +630,15 @@ "support_new_title" = "Введите тему вашего обращения"; "support_new_content" = "Опишите проблему или предложение"; -"support_rate_good_answer" = "Это хороший ответ"; -"support_rate_bad_answer" = "Это плохой ответ"; -"support_good_answer_user" = "Вы оставили положительный отзыв."; -"support_bad_answer_user" = "Вы оставили негативный отзыв."; -"support_good_answer_agent" = "Пользователь оставил положительный отзыв"; -"support_bad_answer_agent" = "Пользователь оставил негативный отзыв"; -"support_rated_good" = "Вы оставили положительный отзыв об ответе."; -"support_rated_bad" = "Вы оставили негативный отзыв об ответе."; -"wrong_parameters" = "Неверные параметры запроса."; +"support_rate_good_answer" = "та умой ответ"; +"support_rate_bad_answer" = "уродзэ та ответ"; +"support_good_answer_user" = "положительной отзыв тон кельты."; +"support_bad_answer_user" = "негативный отзыв тон кельты."; +"support_good_answer_agent" = "Пользователь кельто положительной отзыв"; +"support_bad_answer_agent" = "Пользователь негативный кельто отзыв"; +"support_rated_good" = "тон сярысь веранзэ азьланьтэ отзыв кельто."; +"support_rated_bad" = "тыныд ответ кельто негативный сярысь отзывъёссэс."; +"wrong_parameters" = "запрос параметръёсты оскытылӥзы."; "fast_answers" = "Быстрые ответы"; @@ -684,7 +684,7 @@ "topic_messages_count_other" = "В теме $1 сообщений"; "replied" = "ответил"; -"create_topic" = "Создать тему"; +"create_topic" = "Кылдӥз тему"; "new_topic" = "Новая тема"; "title" = "Заголовок"; @@ -710,18 +710,18 @@ "topic_changes_saved_comment" = "Обновлённый заголовок и настройки появятся на странице с темой."; -"failed_to_create_topic" = "Не удалось создать тему"; +"failed_to_create_topic" = "Не удалось кылдӥз тему"; "failed_to_change_topic" = "Не удалось изменить тему"; "no_title_specified" = "Заголовок не указан."; /* Errors */ "error_1" = "Некорректный запрос"; -"error_2" = "Неверный логин или пароль"; -"error_3" = "Не авторизован"; -"error_4" = "Пользователь не существует"; -"information_-1" = "Операция выполнена успешно"; -"information_-2" = "Вход выполнен успешно"; +"error_2" = "Логин пароль яке Мыдлань"; +"error_3" = "Уг авторизовать"; +"error_4" = "уг уло Пользователь"; +"information_-1" = "операциосты быдэсъяны йыг"; +"information_-2" = "йыг пырон быдэстэм"; "no_data" = "Нет данных"; "no_data_description" = "Ивортодэт татын ӧвӧл татын."; @@ -779,35 +779,35 @@ /* Admin actions */ -"login_as" = "Войти как $1"; -"manage_user_action" = "Управление пользователем"; -"manage_group_action" = "Управление группой"; -"ban_user_action" = "Заблокировать пользователя"; -"warn_user_action" = "Предупредить пользователя"; +"login_as" = "кызьы пыриды $1"; +"manage_user_action" = "граждан Управление"; +"manage_group_action" = "клуб Управление"; +"ban_user_action" = "граждан Заблокировать"; +"warn_user_action" = "граждан Шӧдытыны"; /* Paginator (deprecated) */ -"paginator_back" = "Назад"; -"paginator_page" = "Страница $1"; -"paginator_next" = "Дальше"; +"paginator_back" = "Берлань"; +"paginator_page" = "Бам $1"; +"paginator_next" = "Кыдёке"; /* About */ -"about_openvk" = "Об OpenVK"; +"about_openvk" = "Сярысь органъёс OpenVK"; /* Dialogs */ -"ok" = "ОК"; -"yes" = "Да"; -"no" = "Нет"; -"cancel" = "Отмена"; -"edit_action" = "Изменить"; -"transfer" = "Передать"; -"close" = "Закрыть"; +"ok" = "ӜОГ"; +"yes" = "Я"; +"no" = "Ӧвӧл"; +"cancel" = "Воштон"; +"edit_action" = "Воштоз"; +"transfer" = "Дышетон"; +"close" = "Ворсамын"; -"warning" = "Внимание"; -"question_confirm" = "Это действие нельзя отменить. Вы действительно уверены в том что хотите сделать?"; +"warning" = "Айкай"; +"question_confirm" = "Та ужме уг вошты. Зэм но, мар каремзы потэ, тон солы оскиськод-а?"; /* User alerts */ -"user_alert_scam" = "На этот аккаунт много жаловались в связи с мошенничеством. Пожалуйста, будьте осторожны, особенно если у вас попросят денег."; +"user_alert_scam" = "мошенничество тросгес герӟаськемын та to вылэ ӝожтӥсько. Пожалуйста, сак луыны, уката ик дорын тонэ уксё куре ке."; \ No newline at end of file From faa1553583e46438cdab4facd7891bca95bff02b Mon Sep 17 00:00:00 2001 From: MaksimMohooks Date: Mon, 10 Jan 2022 10:32:31 +0300 Subject: [PATCH 05/81] Fix udm strings --- locales/udm.strings | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locales/udm.strings b/locales/udm.strings index 2a8f7bf8..ea90a780 100644 --- a/locales/udm.strings +++ b/locales/udm.strings @@ -472,14 +472,14 @@ "videos" = "Видеозапись"; "video" = "Видеозапись"; -"upload_video" = "video Etkileşimli"; -"video_uploaded" = "Etkileşimli"; +"upload_video" = "Загрузить видео"; +"video_uploaded" = "Загружено"; "video_updated" = "- лэн выльдэм"; "video_link_to_yt" = "вылэ Ссылка YouTube"; "info_name" = "Нимыза"; "info_description" = "Кылсуред"; -"info_uploaded_by" = "Etkileşimli"; +"info_uploaded_by" = "Загрузил"; "info_upload_date" = "загрузка Дыр"; "videos_zero" = "одӥг но видеозапись"; @@ -627,8 +627,8 @@ "support_faq_title" = "Для кого этот сайт?"; "support_faq_content" = "Сайт предназначен для поиска друзей и знакомых, а также для просмотра данных пользователя. Это как справочник города, с помощью которого люди могут быстро найти актуальную информацию о человеке."; -"support_new_title" = "Введите тему вашего обращения"; -"support_new_content" = "Опишите проблему или предложение"; +"support_new_title" = "Темая-лэсь вазиськонэ пыртӥзы"; +"support_new_content" = "Гожтэмын яке предложениосты ужпум"; "support_rate_good_answer" = "та умой ответ"; "support_rate_bad_answer" = "уродзэ та ответ"; From f7b060fa082579b2cac7fcb5ea3fd7bb799695e3 Mon Sep 17 00:00:00 2001 From: MaksimMohooks Date: Mon, 10 Jan 2022 10:45:57 +0300 Subject: [PATCH 06/81] Update udm strings --- locales/udm.strings | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/udm.strings b/locales/udm.strings index ea90a780..6fab3566 100644 --- a/locales/udm.strings +++ b/locales/udm.strings @@ -472,14 +472,14 @@ "videos" = "Видеозапись"; "video" = "Видеозапись"; -"upload_video" = "Загрузить видео"; -"video_uploaded" = "Загружено"; +"upload_video" = "Ватсаны видео"; +"video_uploaded" = "Ватсаны"; "video_updated" = "- лэн выльдэм"; "video_link_to_yt" = "вылэ Ссылка YouTube"; "info_name" = "Нимыза"; "info_description" = "Кылсуред"; -"info_uploaded_by" = "Загрузил"; +"info_uploaded_by" = "Ватсаны"; "info_upload_date" = "загрузка Дыр"; "videos_zero" = "одӥг но видеозапись"; From 94cc24c65e711f68b707186f284e71b2c56b2f17 Mon Sep 17 00:00:00 2001 From: Ilya Prokopenko Date: Wed, 12 Jan 2022 23:01:06 +0700 Subject: [PATCH 07/81] Global: Fix textarea [CSS] --- Web/static/css/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/Web/static/css/style.css b/Web/static/css/style.css index 9349f9bb..411d6119 100644 --- a/Web/static/css/style.css +++ b/Web/static/css/style.css @@ -1149,6 +1149,7 @@ textarea { width: 100%; padding: 4px; resize: none; + box-sizing: border-box; } #faqhead { From 5d6293405390420af4616325b83aa0e8b22e4673 Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Sat, 15 Jan 2022 17:15:37 +0200 Subject: [PATCH 08/81] VKAPI: A simple but incompatible implementation of attaching media to posts --- VKAPI/Handlers/Wall.php | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/VKAPI/Handlers/Wall.php b/VKAPI/Handlers/Wall.php index 203265b5..9c09a3ba 100644 --- a/VKAPI/Handlers/Wall.php +++ b/VKAPI/Handlers/Wall.php @@ -130,12 +130,43 @@ final class Wall extends VKAPIRequestHandler if($canPost == false) $this->fail(15, "Access denied"); + $anon = OPENVK_ROOT_CONF["openvk"]["preferences"]["wall"]["anonymousPosting"]["enable"]; + if($wallOwner instanceof Club && $from_group == 1 && $signed != 1 && $anon) { + $manager = $wallOwner->getManager($this->getUser()); + if($manager) + $anon = $manager->isHidden(); + elseif($this->getUser()->getId() === $wallOwner->getOwner()->getId()) + $anon = $wallOwner->isOwnerHidden(); + } else { + $anon = false; + } + $flags = 0; if($from_group == 1) $flags |= 0b10000000; if($signed == 1) $flags |= 0b01000000; + // TODO: Compatible implementation of this + try { + $photo = null; + $video = null; + if($_FILES["photo"]["error"] === UPLOAD_ERR_OK) { + $album = null; + if(!$anon && $owner_id > 0 && $owner_id === $this->getUser()->getId()) + $album = (new AlbumsRepo)->getUserWallAlbum($wallOwner); + + $photo = Photo::fastMake($this->getUser()->getId(), $message, $_FILES["photo"], $album, $anon); + } + + if($_FILES["video"]["error"] === UPLOAD_ERR_OK) + $video = Video::fastMake($this->getUser()->getId(), $message, $_FILES["video"], $anon); + } catch(\DomainException $ex) { + $this->fail(-156, "The media file is corrupted"); + } catch(ISE $ex) { + $this->fail(-156, "The media file is corrupted or too large "); + } + try { $post = new Post; $post->setOwner($this->getUser()->getId()); @@ -148,6 +179,12 @@ final class Wall extends VKAPIRequestHandler $this->fail(100, "One of the parameters specified was missing or invalid"); } + if(!is_null($photo)) + $post->attach($photo); + + if(!is_null($video)) + $post->attach($video); + if($wall > 0 && $wall !== $this->user->identity->getId()) (new WallPostNotification($wallOwner, $post, $this->user->identity))->emit(); From a81e9ac704540adfe833f14d37b3e558819162fc Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Sat, 15 Jan 2022 17:51:04 +0200 Subject: [PATCH 09/81] VKAPI: Remove the ability for those who are not group administrators to publish posts on behalf of the group --- VKAPI/Handlers/Wall.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VKAPI/Handlers/Wall.php b/VKAPI/Handlers/Wall.php index 9c09a3ba..cb8a1ca2 100644 --- a/VKAPI/Handlers/Wall.php +++ b/VKAPI/Handlers/Wall.php @@ -142,7 +142,7 @@ final class Wall extends VKAPIRequestHandler } $flags = 0; - if($from_group == 1) + if($from_group == 1 && $wallOwner instanceof Club && $wallOwner->canBeModifiedBy($this->getUser())) $flags |= 0b10000000; if($signed == 1) $flags |= 0b01000000; From dd236c003423757102412491f135c8d5ac56c2cf Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Sat, 15 Jan 2022 18:50:03 +0200 Subject: [PATCH 10/81] VKAPI: Add the ability to publish posts only with media --- VKAPI/Handlers/Wall.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/VKAPI/Handlers/Wall.php b/VKAPI/Handlers/Wall.php index cb8a1ca2..530c8aa4 100644 --- a/VKAPI/Handlers/Wall.php +++ b/VKAPI/Handlers/Wall.php @@ -110,7 +110,7 @@ final class Wall extends VKAPIRequestHandler ]; } - function post(string $owner_id, string $message, int $from_group = 0, int $signed = 0): object + function post(string $owner_id, string $message = "", int $from_group = 0, int $signed = 0): object { $this->requireUser(); @@ -167,6 +167,9 @@ final class Wall extends VKAPIRequestHandler $this->fail(-156, "The media file is corrupted or too large "); } + if(empty($message) && !$photo && !$video) + $this->fail(100, "Required parameter 'message' missing."); + try { $post = new Post; $post->setOwner($this->getUser()->getId()); From 5e80477ae2bace8162cf3e4fb0b10af4066e5168 Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Sat, 15 Jan 2022 19:41:39 +0200 Subject: [PATCH 11/81] Admin: Add ability to disable display of group posts in the global feed --- Web/Presenters/AdminPresenter.php | 1 + Web/Presenters/templates/Admin/Club.xml | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/Web/Presenters/AdminPresenter.php b/Web/Presenters/AdminPresenter.php index 0199f38d..9c356d55 100644 --- a/Web/Presenters/AdminPresenter.php +++ b/Web/Presenters/AdminPresenter.php @@ -109,6 +109,7 @@ final class AdminPresenter extends OpenVKPresenter $club->setAbout($this->postParam("about")); $club->setShortCode($this->postParam("shortcode")); $club->setVerified(empty($this->postParam("verify") ? 0 : 1)); + $club->setHide_From_Global_Feed(empty($this->postParam("hide_from_global_feed") ? 0 : 1)); $club->save(); break; case "ban": diff --git a/Web/Presenters/templates/Admin/Club.xml b/Web/Presenters/templates/Admin/Club.xml index a29b0ff4..c79a3cf7 100644 --- a/Web/Presenters/templates/Admin/Club.xml +++ b/Web/Presenters/templates/Admin/Club.xml @@ -79,6 +79,12 @@ Верификация +
+ isHideFromGlobalFeedEnabled()} checked {/if} /> + +

From 7508030909c66c75fc02f9767f9be75eb855d1cf Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Sun, 16 Jan 2022 00:03:35 +0200 Subject: [PATCH 12/81] About: Fix parsing Textile files in knowledgebase --- Web/Presenters/SupportPresenter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Web/Presenters/SupportPresenter.php b/Web/Presenters/SupportPresenter.php index 52a2f635..03e14801 100644 --- a/Web/Presenters/SupportPresenter.php +++ b/Web/Presenters/SupportPresenter.php @@ -219,7 +219,7 @@ final class SupportPresenter extends OpenVKPresenter array_shift($lines); } - $content = implode("\r\n", $lines); + $content = implode($lines); $parser = new Textile\Parser; $this->template->heading = $heading; From fde35e40a65244855ab12559f7dd8a0007ef267e Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Sun, 16 Jan 2022 00:39:48 +0200 Subject: [PATCH 13/81] About: Rewrite the default rules They have become shorter and clearer. References to the official instance have been removed. An English version of the rules has also been added. --- data/knowledgebase/rules.ru.textile | 83 ++++++++++++----------------- data/knowledgebase/rules.textile | 42 ++++++++++++++- 2 files changed, 75 insertions(+), 50 deletions(-) diff --git a/data/knowledgebase/rules.ru.textile b/data/knowledgebase/rules.ru.textile index 7e048255..08c6afbb 100644 --- a/data/knowledgebase/rules.ru.textile +++ b/data/knowledgebase/rules.ru.textile @@ -1,58 +1,43 @@ OpenVK-KB-Heading: Правила -Добро пожаловать на *инстанцию OpenVK* имени Веселкрафта. OpenVK -- социальная сеть с открытым исходным кодом, которая помогает людям поддерживать связь со своими друзьями и заводить новых. -Администрация этой инстанции разрешает вам пользоваться ею на условиях, которые определены в этом документе (далее по тексту - правила). +Администрация сайта разрешает Вам пользоваться сайтом на условиях, которые определены в этих правилах. +Делать можно всё то, что не относится к запрещённым действиям, а к ним относятся: -h3. Статус этих правил +# Отказ от подчинения правилам или их игнорирование, +# Отказ от своевременного исполнения запросов агентов тех. поддержки или администрации, +# Использование чужих страниц без разрешения владельца, +# Выдача себя за других людей для получения выгоды. Исключения: +## Человек разрешил использование своей личности, +## Человек является оригинальным персонажем, принадлежащим Вам +# Создание массовых рассылок любым способом, +# Создание ситуаций, любым образом мешающих работе OpenVK, +# Публикация и хранение на ресурсе любого содержимого, которое: +## Является незаконным на территории Франции или Вашей страны проживания, +## Содержит порнографические сцены с участием лиц младше 18 лет, +## Содержит рекламу запрещенных в Франции или Вашей стране проживания препаратов или инструкции по их приготовлению, +## Содержит информацию, запрещённую на территории Франции или Вашей страны проживания, +## Содержит сцены бесчеловечного обращения с людьми или животными, +## Нарушает авторские и смежные права, +## Нарушает права человека, +## Мешает пользователям исполнять правила или нормально пользоваться услугами, предоставляемыми проектом OpenVK. -Эти правила являются черновиком. Мы их ещё дорабатываем и приниманием предложения от пользователей. Но не смотря на это, эти правила всё равно действуют и к Вам могут быть применены санкции из-за их нарушения. -Эти правила могут изменяться без уведомления. Продолжение использования инстанции OpenVK будет означать согласие с ними. +Администрация является высшим органом власти, имеющим полное право принимать решения насчёт спорных ситуаций, не описанных в правилах. -h3. Область действия этих правил +Администрация может выдать наказание, если пользователи: -Эти правила распостраняются только на эту инстанцию OpenVK, а именно на всё, что расположено на домене openvk2.veselcraft.ru (включая все его поддомены). -За пределами этой инстанции правила не действуют и Вы в праве делать всё, что посчитаете нужным. +# Публикуют запрещённый контент на страницах других пользователей, +# Обманывают администрацию или агентов тех. поддержки, +# Вводят в заблуждение пользователей сайта, +# Публично критикуют OpenVK или администрацию с целью унизить или оскорбить участников проекта или его руководителей, +# Забанены в официальных чатах OpenVK в Telegram, +# Не уважают администрацию проекта или агентов тех. поддержки. -h3. Что можно делать? +При нарушении правил, администрация может: -Делать можно всё, что не запрещено. А запрещено: -# Не следовать правилам -# Не отвечать своевременно на запросы от техподдержки или Администрации -# Выдавать себя за других людей -## Если это не было разрешено явно другим человеком -## Если другой человек на самом деле оригинальный персонаж, который принадлежит Вам -## Также нельзя заходить на чужие страницы без разрешения (взлом жопы) -# Делать массовые рассылки любым способом -# Мешать любым образом работе OpenVK -# Загружать на сайт и с сайта любым образом любое содержимое, которое: -## Не является законным на територии Нидерландов и Вашей страны проживания: -### Содержит порнографию с участием несовершеннолетних лиц -#### Если эти лица не являются вымышленными персонажами -### Содержит рекламу наркотических препаратов или инструкции по их приготовлению -### Содержит информацию закрытого доступа -### Содержит сцены бесчеловечного обращения с животными -### Нарушает авторские и смежные права -### Нарушает права человека -## Содержит спойлеры -## Мешает другим пользователям исполнять правила -## Мешает другим пользователям нормально пользоваться OpenVK -## Администрация может посчитать недопустимым -# Загружать "adult"-контент на страницах других пользователей без разрешения -# Обманывать Администрацию и/или _неопределённую_ группу пользователей -## Неопределённа группа пользователей -- пользователи, которых вы не знаете. Обманывать своих друзей можно. -# Оскорблять OpenVK и/или Администрацию -## Если это не оправданно -# Быть забаненным в OpenVK Chat, /KDE/ или в чате, который располагается по имени traintovos -# Не уважать Веселкрафта, Косфурлера и Джилл +# Проигнорировать нарушение, являющееся незначительным, +# Вынести пользователю предупреждение, +# Выдать временную или постоянную блокировку, +# Запретить в будущем пользоваться этим сайтом, +# Удалить аккаунт или запрещенный контент. -h3. Санкции за нарушение правил - -За нарушение этих правил, мы можем: -# Проигнорировать нарушение -# Вынести Вам устное предуреждение -# Выдать временную или постоянную блокировку -# Запретить Вам в будущем пользоваться этой инстанцией -# Удалить Ваш контент и/или аккаунт - -Определение наказания и его последующее исполнение - обязанность Администрации. -Также мы оставляем за собой право применить санкции к Вам не объясняя причин (если они вообще будут). +Администрация может выдавать наказания без объяснения причины (даже если таковая имеется). diff --git a/data/knowledgebase/rules.textile b/data/knowledgebase/rules.textile index dacf1de9..7fd2adc3 100644 --- a/data/knowledgebase/rules.textile +++ b/data/knowledgebase/rules.textile @@ -1,3 +1,43 @@ OpenVK-KB-Heading: Rules -Sample rules +The site administration allows you to use the site on the terms specified in these rules. +You can do everything that does not apply to prohibited actions, but they include: + +# Refusing to obey the rules or ignoring them, +# Waiver of the mandatory presence of representatives of tech support agents or administration, +# Using other people's pages without the permission of the owner, +# Impersonating other people for gain. Exceptions: +## The person has allowed the use of his identity, +## The person is an original character belonging to you +# Creation of mass mailings in any way, +# Creating situations that in any way interfere with the operation of OpenVK, +# The publication and storage on the resource of any content that: +## Is illegal in France or your country of residence, +## Contains pornographic scenes involving persons under the age of 18, +## Contains advertisements for drugs banned in France or your country of residence or instructions for their preparation, +## Contains information prohibited in France or your country of residence, +## Contains scenes of inhuman treatment of people or animals, +## Violates copyright and related rights, +## Violates human rights +## Prevents users from following the rules or from properly using the services provided by the OpenVK project. + +The administration is the highest authority that has the full right to make decisions about disputes that are not described in the rules. + +The administration may issue a punishment if users: + +# Post prohibited content on the pages of other users, +# They deceive the administration or tech support agents, +# Mislead website users, +# Publicly criticize OpenVK or the administration in order to humiliate or insult project participants or its leaders +# Banned from official OpenVK chats on Telegram, +# They do not respect the Project administration or tech support agents. + +In case of violation of the rules, the administration can: + +# Ignore a violation that is minor, +# Issue a warning to the user +# Issue a temporary or permanent ban, +# Prohibit future use of this site, +# Remove account or prohibited content. + +The administration can issue punishments without giving a reason (even if there is one). From 217463e55484c18e264671520a43c52e65258ae1 Mon Sep 17 00:00:00 2001 From: Ilya Prokopenko Date: Sun, 16 Jan 2022 12:09:05 +0300 Subject: [PATCH 14/81] Global: Replacing Textile with Markdown Closes #293 --- Web/Presenters/SupportPresenter.php | 15 +- composer.json | 4 +- composer.lock | 194 ++++++++---------- .../knowledgebase/{about.textile => about.md} | 2 +- .../{about.ru.textile => about.ru.md} | 2 +- .../{donate.textile => donate.md} | 0 .../{donate.ru.textile => donate.ru.md} | 0 .../knowledgebase/{notes.textile => notes.md} | 9 +- .../{notes.ru.textile => notes.ru.md} | 4 + .../{points.textile => points.md} | 4 +- .../{points.ru.textile => points.ru.md} | 6 +- .../{privacy.textile => privacy.md} | 14 +- .../{privacy.ru.textile => privacy.ru.md} | 14 +- data/knowledgebase/rules.md | 44 ++++ data/knowledgebase/rules.ru.md | 44 ++++ data/knowledgebase/rules.ru.textile | 43 ---- data/knowledgebase/rules.textile | 43 ---- data/rules.xhtml | 1 - 18 files changed, 219 insertions(+), 224 deletions(-) rename data/knowledgebase/{about.textile => about.md} (80%) rename data/knowledgebase/{about.ru.textile => about.ru.md} (82%) rename data/knowledgebase/{donate.textile => donate.md} (100%) rename data/knowledgebase/{donate.ru.textile => donate.ru.md} (100%) rename data/knowledgebase/{notes.textile => notes.md} (69%) rename data/knowledgebase/{notes.ru.textile => notes.ru.md} (99%) rename data/knowledgebase/{points.textile => points.md} (87%) rename data/knowledgebase/{points.ru.textile => points.ru.md} (52%) rename data/knowledgebase/{privacy.textile => privacy.md} (90%) rename data/knowledgebase/{privacy.ru.textile => privacy.ru.md} (90%) create mode 100644 data/knowledgebase/rules.md create mode 100644 data/knowledgebase/rules.ru.md delete mode 100644 data/knowledgebase/rules.ru.textile delete mode 100644 data/knowledgebase/rules.textile delete mode 100644 data/rules.xhtml diff --git a/Web/Presenters/SupportPresenter.php b/Web/Presenters/SupportPresenter.php index 03e14801..d644deb1 100644 --- a/Web/Presenters/SupportPresenter.php +++ b/Web/Presenters/SupportPresenter.php @@ -6,7 +6,7 @@ use openvk\Web\Models\Entities\TicketComment; use openvk\Web\Models\Repositories\TicketComments; use openvk\Web\Util\Telegram; use Chandler\Session\Session; -use Netcarver\Textile; +use Parsedown; final class SupportPresenter extends OpenVKPresenter { @@ -204,10 +204,10 @@ final class SupportPresenter extends OpenVKPresenter { $lang = Session::i()->get("lang", "ru"); $base = OPENVK_ROOT . "/data/knowledgebase"; - if(file_exists("$base/$name.$lang.textile")) - $file = "$base/$name.$lang.textile"; - else if(file_exists("$base/$name.textile")) - $file = "$base/$name.textile"; + if(file_exists("$base/$name.$lang.md")) + $file = "$base/$name.$lang.md"; + else if(file_exists("$base/$name.md")) + $file = "$base/$name.md"; else $this->notFound(); @@ -221,9 +221,10 @@ final class SupportPresenter extends OpenVKPresenter $content = implode($lines); - $parser = new Textile\Parser; + $parser = new Parsedown(); + $parser->setSafeMode(true); $this->template->heading = $heading; - $this->template->content = $parser->parse($content); + $this->template->content = $parser->text($content); } function renderRateAnswer(int $id, int $mark): void diff --git a/composer.json b/composer.json index 46f58e0d..396eea06 100644 --- a/composer.json +++ b/composer.json @@ -7,13 +7,13 @@ "james-heinrich/getid3": "^1.9@dev", "rybakit/msgpack": "dev-master", "wapmorgan/binary-stream": "dev-master", - "netcarver/textile": "^3.7@dev", "al/emoji-detector": "dev-master", "ezyang/htmlpurifier": "dev-master", "scssphp/scssphp": "dev-master", "lfkeitel/phptotp": "dev-master", "chillerlan/php-qrcode": "dev-main", - "vearutop/php-obscene-censor-rus": "dev-master" + "vearutop/php-obscene-censor-rus": "dev-master", + "erusev/parsedown": "dev-master" }, "minimum-stability": "dev" } diff --git a/composer.lock b/composer.lock index 2a289d49..8ad0ecb4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "770bb7b5fdc8074bb03f5c2a762914fe", + "content-hash": "3816f5fbf2c78a3e252637476cd2ae08", "packages": [ { "name": "al/emoji-detector", @@ -58,12 +58,12 @@ "source": { "type": "git", "url": "https://github.com/chillerlan/php-qrcode.git", - "reference": "0c1f322476a090b945108e6df960ee381a8c352e" + "reference": "06730361508c283a02bbf9cbc9e4b55e7b3bc88b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/0c1f322476a090b945108e6df960ee381a8c352e", - "reference": "0c1f322476a090b945108e6df960ee381a8c352e", + "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/06730361508c283a02bbf9cbc9e4b55e7b3bc88b", + "reference": "06730361508c283a02bbf9cbc9e4b55e7b3bc88b", "shasum": "" }, "require": { @@ -138,7 +138,7 @@ "type": "ko_fi" } ], - "time": "2021-12-12T23:34:10+00:00" + "time": "2021-12-14T15:11:20+00:00" }, { "name": "chillerlan/php-settings-container", @@ -203,26 +203,74 @@ ], "time": "2021-09-06T15:17:01+00:00" }, + { + "name": "erusev/parsedown", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "6598f3860c2698fe2f0f1bc98212fc01d0a1893c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/6598f3860c2698fe2f0f1bc98212fc01d0a1893c", + "reference": "6598f3860c2698fe2f0f1bc98212fc01d0a1893c", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "support": { + "issues": "https://github.com/erusev/parsedown/issues", + "source": "https://github.com/erusev/parsedown/tree/master" + }, + "time": "2020-08-09T14:12:21+00:00" + }, { "name": "ezyang/htmlpurifier", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "996eaf43310edf1d908bc0030a18b37b8cf6eefd" + "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/996eaf43310edf1d908bc0030a18b37b8cf6eefd", - "reference": "996eaf43310edf1d908bc0030a18b37b8cf6eefd", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/12ab42bd6e742c70c0a52f7b82477fcd44e64b75", + "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75", "shasum": "" }, "require": { "php": ">=5.2" }, - "require-dev": { - "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" - }, "default-branch": true, "type": "library", "autoload": { @@ -254,9 +302,9 @@ ], "support": { "issues": "https://github.com/ezyang/htmlpurifier/issues", - "source": "https://github.com/ezyang/htmlpurifier/tree/master" + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.14.0" }, - "time": "2021-09-07T18:16:55+00:00" + "time": "2021-12-25T01:21:49+00:00" }, { "name": "guzzlehttp/guzzle", @@ -357,12 +405,12 @@ "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0" + "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/136a635e2b4a49b9d79e9c8fee267ffb257fdba0", - "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0", + "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", "shasum": "" }, "require": { @@ -418,7 +466,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.0" + "source": "https://github.com/guzzle/promises/tree/1.5.1" }, "funding": [ { @@ -434,7 +482,7 @@ "type": "tidelift" } ], - "time": "2021-10-07T13:05:22+00:00" + "time": "2021-10-22T20:56:57+00:00" }, { "name": "guzzlehttp/psr7", @@ -552,12 +600,12 @@ "source": { "type": "git", "url": "https://github.com/JamesHeinrich/getID3.git", - "reference": "a440175a329a83dbfad991e67b5e5f3a1ff51bd9" + "reference": "46346ff3bea96a63f1a1d58ee4eabc79471d0ec8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JamesHeinrich/getID3/zipball/a440175a329a83dbfad991e67b5e5f3a1ff51bd9", - "reference": "a440175a329a83dbfad991e67b5e5f3a1ff51bd9", + "url": "https://api.github.com/repos/JamesHeinrich/getID3/zipball/46346ff3bea96a63f1a1d58ee4eabc79471d0ec8", + "reference": "46346ff3bea96a63f1a1d58ee4eabc79471d0ec8", "shasum": "" }, "require": { @@ -612,7 +660,7 @@ "issues": "https://github.com/JamesHeinrich/getID3/issues", "source": "https://github.com/JamesHeinrich/getID3/tree/master" }, - "time": "2021-10-07T12:08:13+00:00" + "time": "2022-01-03T16:59:52+00:00" }, { "name": "komeiji-satori/curl", @@ -706,66 +754,6 @@ }, "time": "2017-02-06T17:46:14+00:00" }, - { - "name": "netcarver/textile", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/textile/php-textile.git", - "reference": "d64e1f8424afd600cc2732f4f99f262aef55fca2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/textile/php-textile/zipball/d64e1f8424afd600cc2732f4f99f262aef55fca2", - "reference": "d64e1f8424afd600cc2732f4f99f262aef55fca2", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "2.1.*", - "phpunit/phpunit": "5.7.*", - "squizlabs/php_codesniffer": "3.*", - "symfony/yaml": "2.4.*" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - }, - "autoload": { - "psr-4": { - "Netcarver\\Textile\\": "src/Netcarver/Textile/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Textile markup language parser", - "homepage": "https://github.com/textile/php-textile", - "keywords": [ - "document", - "format", - "html", - "language", - "markup", - "parser", - "php-textile", - "plaintext", - "textile" - ], - "support": { - "irc": "irc://irc.freenode.net/textile", - "issues": "https://github.com/textile/php-textile/issues", - "source": "https://github.com/textile/php-textile", - "wiki": "https://github.com/textile/php-textile/wiki" - }, - "time": "2020-10-01T18:21:03+00:00" - }, { "name": "psr/cache", "version": "1.0.1", @@ -919,12 +907,12 @@ "source": { "type": "git", "url": "https://github.com/rybakit/msgpack.php.git", - "reference": "66ca2c3948d72068ca0c8b9a4f599f822a7fe2c3" + "reference": "1e9eda511520e7494c241622671816a83a76e149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rybakit/msgpack.php/zipball/66ca2c3948d72068ca0c8b9a4f599f822a7fe2c3", - "reference": "66ca2c3948d72068ca0c8b9a4f599f822a7fe2c3", + "url": "https://api.github.com/repos/rybakit/msgpack.php/zipball/1e9eda511520e7494c241622671816a83a76e149", + "reference": "1e9eda511520e7494c241622671816a83a76e149", "shasum": "" }, "require": { @@ -933,7 +921,8 @@ "require-dev": { "ext-gmp": "*", "friendsofphp/php-cs-fixer": "^2.14", - "phpunit/phpunit": "^7.1|^8|^9" + "phpunit/phpunit": "^7.1|^8|^9", + "vimeo/psalm": "^3.9|^4" }, "suggest": { "ext-decimal": "For converting overflowed integers to Decimal objects", @@ -973,7 +962,7 @@ "type": "github" } ], - "time": "2021-07-08T19:01:22+00:00" + "time": "2021-12-17T22:02:51+00:00" }, { "name": "scssphp/scssphp", @@ -981,12 +970,12 @@ "source": { "type": "git", "url": "https://github.com/scssphp/scssphp.git", - "reference": "fd4fc9edc49f5a4465e11e03b7d6198404adbc22" + "reference": "c800975c7408e923309fbb51346b84e83dd05700" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scssphp/scssphp/zipball/fd4fc9edc49f5a4465e11e03b7d6198404adbc22", - "reference": "fd4fc9edc49f5a4465e11e03b7d6198404adbc22", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/c800975c7408e923309fbb51346b84e83dd05700", + "reference": "c800975c7408e923309fbb51346b84e83dd05700", "shasum": "" }, "require": { @@ -1002,7 +991,7 @@ "symfony/phpunit-bridge": "^5.1", "thoughtbot/bourbon": "^7.0", "twbs/bootstrap": "~5.0", - "twbs/bootstrap4": "4.6.0", + "twbs/bootstrap4": "4.6.1", "zurb/foundation": "~6.5" }, "suggest": { @@ -1045,11 +1034,11 @@ "issues": "https://github.com/scssphp/scssphp/issues", "source": "https://github.com/scssphp/scssphp/tree/master" }, - "time": "2021-10-02T12:51:54+00:00" + "time": "2022-01-06T19:41:32+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "dev-main", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", @@ -1069,7 +1058,6 @@ "suggest": { "ext-intl": "For best performance" }, - "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -1117,7 +1105,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/main" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.24.0" }, "funding": [ { @@ -1137,7 +1125,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "dev-main", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -1155,7 +1143,6 @@ "suggest": { "ext-intl": "For best performance" }, - "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -1202,7 +1189,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.24.0" }, "funding": [ { @@ -1222,7 +1209,7 @@ }, { "name": "symfony/polyfill-php72", - "version": "dev-main", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", @@ -1237,7 +1224,6 @@ "require": { "php": ">=7.1" }, - "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -1279,7 +1265,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.24.0" }, "funding": [ { @@ -1520,17 +1506,17 @@ "james-heinrich/getid3": 20, "rybakit/msgpack": 20, "wapmorgan/binary-stream": 20, - "netcarver/textile": 20, "al/emoji-detector": 20, "ezyang/htmlpurifier": 20, "scssphp/scssphp": 20, "lfkeitel/phptotp": 20, "chillerlan/php-qrcode": 20, - "vearutop/php-obscene-censor-rus": 20 + "vearutop/php-obscene-censor-rus": 20, + "erusev/parsedown": 20 }, "prefer-stable": false, "prefer-lowest": false, "platform": [], "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.0.0" } diff --git a/data/knowledgebase/about.textile b/data/knowledgebase/about.md similarity index 80% rename from data/knowledgebase/about.textile rename to data/knowledgebase/about.md index c80e9fb0..bff49358 100644 --- a/data/knowledgebase/about.textile +++ b/data/knowledgebase/about.md @@ -1,4 +1,4 @@ -*OpenVK is a universal colleague search tool based on the VKontakte structure.* +**OpenVK is a universal colleague search tool based on the VKontakte structure.** We want friends, classmates, classmates, neighbors and colleagues to always be in touch. diff --git a/data/knowledgebase/about.ru.textile b/data/knowledgebase/about.ru.md similarity index 82% rename from data/knowledgebase/about.ru.textile rename to data/knowledgebase/about.ru.md index 3c024b00..a5903cbf 100644 --- a/data/knowledgebase/about.ru.textile +++ b/data/knowledgebase/about.ru.md @@ -1,6 +1,6 @@ OpenVK-KB-Heading: Добро пожаловать -*OpenVK - универсальное средство поиска коллег основанное на структуре ВКонтакте.* +**OpenVK - универсальное средство поиска коллег основанное на структуре ВКонтакте.** Мы хотим, чтобы друзья, однокурсники, одноклассники, соседи и коллеги всегда могли быть в контакте. diff --git a/data/knowledgebase/donate.textile b/data/knowledgebase/donate.md similarity index 100% rename from data/knowledgebase/donate.textile rename to data/knowledgebase/donate.md diff --git a/data/knowledgebase/donate.ru.textile b/data/knowledgebase/donate.ru.md similarity index 100% rename from data/knowledgebase/donate.ru.textile rename to data/knowledgebase/donate.ru.md diff --git a/data/knowledgebase/notes.textile b/data/knowledgebase/notes.md similarity index 69% rename from data/knowledgebase/notes.textile rename to data/knowledgebase/notes.md index d937f989..3e7e2284 100644 --- a/data/knowledgebase/notes.textile +++ b/data/knowledgebase/notes.md @@ -1,6 +1,7 @@ OpenVK-KB-Heading: Editing notes OpenVK wiki-markup is basically XHTML1.0 Transitional. The only difference is that we removed tags that are not needed or may harm OpenVK and it's users. + Allowed tags: * All headers from level 3 to 6 (h3-h6) * Paragraphs (<p>) @@ -8,12 +9,13 @@ Allowed tags: * <sup>, <sub>, <ins> * Everything related to tables * Links and images (<a>, <img>) -* Lists (и <ol> и <ul>) +* Lists (and <ol> and <ul>) * Line feed and horizontal rule (hr) -* Blockquotes (<blockquote> и <cite>) +* Blockquotes (<blockquote> and <cite>) * <acronym> -*Please note*: images can't have sourcemap and their source must be a file that is hosted on this OpenVK instance. This restrictions does not apply to links. Links can link to everything (except for data: and javascript: pseudoprotocols). They will be derefered though. +**Please note**: images can't have sourcemap and their source must be a file that is hosted on this OpenVK instance. This restrictions does not apply to links. Links can link to everything (except for data: and javascript: pseudoprotocols). They will be derefered though. + You may also have noticed, that <style> is note in the allowlist, however, we do support styling <div> and <img> tags using style attribute. This CSS properties are allowed: * float * height @@ -21,4 +23,5 @@ You may also have noticed, that <style> is note in the allowlist, however, * max-height * max-width * font-weight + If property is a size property it can only accept pixels as value (no %, pt, pc, em, rem, vw or vh). diff --git a/data/knowledgebase/notes.ru.textile b/data/knowledgebase/notes.ru.md similarity index 99% rename from data/knowledgebase/notes.ru.textile rename to data/knowledgebase/notes.ru.md index 4296cdab..acba24d8 100644 --- a/data/knowledgebase/notes.ru.textile +++ b/data/knowledgebase/notes.ru.md @@ -1,6 +1,7 @@ OpenVK-KB-Heading: Справка по редактированию заметок Вики-разметка OpenVK это тоже самое, что и XHTML1.0 Transitional. Единственное изменение заключается в том, что мы убрали некоторые теги, которые могут принести вред OpenVK или не нужны. + Список разрешённых тегов: * Все заголовки 3-6 уровней (h3-h6) * Параграфы (<p>) @@ -12,7 +13,9 @@ OpenVK-KB-Heading: Справка по редактированию замето * Перевод строки и горизонтальная линия (hr) * Цитаты (<blockquote> и <cite>) * <acronym> + Обратите внимание, источником изображения могут быть только файлы из OpenVK. Это ограничение не распространяется на ссылки, где href может быть любой (в целях безопасности наших пользователей, ссылка будет автоматически заменена на редирект через away.php) + Вы могли заметить, что в списке разрешённых тегов нету <style>, но ничего страшного, вы можете применять аттрибут style к тегам <div> и <img>. В перечень поддерживаемых свойств CSS входят: * float * height @@ -20,4 +23,5 @@ OpenVK-KB-Heading: Справка по редактированию замето * max-height * max-width * font-weight + Обратите внимание на то, что поддерживаются только значения в пикселях. diff --git a/data/knowledgebase/points.textile b/data/knowledgebase/points.md similarity index 87% rename from data/knowledgebase/points.textile rename to data/knowledgebase/points.md index 43c22bc3..dfaaf590 100644 --- a/data/knowledgebase/points.textile +++ b/data/knowledgebase/points.md @@ -1,7 +1,7 @@ OpenVK-KB-Heading: About points -h4. What are points? +#### What are points? Points are OpenVK internal currency. You can use it to buy stickers and gifts. -h4. How can I buy points? +#### How can I buy points? This is example knowledgebase article and it does not have the details about this topic. If you are administrator of this social network, please change this article to fit your needs. If you are a user you can ask your admin directly about this. diff --git a/data/knowledgebase/points.ru.textile b/data/knowledgebase/points.ru.md similarity index 52% rename from data/knowledgebase/points.ru.textile rename to data/knowledgebase/points.ru.md index f53e1b65..490e6838 100644 --- a/data/knowledgebase/points.ru.textile +++ b/data/knowledgebase/points.ru.md @@ -1,7 +1,7 @@ OpenVK-KB-Heading: Про голоса -h4. Что такое голоса? +#### Что такое голоса? Голоса это внутреняя валюта OpenVK. За неё можно купить стикеры или подарки другим пользователям. -h4. Как купить голоса? -Это пример статьи о голосах и из-за этого в ней нет таких деталей. Если вы администратор этой социальной сети, отредактируйте файл data/knowledgebase/points.ru.textile, чтобы он соответствовал вашим нуждам. Если вы простой пользователь, уведомите администратора о том, что он забыл отредактировать файлы и спросите у него, как же вам купить голоса. +#### Как купить голоса? +Это пример статьи о голосах и из-за этого в ней нет таких деталей. Если вы администратор этой социальной сети, отредактируйте файл data/knowledgebase/points.ru.md, чтобы он соответствовал вашим нуждам. Если вы простой пользователь, уведомите администратора о том, что он забыл отредактировать файлы и спросите у него, как же вам купить голоса. diff --git a/data/knowledgebase/privacy.textile b/data/knowledgebase/privacy.md similarity index 90% rename from data/knowledgebase/privacy.textile rename to data/knowledgebase/privacy.md index 936214a5..6ba883c2 100644 --- a/data/knowledgebase/privacy.textile +++ b/data/knowledgebase/privacy.md @@ -1,31 +1,31 @@ OpenVK-KB-Heading: Privacy Policy -h2. What information do we collect? +## What information do we collect? * _Basic account information_: If you register on this server, you may be asked to enter your real name, last name, an email address, and a password. You may also enter additional profile information such as a nickname, status, biography, interests, etc. Your first name, last name, a nickname, a status, and a profile picture are always listed publicly. * _Posts, private messages and other information_: All information is processed and stored on the server. When you submit any content, the date and time are stored with the post, including attachments. Messages may contain media attachments, such as pictures and videos. Posts are available publicly. Personal messages are only delivered to users to whom you have personally sent messages. _Please do not share any dangerous information over OpenVK._ * _IPs and other metadata_: When you log in, we may record the IP address you log in from, as well as the name of your browser application. We also may retain server logs which include the IP address of every request to our server. -h2. What do we use your information for? +## What do we use your information for? Any of the information we collect from you may be used in the following ways: * To provide the core functionality of OpenVK. You can only interact with other people's content and post your own content when you are logged in. * To aid moderation of the community, for example comparing your IP address with other known ones to determine ban evasion or other violations. * The email address you provide may be used to regain access to your account by changing your password. -h2. How do we protect your information? +## How do we protect your information? We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL, and your password is hashed using a strong one-way algorithm. -h2. Do we use cookies? +## Do we use cookies? Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account. We use cookies to understand and save your preferences for future visits. -h2. Do we disclose any information to outside parties? +## Do we disclose any information to outside parties? We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety. -h2. Changes to our Privacy Policy +## Changes to our Privacy Policy If we decide to change our privacy policy, we will post those changes on this page. This document is CC-BY-SA. It was last updated October 8, 2021. -Originally adapted from the "Mastodon privacy policy":https://mastodon.social/terms. +Originally adapted from the [Mastodon privacy policy](https://mastodon.social/terms). diff --git a/data/knowledgebase/privacy.ru.textile b/data/knowledgebase/privacy.ru.md similarity index 90% rename from data/knowledgebase/privacy.ru.textile rename to data/knowledgebase/privacy.ru.md index af9b64ad..c18192a3 100644 --- a/data/knowledgebase/privacy.ru.textile +++ b/data/knowledgebase/privacy.ru.md @@ -1,31 +1,31 @@ OpenVK-KB-Heading: Политика Конфиденциальности -h2. Какую информацию мы собираем? +## Какую информацию мы собираем? * _Основная информация_: Если у вас есть желание зарегистрироваться на данном сайте, вас могут попросить ввести реальное имя, фамилию, адрес электронной почты и пароль. Также вы можете ввести дополнительную информацию профиля, например, псевдоним, статус, биографию, интересы, и т.д. Имя, фамилия, псевдоним, статус и фото профиля будут общедоступными. * _Записи, личные сообщения и другая информация_: Вся информация обрабатывается и хранится на сервере. Когда вы отправляете любой контент, дата и время сохраняются с записью, включая вложения. Сообщения могут включать медиа вложения, к примеру изображения и видео. Записи являются общедоступной информацией. Личные сообщения доставляются только тем пользователями, которым Вы лично отправили сообщения. _Пожалуйста, не делитесь любой вредоносной информации через OpenVK._ * _IP-адреса и другие метаданные_: Когда Вы выполняете вход в свой аккаунт, мы можем записывать IP-адрес, с которого был произведён вход, и название вашего веб-браузера. Мы также можем сохранять журналы сервера, которые включают IP-адрес каждого запроса к серверу. -h2. Для чего мы используем вашу информацию? +## Для чего мы используем вашу информацию? Любую собранную нами информацию мы используем для следующих целей: * Для предоставления базового функционала OpenVK. Вы можете взаимодействовать с чужим контентом и размещать собственный контент только тогда, когда Вы вошли в систему. * Чтобы помочь модерации сообщества, например, сравнить ваш IP-адрес с другими известными адресами, чтобы определить уклонения от блокировки или других нарушений. * Предоставленный вами адрес электронной почты может быть использован для восстановления доступа к вашему аккаунту при помощи смены пароля. -h2. Как мы защищаем вашу информацию? +## Как мы защищаем вашу информацию? Мы применяем различные меры безопасности для обеспечения сохранности вашей личной информации, когда вы вводите, отправляете или получаете доступ к своей личной информации. Среди прочего, сессия вашего браузера, а также трафик между вашими приложениями и API защищены протоколом SSL, а ваш пароль хэшируется с помощью надежного одностороннего алгоритма. -h2. Используем ли мы файлы cookies? +## Используем ли мы файлы cookies? Да. Cookies - это небольшие файлы, которые сайт или его поставщик услуг передает на жесткий диск вашего компьютера через ваш веб-браузер (если вы разрешаете). Эти файлы cookie позволяют сайту распознать ваш браузер и, если у вас есть зарегистрированная учетная запись, связать ее с вашей зарегистрированной учетной записью. Мы используем файлы cookies, чтобы понять и сохранить ваши настройки для будущих посещений. -h2. Раскрываем ли мы какую-либо информацию сторонним лицам? +## Раскрываем ли мы какую-либо информацию сторонним лицам? Мы не продаем, не обмениваем и не передаем посторонним лицам вашу личную информацию. Это не относится к доверенным третьим лицам, которые помогают нам управлять нашим сайтом или обслуживать вас, если эти лица согласны сохранять конфиденциальность этой информации. Мы также можем раскрыть вашу информацию, если считаем, что это необходимо для соблюдения закона, исполнения правил нашего сайта или защиты наших или чужих прав, собственности или безопасности. -h2. Изменения в нашей Политике конфиденциальности +## Изменения в нашей Политике конфиденциальности Если мы решим изменить нашу политику конфиденциальности, мы опубликуем эти изменения на данной странице. Данный документ лицензирован по CC-BY-SA. В последний раз обновлялся 8 октября 2021. -Первоначально адаптировано из "Политики конфиденциальности Mastodon":https://mastodon.social/terms. +Первоначально адаптировано из [Политики конфиденциальности Mastodon](https://mastodon.social/terms). diff --git a/data/knowledgebase/rules.md b/data/knowledgebase/rules.md new file mode 100644 index 00000000..899216cd --- /dev/null +++ b/data/knowledgebase/rules.md @@ -0,0 +1,44 @@ +OpenVK-KB-Heading: Rules + +The site administration allows you to use the site on the terms specified in these rules. + +You can do everything that does not apply to prohibited actions, but they include: + +1. Refusing to obey the rules or ignoring them, +2. Waiver of the mandatory presence of representatives of tech support agents or administration, +3. Using other people's pages without the permission of the owner, +4. Impersonating other people for gain. Exceptions: + 1. The person has allowed the use of his identity, + 2. The person is an original character belonging to you +5. Creation of mass mailings in any way, +6. Creating situations that in any way interfere with the operation of OpenVK, +7. The publication and storage on the resource of any content that: + 1. Is illegal in France or your country of residence, + 2. Contains pornographic scenes involving persons under the age of 18, + 3. Contains advertisements for drugs banned in France or your country of residence or instructions for their preparation, + 4. Contains information prohibited in France or your country of residence, + 5. Contains scenes of inhuman treatment of people or animals, + 6. Violates copyright and related rights, + 7. Violates human rights + 8. Prevents users from following the rules or from properly using the services provided by the OpenVK project. + +The administration is the highest authority that has the full right to make decisions about disputes that are not described in the rules. + +The administration may issue a punishment if users: + +1. Post prohibited content on the pages of other users, +2. They deceive the administration or tech support agents, +3. Mislead website users, +4. Publicly criticize OpenVK or the administration in order to humiliate or insult project participants or its leaders +5. Banned from official OpenVK chats on Telegram, +6. They do not respect the Project administration or tech support agents. + +In case of violation of the rules, the administration can: + +1. Ignore a violation that is minor, +2. Issue a warning to the user +3. Issue a temporary or permanent ban, +4. Prohibit future use of this site, +5. Remove account or prohibited content. + +The administration can issue punishments without giving a reason (even if there is one). diff --git a/data/knowledgebase/rules.ru.md b/data/knowledgebase/rules.ru.md new file mode 100644 index 00000000..ae9b10f1 --- /dev/null +++ b/data/knowledgebase/rules.ru.md @@ -0,0 +1,44 @@ +OpenVK-KB-Heading: Правила + +Администрация сайта разрешает Вам пользоваться сайтом на условиях, которые определены в этих правилах. + +Делать можно всё то, что не относится к запрещённым действиям, а к ним относятся: + +1. Отказ от подчинения правилам или их игнорирование, +2. Отказ от своевременного исполнения запросов агентов тех. поддержки или администрации, +3. Использование чужих страниц без разрешения владельца, +4. Выдача себя за других людей для получения выгоды. Исключения: + 1. Человек разрешил использование своей личности, + 2. Человек является оригинальным персонажем, принадлежащим Вам +5. Создание массовых рассылок любым способом, +6. Создание ситуаций, любым образом мешающих работе OpenVK, +7. Публикация и хранение на ресурсе любого содержимого, которое: + 1. Является незаконным на территории Франции или Вашей страны проживания, + 2. Содержит порнографические сцены с участием лиц младше 18 лет, + 3. Содержит рекламу запрещенных в Франции или Вашей стране проживания препаратов или инструкции по их приготовлению, + 4. Содержит информацию, запрещённую на территории Франции или Вашей страны проживания, + 5. Содержит сцены бесчеловечного обращения с людьми или животными, + 6. Нарушает авторские и смежные права, + 7. Нарушает права человека, + 8. Мешает пользователям исполнять правила или нормально пользоваться услугами, предоставляемыми проектом OpenVK. + +Администрация является высшим органом власти, имеющим полное право принимать решения насчёт спорных ситуаций, не описанных в правилах. + +Администрация может выдать наказание, если пользователи: + +1. Публикуют запрещённый контент на страницах других пользователей, +2. Обманывают администрацию или агентов тех. поддержки, +3. Вводят в заблуждение пользователей сайта, +4. Публично критикуют OpenVK или администрацию с целью унизить или оскорбить участников проекта или его руководителей, +5. Забанены в официальных чатах OpenVK в Telegram, +6. Не уважают администрацию проекта или агентов тех. поддержки. + +При нарушении правил, администрация может: + +1. Проигнорировать нарушение, являющееся незначительным, +2. Вынести пользователю предупреждение, +3. Выдать временную или постоянную блокировку, +4. Запретить в будущем пользоваться этим сайтом, +5. Удалить аккаунт или запрещенный контент. + +Администрация может выдавать наказания без объяснения причины (даже если таковая имеется). diff --git a/data/knowledgebase/rules.ru.textile b/data/knowledgebase/rules.ru.textile deleted file mode 100644 index 08c6afbb..00000000 --- a/data/knowledgebase/rules.ru.textile +++ /dev/null @@ -1,43 +0,0 @@ -OpenVK-KB-Heading: Правила - -Администрация сайта разрешает Вам пользоваться сайтом на условиях, которые определены в этих правилах. -Делать можно всё то, что не относится к запрещённым действиям, а к ним относятся: - -# Отказ от подчинения правилам или их игнорирование, -# Отказ от своевременного исполнения запросов агентов тех. поддержки или администрации, -# Использование чужих страниц без разрешения владельца, -# Выдача себя за других людей для получения выгоды. Исключения: -## Человек разрешил использование своей личности, -## Человек является оригинальным персонажем, принадлежащим Вам -# Создание массовых рассылок любым способом, -# Создание ситуаций, любым образом мешающих работе OpenVK, -# Публикация и хранение на ресурсе любого содержимого, которое: -## Является незаконным на территории Франции или Вашей страны проживания, -## Содержит порнографические сцены с участием лиц младше 18 лет, -## Содержит рекламу запрещенных в Франции или Вашей стране проживания препаратов или инструкции по их приготовлению, -## Содержит информацию, запрещённую на территории Франции или Вашей страны проживания, -## Содержит сцены бесчеловечного обращения с людьми или животными, -## Нарушает авторские и смежные права, -## Нарушает права человека, -## Мешает пользователям исполнять правила или нормально пользоваться услугами, предоставляемыми проектом OpenVK. - -Администрация является высшим органом власти, имеющим полное право принимать решения насчёт спорных ситуаций, не описанных в правилах. - -Администрация может выдать наказание, если пользователи: - -# Публикуют запрещённый контент на страницах других пользователей, -# Обманывают администрацию или агентов тех. поддержки, -# Вводят в заблуждение пользователей сайта, -# Публично критикуют OpenVK или администрацию с целью унизить или оскорбить участников проекта или его руководителей, -# Забанены в официальных чатах OpenVK в Telegram, -# Не уважают администрацию проекта или агентов тех. поддержки. - -При нарушении правил, администрация может: - -# Проигнорировать нарушение, являющееся незначительным, -# Вынести пользователю предупреждение, -# Выдать временную или постоянную блокировку, -# Запретить в будущем пользоваться этим сайтом, -# Удалить аккаунт или запрещенный контент. - -Администрация может выдавать наказания без объяснения причины (даже если таковая имеется). diff --git a/data/knowledgebase/rules.textile b/data/knowledgebase/rules.textile deleted file mode 100644 index 7fd2adc3..00000000 --- a/data/knowledgebase/rules.textile +++ /dev/null @@ -1,43 +0,0 @@ -OpenVK-KB-Heading: Rules - -The site administration allows you to use the site on the terms specified in these rules. -You can do everything that does not apply to prohibited actions, but they include: - -# Refusing to obey the rules or ignoring them, -# Waiver of the mandatory presence of representatives of tech support agents or administration, -# Using other people's pages without the permission of the owner, -# Impersonating other people for gain. Exceptions: -## The person has allowed the use of his identity, -## The person is an original character belonging to you -# Creation of mass mailings in any way, -# Creating situations that in any way interfere with the operation of OpenVK, -# The publication and storage on the resource of any content that: -## Is illegal in France or your country of residence, -## Contains pornographic scenes involving persons under the age of 18, -## Contains advertisements for drugs banned in France or your country of residence or instructions for their preparation, -## Contains information prohibited in France or your country of residence, -## Contains scenes of inhuman treatment of people or animals, -## Violates copyright and related rights, -## Violates human rights -## Prevents users from following the rules or from properly using the services provided by the OpenVK project. - -The administration is the highest authority that has the full right to make decisions about disputes that are not described in the rules. - -The administration may issue a punishment if users: - -# Post prohibited content on the pages of other users, -# They deceive the administration or tech support agents, -# Mislead website users, -# Publicly criticize OpenVK or the administration in order to humiliate or insult project participants or its leaders -# Banned from official OpenVK chats on Telegram, -# They do not respect the Project administration or tech support agents. - -In case of violation of the rules, the administration can: - -# Ignore a violation that is minor, -# Issue a warning to the user -# Issue a temporary or permanent ban, -# Prohibit future use of this site, -# Remove account or prohibited content. - -The administration can issue punishments without giving a reason (even if there is one). diff --git a/data/rules.xhtml b/data/rules.xhtml deleted file mode 100644 index 440d7476..00000000 --- a/data/rules.xhtml +++ /dev/null @@ -1 +0,0 @@ -Sample rules \ No newline at end of file From cfb8b68fc0be1321dcff7b0045a1ef5ce4b7c350 Mon Sep 17 00:00:00 2001 From: celestora Date: Sun, 16 Jan 2022 13:15:08 +0200 Subject: [PATCH 15/81] Allow semicolons in links [wip?] Resolves #359 --- Web/Models/Entities/Traits/TRichText.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Web/Models/Entities/Traits/TRichText.php b/Web/Models/Entities/Traits/TRichText.php index e3e2ce6d..07caacdc 100644 --- a/Web/Models/Entities/Traits/TRichText.php +++ b/Web/Models/Entities/Traits/TRichText.php @@ -32,10 +32,12 @@ trait TRichText private function formatLinks(string &$text): string { return preg_replace_callback( - "%(([A-z]++):\/\/(\S*?\.\S*?))([\s)\[\]{},;\"\'<]|\.\s|$)%", + "%(([A-z]++):\/\/(\S*?\.\S*?))([\s)\[\]{},\"\'<]|\.\s|$)%", (function (array $matches): string { $href = str_replace("#", "#", $matches[1]); + $href = str_replace(";", ";", $matches[1]); $link = str_replace("#", "#", $matches[3]); + $link = str_replace(";", ";", $matches[3]); $rel = $this->isAd() ? "sponsored" : "ugc"; return "$link" . htmlentities($matches[4]); From 89bcd89cb3b6361288cea19fa8e3cae40477351d Mon Sep 17 00:00:00 2001 From: celestora Date: Sun, 16 Jan 2022 13:50:52 +0200 Subject: [PATCH 16/81] Improve "Reply..." button Now it can be used after textarea initialization (fixes #391) and is capable of replacing pervious mention (if it is located at the start of le string, otherwise it prepends mention) --- Web/static/js/al_comments.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Web/static/js/al_comments.js b/Web/static/js/al_comments.js index 21acd797..6f36730b 100644 --- a/Web/static/js/al_comments.js +++ b/Web/static/js/al_comments.js @@ -5,7 +5,9 @@ u(".comment-reply").on("click", function(e) { let fromGroup = Boolean(comment.data("from-group")); let postId = comment.data("post-id"); let inputbox = postId == null ? u("#write textarea") : u("#wall-post-input" + (postId || "")); + let mention = ("[" + (fromGroup ? "club" : "id") + authorId + "|" + authorNm + "], "); - inputbox.text("[" + (fromGroup ? "club" : "id") + authorId + "|" + authorNm + "], "); + // Substitute pervious mention if present, prepend otherwise + inputbox.nodes[0].value = s.nodes[0].value.replace(/(^\[([A-Za-z0-9]+)\|([\p{L} 0-9@]+)\], |^)/u, mention); inputbox.trigger("focusin"); }); From ca64bf210da6e56f5f225ab8b3d6bbbf1e9907b6 Mon Sep 17 00:00:00 2001 From: celestora Date: Sun, 16 Jan 2022 14:07:57 +0200 Subject: [PATCH 17/81] Add "my news" link to global feed Resolves #390 --- Web/Presenters/templates/Wall/Feed.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Web/Presenters/templates/Wall/Feed.xml b/Web/Presenters/templates/Wall/Feed.xml index 517cc0a0..8e8b0cca 100644 --- a/Web/Presenters/templates/Wall/Feed.xml +++ b/Web/Presenters/templates/Wall/Feed.xml @@ -4,10 +4,14 @@ {block header} {_"feed"} -
+
- {_"all_news"} + {if !isset($globalFeed)} + {_"all_news"} + {else} + {_"my_feed"} + {/if}
From 8e07a591725b0300e328aede820e8e1eed9558e0 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Sun, 16 Jan 2022 23:15:33 +0300 Subject: [PATCH 18/81] Themes: Autodetect Mobile and Desktop platforms Check out openvk-example.yml to set up default mobile theme (if u have one) I also changed the function's name and added a 'once' boolean arg which means the theme will be set for only one page Also closes #402 and #403 --- Web/Presenters/OpenVKPresenter.php | 13 +++++++++++-- Web/Presenters/UserPresenter.php | 2 +- openvk-example.yml | 1 + 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Web/Presenters/OpenVKPresenter.php b/Web/Presenters/OpenVKPresenter.php index 17e36e8a..380dd3cd 100755 --- a/Web/Presenters/OpenVKPresenter.php +++ b/Web/Presenters/OpenVKPresenter.php @@ -8,6 +8,7 @@ use Latte\Engine as TemplatingEngine; use openvk\Web\Models\Entities\IP; use openvk\Web\Themes\Themepacks; use openvk\Web\Models\Repositories\{IPs, Users, APITokens, Tickets}; +use WhichBrowser; abstract class OpenVKPresenter extends SimplePresenter { @@ -34,9 +35,10 @@ abstract class OpenVKPresenter extends SimplePresenter ])); } - protected function setTempTheme(string $theme): void + protected function setSessionTheme(string $theme, bool $once = false): void { - Session::i()->set("_tempTheme", $theme); + if(once) Session::i()->set("_tempTheme", $theme); + else Session::i()->set("_sessionTheme", $theme); } protected function flashFail(string $type, string $title, ?string $message = NULL, ?int $code = NULL, bool $json = false): void @@ -234,10 +236,17 @@ abstract class OpenVKPresenter extends SimplePresenter { parent::onBeforeRender(); + $whichbrowser = new WhichBrowser\Parser(getallheaders()); + $mobiletheme = OPENVK_ROOT_CONF["openvk"]["preferences"]["defaultMobileTheme"]; + if($mobiletheme && $whichbrowser->isType('mobile') && Session::i()->get("_tempTheme") == null) + $this->setSessionTheme($mobiletheme); + $theme = NULL; if(Session::i()->get("_tempTheme")) { $theme = Themepacks::i()[Session::i()->get("_tempTheme", "ovk")]; Session::i()->set("_tempTheme", NULL); + } else if(Session::i()->get("_sessionTheme")) { + $theme = Themepacks::i()[Session::i()->get("_sessionTheme", "ovk")]; } else if($this->requestParam("themePreview")) { $theme = Themepacks::i()[$this->requestParam("themePreview")]; } else if($this->user->identity !== null && $this->user->identity->getTheme()) { diff --git a/Web/Presenters/UserPresenter.php b/Web/Presenters/UserPresenter.php index ddcddb95..fec3798f 100644 --- a/Web/Presenters/UserPresenter.php +++ b/Web/Presenters/UserPresenter.php @@ -354,7 +354,7 @@ final class UserPresenter extends OpenVKPresenter if (isset(Themepacks::i()[$this->postParam("style")]) || $this->postParam("style") === Themepacks::DEFAULT_THEME_ID) { $user->setStyle($this->postParam("style")); - $this->setTempTheme($this->postParam("style")); + $this->setSessionTheme($this->postParam("style")); } if ($this->postParam("style_avatar") <= 2 && $this->postParam("style_avatar") >= 0) diff --git a/openvk-example.yml b/openvk-example.yml index 0f8a9b55..df9c55ef 100644 --- a/openvk-example.yml +++ b/openvk-example.yml @@ -59,6 +59,7 @@ openvk: bellsAndWhistles: fartscroll: false testLabel: false + defaultMobileTheme: "" telemetry: plausible: From b49020829002db7b394db535546d7b4e32be53cb Mon Sep 17 00:00:00 2001 From: celestora Date: Mon, 17 Jan 2022 12:15:44 +0200 Subject: [PATCH 19/81] Fix typo in al_comments --- Web/static/js/al_comments.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Web/static/js/al_comments.js b/Web/static/js/al_comments.js index 6f36730b..f4172428 100644 --- a/Web/static/js/al_comments.js +++ b/Web/static/js/al_comments.js @@ -8,6 +8,6 @@ u(".comment-reply").on("click", function(e) { let mention = ("[" + (fromGroup ? "club" : "id") + authorId + "|" + authorNm + "], "); // Substitute pervious mention if present, prepend otherwise - inputbox.nodes[0].value = s.nodes[0].value.replace(/(^\[([A-Za-z0-9]+)\|([\p{L} 0-9@]+)\], |^)/u, mention); + inputbox.nodes[0].value = inputbox.nodes[0].value.replace(/(^\[([A-Za-z0-9]+)\|([\p{L} 0-9@]+)\], |^)/u, mention); inputbox.trigger("focusin"); }); From b0bb5fb88f6a04c09c54ec3cc7fecd2980b2e950 Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Mon, 17 Jan 2022 14:42:39 +0200 Subject: [PATCH 20/81] Global: Fix display of text inputs --- Web/static/css/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/Web/static/css/style.css b/Web/static/css/style.css index 411d6119..c409f70f 100644 --- a/Web/static/css/style.css +++ b/Web/static/css/style.css @@ -563,6 +563,7 @@ input[type="text"], input[type="password"], input[type~="text"], input[type~="pa font-size: 11px; font-family: tahoma, verdana, arial, sans-serif; width: 100%; + box-sizing: border-box; } h4 { From bf81402174006732d1ff62a201e669346f8d4b46 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Mon, 17 Jan 2022 19:01:30 +0300 Subject: [PATCH 21/81] Themes: Apply themes only for one device Closes #424 --- Web/Presenters/UserPresenter.php | 2 +- Web/Presenters/templates/User/Settings.xml | 8 ++++++++ locales/en.strings | 2 ++ locales/ru.strings | 2 ++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Web/Presenters/UserPresenter.php b/Web/Presenters/UserPresenter.php index fec3798f..b05f7843 100644 --- a/Web/Presenters/UserPresenter.php +++ b/Web/Presenters/UserPresenter.php @@ -353,7 +353,7 @@ final class UserPresenter extends OpenVKPresenter } else if($_GET['act'] === "interface") { if (isset(Themepacks::i()[$this->postParam("style")]) || $this->postParam("style") === Themepacks::DEFAULT_THEME_ID) { - $user->setStyle($this->postParam("style")); + if ($this->postParam("theme_for_session") != "1") $user->setStyle($this->postParam("style")); $this->setSessionTheme($this->postParam("style")); } diff --git a/Web/Presenters/templates/User/Settings.xml b/Web/Presenters/templates/User/Settings.xml index b5d2c2a5..12225673 100644 --- a/Web/Presenters/templates/User/Settings.xml +++ b/Web/Presenters/templates/User/Settings.xml @@ -462,6 +462,14 @@ + + + + + + {_apply_style_for_this_device} + + diff --git a/locales/en.strings b/locales/en.strings index 03124da7..0f4d8fc7 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -369,6 +369,8 @@ "cut" = "Cut"; "round_avatars" = "Round avatars"; +"apply_style_for_this_device" = "Apply style only for this device"; + "search_for_groups" = "Search for groups"; "search_for_people" = "Search for people"; "search_button" = "Find"; diff --git a/locales/ru.strings b/locales/ru.strings index e5e7aee3..64f66185 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -387,6 +387,8 @@ "cut" = "Обрезка"; "round_avatars" = "Круглый аватар"; +"apply_style_for_this_device" = "Применить стиль только для этого устройства"; + "search_for_groups" = "Поиск групп"; "search_for_people" = "Поиск людей"; "search_button" = "Найти"; From 4e97b1ae0209629f70408d2922af755f9e2daeb1 Mon Sep 17 00:00:00 2001 From: Ilya Prokopenko Date: Wed, 19 Jan 2022 16:11:29 +0300 Subject: [PATCH 22/81] Languages: New interface (#120) Thanks to @myslivets for the new style! Closes #120 --- Web/Presenters/templates/About/Language.xml | 49 +++++++++++++++++++-- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/Web/Presenters/templates/About/Language.xml b/Web/Presenters/templates/About/Language.xml index 4cb4c9ed..db6c06b3 100644 --- a/Web/Presenters/templates/About/Language.xml +++ b/Web/Presenters/templates/About/Language.xml @@ -6,9 +6,50 @@ {/block} {block content} - {/if} From 4281ec4f80b6d94267f5ec80b6485acfe76039ed Mon Sep 17 00:00:00 2001 From: Ilya Prokopenko Date: Fri, 21 Jan 2022 13:47:08 +0300 Subject: [PATCH 28/81] Markdown: Removed Safe Mode It's not necessary at this point anyway. --- Web/Presenters/SupportPresenter.php | 1 - 1 file changed, 1 deletion(-) diff --git a/Web/Presenters/SupportPresenter.php b/Web/Presenters/SupportPresenter.php index d644deb1..8a48a0db 100644 --- a/Web/Presenters/SupportPresenter.php +++ b/Web/Presenters/SupportPresenter.php @@ -222,7 +222,6 @@ final class SupportPresenter extends OpenVKPresenter $content = implode($lines); $parser = new Parsedown(); - $parser->setSafeMode(true); $this->template->heading = $heading; $this->template->content = $parser->text($content); } From 8c29138755ee446fbb3135627aa0a5c93441008d Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Fri, 21 Jan 2022 18:15:12 +0200 Subject: [PATCH 29/81] OpenVK Modern: Support displaying instance name in header bar --- themepacks/openvk_modern/res/5.png | Bin 0 -> 1475 bytes themepacks/openvk_modern/stylesheet.css | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 themepacks/openvk_modern/res/5.png diff --git a/themepacks/openvk_modern/res/5.png b/themepacks/openvk_modern/res/5.png new file mode 100644 index 0000000000000000000000000000000000000000..abacbfdefbe78456158250f27dd44b468216a1d5 GIT binary patch literal 1475 zcmV;!1w8tRP)EX>4Tx04R}tkv&MmP!xqvQ>7x64ptCx$WV2$AXdatt5Adrp;lE=M<*vm7b)?+q|hSP3y=44-aUu+?gNB+nQ2zn1fc1* znM%aPOm4+%q(M0l9K3HU-#5abrFVHWr1gg&2(y>I7}=S+E{60Rx~x@DdLE#>69;I zJXSexan{OJ*1RWwVKAq!EOVXKFcMhA5+sOFP(=x4*oe}ulVTx7=kX5yA=fXFOCeVY zj2sK7K!fc1!T;d*Y^{83(n|`)f$kT_`4|BLyFjDnIN!&P(>MYA&%l-5@>lA>%qQu! zmKHezLfgQ_bxTwBfXf|V@X3%(*_HgXgnS-&KcjET0{yo@@0vHa<~dFufHci2c>^3A z0;2`WUhnYkp7y!@+tZxi53E>nzP3{pZU6uP24YJ`L;yShJODhOjE;){000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&445C$<#%-HS#000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}000A;NklSjS*g@TBn zTUK@d&6%saD#LUVKT2M8iVL>dBuj6;xd2r>>q#vuqY4)G17jGZQm7#|;p z!{LA|%P1%)$oQd(qTv4i9-&YOi;Ig{b^Pe)2rVrwq+mYGICi@o!C(+wU0twRt&k)M zf*@r4kt7LLs})YC6Tx5*jg5_@gjS8y(9i&n$MgR?Ac}Ci-EcS@q=pua6&0bTrUv!(^-u__V)IWOeR(F&CN|zRaJd{9~~Vk&zK*-Jzi&RqXBU z4R?2Uq=24`qbLe9US3|#jMvuIGUJbrkEDQ}j1!B+m~o@gm{B|Nc$^f_lW`0N12g{d zk=ecXT)x5}exPxRi;KBibQZiMnAZ-WQR4`Lz>J@tpEKjf$H&aL#bO}^^tP+2uC7+a zR#sM+by?RjWLZXOX(=h7H{(oBPBNFOnVFf-t$Hez!p_bPuCA_Bbyamybb9=N-#biX4s zWE|dZ2>=cc51IK6i?XsZ`2BuLiuGcgNF>57D=8_#`uaNjem^QIDwuUlCKJ3~FLrl# zVYAt|ZGCm8hsd)W$L)4wd3ibQvSqW`u)V$gto!mF>L>}ijzey&O zn3$M=!C-*PoH9-IX002ovPDHLkV1g}~q|pEX literal 0 HcmV?d00001 diff --git a/themepacks/openvk_modern/stylesheet.css b/themepacks/openvk_modern/stylesheet.css index 17b41f0a..a05746b2 100644 --- a/themepacks/openvk_modern/stylesheet.css +++ b/themepacks/openvk_modern/stylesheet.css @@ -15,6 +15,13 @@ body { background-position-x: 1px; } +.home_button_custom { + background: url("/themepack/openvk_modern/0.0.1.0/resource/5.png") no-repeat; + background-position-y: 0px; + background-position-x: 1px; + text-shadow: none; +} + .header_navigation .link { background: unset; } From 26f3f8c77a14b22259eb50aa7c48e4a373e198c1 Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Fri, 21 Jan 2022 18:38:41 +0200 Subject: [PATCH 30/81] Admin: Display instance name in header --- Web/Presenters/templates/Admin/@layout.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Web/Presenters/templates/Admin/@layout.xml b/Web/Presenters/templates/Admin/@layout.xml index 3186353d..15eca673 100644 --- a/Web/Presenters/templates/Admin/@layout.xml +++ b/Web/Presenters/templates/Admin/@layout.xml @@ -6,7 +6,7 @@ {var css = file_get_contents(OPENVK_ROOT . "/Web/static/js/node_modules/@atlassian/aui/dist/aui/aui-prototyping.css")} {str_replace("fonts/", "/assets/packages/static/openvk/js/node_modules/@atlassian/aui/dist/aui/fonts/", $css)|noescape} - {include title} + {include title} - Админ-панель {=OPENVK_ROOT_CONF['openvk']['appearance']['name']}
@@ -16,7 +16,7 @@ From 2636d0ff780490415f0eafb73dfb6aa3610e045e Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Fri, 21 Jan 2022 18:45:27 +0200 Subject: [PATCH 31/81] Admin: Display more information in footer --- Web/Presenters/templates/Admin/@layout.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Web/Presenters/templates/Admin/@layout.xml b/Web/Presenters/templates/Admin/@layout.xml index 15eca673..ec8a213c 100644 --- a/Web/Presenters/templates/Admin/@layout.xml +++ b/Web/Presenters/templates/Admin/@layout.xml @@ -163,9 +163,7 @@
From 7baa4cf20a2dc97fee31b71d1474fbe417b3fa0d Mon Sep 17 00:00:00 2001 From: veselcraft Date: Sat, 22 Jan 2022 15:54:57 +0300 Subject: [PATCH 32/81] Global: Add a date adaptation to the user's timezone Closes #170 --- Web/Presenters/InternalAPIPresenter.php | 25 +++++++++++++++++++++++++ Web/Presenters/OpenVKPresenter.php | 1 + Web/Presenters/templates/@layout.xml | 4 ++++ Web/routes.yml | 2 ++ Web/static/js/timezone.js | 7 +++++++ bootstrap.php | 3 ++- 6 files changed, 41 insertions(+), 1 deletion(-) create mode 100755 Web/static/js/timezone.js diff --git a/Web/Presenters/InternalAPIPresenter.php b/Web/Presenters/InternalAPIPresenter.php index a8933639..51f03cd3 100644 --- a/Web/Presenters/InternalAPIPresenter.php +++ b/Web/Presenters/InternalAPIPresenter.php @@ -1,6 +1,7 @@ fail(-32603, "Uncaught " . get_class($ex)); } } + + function renderTimezone() { + if($_SERVER["REQUEST_METHOD"] !== "POST") + exit("ты дебил это метод апи"); + + $sessionOffset = Session::i()->get("_timezoneOffset"); + if(is_numeric($this->postParam("timezone"))) { + $postTZ = intval($this->postParam("timezone")); + if ($postTZ != $sessionOffset || $sessionOffset == null) { + Session::i()->set("_timezoneOffset", $postTZ ? $postTZ : 3 * MINUTE ); + $this->returnJson([ + "success" => 1 // If it's new value + ]); + } else { + $this->returnJson([ + "success" => 2 // If it's the same value (if for some reason server will call this func) + ]); + } + } else { + $this->returnJson([ + "success" => 0 + ]); + } + } } diff --git a/Web/Presenters/OpenVKPresenter.php b/Web/Presenters/OpenVKPresenter.php index 1f2ad294..c232cd91 100755 --- a/Web/Presenters/OpenVKPresenter.php +++ b/Web/Presenters/OpenVKPresenter.php @@ -201,6 +201,7 @@ abstract class OpenVKPresenter extends SimplePresenter $user = Authenticator::i()->getUser(); $this->template->isXmas = intval(date('d')) >= 1 && date('m') == 12 || intval(date('d')) <= 15 && date('m') == 1 ? true : false; + $this->template->isTimezoned = Session::i()->get("_timezoneOffset"); if(!is_null($user)) { $this->user = (object) []; diff --git a/Web/Presenters/templates/@layout.xml b/Web/Presenters/templates/@layout.xml index 10ebec28..d410bc84 100644 --- a/Web/Presenters/templates/@layout.xml +++ b/Web/Presenters/templates/@layout.xml @@ -17,6 +17,10 @@ {script "js/l10n.js"} {script "js/openvk.cls.js"} + {if $isTimezoned == null} + {script "js/timezone.js"} + {/if} + {ifset $thisUser} {if $thisUser->getNsfwTolerance() < 2} {css "css/nsfw-posts.css"} diff --git a/Web/routes.yml b/Web/routes.yml index ec53b002..e22f938e 100644 --- a/Web/routes.yml +++ b/Web/routes.yml @@ -9,6 +9,8 @@ routes: handler: "About->rules" - url: "/rpc" handler: "InternalAPI->route" + - url: "/iapi/timezone" + handler: "InternalAPI->timezone" - url: "/support" handler: "Support->index" - url: "/support/tickets" diff --git a/Web/static/js/timezone.js b/Web/static/js/timezone.js new file mode 100755 index 00000000..a85472fd --- /dev/null +++ b/Web/static/js/timezone.js @@ -0,0 +1,7 @@ +// This file is included only when there is no info about timezone in users's chandler session + +xhr = new XMLHttpRequest(); +xhr.open("POST", "/iapi/timezone", true); +xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); +xhr.onload = () => {window.location.reload()}; +xhr.send('timezone=' + new Date().getTimezoneOffset()); diff --git a/bootstrap.php b/bootstrap.php index c4ac5395..5c1fb0d7 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -167,7 +167,8 @@ function ovk_proc_strtrim(string $string, int $length = 0): string function ovk_strftime_safe(string $format, ?int $timestamp = NULL): string { - $str = strftime($format, $timestamp ?? time()); + $sessionOffset = intval(Session::i()->get("_timezoneOffset")); + $str = strftime($format, $timestamp + ($sessionOffset * MINUTE) * -1 ?? time() + ($sessionOffset * MINUTE) * -1); if(PHP_SHLIB_SUFFIX === "dll") { $enc = tr("__WinEncoding"); if($enc === "@__WinEncoding") From 89b75825b3bbe440982271c90f4741921c4aa620 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Sat, 22 Jan 2022 16:12:01 +0300 Subject: [PATCH 33/81] Global: Fix reloadloop if the server checks for CSRF token --- Web/Presenters/InternalAPIPresenter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Web/Presenters/InternalAPIPresenter.php b/Web/Presenters/InternalAPIPresenter.php index 51f03cd3..f0551b7f 100644 --- a/Web/Presenters/InternalAPIPresenter.php +++ b/Web/Presenters/InternalAPIPresenter.php @@ -75,8 +75,8 @@ final class InternalAPIPresenter extends OpenVKPresenter exit("ты дебил это метод апи"); $sessionOffset = Session::i()->get("_timezoneOffset"); - if(is_numeric($this->postParam("timezone"))) { - $postTZ = intval($this->postParam("timezone")); + if(is_numeric($this->postParam("timezone", false))) { + $postTZ = intval($this->postParam("timezone", false)); if ($postTZ != $sessionOffset || $sessionOffset == null) { Session::i()->set("_timezoneOffset", $postTZ ? $postTZ : 3 * MINUTE ); $this->returnJson([ From 0a15119a234c14367ab58622d82bfd47f54d4624 Mon Sep 17 00:00:00 2001 From: KosFurler Date: Sun, 23 Jan 2022 18:10:55 +0300 Subject: [PATCH 34/81] Update su.strings --- locales/su.strings | 58 +++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/locales/su.strings b/locales/su.strings index 0e3091e9..39f630af 100644 --- a/locales/su.strings +++ b/locales/su.strings @@ -53,7 +53,7 @@ "registration_date" = "Дата регистрации"; "hometown" = "Родной город"; "this_is_you" = "это Вы"; -"edit_page" = "Изменить информацию паспорта"; +"edit_page" = "Изменить информацию досье"; "edit_group" = "Изменить информацию клуба"; "change_status" = "изменить "; "name" = "Имя"; @@ -164,7 +164,7 @@ "no_comments" = "Отзывы отсутствуют"; "all_news" = "Все новостные газеты"; -"posts_per_page" = "Количество записей в паспорте"; +"posts_per_page" = "Количество записей в досье"; "attachment" = "Вложение"; "post_as_group" = "От имени клуба"; @@ -296,7 +296,7 @@ "open_original" = "Посмотреть оригинал картинки"; -"avatar_album" = "Картинки с паспорта"; +"avatar_album" = "Картинки из досье"; "wall_album" = "Картинки с доски"; "albums_zero" = "Ни одного альбома с картинками"; @@ -322,22 +322,22 @@ /* Menus */ -"edit_button" = "ред."; -"my_page" = "Мой Паспорт"; +"edit_button" = "корр."; +"my_page" = "Мое Досье"; "my_friends" = "Мои Товарищи"; "my_photos" = "Мои Фотокартинки"; "my_videos" = "Мои Киноленты"; -"my_messages" = "Мои Письма"; -"my_notes" = "Мои Черновики"; +"my_messages" = "Мои Телеграмы"; +"my_notes" = "Мои Записки"; "my_groups" = "Мои Клубы"; -"my_feed" = "Мои Газеты"; -"my_feedback" = "Мои Ответы"; +"my_feed" = "Мое Информбюро"; +"my_feedback" = "Мои Сводки"; "my_settings" = "Мои Настройки"; "bug_tracker" = "Доска задач"; "menu_login" = "Вход"; "menu_registration" = "Регистрация"; -"menu_help" = "Помощь"; +"menu_help" = "Справка"; "menu_logout" = "Выйти"; "menu_support" = "Поддержка"; @@ -346,9 +346,9 @@ "header_groups" = "клубы"; "header_people" = "граждане"; "header_invite" = "пригласить"; -"header_help" = "помощь"; -"header_log_out" = "выйти"; -"header_search" = "Поиск"; +"header_help" = "справка"; +"header_log_out" = "эмиграция"; +"header_search" = "Розыск"; "header_login" = "вход"; "header_registration" = "регистрация"; @@ -359,14 +359,14 @@ "footer_help" = "помощь"; "footer_developers" = "госслужащим"; "footer_choose_language" = "выбрать язык"; -"footer_privacy" = "приватность"; +"footer_privacy" = "секретность"; /* Settings */ "main" = "Основное"; "contacts" = "Контакты"; "avatar" = "Картинка"; -"privacy" = "Приватность"; +"privacy" = "Секретность"; "interface" = "Внешний вид"; "profile_picture" = "Изображение страницы"; @@ -385,8 +385,8 @@ "cut" = "Обрезка"; "round_avatars" = "Круглая картинка"; -"search_for_groups" = "Поиск клубов"; -"search_for_people" = "Поиск гражданинов"; +"search_for_groups" = "Розыск клубов"; +"search_for_people" = "Розыск граждан"; "search_button" = "Найти"; "search_placeholder" = "Начните вводить любое имя, название или слово"; "results_zero" = "Ни одного результата"; @@ -395,7 +395,7 @@ "results_many" = "$1 результатов"; "results_other" = "$1 результатов"; -"privacy_setting_access_page" = "Кому из граждан виден мой паспорт"; +"privacy_setting_access_page" = "Кому из граждан видно мое досье"; "privacy_setting_read_info" = "Кому видно основную информацию моей страницы"; "privacy_setting_see_groups" = "Кому разрешено просматривать мои картинки и встречи"; "privacy_setting_see_photos" = "Кому разрешено просматривать мои картинки"; @@ -410,17 +410,17 @@ "privacy_value_users" = "Участникам органа OpenVK"; "privacy_value_friends" = "Товарищи"; "privacy_value_friends_dative" = "Товарищам"; -"privacy_value_only_me" = "Только я"; -"privacy_value_only_me_dative" = "Только мне"; +"privacy_value_only_me" = "Только я и КГБ"; +"privacy_value_only_me_dative" = "Только мне и КГБ"; "privacy_value_nobody" = "Никто"; "your_email_address" = "Адрес Вашего почтового ящика"; -"your_page_address" = "Адрес Вашего паспорта"; -"page_address" = "Адрес паспорта"; +"your_page_address" = "Адрес Вашего досье"; +"page_address" = "Адрес досье"; "current_email_address" = "Текущий адрес"; -"page_id" = "Номер паспорта"; +"page_id" = "Номер досье"; "you_can_also" = "Вы также можете"; -"delete_your_page" = "порвать свой паспорт"; +"delete_your_page" = "порвать свое досье"; "delete_album" = "выкинуть свой альбом с картинками"; "ui_settings_interface" = "Интерфейс"; @@ -561,7 +561,7 @@ "transferred_to_you" = "передал вам"; -"receiver_address" = "Адрес паспорта получателя"; +"receiver_address" = "Адрес досье получателя"; "coins_count" = "Количество рублей"; "message" = "Сообщение"; @@ -740,10 +740,10 @@ "forbidden_comment" = "Настройки приватности этого пользователя не разрешают вам смотреть на его страницу."; "changes_saved" = "Изменения сохранены"; -"changes_saved_comment" = "Товарищ, обоновлённые данные появятся на вашем паспорте."; +"changes_saved_comment" = "Товарищ, обоновлённые данные появятся на вашем досье."; "photo_saved" = "Картинка сохранена"; -"photo_saved_comment" = "Товарищ, орган одобрил новую картинку в вашем паспорте."; +"photo_saved_comment" = "Товарищ, орган одобрил новую картинку в вашем досье."; "shared_succ" = "Запись появится на вашей доске. Нажмите на уведомление, чтобы перейти к своей стене."; @@ -759,8 +759,8 @@ "token_manipulation_error" = "Ошибка манипулирования токеном"; "token_manipulation_error_comment" = "Токен недействителен или истёк"; -"profile_changed" = "Паспорт изменён"; -"profile_changed_comment" = "Товарищ, орган одобрил изменение вашего паспорта."; +"profile_changed" = "Досье изменёно"; +"profile_changed_comment" = "Товарищ, орган одобрил изменение вашего досье."; "profile_not_found" = "Гражданин не найден."; "suspicious_registration_attempt" = "Подозрительная попытка регистрации в орган"; From c22c4a0c2cae926702e3f5724dff16f1718478ea Mon Sep 17 00:00:00 2001 From: KosFurler Date: Sun, 23 Jan 2022 19:15:38 +0300 Subject: [PATCH 35/81] Update style.css --- Web/static/css/style.css | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Web/static/css/style.css b/Web/static/css/style.css index c409f70f..10e75284 100644 --- a/Web/static/css/style.css +++ b/Web/static/css/style.css @@ -1787,3 +1787,21 @@ body.scrolled .toTop:hover { .hover-box:hover { background-color: #C0CAD5; } +.summaryBar { + border-bottom: 1px solid #DAE2E8; + clear: both; + padding: 11px 10px 0 10px; + padding-top: 11px; + padding-top: 11px; + color: black; + font-weight: normal; + line-height: normal; + margin-left: -12px; + margin-right: -12px; +} +.summaryBar .summary { + color: #45688E; + font-weight: bold; + padding-top: 3px; + padding-bottom: 4px; +} \ No newline at end of file From df4a492543354e68c34f712e1bf3e51b2d2b535b Mon Sep 17 00:00:00 2001 From: KosFurler Date: Sun, 23 Jan 2022 19:18:34 +0300 Subject: [PATCH 36/81] Update style.css --- Web/static/css/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Web/static/css/style.css b/Web/static/css/style.css index 10e75284..ffb4de94 100644 --- a/Web/static/css/style.css +++ b/Web/static/css/style.css @@ -1790,7 +1790,7 @@ body.scrolled .toTop:hover { .summaryBar { border-bottom: 1px solid #DAE2E8; clear: both; - padding: 11px 10px 0 10px; + padding: 0 10px; padding-top: 11px; padding-top: 11px; color: black; From bf5856ba43a58e1f38a8f771fb61d2630dafc445 Mon Sep 17 00:00:00 2001 From: KosFurler Date: Sun, 23 Jan 2022 23:26:58 +0300 Subject: [PATCH 37/81] Styles Added styles for new page elements and some fixes --- Web/static/css/style.css | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Web/static/css/style.css b/Web/static/css/style.css index ffb4de94..34745ba1 100644 --- a/Web/static/css/style.css +++ b/Web/static/css/style.css @@ -794,10 +794,9 @@ table.User { } .tabs { - border-bottom: 1px solid #707070; - margin-left: -10px; - margin-right: -6px; - width: 627px; + border-bottom: 1px solid #707070; + margin-right: -12px; + margin-left: -12px; } #activetabs { @@ -1804,4 +1803,21 @@ body.scrolled .toTop:hover { font-weight: bold; padding-top: 3px; padding-bottom: 4px; +} +.note_header { + background: #f7f7f7; + border-bottom: solid 1px #DAE1E8; + border-top: solid 1px #45688E; + padding: 4px 6px 5px 6px; +} +.note_header .note_title { + color: #45688E; + font-size: 13px; + font-weight: bold; + line-height: 15px; + margin: 0px; + padding: 0px 0px 1px 0px; +} +.page_yellowheader a { + color: #696029; } \ No newline at end of file From 9a42484401aed421c3b5ac94ed393a825c9ed931 Mon Sep 17 00:00:00 2001 From: KosFurler Date: Sun, 23 Jan 2022 23:27:52 +0300 Subject: [PATCH 38/81] Notes Add a header in the note view --- Web/Presenters/templates/Notes/View.xml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Web/Presenters/templates/Notes/View.xml b/Web/Presenters/templates/Notes/View.xml index c2da6188..3ba2d33a 100644 --- a/Web/Presenters/templates/Notes/View.xml +++ b/Web/Presenters/templates/Notes/View.xml @@ -34,8 +34,20 @@ } -
+
From f72879de0e8a32017d5027260d9a9b4aae825e6a Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Mon, 24 Jan 2022 14:35:26 +0200 Subject: [PATCH 39/81] Discussions: Fix search bar in group discussion board --- Web/Presenters/templates/Topics/Board.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Web/Presenters/templates/Topics/Board.xml b/Web/Presenters/templates/Topics/Board.xml index 6d38ea20..1afeabb8 100644 --- a/Web/Presenters/templates/Topics/Board.xml +++ b/Web/Presenters/templates/Topics/Board.xml @@ -14,8 +14,8 @@ {block tabs}
- - + +

From b9f4cedca57ccd878e074667b3aaff2ef503cfb6 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Mon, 24 Jan 2022 16:08:40 +0300 Subject: [PATCH 40/81] Date: Make it more user-friendly --- Web/Util/DateTime.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Web/Util/DateTime.php b/Web/Util/DateTime.php index 4e01d5f2..3650d722 100644 --- a/Web/Util/DateTime.php +++ b/Web/Util/DateTime.php @@ -32,10 +32,10 @@ class DateTime return $diff->i === 5 ? tr("time_exactly_five_minutes_ago") : tr("time_minutes_ago", $diff->i); } else if($this->timestamp >= strtotime("-1day midnight")) { # Yesterday return tr("time_yesterday") . tr("time_at_sp") . ovk_strftime_safe("%X", $this->timestamp); - } else if(ovk_strftime_safe("%Y", $this->timestamp) === ovk_strftime_safe("%Y")) { # In this year + } else if(ovk_strftime_safe("%Y", $this->timestamp) === ovk_strftime_safe("%Y", time())) { # In this year return ovk_strftime_safe("%e %h ", $this->timestamp) . tr("time_at_sp") . ovk_strftime_safe(" %R %p", $this->timestamp); } else { - return ovk_strftime_safe("%e %B %Y ", $this->timestamp) . tr("time_at_sp") . ovk_strftime_safe(" %X", $this->timestamp); + return ovk_strftime_safe("%e %B %Y ", $this->timestamp) . tr("time_at_sp") . ovk_strftime_safe(" %R %p", $this->timestamp); } } From 4ae74841e0197180045109ea792dff8354633492 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Mon, 24 Jan 2022 16:15:27 +0300 Subject: [PATCH 41/81] Date: Hide seconds if smth was created today or yesterday --- Web/Util/DateTime.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Web/Util/DateTime.php b/Web/Util/DateTime.php index 3650d722..2bcb0f9d 100644 --- a/Web/Util/DateTime.php +++ b/Web/Util/DateTime.php @@ -25,7 +25,7 @@ class DateTime if($this->timestamp >= strtotime("midnight")) { # Today if($diff->h >= 1) - return tr("time_today") . tr("time_at_sp") . ovk_strftime_safe("%X", $this->timestamp); + return tr("time_today") . tr("time_at_sp") . ovk_strftime_safe(" %R %p", $this->timestamp); else if($diff->i < 2) return tr("time_just_now"); else From 6c90bd1d0f54f7329f4e03a3846becbf9f04915f Mon Sep 17 00:00:00 2001 From: veselcraft Date: Mon, 24 Jan 2022 16:16:24 +0300 Subject: [PATCH 42/81] Date: Hide seconds if smth was created today or ACTUALLY yesterday --- Web/Util/DateTime.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Web/Util/DateTime.php b/Web/Util/DateTime.php index 2bcb0f9d..464f10c9 100644 --- a/Web/Util/DateTime.php +++ b/Web/Util/DateTime.php @@ -31,7 +31,7 @@ class DateTime else return $diff->i === 5 ? tr("time_exactly_five_minutes_ago") : tr("time_minutes_ago", $diff->i); } else if($this->timestamp >= strtotime("-1day midnight")) { # Yesterday - return tr("time_yesterday") . tr("time_at_sp") . ovk_strftime_safe("%X", $this->timestamp); + return tr("time_yesterday") . tr("time_at_sp") . ovk_strftime_safe(" %R %p", $this->timestamp); } else if(ovk_strftime_safe("%Y", $this->timestamp) === ovk_strftime_safe("%Y", time())) { # In this year return ovk_strftime_safe("%e %h ", $this->timestamp) . tr("time_at_sp") . ovk_strftime_safe(" %R %p", $this->timestamp); } else { From bf19fb2ab78c510a34eb1f6dc32ebd1bd9b3376e Mon Sep 17 00:00:00 2001 From: veselcraft Date: Mon, 24 Jan 2022 16:25:56 +0300 Subject: [PATCH 43/81] Notes: Fix 500 error made by @kosfurler :DDDDDDDDDDDDDDD --- Web/Presenters/templates/Notes/View.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/Web/Presenters/templates/Notes/View.xml b/Web/Presenters/templates/Notes/View.xml index 3ba2d33a..dd1e8348 100644 --- a/Web/Presenters/templates/Notes/View.xml +++ b/Web/Presenters/templates/Notes/View.xml @@ -12,6 +12,7 @@ {/block} {block content} + {var author = $note->getOwner()} -

+ + +
@@ -60,11 +68,5 @@ model => "notes", parent => $note}
-
-

{_actions}

-
- {_delete} -
-
{/block} diff --git a/Web/static/css/style.css b/Web/static/css/style.css index add49c26..7fe91ff0 100644 --- a/Web/static/css/style.css +++ b/Web/static/css/style.css @@ -1820,3 +1820,12 @@ body.scrolled .toTop:hover { margin: 0; padding: 0 0 1px 0; } +.note_footer { + border-top: 1px solid #ddd; + clear: both; + margin-top: 10px; + padding: 0px 2px 0px 6px; +} +.comments_count { + padding: 5px 0px 0px 0px; +} \ No newline at end of file From 287b2a29aab9d19b0cc01de4f0ec6d2a22d57e14 Mon Sep 17 00:00:00 2001 From: KosFurler Date: Tue, 25 Jan 2022 23:52:23 +0300 Subject: [PATCH 51/81] Notes: Update layot --- Web/Presenters/templates/Notes/View.xml | 14 ++++++++------ Web/static/css/style.css | 12 +++++++----- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Web/Presenters/templates/Notes/View.xml b/Web/Presenters/templates/Notes/View.xml index e9858c64..5d1eb5ab 100644 --- a/Web/Presenters/templates/Notes/View.xml +++ b/Web/Presenters/templates/Notes/View.xml @@ -51,16 +51,19 @@
- diff --git a/Web/routes.yml b/Web/routes.yml index e22f938e..7bd01965 100644 --- a/Web/routes.yml +++ b/Web/routes.yml @@ -223,6 +223,8 @@ routes: handler: "Notes->view" - url: "/notes/create" handler: "Notes->create" + - url: "/note{num}_{num}/edit" + handler: "Notes->edit" - url: "/note{num}_{num}/delete" handler: "Notes->delete" - url: "/invite" diff --git a/locales/en.strings b/locales/en.strings index 0f4d8fc7..ee2e9081 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -295,8 +295,11 @@ "name_note" = "Title"; "text_note" = "Content"; "create_note" = "Create note"; +"edit_note" = "Edit note"; "actions" = "Actions"; +"edited" = "Edited"; + "notes_zero" = "No notes"; "notes_one" = "$1 note"; "notes_other" = "$1 notes"; diff --git a/locales/ru.strings b/locales/ru.strings index 64f66185..bee9b7cc 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -313,8 +313,11 @@ "name_note" = "Название"; "text_note" = "Содержание"; "create_note" = "Создать заметку"; +"edit_note" = "Редактировать заметку"; "actions" = "Действия"; +"edited" = "Отредактировано"; + "notes_zero" = "Ни одной заметки"; "notes_one" = "Одна заметка"; "notes_few" = "$1 заметки"; From 22157c7fa30d7a7779c536929d91affd864044e3 Mon Sep 17 00:00:00 2001 From: Ilya Prokopenko Date: Thu, 27 Jan 2022 14:01:27 +0300 Subject: [PATCH 57/81] [SECURITY] Deny login to a deleted account --- Web/Presenters/AuthPresenter.php | 7 +++++-- Web/Presenters/OpenVKPresenter.php | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Web/Presenters/AuthPresenter.php b/Web/Presenters/AuthPresenter.php index 0d43315b..9123f12a 100644 --- a/Web/Presenters/AuthPresenter.php +++ b/Web/Presenters/AuthPresenter.php @@ -126,6 +126,10 @@ final class AuthPresenter extends OpenVKPresenter if(!$this->authenticator->verifyCredentials($user->id, $this->postParam("password"))) $this->flashFail("err", tr("login_failed"), tr("invalid_username_or_password")); + $ovkUser = new User($user->related("profiles.user")->fetch()); + if($ovkUser->isDeleted()) + $this->flashFail("err", tr("login_failed"), tr("invalid_username_or_password")); + $secret = $user->related("profiles.user")->fetch()["2fa_secret"]; $code = $this->postParam("code"); if(!is_null($secret)) { @@ -136,7 +140,6 @@ final class AuthPresenter extends OpenVKPresenter if(is_null($code)) return; - $ovkUser = new User($user->related("profiles.user")->fetch()); if(!($code === (new Totp)->GenerateToken(Base32::decode($secret)) || $ovkUser->use2faBackupCode((int) $code))) { $this->flash("err", tr("login_failed"), tr("incorrect_2fa_code")); return; @@ -229,7 +232,7 @@ final class AuthPresenter extends OpenVKPresenter } $user = $this->users->getByChandlerUser(new ChandlerUser($uRow)); - if(!$user) + if(!$user || $user->isDeleted()) $this->flashFail("err", tr("error"), tr("password_reset_error")); $request = $this->restores->getLatestByUser($user); diff --git a/Web/Presenters/OpenVKPresenter.php b/Web/Presenters/OpenVKPresenter.php index c232cd91..1aee16d2 100755 --- a/Web/Presenters/OpenVKPresenter.php +++ b/Web/Presenters/OpenVKPresenter.php @@ -210,6 +210,13 @@ abstract class OpenVKPresenter extends SimplePresenter $this->user->id = $this->user->identity->getId(); $this->template->thisUser = $this->user->identity; $this->template->userTainted = $user->isTainted(); + + if($this->user->identity->isDeleted()) { + Authenticator::i()->logout(); + Session::i()->set("_su", NULL); + $this->flashFail("err", tr("error"), tr("profile_not_found")); + $this->redirect("/", static::REDIRECT_TEMPORARY); + } if($this->user->identity->isBanned() && !$this->banTolerant) { header("HTTP/1.1 403 Forbidden"); From 3796135c2f5a3a2812ef369620f1b7be08e0cfd4 Mon Sep 17 00:00:00 2001 From: Ilya Prokopenko Date: Thu, 27 Jan 2022 14:46:28 +0300 Subject: [PATCH 58/81] Search: Filter out deleted accounts --- Web/Models/Repositories/Users.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Web/Models/Repositories/Users.php b/Web/Models/Repositories/Users.php index e99611b2..e0893a6d 100644 --- a/Web/Models/Repositories/Users.php +++ b/Web/Models/Repositories/Users.php @@ -39,7 +39,7 @@ class Users function find(string $query): Util\EntityStream { $query = "%$query%"; - $result = $this->users->where("CONCAT_WS(' ', first_name, last_name) LIKE ?", $query); + $result = $this->users->where("CONCAT_WS(' ', first_name, last_name) LIKE ?", $query)->where("deleted", 0); return new Util\EntityStream("User", $result); } From 518a52971dadf9f855caa52ebbd68f8edb00e359 Mon Sep 17 00:00:00 2001 From: WerySkok <15957616+WerySkok@users.noreply.github.com> Date: Thu, 27 Jan 2022 21:18:45 +0300 Subject: [PATCH 59/81] Docs: Move docs away from the repo We now have docs.openvk.su for hosting documentation. --- docs/centos8_install.md | 357 ---------------------------------------- 1 file changed, 357 deletions(-) delete mode 100644 docs/centos8_install.md diff --git a/docs/centos8_install.md b/docs/centos8_install.md deleted file mode 100644 index f29ebc67..00000000 --- a/docs/centos8_install.md +++ /dev/null @@ -1,357 +0,0 @@ -# Installing OpenVK - -Based on [@rem-pai](https://github.com/rem-pai)'s way to install OpenVK modified using my experience. - -!!WARNING!! - -CentOS 8 is reaching it's end-of-life soon. There are other supported similar distributions like Rocky Linux or AlmaLinux. - -## SELinux - -🖥Run the command: - -```bash -sestatus -``` - -If it says `SELinux status: enabled` then SELinux will disturb us. Let's disable it. - -_ℹNote: I know that it's not most secured solution but I don't know any proper way that will work._ - -📝Edit file `/etc/sysconfig/selinux` and change the line `SELinux=enforcing` to `SELinux=disabled`, then 🔌reboot your machine. `sestatus` should tell `SELinux status: disabled` right now. - -## Dependencies - -🖥Let's install EPEL and Remi repos for PHP 7.4: - -```bash -dnf -y install epel-release -dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -``` - -🖥Then enable modules that we need: - -```bash -dnf -y module enable php:remi-7.4 -dnf -y module enable nodejs:14 -``` - -🖥And install dependencies: - -```bash -dnf -y install php php-cli php-common unzip php-zip php-yaml php-gd php-pdo_mysql nodejs git -``` - -🖥Don't forget about Yarn and Composer: - -```bash -npm i -g yarn -php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" -php composer-setup.php --filename=composer2 --install-dir=/bin --snapshot -rm composer-setup.php -``` - -### Database - -🖥We will use Percona Server for DB: - -```bash -dnf -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -percona-release setup -y ps80 -dnf -y install percona-server-server percona-toolkit -systemctl start mysql -``` - -🖥And then look up for temporary password: - -```bash -cat /var/log/mysqld.log | grep password -``` - -It should look like this: - - 2021-01-11T12:56:09.203991Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: >b?Q.fDXJ4fk - -🖥Then run `mysql_secure_installation`, set new password and answer like this: - - Change the password for root ? ((Press y|Y for Yes, any other key for No) : n - Remove anonymous users? (Press y|Y for Yes, any other key for No) : y - Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y - Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y - Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y - -### ffmpeg - -Additionally, you can install ffmpeg for processing videos. - -🖥You will need to use RPMFusion repo to install it: - -```bash -dnf -y localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm -dnf -y install --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm -``` - -🖥Then install SDL2 and ffmpeg: - -```bash -dnf -y install http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.10-1.el7.x86_64.rpm -dnf -y install ffmpeg -``` - -## Chandler and OpenVK installation - -🖥Install Chandler in `/opt`: - -```bash -cd /opt -git clone https://github.com/openvk/chandler.git -cd chandler/ -composer2 install -``` - -🖥You will need a secret key. You can generate it using: - -```bash -cat /dev/random | tr -dc 'a-z0-9' | fold -w 128 | head -n 1 -``` - -📝Now edit config file `chandler-example.yml` like this: - -```yaml -chandler: - debug: true - websiteUrl: null - rootApp: "openvk" - - preferences: - appendExtension: "xhtml" - adminUrl: "/chandlerd" - exposeChandler: true - - database: - dsn: "mysql:unix_socket=/var/lib/mysql/mysql.sock;dbname=db" - user: "root" - password: "DATABASE_PASSWORD" - - security: - secret: "SECRET_KEY_HERE" - csrfProtection: "permissive" - sessionDuration: 14 -``` - -🖥And rename it to `chandler.yml`: - -```bash -mv chandler-example.yml chandler.yml -``` - -🖥Now let's install CommitCaptcha extension. It is mandatory for OpenVK. - -```bash -cd extensions/available/ -git clone https://github.com/openvk/commitcaptcha.git -cd commitcaptcha/ -composer2 install -``` - -🖥And now download OpenVK: - -```bash -cd .. -git clone https://github.com/openvk/openvk.git -cd openvk/ -composer2 install -cd Web/static/js -yarn install -``` - -📝Now edit config file `openvk-example.yml` like this: - -```yaml -openvk: - debug: true - appearance: - name: "OpenVK" - motd: "Yet another OpenVK instance" - preferences: - femaleGenderPriority: true - uploads: - disableLargeUploads: false - mode: "basic" - shortcodes: - forbiddenNames: - - "index.php" - security: - requireEmail: false - requirePhone: false - forcePhoneVerification: false - forceEmailVerification: false - enableSu: true - rateLimits: - actions: 5 - time: 20 - maxViolations: 50 - maxViolationsAge: 120 - autoban: true - support: - supportName: "Moderator" - adminAccount: 1 # Change this ok - messages: - strict: false - wall: - postSizes: - maxSize: 60000 - processingLimit: 3000 - emojiProcessingLimit: 1000 - menu: - links: - - adPoster: - enable: false - src: "https://example.org/ad_poster.jpeg" - caption: "Ad caption" - link: "https://example.org/product.aspx?id=10&from=ovk" - bellsAndWhistles: - fartscroll: false - testLabel: false - credentials: - smsc: - enable: false - client: "" - secret: "" - eventDB: - enable: true # Better enable this - database: - dsn: "mysql:unix_socket=/var/lib/mysql/mysql.sock;dbname=openvk_eventdb" - user: "root" - password: "DATABASE_PASSWORD" -``` - -Please note `eventDB` section because it's better to enable event database. - -🖥And rename it to `openvk.yml`: - -```bash -mv openvk-example.yml openvk.yml -``` - -🖥Then enable CommitCaptcha and OpenVK for Chandler: - -```bash -ln -s /opt/chandler/extensions/available/commitcaptcha/ /opt/chandler/extensions/enabled/commitcaptcha -ln -s /opt/chandler/extensions/available/openvk/ /opt/chandler/extensions/enabled/openvk -``` - -### DB configuration - -_ℹNote: it's better to create another user for SQL but I won't cover that._ - -🖥Enter MySQL shell: - -```bash -mysql -p -``` - -🖥And create main and event databases: - -```sql -CREATE DATABASE openvk; -CREATE DATABASE openvk_eventdb; -exit -``` - -🖥Go to `/opt/chandler`: - -```bash -cd /opt/chandler -``` - -📝We need to import Chandler database but for some reason it's not ready for use so we need to edit dump `install/init-db.sql`: -1\. Remove ` PAGE_CHECKSUM=1` everywhere. -2\. Replace `Aria` with `InnoDB` everywhere. - -🖥Now database dump can be imported: - -```bash -mysql -p'DATABASE_PASSWORD' openvk < install/init-db.sql -``` - -🖥Go to `extensions/available/openvk/`: - -```bash -cd extensions/available/openvk/ -``` - -📝We also need to import OpenVK database. Unless you use MariaDB (we are using Percona here) you should edit `install/init-static-db.sql`: -1\. Replace `utf8mb4_unicode_nopad_ci` with `utf8mb4_unicode_520_ci` everywhere. - -🖥Now database dump can be imported: - -```bash -mysql -p'DATABASE_PASSWORD' openvk < install/init-static-db.sql -``` - -🖥Also import event database: - -```bash -mysql -p'DATABASE_PASSWORD' openvk_eventdb < install/init-event-db.sql -``` - -### Webserver configuration - -Apache is already installed so we will use it. - -🖥Make the user `apache` owner of the `chandler` folder: - -```bash -cd /opt -chown -R apache: chandler/ -``` - -📝Now let's create config file `/etc/httpd/conf.d/10-openvk.conf`: - -```apache - - ServerName openvk.local - DocumentRoot /opt/chandler/htdocs - - - AllowOverride All - - Require all granted - - - ErrorLog /var/log/openvk/error.log - CustomLog /var/log/openvk/access.log combinedio - -``` - -📝Also enable rewrite_module by creating `/etc/httpd/conf.modules.d/02-rewrite.conf`: - -```apache -LoadModule rewrite_module modules/mod_rewrite.so -``` - -🖥Make directory for OpenVK logs and make the user `apache` owner of it: - -```bash -mkdir /var/log/openvk -chown apache: /var/log/openvk/ -``` - -🖥Make the firewall exception for port 80: - -```bash -firewall-cmd --permanent --add-port=80/tcp -firewall-cmd --reload -``` - -🖥And start Apache: - -```bash -systemctl start httpd -``` - -OpenVK should work right now! - -Also you can raise 2MB the file limit through editing `/etc/php.ini`. And it's also better to install PHPMyAdmin but I won't cover that. From 2c31a72774d9c2adafa62f5bd841d4300758ddaf Mon Sep 17 00:00:00 2001 From: WerySkok <15957616+WerySkok@users.noreply.github.com> Date: Thu, 27 Jan 2022 21:24:42 +0300 Subject: [PATCH 60/81] Locales: Fix README --- locales/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/README.md b/locales/README.md index 84bb344a..1d156ee7 100644 --- a/locales/README.md +++ b/locales/README.md @@ -1,5 +1,5 @@ # Locales for OpenVK -So, there is a locales contained here for [OpenVK](../../../openvk). +So, there is a locales contained here for [OpenVK](../../openvk). ## Contributing From e35b4dc70ee10f9338ee2ba6579c050ca4c7824a Mon Sep 17 00:00:00 2001 From: WerySkok <15957616+WerySkok@users.noreply.github.com> Date: Thu, 27 Jan 2022 21:28:23 +0300 Subject: [PATCH 61/81] Locales: hotfix previous commit --- locales/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/README.md b/locales/README.md index 1d156ee7..1a1c94e0 100644 --- a/locales/README.md +++ b/locales/README.md @@ -1,5 +1,5 @@ # Locales for OpenVK -So, there is a locales contained here for [OpenVK](../../openvk). +So, there is a locales contained here for [OpenVK](../../../). ## Contributing From 67c61bf7a18a99975d70c15eec5ae9873e321b45 Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Fri, 28 Jan 2022 15:34:13 +0200 Subject: [PATCH 62/81] Support: Add ability to delete comments in a ticket There used to be a button for this, but it didn't work. It works now --- Web/Models/Entities/TicketComment.php | 5 ++++ Web/Models/Repositories/TicketComments.php | 3 +-- Web/Presenters/SupportPresenter.php | 23 +++++++++++++++++++ .../templates/Support/AnswerTicket.xml | 8 +++---- Web/Presenters/templates/Support/View.xml | 2 +- Web/routes.yml | 2 ++ 6 files changed, 35 insertions(+), 8 deletions(-) diff --git a/Web/Models/Entities/TicketComment.php b/Web/Models/Entities/TicketComment.php index 0801c39f..a9fb684a 100644 --- a/Web/Models/Entities/TicketComment.php +++ b/Web/Models/Entities/TicketComment.php @@ -127,5 +127,10 @@ class TicketComment extends RowModel return $mark === 1; } + function isDeleted(): bool + { + return (bool) $this->getRecord()->deleted; + } + use Traits\TRichText; } diff --git a/Web/Models/Repositories/TicketComments.php b/Web/Models/Repositories/TicketComments.php index 94360aec..4d3c5316 100644 --- a/Web/Models/Repositories/TicketComments.php +++ b/Web/Models/Repositories/TicketComments.php @@ -4,7 +4,6 @@ namespace openvk\Web\Models\Repositories; // use openvk\Web\Models\Entities\User; // use openvk\Web\Models\Repositories\Users; use openvk\Web\Models\Entities\TicketComment; -use Nette\Database\Table\ActiveRow; use Chandler\Database\DatabaseConnection; class TicketComments @@ -20,7 +19,7 @@ class TicketComments function getCommentsById(int $ticket_id): \Traversable { - foreach($this->comments->where(['ticket_id' => $ticket_id]) as $comment) yield new TicketComment($comment); + foreach($this->comments->where(['ticket_id' => $ticket_id, 'deleted' => 0]) as $comment) yield new TicketComment($comment); } // private function toTicket(?ActiveRow $ar): ?Ticket diff --git a/Web/Presenters/SupportPresenter.php b/Web/Presenters/SupportPresenter.php index 8a48a0db..a96ac465 100644 --- a/Web/Presenters/SupportPresenter.php +++ b/Web/Presenters/SupportPresenter.php @@ -226,6 +226,29 @@ final class SupportPresenter extends OpenVKPresenter $this->template->content = $parser->text($content); } + function renderDeleteComment(int $id): void + { + $this->assertUserLoggedIn(); + $this->assertNoCSRF(); + + $comment = $this->comments->get($id); + if(is_null($comment)) + $this->notFound(); + + $ticket = $comment->getTicket(); + + if($ticket->isDeleted()) + $this->notFound(); + + if(!($ticket->getUserId() === $this->user->id && $comment->getUType() === 0)) + $this->assertPermission("openvk\Web\Models\Entities\TicketReply", "write", 0); + + $this->willExecuteWriteAction(); + $comment->delete(); + + $this->flashFail("succ", tr("ticket_changed"), tr("ticket_changed_comment")); + } + function renderRateAnswer(int $id, int $mark): void { $this->willExecuteWriteAction(); diff --git a/Web/Presenters/templates/Support/AnswerTicket.xml b/Web/Presenters/templates/Support/AnswerTicket.xml index c8fea4d7..a35ad6a6 100644 --- a/Web/Presenters/templates/Support/AnswerTicket.xml +++ b/Web/Presenters/templates/Support/AnswerTicket.xml @@ -101,11 +101,9 @@ {/if}
- {if $comment->getUType() === 0} -
- {_delete} -
- {/if} +
+ {_delete} +
{if $comment->getUType() === 1 && !is_null($comment->isLikedByUser())}
diff --git a/Web/Presenters/templates/Support/View.xml b/Web/Presenters/templates/Support/View.xml index 8f502fc3..4ef1ce2b 100644 --- a/Web/Presenters/templates/Support/View.xml +++ b/Web/Presenters/templates/Support/View.xml @@ -103,7 +103,7 @@ {if $comment->getUType() === 0}
- {_delete} + {_delete}
{/if} diff --git a/Web/routes.yml b/Web/routes.yml index 7bd01965..9fc08750 100644 --- a/Web/routes.yml +++ b/Web/routes.yml @@ -25,6 +25,8 @@ routes: handler: "Support->makeComment" - url: "/al_comments/create/support/reply/{num}" handler: "Support->AnswerTicketReply" + - url: "/support/comment/{num}/delete" + handler: "Support->deleteComment" - url: "/al_comments/create/{text}/{num}" handler: "Comment->makeComment" - url: "/support/delete/{num}" From f53058d40bdf3622e13433b644beaf066bea8cfb Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Fri, 28 Jan 2022 18:02:19 +0200 Subject: [PATCH 63/81] Support: Display number of tickets with a response in left menu to banned users --- Web/Presenters/templates/@layout.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Web/Presenters/templates/@layout.xml b/Web/Presenters/templates/@layout.xml index d410bc84..4834aed8 100644 --- a/Web/Presenters/templates/@layout.xml +++ b/Web/Presenters/templates/@layout.xml @@ -190,7 +190,11 @@ {php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['caption']} {else} - {_menu_support} + {_menu_support} + {if $ticketAnsweredCount > 0} + ({$ticketAnsweredCount}) + {/if} + {_menu_logout} {/if} {else} From dcd18d266f17a118a5f512d654e0100df0ef935f Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Fri, 28 Jan 2022 18:11:58 +0200 Subject: [PATCH 64/81] Users: Do not constantly reload the page about the user's ban Closes #440 --- Web/Presenters/OpenVKPresenter.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Web/Presenters/OpenVKPresenter.php b/Web/Presenters/OpenVKPresenter.php index 1aee16d2..51840c3d 100755 --- a/Web/Presenters/OpenVKPresenter.php +++ b/Web/Presenters/OpenVKPresenter.php @@ -223,6 +223,7 @@ abstract class OpenVKPresenter extends SimplePresenter $this->getTemplatingEngine()->render(__DIR__ . "/templates/@banned.xml", [ "thisUser" => $this->user->identity, "csrfToken" => $GLOBALS["csrfToken"], + "isTimezoned" => Session::i()->get("_timezoneOffset"), ]); exit; } From 9a47089736341ef00adf78ac1c05c17012ae5e5a Mon Sep 17 00:00:00 2001 From: Ilya Prokopenko Date: Sat, 29 Jan 2022 09:49:03 +0300 Subject: [PATCH 65/81] Note: Add an Cancel button for editing --- Web/Presenters/templates/Notes/Edit.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Web/Presenters/templates/Notes/Edit.xml b/Web/Presenters/templates/Notes/Edit.xml index 1544fbc1..b3b37ee2 100644 --- a/Web/Presenters/templates/Notes/Edit.xml +++ b/Web/Presenters/templates/Notes/Edit.xml @@ -22,6 +22,8 @@ +   + {_cancel} {script "js/node_modules/monaco-editor/min/vs/loader.js"} From e06884a946ca9a663c581d3239797076c0724dfc Mon Sep 17 00:00:00 2001 From: Ilya Prokopenko Date: Sat, 29 Jan 2022 10:15:00 +0300 Subject: [PATCH 66/81] README: Change the link for CentOS 8 installation This was done due to appearance of docs.openvk.su and the removal of docs from the OVK source code (518a52971dadf9f855caa52ebbd68f8edb00e359). --- README.md | 2 +- README_RU.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bfab5547..56211045 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Once you are done, you can login as a system administrator on the network itself * **Password**: `admin` * It is recommended to change the password before using the built-in account. -Full example installation instruction for CentOS 8 is also available [here](docs/centos8_install.md). +Full example installation instruction for CentOS 8 is also available [here](https://docs.openvk.su/openvk_engine/centos8_installation/). ### If my website uses OpenVK, should I publish it's sources? diff --git a/README_RU.md b/README_RU.md index f40b45ea..2ed13a7b 100644 --- a/README_RU.md +++ b/README_RU.md @@ -61,7 +61,7 @@ ln -s /path/to/chandler/extensions/available/openvk /path/to/chandler/extensions * **Пароль**: `admin` * Перед использованием встроенной учетной записи рекомендуется сменить пароль. -Полный пример инструкции по установке CentOS 8 также доступен [здесь](docs/centos8_install.md). +Полный пример инструкции по установке CentOS 8 также доступен [здесь](https://docs.openvk.su/openvk_engine/centos8_installation/). ### Если мой сайт использует OpenVK, должен ли я публиковать его исходные тексты? From 72e010302121d32b54ba41deef736810cb7db1b4 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Sun, 30 Jan 2022 13:04:07 +0300 Subject: [PATCH 67/81] Timezone: Fix funny case when page is always reloading in some places --- Web/static/js/timezone.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Web/static/js/timezone.js b/Web/static/js/timezone.js index a85472fd..fc4f8c55 100755 --- a/Web/static/js/timezone.js +++ b/Web/static/js/timezone.js @@ -3,5 +3,9 @@ xhr = new XMLHttpRequest(); xhr.open("POST", "/iapi/timezone", true); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); -xhr.onload = () => {window.location.reload()}; +xhr.onload = () => { + if(JSON.parse(response.originalTarget.responseText).response == 1) { + window.location.reload(); + } +}; xhr.send('timezone=' + new Date().getTimezoneOffset()); From f81444ee08db378e6c9fba58d283c466990b1396 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Sun, 30 Jan 2022 13:06:04 +0300 Subject: [PATCH 68/81] ok i actually broke it --- Web/static/js/timezone.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Web/static/js/timezone.js b/Web/static/js/timezone.js index fc4f8c55..10d0c5c9 100755 --- a/Web/static/js/timezone.js +++ b/Web/static/js/timezone.js @@ -3,8 +3,8 @@ xhr = new XMLHttpRequest(); xhr.open("POST", "/iapi/timezone", true); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); -xhr.onload = () => { - if(JSON.parse(response.originalTarget.responseText).response == 1) { +xhr.onload = (response) => { + if(JSON.parse(response.originalTarget.responseText).success == 1) { window.location.reload(); } }; From 4c841c96a66cb9cda707436863fae171d8644c5e Mon Sep 17 00:00:00 2001 From: celestora Date: Sun, 30 Jan 2022 14:12:57 +0200 Subject: [PATCH 69/81] Fix InputBox resize bug on newer browsers Apparently I forgot to add "px" a few thousand years ago and now this behaviour is broken. Big sad. --- Web/static/js/al_wall.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Web/static/js/al_wall.js b/Web/static/js/al_wall.js index d18b773d..35b964da 100644 --- a/Web/static/js/al_wall.js +++ b/Web/static/js/al_wall.js @@ -110,7 +110,7 @@ function setupWallPostInputHandlers(id) { var textArea = e.target; textArea.style.height = "5px"; var newHeight = textArea.scrollHeight; - textArea.style.height = newHeight + boost; + textArea.style.height = newHeight + boost + "px"; return; // revert to original size if it is larger (possibly changed by user) From d87277e7e74d465a73659ffb94b4e99c59c87a56 Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Sun, 30 Jan 2022 14:18:39 +0200 Subject: [PATCH 70/81] Global: Fix up button Due to the fact that "document.body.scrollTop" was removed from newer browsers, hovering over this button was not displayed. I replaced this with "window.scrollY" which works in newer browsers. I also localized the text on it. --- Web/Presenters/templates/@layout.xml | 2 +- Web/static/js/scroll.js | 2 +- locales/en.strings | 1 + locales/ru.strings | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Web/Presenters/templates/@layout.xml b/Web/Presenters/templates/@layout.xml index 4834aed8..f6542040 100644 --- a/Web/Presenters/templates/@layout.xml +++ b/Web/Presenters/templates/@layout.xml @@ -93,7 +93,7 @@
- ⬆ Вверх + ⬆ {_to_top}
diff --git a/Web/static/js/scroll.js b/Web/static/js/scroll.js index 19e1c63a..3b652afd 100644 --- a/Web/static/js/scroll.js +++ b/Web/static/js/scroll.js @@ -1,5 +1,5 @@ window.addEventListener("scroll", function(e) { - if(document.body.scrollTop < 100) { + if(window.scrollY < 100) { document.body.classList.toggle("scrolled", false); } else { document.body.classList.toggle("scrolled", true); diff --git a/locales/en.strings b/locales/en.strings index ee2e9081..7ef546da 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -6,6 +6,7 @@ "home" = "Home"; "welcome" = "Welcome"; +"to_top" = "To top"; /* Login */ diff --git a/locales/ru.strings b/locales/ru.strings index bee9b7cc..a283fe35 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -7,6 +7,7 @@ "home" = "Главная"; "welcome" = "Добро пожаловать"; +"to_top" = "Вверх"; /* Login */ @@ -848,4 +849,4 @@ /* User alerts */ -"user_alert_scam" = "На этот аккаунт много жаловались в связи с мошенничеством. Пожалуйста, будьте осторожны, особенно если у вас попросят денег."; \ No newline at end of file +"user_alert_scam" = "На этот аккаунт много жаловались в связи с мошенничеством. Пожалуйста, будьте осторожны, особенно если у вас попросят денег."; From 1df0545061acdbb476ffea0d342defa537ae6f74 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Mon, 31 Jan 2022 14:45:53 +0300 Subject: [PATCH 71/81] [WIP Maybe] Email: Add verification mechanism This does work only if email is required by instance. If you're sysadmin, you can configure it in openvk.yml. --- Email/verify-email.eml.latte | 204 ++++++++++++++++++++++ Web/Models/Entities/EmailVerification.php | 10 ++ Web/Models/Entities/PasswordReset.php | 7 +- Web/Models/Entities/User.php | 14 +- Web/Models/Repositories/Confirmations.php | 33 ++++ Web/Presenters/AboutPresenter.php | 1 + Web/Presenters/AuthPresenter.php | 67 ++++++- Web/Presenters/OpenVKPresenter.php | 35 +++- Web/Presenters/templates/@email.xml | 19 ++ Web/Presenters/templates/@layout.xml | 6 +- Web/di.yml | 3 +- Web/routes.yml | 4 + Web/static/css/style.css | 12 +- locales/en.strings | 15 ++ locales/ru.strings | 15 ++ 15 files changed, 431 insertions(+), 14 deletions(-) create mode 100755 Email/verify-email.eml.latte create mode 100755 Web/Models/Entities/EmailVerification.php create mode 100755 Web/Models/Repositories/Confirmations.php create mode 100755 Web/Presenters/templates/@email.xml diff --git a/Email/verify-email.eml.latte b/Email/verify-email.eml.latte new file mode 100755 index 00000000..40711f94 --- /dev/null +++ b/Email/verify-email.eml.latte @@ -0,0 +1,204 @@ + + + + + + Подтверждение Email + + + + + + + + +
+
+ + + + +
+   +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+   +
+

Подтверждение Email

+
+
+ + + + + +
+ + + + +
+
+ +
+ + + + + +
+   +
+ +
+ + + + + +
+   +
+ +

+ Здравствуйте, {$name}! Вы вероятно зарегистрировались на одном из инстансов OpenVK. Чтобы ваш аккаунт активировался, необходимо подтвердить Email. +

+ + + + + +
+   +
+ + + + + +
+ + + + +
+
+ Подтвердить Email! +
+
+
+ + + + + +
+   +
+ +

+ Если кнопка не работает, вы можете попробовать скопировать и вставить эту ссылку в адресную строку вашего веб-обозревателя: +

+ + + + + +
+ + http://{$_SERVER['HTTP_HOST']}/regFinish?key={$key} + +
+ +

+ Обратите внимание на то, что эту ссылку нельзя: +

+ +
    +
  • Передавать другим людям (даже друзьям, питомцам, соседам, любимым девушкам)
  • +
  • Использовать, если прошло более двух дней с её генерации
  • +
+ + + + + +
+

+ Ещё раз обратите внимание на то, что данную ссылку или письмо ни в коем случае нельзя передавать другим людям! Даже если они представляются службой поддержки.
+ Это письмо предназначено исключительно для одноразового, непосредственного использования владельцем аккаунта. +

+
+ + + + + +
+   +
+ +

+ С уважением, овк-тян. +

+ + + + + +
+   +
+ +
+ + + + + +
+   +
+ +

+ + Вы получили это письмо так как кто-то или вы зарегистрировались на инстансе OpenVK. Это не рассылка и от неё нельзя отписаться. Если вы всё равно хотите перестать получать подобные письма, деактивируйте ваш аккаунт. + +

+
+
+
+ + + + +
+   +
+
+
+ + diff --git a/Web/Models/Entities/EmailVerification.php b/Web/Models/Entities/EmailVerification.php new file mode 100755 index 00000000..cfd057f9 --- /dev/null +++ b/Web/Models/Entities/EmailVerification.php @@ -0,0 +1,10 @@ +getRecord()->timestamp > (time() - 301); + return $this->getRecord()->timestamp > (time() - (5 * MINUTE)); } + /** + * Token is valid only for 3 days. + */ function isStillValid(): bool { - return $this->getRecord()->timestamp > (time() - 172801); + return $this->getRecord()->timestamp > (time() - (3 * DAY)); } function verify(string $token): bool diff --git a/Web/Models/Entities/User.php b/Web/Models/Entities/User.php index 81c10695..84e48041 100644 --- a/Web/Models/Entities/User.php +++ b/Web/Models/Entities/User.php @@ -850,10 +850,10 @@ class User extends RowModel function isDeleted(): bool { - if ($this->getRecord()->deleted == 1) - return TRUE; - else - return FALSE; + if ($this->getRecord()->deleted == 1) + return TRUE; + else + return FALSE; } /** @@ -882,6 +882,12 @@ class User extends RowModel { return $this->getRecord()->website; } + + // ты устрица + function isActivated(): bool + { + return (bool) $this->getRecord()->activated; + } use Traits\TSubscribable; } diff --git a/Web/Models/Repositories/Confirmations.php b/Web/Models/Repositories/Confirmations.php new file mode 100755 index 00000000..1553b50f --- /dev/null +++ b/Web/Models/Repositories/Confirmations.php @@ -0,0 +1,33 @@ +context = DatabaseConnection::i()->getContext(); + $this->confirmations = $this->context->table("email_verifications"); + } + + function toEmailVerification(?ActiveRow $ar): ?EmailVerification + { + return is_null($ar) ? NULL : new EmailVerification($ar); + } + + function getByToken(string $token): ?EmailVerification + { + return $this->toEmailVerification($this->confirmations->where("key", $token)->fetch()); + } + + function getLatestByUser(User $user): ?EmailVerification + { + return $this->toEmailVerification($this->confirmations->where("profile", $user->getId())->order("timestamp DESC")->fetch()); + } +} diff --git a/Web/Presenters/AboutPresenter.php b/Web/Presenters/AboutPresenter.php index bd84efbc..e7351897 100644 --- a/Web/Presenters/AboutPresenter.php +++ b/Web/Presenters/AboutPresenter.php @@ -8,6 +8,7 @@ use Chandler\Session\Session; final class AboutPresenter extends OpenVKPresenter { protected $banTolerant = true; + protected $activationTolerant = true; function renderIndex(): void { diff --git a/Web/Presenters/AuthPresenter.php b/Web/Presenters/AuthPresenter.php index 9123f12a..d6970ff1 100644 --- a/Web/Presenters/AuthPresenter.php +++ b/Web/Presenters/AuthPresenter.php @@ -3,9 +3,11 @@ namespace openvk\Web\Presenters; use openvk\Web\Models\Entities\IP; use openvk\Web\Models\Entities\User; use openvk\Web\Models\Entities\PasswordReset; +use openvk\Web\Models\Entities\EmailVerification; use openvk\Web\Models\Repositories\IPs; use openvk\Web\Models\Repositories\Users; use openvk\Web\Models\Repositories\Restores; +use openvk\Web\Models\Repositories\Confirmations; use openvk\Web\Util\Validator; use Chandler\Session\Session; use Chandler\Security\User as ChandlerUser; @@ -16,19 +18,22 @@ use lfkeitel\phptotp\{Base32, Totp}; final class AuthPresenter extends OpenVKPresenter { protected $banTolerant = true; + protected $activationTolerant = true; private $authenticator; private $db; private $users; private $restores; + private $confirmations; - function __construct(Users $users, Restores $restores) + function __construct(Users $users, Restores $restores, Confirmations $confirmations) { $this->authenticator = Authenticator::i(); $this->db = DatabaseConnection::i()->getContext(); $this->users = $users; $this->restores = $restores; + $this->confirmations = $confirmations; parent::__construct(); } @@ -81,7 +86,7 @@ final class AuthPresenter extends OpenVKPresenter $this->flashFail("err", tr("invalid_email_address"), tr("invalid_email_address_comment")); if (strtotime($this->postParam("birthday")) > time()) - $this->flashFail("err", tr("invalid_birth_date"), tr("invalid_birth_date_comment")); + $this->flashFail("err", tr("invalid_birth_date"), tr("invalid_birth_date_comment")); $chUser = ChandlerUser::create($this->postParam("email"), $this->postParam("password")); if(!$chUser) @@ -96,12 +101,25 @@ final class AuthPresenter extends OpenVKPresenter $user->setSince(date("Y-m-d H:i:s")); $user->setRegistering_Ip(CONNECTING_IP); $user->setBirthday(strtotime($this->postParam("birthday"))); + $user->setActivated((int) !OPENVK_ROOT_CONF['openvk']['preferences']['security']['requireEmail']); $user->save(); if(!is_null($referer)) { $user->toggleSubscription($referer); $referer->toggleSubscription($user); } + + if (OPENVK_ROOT_CONF['openvk']['preferences']['security']['requireEmail']) { + $verifObj = new EmailVerification; + $verifObj->setProfile($user->getId()); + $verifObj->save(); + + $params = [ + "key" => $verifObj->getKey(), + "name" => $user->getCanonicalName(), + ]; + $this->sendmail($user->getEmail(), "verify-email", $params); #Vulnerability possible + } $this->authenticator->authenticate($chUser->getId()); $this->redirect("/id" . $user->getId(), static::REDIRECT_TEMPORARY); @@ -253,4 +271,49 @@ final class AuthPresenter extends OpenVKPresenter $this->flashFail("succ", tr("information_-1"), tr("password_reset_email_sent")); } } + + function renderResendEmail(): void + { + if(!is_null($this->user) && $this->user->identity->isActivated()) + $this->redirect("/id" . $this->user->id, static::REDIRECT_TEMPORARY); + + if($_SERVER["REQUEST_METHOD"] === "POST") { + $user = $this->user->identity; + if(!$user || $user->isDeleted() || $user->isActivated()) + $this->flashFail("err", tr("error"), tr("email_error")); + + $request = $this->confirmations->getLatestByUser($user); + if(!is_null($request) && $request->isNew()) + $this->flashFail("err", tr("forbidden"), tr("email_rate_limit_error")); + + $verifObj = new EmailVerification; + $verifObj->setProfile($user->getId()); + $verifObj->save(); + + $params = [ + "key" => $verifObj->getKey(), + "name" => $user->getCanonicalName(), + ]; + $this->sendmail($user->getEmail(), "verify-email", $params); #Vulnerability possible + + $this->flashFail("succ", tr("information_-1"), tr("email_sent")); + } + } + + function renderVerifyEmail(): void + { + $request = $this->confirmations->getByToken(str_replace(" ", "+", $this->queryParam("key"))); + if(!$request || !$request->isStillValid()) { + $this->flash("err", tr("token_manipulation_error"), tr("token_manipulation_error_comment")); + $this->redirect("/"); + return; + }else{ + $user = $request->getUser(); + $user->setActivated(1); + $user->save(); + + $this->flash("success", tr("email_verify_success")); + $this->redirect("/"); + } + } } diff --git a/Web/Presenters/OpenVKPresenter.php b/Web/Presenters/OpenVKPresenter.php index 51840c3d..30c0b0a6 100755 --- a/Web/Presenters/OpenVKPresenter.php +++ b/Web/Presenters/OpenVKPresenter.php @@ -13,6 +13,7 @@ use WhichBrowser; abstract class OpenVKPresenter extends SimplePresenter { protected $banTolerant = false; + protected $activationTolerant = false; protected $errorTemplate = "@error"; protected $user = NULL; @@ -212,6 +213,27 @@ abstract class OpenVKPresenter extends SimplePresenter $this->template->userTainted = $user->isTainted(); if($this->user->identity->isDeleted()) { + /* + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⠶⠶⣶⠶⠶⠶⠶⠶⠶⠶⠶⠶⢶⠶⠶⠶⠤⠤⠤⠤⣄⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⣠⡾⠋⠀⠀⠊⠀⠀⠀⠀⠀⠀⠀⠀⠒⠒⠒⠀⠀⠀⠀⠤⢤⣤⣄⠉⠉⠛⠛⠷⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⣰⠟⠀⠀⠀⠀⠀⠐⠋⢑⣤⣶⣶⣤⡢⡀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣄⡂⠀⠀⠶⢄⠙⢷⣤⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⣸⡿⠚⠉⡀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⢢⠀⠀⡀⣰⣿⣿⣿⣿⣦⡀⠀⠀⠡⡀⢹⡆⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⢀⣴⠏⠀⣀⣀⣀⡤⢤⣄⣠⣿⣿⣿⣿⣻⣿⣿⣷⠀⢋⣾⠈⠙⣶⠒⢿⣿⣿⣿⣿⡿⠟⠃⠀⡀⠡⠼⣧⡀⠀⠀⠀⠀⠀⠀ + ⠀⠀⢀⣴⣿⢃⡴⢊⢽⣶⣤⣀⠀⠊⠉⠉⡛⢿⣿⣿⣿⠿⠋⢀⡀⠁⠀⠀⢸⣁⣀⣉⣉⣉⡉⠀⠩⡡⠀⣩⣦⠀⠈⠻⣦⡀⠀⠀⠀⠀ + ⠀⢠⡟⢡⠇⡞⢀⠆⠀⢻⣿⣿⣷⣄⠀⢀⠈⠂⠈⢁⡤⠚⡟⠉⠀⣀⣀⠀⠈⠳⣍⠓⢆⢀⡠⢀⣨⣴⣿⣿⡏⢀⡆⠀⢸⡇⠀⠀⠀⠀ + ⠀⣾⠁⢸⠀⠀⢸⠀⠀⠀⠹⣿⣿⣿⣿⣶⣬⣦⣤⡈⠀⠀⠇⠀⠛⠉⣩⣤⣤⣤⣿⣤⣤⣴⣾⣿⣿⣿⣿⣿⣧⠞⠀⠀⢸⡇⠀⠀⠀⠀ + ⠀⢹⣆⠸⠀⠀⢸⠀⠀⠀⠀⠘⢿⣿⣿⣿⣿⣿⣿⣟⣛⠛⠛⣛⡛⠛⠛⣛⣋⡉⠉⣡⠶⢾⣿⣿⣿⣿⣿⣿⡇⠀⠀⢀⣾⠃⠀⠀⠀⠀ + ⠀⠀⠻⣆⡀⠀⠈⢂⠀⠀⠀⠠⡈⢻⣿⣿⣿⣿⡟⠁⠈⢧⡼⠉⠙⣆⡞⠁⠈⢹⣴⠃⠀⢸⣿⣿⣿⣿⣿⣿⠃⠀⡆⣾⠃⠀⠀⠀⠀⠀ + ⠀⠀⠀⠈⢻⣇⠀⠀⠀⠀⠀⠀⢡⠀⠹⣿⣿⣿⣷⡀⠀⣸⡇⠀⠀⣿⠁⠀⠀⠘⣿⠀⠀⠘⣿⣿⣿⣿⣿⣿⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠹⣇⠀⠠⠀⠀⠀⠀⠡⠐⢬⡻⣿⣿⣿⣿⣿⣷⣶⣶⣿⣦⣤⣤⣤⣿⣦⣶⣿⣿⣿⣿⣿⣿⣿⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠹⣧⡀⠡⡀⠀⠀⠀⠑⠄⠙⢎⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⢿⡇⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠈⠳⣤⡐⡄⠀⠀⠀⠈⠂⠀⠱⣌⠻⣿⣿⣿⣿⣿⣿⣿⠿⣿⠟⢻⡏⢻⣿⣿⣿⣿⣿⣿⣿⠀⢸⡇⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢮⣦⡀⠂⠀⢀⠀⠀⠈⠳⣈⠻⣿⣿⣿⡇⠘⡄⢸⠀⠀⣇⠀⣻⣿⣿⣿⣿⣿⡏⠀⠸⡇⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⢶⣤⣄⡑⠄⠀⠀⠈⠑⠢⠙⠻⢷⣶⣵⣞⣑⣒⣋⣉⣁⣻⣿⠿⠟⠱⠃⡸⠀⣧⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠻⣷⣄⡀⠐⠢⣄⣀⡀⠀⠉⠉⠉⠉⠛⠙⠭⠭⠄⠒⠈⠀⠐⠁⢀⣿⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠷⢦⣤⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣒⡠⠄⣠⡾⠃⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠛⠷⠶⣦⣤⣭⣤⣬⣭⣭⣴⠶⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀ + */ Authenticator::i()->logout(); Session::i()->set("_su", NULL); $this->flashFail("err", tr("error"), tr("profile_not_found")); @@ -222,8 +244,17 @@ abstract class OpenVKPresenter extends SimplePresenter header("HTTP/1.1 403 Forbidden"); $this->getTemplatingEngine()->render(__DIR__ . "/templates/@banned.xml", [ "thisUser" => $this->user->identity, - "csrfToken" => $GLOBALS["csrfToken"], - "isTimezoned" => Session::i()->get("_timezoneOffset"), + "csrfToken" => $GLOBALS["csrfToken"] + ]); + exit; + } + + // ето для емейл уже надо (и по хорошему надо бы избавится от повторяющегося кода мда) + if(!$this->user->identity->isActivated() && !$this->activationTolerant) { + header("HTTP/1.1 403 Forbidden"); + $this->getTemplatingEngine()->render(__DIR__ . "/templates/@email.xml", [ + "thisUser" => $this->user->identity, + "csrfToken" => $GLOBALS["csrfToken"] ]); exit; } diff --git a/Web/Presenters/templates/@email.xml b/Web/Presenters/templates/@email.xml new file mode 100755 index 00000000..3de8b2e1 --- /dev/null +++ b/Web/Presenters/templates/@email.xml @@ -0,0 +1,19 @@ +{extends "@layout.xml"} +{block title}{_ec_header}{/block} + +{block header} +{_ec_header} +{/block} + +{block content} +
+

{_ec_title}

+

{tr("ec_1", htmlentities($thisUser->getCanonicalName()))|noescape}

+

{_ec_2}

+

+

+ +
+

+
+{/block} diff --git a/Web/Presenters/templates/@layout.xml b/Web/Presenters/templates/@layout.xml index 4834aed8..ffb425b8 100644 --- a/Web/Presenters/templates/@layout.xml +++ b/Web/Presenters/templates/@layout.xml @@ -100,7 +100,7 @@