From 9da9b4c41ab1a540bb8a6f1b7cf0f7ac33a73851 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sat, 2 Apr 2022 12:40:59 -0600 Subject: [PATCH 1/4] Apply emailed patch for uk lang --- resources/lang/uk/auth.php | 19 ++ resources/lang/uk/exception.php | 11 ++ resources/lang/uk/helpcenter.php | 28 +++ resources/lang/uk/navmenu.php | 19 ++ resources/lang/uk/notification.php | 12 ++ resources/lang/uk/pagination.php | 19 ++ resources/lang/uk/passwords.php | 22 +++ resources/lang/uk/profile.php | 15 ++ resources/lang/uk/site.php | 20 +++ resources/lang/uk/timeline.php | 7 + resources/lang/uk/validation.php | 122 +++++++++++++ resources/lang/uk/web.php | 274 ++++++++++++++++------------- 12 files changed, 442 insertions(+), 126 deletions(-) create mode 100644 resources/lang/uk/auth.php create mode 100644 resources/lang/uk/exception.php create mode 100644 resources/lang/uk/helpcenter.php create mode 100644 resources/lang/uk/navmenu.php create mode 100644 resources/lang/uk/notification.php create mode 100644 resources/lang/uk/pagination.php create mode 100644 resources/lang/uk/passwords.php create mode 100644 resources/lang/uk/profile.php create mode 100644 resources/lang/uk/site.php create mode 100644 resources/lang/uk/timeline.php create mode 100644 resources/lang/uk/validation.php diff --git a/resources/lang/uk/auth.php b/resources/lang/uk/auth.php new file mode 100644 index 000000000..58cb10e50 --- /dev/null +++ b/resources/lang/uk/auth.php @@ -0,0 +1,19 @@ + 'Особові дані не збігаються з нашими записами.', + 'throttle' => 'Забагато спроб входу. Повторіть спробу через :seconds секунд.', + +]; diff --git a/resources/lang/uk/exception.php b/resources/lang/uk/exception.php new file mode 100644 index 000000000..77098e129 --- /dev/null +++ b/resources/lang/uk/exception.php @@ -0,0 +1,11 @@ + [ + 'invalid' => [ + 'album' => 'Мусить містити знімок, відеозапис чи декілька знімків.', + ], + ], + +]; diff --git a/resources/lang/uk/helpcenter.php b/resources/lang/uk/helpcenter.php new file mode 100644 index 000000000..264a5f301 --- /dev/null +++ b/resources/lang/uk/helpcenter.php @@ -0,0 +1,28 @@ + 'Довідка', + 'whatsnew' => 'Що нового', + + 'gettingStarted' => 'Як розпочати', + 'sharingMedia' => 'Поширення медіа', + 'profile' => 'Профіль', + 'stories' => 'Сторі', + 'hashtags' => 'Хештеги', + 'discover' => 'Цікаве', + 'directMessages' => 'Прямі листи', + 'timelines' => 'Стрічки', + 'embed' => 'Експорт', + + 'communityGuidelines' => 'Правила спільноти', + 'whatIsTheFediverse' => 'Що таке федіверс?', + 'controllingVisibility' => 'Керування видимістю', + 'blockingAccounts' => 'Блокування облікових записів', + 'safetyTips' => 'Поради безпеки', + 'reportSomething' => 'Скарга на щось', + 'dataPolicy' => 'Політика даних', + + 'taggingPeople' => 'Позначення людей' + +]; diff --git a/resources/lang/uk/navmenu.php b/resources/lang/uk/navmenu.php new file mode 100644 index 000000000..c0ccbaf51 --- /dev/null +++ b/resources/lang/uk/navmenu.php @@ -0,0 +1,19 @@ + 'Пошук', + 'home' => 'Дім', + 'local' => 'Поруч', + 'network' => 'Мережа', + 'discover' => 'Цікаве', + 'viewMyProfile' => 'Переглянути свій профіль', + 'myProfile' => 'Мій профіль', + 'myTimeline' => 'Моя стрічка', + 'publicTimeline' => 'Загальнодоступна стрічка', + 'remoteFollow' => 'Стеження ззовні', + 'settings' => 'Параметри', + 'admin' => 'Адміністрування', + 'logout' => 'Вийти', + 'directMessages' => 'Прямі листи', + 'composePost' => 'Написати допис', +]; diff --git a/resources/lang/uk/notification.php b/resources/lang/uk/notification.php new file mode 100644 index 000000000..67ef99912 --- /dev/null +++ b/resources/lang/uk/notification.php @@ -0,0 +1,12 @@ + 'ставить уподобання під ваш допис.', + 'likedComment' => 'ставить уподобання під ваш коментар.', + 'startedFollowingYou' => 'починає за вами стежити.', + 'commented' => 'коментує ваш допис.', + 'mentionedYou' => 'згадує вам.', + 'shared' => 'поширює ваш допис.', + +]; diff --git a/resources/lang/uk/pagination.php b/resources/lang/uk/pagination.php new file mode 100644 index 000000000..9b86705bb --- /dev/null +++ b/resources/lang/uk/pagination.php @@ -0,0 +1,19 @@ + '« Назад', + 'next' => 'Далі »', + +]; diff --git a/resources/lang/uk/passwords.php b/resources/lang/uk/passwords.php new file mode 100644 index 000000000..48029a871 --- /dev/null +++ b/resources/lang/uk/passwords.php @@ -0,0 +1,22 @@ + 'Паролі мусять містити принаймні шість символів і збігатися.', + 'reset' => 'Пароль скинуто!', + 'sent' => 'Якщо ваша адреса е-пошти — в нашій базі, посилання для відновлення пароля е-пошти буде надіслано за кілька хвилин. Перевірте теку спаму, якщо лист не надходить.', + 'token' => 'Токен відновлення пароля хибний.', + 'user' => 'Якщо ваша адреса е-пошти — в нашій базі, посилання для відновлення пароля е-пошти буде надіслано за кілька хвилин. Перевірте теку спаму, якщо лист не надходить.', + +]; diff --git a/resources/lang/uk/profile.php b/resources/lang/uk/profile.php new file mode 100644 index 000000000..c28879821 --- /dev/null +++ b/resources/lang/uk/profile.php @@ -0,0 +1,15 @@ + 'Дописів іще нема.', + 'emptyFollowers' => 'Ніхто ще не стежить.', + 'emptyFollowing' => 'Ще ні за ким не стежить.', + 'emptySaved' => 'Ви ще не зберігали дописів.', + 'savedWarning' => 'Лише ви можете переглянути, що зберегли', + 'privateProfileWarning' => 'Обліковий запис приватний', + 'alreadyFollow' => 'Уже стежите за :username?', + 'loginToSeeProfile' => 'для перегляду їхніх фото й відео.', + + 'status.disabled.header' => 'Профіль недоступний', + 'status.disabled.body' => 'На жаль, профіль зараз недоступний. Будь ласка, повторіть спробу згодом.', +]; diff --git a/resources/lang/uk/site.php b/resources/lang/uk/site.php new file mode 100644 index 000000000..9a5dde7f6 --- /dev/null +++ b/resources/lang/uk/site.php @@ -0,0 +1,20 @@ + 'Про застосунок', + 'help' => 'Довідка', + 'language' => 'Мова', + 'fediverse' => 'Федіверс', + 'opensource' => 'Вільне ПЗ', + 'terms' => 'Умови', + 'privacy' => 'Приватність', + 'l10nWip' => 'Переклад іще в роботі', + 'currentLocale' => 'Поточна мова', + 'selectLocale' => 'Оберіть підтримувану мову', + 'contact' => 'Сконтактувати', + 'contact-us' => 'Напишіть нам', + 'places' => 'Місця', + 'profiles' => 'Профілі', + +]; diff --git a/resources/lang/uk/timeline.php b/resources/lang/uk/timeline.php new file mode 100644 index 000000000..3bf61412e --- /dev/null +++ b/resources/lang/uk/timeline.php @@ -0,0 +1,7 @@ + 'Ваша стрічка порожня.', + +]; diff --git a/resources/lang/uk/validation.php b/resources/lang/uk/validation.php new file mode 100644 index 000000000..2ac0e0864 --- /dev/null +++ b/resources/lang/uk/validation.php @@ -0,0 +1,122 @@ + 'Потрібно прийняти :attribute.', + 'active_url' => ':attribute — хибна URL-адреса.', + 'after' => ':attribute мусить бути пізніше, ніж :date.', + 'after_or_equal' => ':attribute мусить бути не раніше, ніж :date.', + 'alpha' => ':attribute може містити лише літери.', + 'alpha_dash' => ':attribute може містити лише літери, цифри й дефіси.', + 'alpha_num' => ':attribute може містити лише літери й цифри.', + 'array' => ':attribute мусить бути масивом.', + 'before' => ':attribute мусить бути раніше, ніж :date.', + 'before_or_equal' => ':attribute мусить бути не пізніше, ніж :date.', + 'between' => [ + 'numeric' => ':attribute мусить бути між :min і :max.', + 'file' => ':attribute мусить містити від :min до :max кілобайтів.', + 'string' => ':attribute мусить містити від :min до :max знаків.', + 'array' => ':attribute мусить містити від :min до :max пунктів.', + ], + 'boolean' => 'Поле :attribute мусить бути істинним чи хибним.', + 'confirmed' => 'Підтвердження :attribute не збігається.', + 'date' => ':attribute — хибна дата.', + 'date_format' => ':attribute не відповідає формату :format.', + 'different' => ':attribute та :other мусять відрізнятися.', + 'digits' => ':attribute мусить містити :digits цифр.', + 'digits_between' => ':attribute мусить містити від :min до :max цифр.', + 'dimensions' => ':attribute має хибну ширину чи висоту.', + 'distinct' => 'Поле :attribute містить дубль.', + 'email' => ':attribute мусить бути чинною адресою е-пошти.', + 'exists' => ':attribute — не ок.', + 'file' => ':attribute мусить бути файлом.', + 'filled' => 'Полю :attribute бракує значення.', + 'image' => ':attribute мусить бути зображенням.', + 'in' => ':attribute — не ок.', + 'in_array' => 'Поля :attribute нема серед :other.', + 'integer' => ':attribute мусить бути числом.', + 'ip' => ':attribute мусить бути чинною IP-адресою.', + 'ipv4' => ':attribute мусить бути чинною IPv4-адресою.', + 'ipv6' => ':attribute мусить бути чинною IPv6-адресою.', + 'json' => ':attribute мусить бути чинним JSON-рядком.', + 'max' => [ + 'numeric' => ':attribute мусить не перевищувати :max.', + 'file' => ':attribute мусить містити не більше, ніж :max кілобайтів.', + 'string' => ':attribute мусить містити не більше, ніж :max символів.', + 'array' => ':attribute мусить містити не більше, ніж :max пунктів.', + ], + 'mimes' => ':attribute мусить бути файлом: :values.', + 'mimetypes' => ':attribute мусить бути файлом: :values.', + 'min' => [ + 'numeric' => ':attribute мусить бути не менше, ніж :max.', + 'file' => ':attribute мусить містити не менше, ніж :max кілобайтів.', + 'string' => ':attribute мусить містити не менше, ніж :max символів.', + 'array' => ':attribute мусить містити не менше, ніж :max пунктів.', + ], + 'not_in' => ':attribute містить хибний вибір.', + 'not_regex' => 'Формат :attribute хибний.', + 'numeric' => ':attribute мусить бути числом.', + 'present' => 'Бракує поля :attribute.', + 'regex' => 'Формат :attribute хибний.', + 'required' => "Поле :attribute обов'язкове.", + 'required_if' => "Поле :attribute обов'язкове, коли :other — :value.", + 'required_unless' => "Поле :attribute обов'язкове unless :other is in :values.", + 'required_with' => "Поле :attribute обов'язкове, коли є :values.", + 'required_with_all' => "Поле :attribute обов'язкове, коли є :values.", + 'required_without' => "Поле :attribute обов'язкове, коли бракує :values.", + 'required_without_all' => "Поле :attribute обов'язкове, коли бракує :values.", + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => ':attribute мусить бути :size.', + 'file' => ':attribute мусить містити :size кілобайтів.', + 'string' => ':attribute мусить містити :size символів.', + 'array' => ':attribute мусить містити :size пунктів.', + ], + 'string' => ':attribute мусить бути рядком.', + 'timezone' => ':attribute мусить бути чинним поясом.', + 'unique' => ':attribute уже зайнято.', + 'uploaded' => 'Не вдалося вивантажити :attribute.', + 'url' => 'Формат :attribute хибний.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/uk/web.php b/resources/lang/uk/web.php index 3844f847a..388a4e235 100644 --- a/resources/lang/uk/web.php +++ b/resources/lang/uk/web.php @@ -3,184 +3,206 @@ return [ 'common' => [ - 'comment' => 'Comment', - 'commented' => 'Commented', - 'comments' => 'Comments', - 'like' => 'Like', - 'liked' => 'Liked', - 'likes' => 'Likes', - 'share' => 'Share', - 'shared' => 'Shared', - 'shares' => 'Shares', - 'unshare' => 'Unshare', + 'comment' => 'Коментувати', + 'commented' => 'Прокоментовано', + 'comments' => 'Коментарі', + 'like' => 'Вподобати', + 'liked' => 'Вподобано', + 'likes' => 'Вподобання', + 'share' => 'Поширити', + 'shared' => 'Поширено', + 'shares' => 'Поширення', + 'unshare' => 'Не поширювати', + 'bookmark' => 'Закладка', - 'cancel' => 'Cancel', - 'copyLink' => 'Copy Link', - 'delete' => 'Delete', - 'error' => 'Error', - 'errorMsg' => 'Something went wrong. Please try again later.', - 'oops' => 'Oops!', - 'other' => 'Other', - 'readMore' => 'Read more', - 'success' => 'Success', + 'cancel' => 'Скасувати', + 'copyLink' => 'Копіювати посилання', + 'delete' => 'Видалити', + 'error' => 'Помилка', + 'errorMsg' => 'Щось пішло не так. Повторіть спробу згодом', + 'oops' => 'Йой!', + 'other' => 'Інше', + 'readMore' => 'Докладніше', + 'success' => 'Успіх', + 'proceed' => 'Продовжити', + 'next' => 'Далі', + 'close' => 'Закрити', + 'clickHere' => 'натисніть тут', - 'sensitive' => 'Sensitive', - 'sensitiveContent' => 'Sensitive Content', - 'sensitiveContentWarning' => 'This post may contain sensitive content', + 'sensitive' => 'Чутливе', + 'sensitiveContent' => 'Чутливий вміст', + 'sensitiveContentWarning' => 'Цей допис може містити чутливий вміст', ], 'site' => [ - 'terms' => 'Terms of Use', - 'privacy' => 'Privacy Policy', + 'terms' => 'Умови використання', + 'privacy' => 'Політика приватності', ], 'navmenu' => [ - 'search' => 'Search', - 'admin' => 'Admin Dashboard', + 'search' => 'Пошук', + 'admin' => 'Адмінпанель', // Timelines - 'homeFeed' => 'Home Feed', - 'localFeed' => 'Local Feed', - 'globalFeed' => 'Global Feed', + 'homeFeed' => 'Домашня стрічка', + 'localFeed' => 'Місцева стрічка', + 'globalFeed' => 'Світова стрічка', // Core features - 'discover' => 'Discover', - 'directMessages' => 'Direct Messages', - 'notifications' => 'Notifications', - 'groups' => 'Groups', - 'stories' => 'Stories', + 'discover' => 'Цікаве', + 'directMessages' => 'Прямі листи', + 'notifications' => 'Сповіщення', + 'groups' => 'Групи', + 'stories' => 'Сторі', // Self links - 'profile' => 'Profile', - 'drive' => 'Drive', - 'settings' => 'Settings', - 'compose' => 'Create New', - 'logout' => 'Logout', + 'profile' => 'Профіль', + 'drive' => 'Сховище', + 'settings' => 'Параметри', + 'compose' => 'Створити', + 'logout' => 'Вийти', // Nav footer - 'about' => 'About', - 'help' => 'Help', - 'language' => 'Language', - 'privacy' => 'Privacy', - 'terms' => 'Terms', + 'about' => 'Про застосунок', + 'help' => 'Довідка', + 'language' => 'Мова', + 'privacy' => 'Приватність', + 'terms' => 'Умови', // Temporary links - 'backToPreviousDesign' => 'Go back to previous design' + 'backToPreviousDesign' => 'Повернути минулий дизайн' ], 'directMessages' => [ - 'inbox' => 'Inbox', - 'sent' => 'Sent', - 'requests' => 'Requests' + 'inbox' => 'Вхідні', + 'sent' => 'Надіслані', + 'requests' => 'Запити' ], 'notifications' => [ - 'liked' => 'liked your', - 'commented' => 'commented on your', - 'reacted' => 'reacted to your', - 'shared' => 'shared your', - 'tagged' => 'tagged you in a', + 'liked' => 'ставить уподобання під ваш', + 'commented' => 'коментує ваш', + 'reacted' => 'реагує на ваш', + 'shared' => 'поширює ваш', + 'tagged' => 'позначає вас через', - 'updatedA' => 'updated a', - 'sentA' => 'sent a', + 'updatedA' => 'оновлює', + 'sentA' => 'надсилає', - 'followed' => 'followed', - 'mentioned' => 'mentioned', - 'you' => 'you', + 'followed' => 'відстежує', + 'mentioned' => 'згадує', + 'you' => 'вас', - 'yourApplication' => 'Your application to join', - 'applicationApproved' => 'was approved!', - 'applicationRejected' => 'was rejected. You can re-apply to join in 6 months.', + 'yourApplication' => 'Вашу реєстраційну заявку', + 'applicationApproved' => 'підтверджено!', + 'applicationRejected' => 'відхилено. Можете повторити спробу через 6 місяців.', - 'dm' => 'dm', - 'groupPost' => 'group post', - 'modlog' => 'modlog', - 'post' => 'post', - 'story' => 'story', + 'dm' => 'лист', + 'groupPost' => 'допис у групі', + 'modlog' => 'моджурнал', + 'post' => 'допис', + 'story' => 'сторі', + 'noneFound' => 'Сповіщень не знайдено', ], 'post' => [ - 'shareToFollowers' => 'Share to followers', - 'shareToOther' => 'Share to other', - 'noLikes' => 'No likes yet', - 'uploading' => 'Uploading', + 'shareToFollowers' => 'Поширити авдиторії', + 'shareToOther' => 'Поширити іншим', + 'noLikes' => 'Вподобань поки нема', + 'uploading' => 'Вивантаження', ], 'profile' => [ - 'posts' => 'Posts', - 'followers' => 'Followers', - 'following' => 'Following', - 'admin' => 'Admin', - 'collections' => 'Collections', - 'follow' => 'Follow', - 'unfollow' => 'Unfollow', - 'editProfile' => 'Edit Profile', - 'followRequested' => 'Follow Requested', - 'joined' => 'Joined', + 'posts' => 'Дописи', + 'followers' => 'Авдиторія', + 'following' => 'Підписки', + 'admin' => 'Адміністрація', + 'collections' => 'Збірки', + 'follow' => 'Стежити', + 'unfollow' => 'Не стежити', + 'editProfile' => 'Редагувати профіль', + 'followRequested' => 'Запит на стеження', + 'joined' => 'Долучається', - 'emptyCollections' => 'We can\'t seem to find any collections', - 'emptyPosts' => 'We can\'t seem to find any posts', + 'emptyCollections' => 'Збірок у вас поки нема', + 'emptyPosts' => 'Дописів у вас поки нема', ], 'menu' => [ - 'viewPost' => 'View Post', - 'viewProfile' => 'View Profile', - 'moderationTools' => 'Moderation Tools', - 'report' => 'Report', - 'archive' => 'Archive', - 'unarchive' => 'Unarchive', - 'embed' => 'Embed', + 'viewPost' => 'Переглянути допис', + 'viewProfile' => 'Переглянути профіль', + 'moderationTools' => 'Засоби модерування', + 'report' => 'Скарга', + 'archive' => 'Архівувати', + 'unarchive' => 'Розархівувати', + 'embed' => 'Експорт', - 'selectOneOption' => 'Select one of the following options', - 'unlistFromTimelines' => 'Unlist from Timelines', - 'addCW' => 'Add Content Warning', - 'removeCW' => 'Remove Content Warning', - 'markAsSpammer' => 'Mark as Spammer', - 'markAsSpammerText' => 'Unlist + CW existing and future posts', - 'spam' => 'Spam', - 'sensitive' => 'Sensitive Content', - 'abusive' => 'Abusive or Harmful', - 'underageAccount' => 'Underage Account', - 'copyrightInfringement' => 'Copyright Infringement', - 'impersonation' => 'Impersonation', - 'scamOrFraud' => 'Scam or Fraud', - 'confirmReport' => 'Confirm Report', - 'confirmReportText' => 'Are you sure you want to report this post?', - 'reportSent' => 'Report Sent!', - 'reportSentText' => 'We have successfully received your report.', - 'reportSentError' => 'There was an issue reporting this post.', + 'selectOneOption' => 'Оберіть один із наступних варіантів', + 'unlistFromTimelines' => 'Сховати зі стрічок', + 'addCW' => 'Застерегти про вміст', + 'removeCW' => 'Вилучити застереження', + 'markAsSpammer' => 'Позначити як спам', + 'markAsSpammerText' => 'Сховати цей і майбутні дописи, додаючи застереження', + 'spam' => 'Спам', + 'sensitive' => 'Чутливий вміст', + 'abusive' => 'Ображає чи шкодить', + 'underageAccount' => 'Недостатній вік', + 'copyrightInfringement' => 'Порушує авторські права', + 'impersonation' => 'Вдає когось', + 'scamOrFraud' => 'Шахрайство', + 'confirmReport' => 'Підтвердити скаргу', + 'confirmReportText' => 'Точно поскаржитись на допис?', + 'reportSent' => 'Скаргу надіслано!', + 'reportSentText' => 'Ми успішно отримали вашу скаргу.', + 'reportSentError' => 'Виникла помилка при надсиланні скарги.', - 'modAddCWConfirm' => 'Are you sure you want to add a content warning to this post?', - 'modCWSuccess' => 'Successfully added content warning', - 'modRemoveCWConfirm' => 'Are you sure you want to remove the content warning on this post?', - 'modRemoveCWSuccess' => 'Successfully removed content warning', - 'modUnlistConfirm' => 'Are you sure you want to unlist this post?', - 'modUnlistSuccess' => 'Successfully unlisted post', - 'modMarkAsSpammerConfirm' => 'Are you sure you want to mark this user as a spammer? All existing and future posts will be unlisted on timelines and a content warning will be applied.', - 'modMarkAsSpammerSuccess' => 'Successfully marked account as spammer', + 'modAddCWConfirm' => 'Точно додати застереження про вміст цьому допису?', + 'modCWSuccess' => 'Застереження про вміст успішно додано', + 'modRemoveCWConfirm' => 'Точно вилучити застереження про вміст із цього допису?', + 'modRemoveCWSuccess' => 'Застереження про вміст успішно вилучено', + 'modUnlistConfirm' => 'Точно сховати цей допис?', + 'modUnlistSuccess' => 'Допис успішно сховано', + 'modMarkAsSpammerConfirm' => 'Точно позначити цей обліковий запис як спам? Усі наявні й майбутні дописи буде сховано зі стрічок, і їм буде додано застереження про вміст.', + 'modMarkAsSpammerSuccess' => 'Обліковий запис успішно позначено як спам', - 'toFollowers' => 'to Followers', + 'toFollowers' => 'до авдиторії', - 'showCaption' => 'Show Caption', - 'showLikes' => 'Show Likes', - 'compactMode' => 'Compact Mode', - 'embedConfirmText' => 'By using this embed, you agree to our', + 'showCaption' => 'Показати підпис', + 'showLikes' => 'Показати вподобання', + 'compactMode' => 'Компактний режим', + 'embedConfirmText' => 'Експортуючи кудись допис, ви погоджуєте наші', - 'deletePostConfirm' => 'Are you sure you want to delete this post?', - 'archivePostConfirm' => 'Are you sure you want to archive this post?', - 'unarchivePostConfirm' => 'Are you sure you want to unarchive this post?', + 'deletePostConfirm' => 'Точно видалити допис?', + 'archivePostConfirm' => 'Точно архівувати допис?', + 'unarchivePostConfirm' => 'Точно розархівувати допис?', ], 'story' => [ - 'add' => 'Add Story' + 'add' => 'Додати сторі' ], 'timeline' => [ - 'peopleYouMayKnow' => 'People you may know' + 'peopleYouMayKnow' => 'Ймовірні знайомі', + + 'onboarding' => [ + 'welcome' => 'Вітаємо', + 'thisIsYourHomeFeed' => 'Це ваша домашня стрічка — тут будуть дописи від облікових записів, за якими ви стежите, в порядку додання.', + 'letUsHelpYouFind' => 'Можемо допомогти вам знайти цікавих людей, за якими варто стежити', + 'refreshFeed' => 'Оновити мою стрічку', + ], ], 'hashtags' => [ - 'emptyFeed' => 'We can\'t seem to find any posts for this hashtag' + 'emptyFeed' => 'Дописів із цим хештегом поки нема' + ], + + 'report' => [ + 'report' => 'Скарга', + 'selectReason' => 'Оберіть підставу', + 'reported' => 'Скаргу надіслано', + 'sendingReport' => 'Надсилання скарги', + 'thanksMsg' => 'Дякуємо за скаргу: ви допомагаєте вбезпечити нашу спільноту!', + 'contactAdminMsg' => 'Якщо бажаєте сконтактувати з адміністрацією про цей допис чи скаргу', ], ]; From a5cdc28b6cf104cf10323b8bf05d277695727a80 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sat, 2 Apr 2022 16:18:13 -0600 Subject: [PATCH 2/4] Update ApiV1Controller, fix timelline pagination --- app/Http/Controllers/Api/ApiV1Controller.php | 119 ++++++++++--------- 1 file changed, 61 insertions(+), 58 deletions(-) diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index 03f7d53f9..964a52e83 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Controller.php @@ -1684,7 +1684,7 @@ class ApiV1Controller extends Controller ->whereIn('profile_id', $following) ->whereIn('visibility',['public', 'unlisted', 'private']) ->latest() - ->take($limit) + ->take(($limit * 2)) ->get() ->map(function($s) use($pid) { $status = StatusService::getMastodon($s['id']); @@ -1701,6 +1701,7 @@ class ApiV1Controller extends Controller ->filter(function($status) { return $status && isset($status['account']); }) + ->take($limit) ->values() ->toArray(); } else { @@ -1715,7 +1716,7 @@ class ApiV1Controller extends Controller ->whereIn('profile_id', $following) ->whereIn('visibility',['public', 'unlisted', 'private']) ->latest() - ->take($limit) + ->take(($limit * 2)) ->get() ->map(function($s) use($pid) { $status = StatusService::getMastodon($s['id']); @@ -1732,6 +1733,7 @@ class ApiV1Controller extends Controller ->filter(function($status) { return $status && isset($status['account']); }) + ->take($limit) ->values() ->toArray(); } @@ -1739,6 +1741,63 @@ class ApiV1Controller extends Controller return $this->json($res); } + /** + * GET /api/v1/timelines/public + * + * + * @return StatusTransformer + */ + public function timelinePublic(Request $request) + { + $this->validate($request,[ + 'min_id' => 'nullable|integer|min:0|max:' . PHP_INT_MAX, + 'max_id' => 'nullable|integer|min:0|max:' . PHP_INT_MAX, + 'limit' => 'nullable|integer|max:100' + ]); + + $min = $request->input('min_id'); + $max = $request->input('max_id'); + $limit = $request->input('limit') ?? 20; + $user = $request->user(); + $filtered = $user ? UserFilterService::filters($user->profile_id) : []; + + Cache::remember('api:v1:timelines:public:cache_check', 10368000, function() { + if(PublicTimelineService::count() == 0) { + PublicTimelineService::warmCache(true, 400); + } + }); + + if ($max) { + $feed = PublicTimelineService::getRankedMaxId($max, $limit + 5); + } else if ($min) { + $feed = PublicTimelineService::getRankedMinId($min, $limit + 5); + } else { + $feed = PublicTimelineService::get(0, $limit + 5); + } + + $res = collect($feed) + ->map(function($k) use($user) { + $status = StatusService::getMastodon($k); + if(!$status || !isset($status['account']) || !isset($status['account']['id'])) { + return false; + } + + if($user) { + $status['favourited'] = (bool) LikeService::liked($user->profile_id, $k); + $status['reblogged'] = (bool) ReblogService::get($user->profile_id, $status['id']); + } + return $status; + }) + ->filter(function($s) use($filtered) { + return $s && isset($s['account']) && in_array($s['account']['id'], $filtered) == false; + }) + ->take($limit) + ->values() + ->toArray(); + + return $this->json($res); + } + /** * GET /api/v1/conversations * @@ -1805,62 +1864,6 @@ class ApiV1Controller extends Controller return $this->json($dms); } - /** - * GET /api/v1/timelines/public - * - * - * @return StatusTransformer - */ - public function timelinePublic(Request $request) - { - $this->validate($request,[ - 'min_id' => 'nullable|integer|min:0|max:' . PHP_INT_MAX, - 'max_id' => 'nullable|integer|min:0|max:' . PHP_INT_MAX, - 'limit' => 'nullable|integer|max:100' - ]); - - $min = $request->input('min_id'); - $max = $request->input('max_id'); - $limit = $request->input('limit') ?? 20; - $user = $request->user(); - $filtered = $user ? UserFilterService::filters($user->profile_id) : []; - - Cache::remember('api:v1:timelines:public:cache_check', 10368000, function() { - if(PublicTimelineService::count() == 0) { - PublicTimelineService::warmCache(true, 400); - } - }); - - if ($max) { - $feed = PublicTimelineService::getRankedMaxId($max, $limit); - } else if ($min) { - $feed = PublicTimelineService::getRankedMinId($min, $limit); - } else { - $feed = PublicTimelineService::get(0, $limit); - } - - $res = collect($feed) - ->map(function($k) use($user) { - $status = StatusService::getMastodon($k); - if(!$status || !isset($status['account']) || !isset($status['account']['id'])) { - return false; - } - - if($user) { - $status['favourited'] = (bool) LikeService::liked($user->profile_id, $k); - $status['reblogged'] = (bool) ReblogService::get($user->profile_id, $status['id']); - } - return $status; - }) - ->filter(function($s) use($filtered) { - return $s && isset($s['account']) && in_array($s['account']['id'], $filtered) == false; - }) - ->values() - ->toArray(); - - return $this->json($res); - } - /** * GET /api/v1/statuses/{id} * From 5649873ab87456c36816b441992244adf7fb4ea9 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sat, 2 Apr 2022 16:34:12 -0600 Subject: [PATCH 3/4] Update ApiV1Controller, add miissing pagination header --- app/Http/Controllers/Api/ApiV1Controller.php | 64 +++++++++++++++++--- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index 964a52e83..7beb251aa 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Controller.php @@ -1702,8 +1702,7 @@ class ApiV1Controller extends Controller return $status && isset($status['account']); }) ->take($limit) - ->values() - ->toArray(); + ->values(); } else { $res = Status::select( 'id', @@ -1734,11 +1733,35 @@ class ApiV1Controller extends Controller return $status && isset($status['account']); }) ->take($limit) - ->values() - ->toArray(); + ->values(); } - return $this->json($res); + $baseUrl = config('app.url') . '/api/v1/timelines/home?limit=' . $limit . '&'; + $minId = $res->map(function($s) { + return ['id' => $s['id']]; + })->min('id'); + $maxId = $res->map(function($s) { + return ['id' => $s['id']]; + })->max('id'); + + if($minId == $maxId) { + $minId = null; + } + + if($maxId) { + $link = '<'.$baseUrl.'max_id='.$maxId.'>; rel="next"'; + } + + if($minId) { + $link = '<'.$baseUrl.'min_id='.$minId.'>; rel="prev"'; + } + + if($maxId && $minId) { + $link = '<'.$baseUrl.'max_id='.$maxId.'>; rel="next",<'.$baseUrl.'min_id='.$minId.'>; rel="prev"'; + } + + $headers = isset($link) ? ['Link' => $link] : []; + return $this->json($res->toArray(), 200, $headers); } /** @@ -1792,10 +1815,35 @@ class ApiV1Controller extends Controller return $s && isset($s['account']) && in_array($s['account']['id'], $filtered) == false; }) ->take($limit) - ->values() - ->toArray(); + ->values(); + // ->toArray(); - return $this->json($res); + $baseUrl = config('app.url') . '/api/v1/timelines/public?limit=' . $limit . '&'; + $minId = $res->map(function($s) { + return ['id' => $s['id']]; + })->min('id'); + $maxId = $res->map(function($s) { + return ['id' => $s['id']]; + })->max('id'); + + if($minId == $maxId) { + $minId = null; + } + + if($maxId) { + $link = '<'.$baseUrl.'max_id='.$maxId.'>; rel="next"'; + } + + if($minId) { + $link = '<'.$baseUrl.'min_id='.$minId.'>; rel="prev"'; + } + + if($maxId && $minId) { + $link = '<'.$baseUrl.'max_id='.$maxId.'>; rel="next",<'.$baseUrl.'min_id='.$minId.'>; rel="prev"'; + } + + $headers = isset($link) ? ['Link' => $link] : []; + return $this->json($res->toArray(), 200, $headers); } /** From a7674b7b8de43c2a066f8383d7e60a1761d22989 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sat, 2 Apr 2022 16:36:02 -0600 Subject: [PATCH 4/4] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71070cb9d..2a17f5274 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -118,6 +118,9 @@ - Updated PlaceController, require authentication. ([e7783af6](https://github.com/pixelfed/pixelfed/commit/e7783af6)) - Updated PublicApiController, disable legacy public access to local timeline. ([6ba7d433](https://github.com/pixelfed/pixelfed/commit/6ba7d433)) - Updated DiscoverController, cache public tag feed and only include local posts for unauthenticated users. ([0541aed5](https://github.com/pixelfed/pixelfed/commit/0541aed5)) +- Updated DiscoverController, improve tag feed performance. ([d8ff40eb](https://github.com/pixelfed/pixelfed/commit/d8ff40eb)) +- Updated ApiV1Controller, fix timeline pagination. ([a5cdc28b](https://github.com/pixelfed/pixelfed/commit/a5cdc28b)) +- Updated ApiV1Controller, add missing pagination header. ([5649873a](https://github.com/pixelfed/pixelfed/commit/5649873a)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.2 (2022-01-09)](https://github.com/pixelfed/pixelfed/compare/v0.11.1...v0.11.2)