diff --git a/.rubocop/strict.yml b/.rubocop/strict.yml index 2222c6d8b9..c2655a1470 100644 --- a/.rubocop/strict.yml +++ b/.rubocop/strict.yml @@ -7,8 +7,13 @@ RSpec/Focus: # Require full spec run on CI Exclude: [] Rails/Output: # Remove any `puts` debugging + inherit_mode: + merge: + - Include Enabled: true Exclude: [] + Include: + - spec/**/*.rb Rails/FindEach: # Using `each` could impact performance, use `find_each` Enabled: true diff --git a/CHANGELOG.md b/CHANGELOG.md index 02ac2898dd..8d1e0bfcf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,21 +10,24 @@ The following changelog entries focus on changes visible to users, administrator - **Add confirmation interstitial instead of silently redirecting logged-out visitors to remote resources** (#27792, #28902, and #30651 by @ClearlyClaire and @Gargron)\ This fixes a longstanding open redirect in Mastodon, at the cost of added friction when local links to remote resources are shared. +- Change `form-action` Content-Security-Policy directive to be more restrictive (#26897 by @ClearlyClaire) +- Update dependencies ### Added -- **Add experimental server-side notification grouping** (#29889, #30576, #30685, #30688, #30707, #30776, #30779, #30781, #30440, #31062, #31098, #31076, #31111, #31123, #31223, #31214, #31224, #31299, #31325, #31347, #31304, #31326, #31384, #31403, #31433, #31509, #31486, and #31513 by @ClearlyClaire, @mgmn, and @renchap)\ +- **Add server-side notification grouping** (#29889, #30576, #30685, #30688, #30707, #30776, #30779, #30781, #30440, #31062, #31098, #31076, #31111, #31123, #31223, #31214, #31224, #31299, #31325, #31347, #31304, #31326, #31384, #31403, #31433, #31509, #31486, #31513, #31592, #31594, #31638, #31746, #31652, #31709, #31725, #31745, #31613, #31657, #31840, #31610 and #31929 by @ClearlyClaire, @Gargron, @mgmn, and @renchap)\ Group notifications of the same type for the same target, so that your notifications no longer get cluttered by boost and favorite notifications as soon as a couple of your posts get traction.\ This is done server-side so that clients can efficiently get relevant groups without having to go through numerous pages of individual notifications.\ As part of this, the visual design of the entire notifications feature has been revamped.\ This feature is intended to eventually replace the existing notifications column, but for this first beta, users will have to enable it in the “Experimental features” section of the notifications column settings.\ The API is not final yet, but it consists of: - a new `group_key` attribute to `Notification` entities - - `GET /api/v2_alpha/notifications`: https://docs.joinmastodon.org/methods/notifications_alpha/#get-grouped - - `GET /api/v2_alpha/notifications/:group_key`: https://docs.joinmastodon.org/methods/notifications_alpha/#get-notification-group - - `POST /api/v2_alpha/notifications/:group_key/dimsiss`: https://docs.joinmastodon.org/methods/notifications_alpha/#dismiss-group - - `GET /api/v2_alpha/notifications/:unread_count`: https://docs.joinmastodon.org/methods/notifications_alpha/#unread-group-count -- **Add notification policies, filtered notifications and notification requests** (#29366, #29529, #29433, #29565, #29567, #29572, #29575, #29588, #29646, #29652, #29658, #29666, #29693, #29699, #29737, #29706, #29570, #29752, #29810, #29826, #30114, #30251, #30559, #29868, #31008, #31011, #30996, #31149, #31220, #31222, #31225, #31242, #31262, #31250, #31273, #31310, #31316, #31322, #31329, #31324, #31331, #31343, #31342, #31309, #31358, #31378, #31406, #31256, #31456, #31419, #31457, #31508, #31540, and #31541 by @ClearlyClaire, @Gargron, @TheEssem, @mgmn, @oneiros, and @renchap)\ + - `GET /api/v2/notifications`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-grouped + - `GET /api/v2/notifications/:group_key`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-notification-group + - `GET /api/v2/notifications/:group_key/accounts`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-group-accounts + - `POST /api/v2/notifications/:group_key/dimsiss`: https://docs.joinmastodon.org/methods/grouped_notifications/#dismiss-group + - `GET /api/v2/notifications/:unread_count`: https://docs.joinmastodon.org/methods/grouped_notifications/#unread-group-count +- **Add notification policies, filtered notifications and notification requests** (#29366, #29529, #29433, #29565, #29567, #29572, #29575, #29588, #29646, #29652, #29658, #29666, #29693, #29699, #29737, #29706, #29570, #29752, #29810, #29826, #30114, #30251, #30559, #29868, #31008, #31011, #30996, #31149, #31220, #31222, #31225, #31242, #31262, #31250, #31273, #31310, #31316, #31322, #31329, #31324, #31331, #31343, #31342, #31309, #31358, #31378, #31406, #31256, #31456, #31419, #31457, #31508, #31540, #31541, and #31723 by @ClearlyClaire, @Gargron, @TheEssem, @mgmn, @oneiros, and @renchap)\ The old “Block notifications from non-followers”, “Block notifications from people you don't follow” and “Block direct messages from people you don't follow” notification settings have been replaced by a new set of settings found directly in the notification column.\ You can now separately filter or drop notifications from people you don't follow, people who don't follow you, accounts created within the past 30 days, as well as unsolicited private mentions, and accounts limited by the moderation.\ Instead of being outright dropped, notifications that you chose to filter are put in a separate “Filtered notifications” box that you can review separately without it clogging your main notifications.\ @@ -57,19 +60,22 @@ The following changelog entries focus on changes visible to users, administrator - **Add timeline of public posts about a trending link** (#30381 and #30840 by @Gargron)\ You can now see public posts mentioning currently-trending articles from people who have opted into discovery features.\ This adds a new REST API endpoint: https://docs.joinmastodon.org/methods/timelines/#link -- **Add author highlight for news articles whose authors are on the fediverse** (#30398, #30670, #30521, and #30846 by @Gargron)\ +- **Add author highlight for news articles whose authors are on the fediverse** (#30398, #30670, #30521, #30846, #31819, and #31900 by @Gargron and @oneiros)\ This adds a mechanism to [highlight the author of news articles](https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/) shared on Mastodon.\ Articles hosted outside the fediverse can indicate a fediverse author with a meta tag: ```html ``` On the API side, this is represented by a new `authors` attribute to the `PreviewCard` entity: https://docs.joinmastodon.org/entities/PreviewCard/#authors\ - Note that this feature is still work in progress and the tagging format and verification mechanisms may change in future releases. + Users can allow arbitrary domains to use `fediverse:creator` to credit them by visiting `/settings/verification`.\ + This is federated as a new `attributionDomains` property in the `http://joinmastodon.org/ns` namespace, containing an array of domain names: https://docs.joinmastodon.org/spec/activitypub/#properties-used-1 - **Add in-app notifications for moderation actions and warnings** (#30065, #30082, and #30081 by @ClearlyClaire)\ In addition to email notifications, also notify users of moderation actions or warnings against them directly within the app, so they are less likely to miss important communication from their moderators.\ This adds the `moderation_warning` notification type to the REST API and streaming, with a new [`moderation_warning` attribute](https://docs.joinmastodon.org/entities/Notification/#moderation_warning). - **Add domain information to profiles in web UI** (#29602 by @Gargron)\ Clicking the domain of a user in their profile will now open a tooltip with a short explanation about servers and federation. +- **Add support for Redis sentinel** (#31694, #31623, #31744, #31767, and #31768 by @ThisIsMissEm and @oneiros)\ + See https://docs.joinmastodon.org/admin/scaling/#redis-sentinel - Add ability to reorder uploaded media before posting in web UI (#28456 by @Gargron) - Add moderation interface for searching hashtags (#30880 by @ThisIsMissEm) - Add ability for admins to configure instance favicon and logo (#30040, #30208, #30259, #30375, #30734, #31016, and #30205 by @ClearlyClaire, @FawazFarid, @JasonPunyon, @mgmn, and @renchap)\ @@ -77,6 +83,8 @@ The following changelog entries focus on changes visible to users, administrator - Add `api_versions` to `/api/v2/instance` (#31354 by @ClearlyClaire)\ Add API version number to make it easier for clients to detect compatible features going forward.\ See API documentation at https://docs.joinmastodon.org/entities/Instance/#api-versions +- Add quick links to Administration and Moderation Reports from Web UI (#24838 by @ThisIsMissEm) +- Add link to `/admin/roles` in moderation interface when changing someone's role (#31791 by @ClearlyClaire) - Add recent audit log entries in federation moderation interface (#27386 by @ThisIsMissEm) - Add profile setup to onboarding in web UI (#27829, #27876, and #28453 by @Gargron) - Add prominent share/copy button on profiles in web UI (#27865 and #27889 by @ClearlyClaire and @Gargron) @@ -113,21 +121,24 @@ The following changelog entries focus on changes visible to users, administrator - Add support for multiple `redirect_uris` when creating OAuth 2.0 Applications (#29192 by @ThisIsMissEm) - Add Interlingue and Interlingua to interface languages (#28630 and #30828 by @Dhghomon and @renchap) - Add Kashubian, Pennsylvania Dutch, Vai, Jawi Malay, Mohawk and Low German to posting languages (#26024, #26634, #27136, #29098, #27115, and #27434 by @EngineerDali, @HelgeKrueger, and @gunchleoc) -- Add validations to `Web::PushSubscription` (#30540 and #30542 by @ThisIsMissEm) - Add option to use native Ruby driver for Redis through `REDIS_DRIVER=ruby` (#30717 by @vmstan) - Add support for libvips in addition to ImageMagick (#30090, #30590, #30597, #30632, #30857, #30869, and #30858 by @ClearlyClaire, @Gargron, and @mjankowski)\ Server admins can now use libvips as a faster and lighter alternative to ImageMagick for processing user-uploaded images.\ This requires libvips 8.13 or newer, and needs to be enabled with `MASTODON_USE_LIBVIPS=true`.\ This is enabled by default in the official Docker images, and is intended to completely replace ImageMagick in the future. +- Add validations to `Web::PushSubscription` (#30540 and #30542 by @ThisIsMissEm) +- Add anchors to each authorized application in `/oauth/authorized_applications` (#31677 by @fowl2) - Add active animation to header settings button (#30221, #30307, and #30388 by @daudix) - Add OpenTelemetry instrumentation (#30130, #30322, #30353, and #30350 by @julianocosta89, @renchap, and @robbkidd)\ See https://docs.joinmastodon.org/admin/config/#otel for documentation - Add API to get multiple accounts and statuses (#27871 and #30465 by @ClearlyClaire)\ This adds `GET /api/v1/accounts` and `GET /api/v1/statuses` to the REST API, see https://docs.joinmastodon.org/methods/accounts/#index and https://docs.joinmastodon.org/methods/statuses/#index +- Add support for CORS to `POST /oauth/revoke` (#31743 by @ClearlyClaire) - Add redirection back to previous page after site upload deletion (#30141 by @FawazFarid) - Add RFC8414 OAuth 2.0 server metadata (#29191 by @ThisIsMissEm) - Add loading indicator and empty result message to advanced interface search (#30085 by @ClearlyClaire) - Add `profile` OAuth 2.0 scope, allowing more limited access to user data (#29087 and #30357 by @ThisIsMissEm) +- Add global Regexp timeout (#31928 by @ClearlyClaire) - Add the role ID to the badge component (#29707 by @renchap) - Add diagnostic message for failure during CLI search deploy (#29462 by @mjankowski) - Add pagination `Link` headers on API accounts/statuses when pinned true (#29442 by @mjankowski) @@ -156,14 +167,14 @@ The following changelog entries focus on changes visible to users, administrator - **Change icons throughout the web interface** (#27385, #27539, #27555, #27579, #27700, #27817, #28519, #28709, #28064, #28775, #28780, #27924, #29294, #29395, #29537, #29569, #29610, #29612, #29649, #29844, #27780, #30974, #30963, #30962, #30961, #31362, #31363, #31359, #31371, #31360, #31512, #31511, and #31525 by @ClearlyClaire, @Gargron, @arbolitoloco1, @mjankowski, @nclm, @renchap, @ronilaukkarinen, and @zunda)\ This changes all the interface icons from FontAwesome to Material Symbols for a more modern look, consistent with the official Mastodon Android app.\ In addition, better care is given to pixel alignment, and icon variants are used to better highlight active/inactive state. -- **Change design of compose form in web UI** (#28119, #29059, #29248, #29372, #29384, #29417, #29456, #29406, #29651, and #29659 by @ClearlyClaire, @Gargron, @eai04191, @hinaloe, and @ronilaukkarinen)\ +- **Change design of compose form in web UI** (#28119, #29059, #29248, #29372, #29384, #29417, #29456, #29406, #29651, #29659, and #31889 by @ClearlyClaire, @Gargron, @eai04191, @hinaloe, and @ronilaukkarinen)\ The compose form has been completely redesigned for a more modern and consistent look, as well as spelling out the chosen privacy setting and language name at all times.\ As part of this, the “Unlisted” privacy setting has been renamed to “Quiet public”. -- **Change design of confirmation modals in the web UI** (#29576, #29614, #29640, #29644, #30131, #30884, and #31399 by @ClearlyClaire, @Gargron, and @tribela)\ +- **Change design of modals in the web UI** (#29576, #29614, #29640, #29644, #30131, #30884, #31399, #31555, #31752, #31801, #31883, #31844, #31864, and #31943 by @ClearlyClaire, @Gargron, @tribela and @vmstan)\ The mute, block, and domain block confirmation modals have been completely redesigned to be clearer and include more detailed information on the action to be performed.\ They also have a more modern and consistent design, along with other confirmation modals in the application. - **Change colors throughout the web UI** (#29522, #29584, #29653, #29779, #29803, #29809, #29808, #29828, #31034, #31168, #31266, #31348, #31349, #31361, and #31510 by @ClearlyClaire, @Gargron, @renchap, and @vmstan) -- **Change onboarding prompt to follow suggestions carousel in web UI** (#28878 and #29272 by @Gargron) +- **Change onboarding prompt to follow suggestions carousel in web UI** (#28878, #29272, and #31912 by @Gargron) - **Change email templates** (#28416, #28755, #28814, #29064, #28883, #29470, #29607, #29761, #29760, and #29879 by @ClearlyClaire, @Gargron, @hteumeuleu, and @mjankowski)\ All emails to end-users have been completely redesigned with a fresh new look, providing more information while making them easier to read and keeping maximum compatibility across mail clients. - **Change follow recommendations algorithm** (#28314, #28433, #29017, #29108, #29306, #29550, #29619, and #31474 by @ClearlyClaire, @Gargron, @kernal053, @mjankowski, and @wheatear-dev)\ @@ -171,19 +182,28 @@ The following changelog entries focus on changes visible to users, administrator In addition, the implementation has been significantly reworked, and all follow recommendations are now dismissable.\ This change deprecates the `source` attribute in `Suggestion` entities in the REST API, and replaces it with the new [`sources` attribute](https://docs.joinmastodon.org/entities/Suggestion/#sources). - Change account search algorithm (#30803 by @Gargron) -- **Change streaming server to use its own dependencies and its own docker image** (#24702, #27967, #26850, #28112, #28115, #28137, #28138, #28497, #28548, and #30795 by @TheEssem, @ThisIsMissEm, @jippi, @timetinytim, and @vmstan)\ +- **Change streaming server to use its own dependencies and its own docker image** (#24702, #27967, #26850, #28112, #28115, #28137, #28138, #28497, #28548, #30795, #31612, and #31615 by @TheEssem, @ThisIsMissEm, @jippi, @renchap, @timetinytim, and @vmstan)\ In order to reduce the amount of runtime dependencies, the streaming server has been moved into a separate package and Docker image.\ The `mastodon` image does not contain the streaming server anymore, as it has been moved to its own `mastodon-streaming` image.\ Administrators may need to update their setup accordingly. -- Change how content warnings and filters are displayed in web UI (#31365 by @Gargron) +- Change how content warnings and filters are displayed in web UI (#31365, and #31761 by @Gargron) +- Change preview card processing to ignore `undefined` as canonical url (#31882 by @oneiros) +- Change embedded posts to use web UI (#31766 by @Gargron) +- Change inner borders in media galleries in web UI (#31852 by @Gargron) +- Change design of hide media button in web UI (#31807 by @Gargron) +- Change labels on thread indicators in web UI (#31806 by @Gargron) +- Change report action buttons to be disabled when action has already been taken (#31773, #31822, and #31899 by @ClearlyClaire and @ThisIsMissEm) +- Change width of columns in advanced web UI (#31762 by @Gargron) +- Change design of unread conversations in web UI (#31763 by @Gargron) - Change Web UI to allow viewing and severing relationships with suspended accounts (#27667 by @ClearlyClaire)\ This also adds a `with_suspended` parameter to `GET /api/v1/accounts/relationships` in the REST API. +- Change preview card image size limit from 2MB to 8MB when using libvips (#31904 by @ClearlyClaire) - Change avatars border radius (#31390 by @renchap) - Change counters to be displayed on profile timelines in web UI (#30525 by @Gargron) - Change disabled buttons color in light mode to make the difference more visible (#30998 by @renchap) - Change design of people tab on explore in web UI (#30059 by @Gargron) - Change sidebar text in web UI (#30696 by @Gargron) -- Change "Follow" to "Follow back" and "Mutual" when appropriate in web UI (#28452 and #28465 by @Gargron and @renchap) +- Change "Follow" to "Follow back" and "Mutual" when appropriate in web UI (#28452, #28465, and #31934 by @ClearlyClaire, @Gargron and @renchap) - Change media to be hidden/blurred by default in report modal (#28522 by @ClearlyClaire) - Change order of the "muting" and "blocking" list options in “Data Exports” (#26088 by @fixermark) - Change admin and moderation notes character limit from 500 to 2000 characters (#30288 by @ThisIsMissEm) @@ -197,6 +217,7 @@ The following changelog entries focus on changes visible to users, administrator - Change dropdown menu icon to not be replaced by close icon when open in web UI (#29532 by @Gargron) - Change back button to always appear in advanced web UI (#29551 and #29669 by @Gargron) - Change border of active compose field search inputs (#29832 and #29839 by @vmstan) +- Change instances of Nokogiri HTML4 parsing to HTML5 (#31812, #31815, #31813, and #31814 by @flavorjones) - Change link detection to allow `@` at the end of an URL (#31124 by @adamniedzielski) - Change User-Agent to use Mastodon as the product, and http.rb as platform details (#31192 by @ClearlyClaire) - Change layout and wording of the Content Retention server settings page (#27733 by @vmstan) @@ -249,8 +270,17 @@ The following changelog entries focus on changes visible to users, administrator - Fix various issues when in link preview card generation (#28748, #30017, #30362, #30173, #30853, #30929, #30933, #30957, #30987, and #31144 by @adamniedzielski, @oneiros, @phocks, @timothyjrogers, and @tribela) - Fix handling of missing links in Webfinger responses (#31030 by @adamniedzielski) - Fix HTTP 500 error in `/api/v1/polls/:id/votes` when required `choices` parameter is missing (#25598 by @danielmbrasil) +- Fix security context sometimes not being added in LD-Signed activities (#31871 by @ClearlyClaire) - Fix cross-origin loading of `inert.css` polyfill (#30687 by @louis77) - Fix cutoff of instance name in sign-up form (#30598 by @oneiros) +- Fix invalid date searches returning 503 errors (#31526 by @notchairmk) +- Fix invalid `visibility` values in `POST /api/v1/statuses` returning 500 errors (#31571 by @c960657) +- Fix some components re-rendering spuriously in web UI (#31879 and #31881 by @ClearlyClaire and @Gargron) +- Fix sort order of moderation notes on Reports and Accounts (#31528 by @ThisIsMissEm) +- Fix email language when recipient has no selected locale (#31747 by @ClearlyClaire) +- Fix frequently-used languages not correctly updating in the web UI (#31386 by @c960657) +- Fix `POST /api/v1/statuses` silently ignoring invalid `media_ids` parameter (#31681 by @c960657) +- Fix handling of the `BIND` environment variable in the streaming server (#31624 by @ThisIsMissEm) - Fix empty `aria-hidden` attribute value in logo resources area (#30570 by @mjankowski) - Fix “Redirect URI” field not being marked as required in “New application” form (#30311 by @ThisIsMissEm) - Fix right-to-left text in preview cards (#30930 by @ClearlyClaire) diff --git a/Gemfile b/Gemfile index 4c808fa480..4cce095ec5 100644 --- a/Gemfile +++ b/Gemfile @@ -111,7 +111,7 @@ group :opentelemetry do gem 'opentelemetry-instrumentation-http', '~> 0.23.2', require: false gem 'opentelemetry-instrumentation-http_client', '~> 0.22.3', require: false gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false - gem 'opentelemetry-instrumentation-pg', '~> 0.28.0', require: false + gem 'opentelemetry-instrumentation-pg', '~> 0.29.0', require: false gem 'opentelemetry-instrumentation-rack', '~> 0.24.1', require: false gem 'opentelemetry-instrumentation-rails', '~> 0.31.0', require: false gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 206178a530..4a139155f5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -331,7 +331,7 @@ GEM httplog (1.7.0) rack (>= 2.0) rainbow (>= 2.0.0) - i18n (1.14.5) + i18n (1.14.6) concurrent-ruby (~> 1.0) i18n-tasks (1.0.14) activesupport (>= 4.0.2) @@ -472,9 +472,9 @@ GEM omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) omniauth (~> 2.0) - omniauth-saml (2.1.0) - omniauth (~> 2.0) - ruby-saml (~> 1.12) + omniauth-saml (2.2.1) + omniauth (~> 2.1) + ruby-saml (~> 1.17) omniauth_openid_connect (0.6.1) omniauth (>= 1.9, < 3) openid_connect (~> 1.1) @@ -502,8 +502,8 @@ GEM opentelemetry-common (~> 0.20) opentelemetry-sdk (~> 1.2) opentelemetry-semantic_conventions - opentelemetry-helpers-sql-obfuscation (0.1.0) - opentelemetry-common (~> 0.20) + opentelemetry-helpers-sql-obfuscation (0.2.0) + opentelemetry-common (~> 0.21) opentelemetry-instrumentation-action_mailer (0.1.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-active_support (~> 0.1) @@ -528,8 +528,9 @@ GEM opentelemetry-instrumentation-active_support (0.6.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-base (0.22.3) + opentelemetry-instrumentation-base (0.22.6) opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.21) opentelemetry-registry (~> 0.1) opentelemetry-instrumentation-concurrent_ruby (0.21.4) opentelemetry-api (~> 1.0) @@ -549,7 +550,7 @@ GEM opentelemetry-instrumentation-net_http (0.22.7) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-pg (0.28.0) + opentelemetry-instrumentation-pg (0.29.0) opentelemetry-api (~> 1.0) opentelemetry-helpers-sql-obfuscation opentelemetry-instrumentation-base (~> 0.22.1) @@ -763,7 +764,7 @@ GEM rubocop-rspec (~> 3, >= 3.0.1) ruby-prof (1.7.0) ruby-progressbar (1.13.0) - ruby-saml (1.16.0) + ruby-saml (1.17.0) nokogiri (>= 1.13.10) rexml ruby-vips (2.2.2) @@ -991,7 +992,7 @@ DEPENDENCIES opentelemetry-instrumentation-http (~> 0.23.2) opentelemetry-instrumentation-http_client (~> 0.22.3) opentelemetry-instrumentation-net_http (~> 0.22.4) - opentelemetry-instrumentation-pg (~> 0.28.0) + opentelemetry-instrumentation-pg (~> 0.29.0) opentelemetry-instrumentation-rack (~> 0.24.1) opentelemetry-instrumentation-rails (~> 0.31.0) opentelemetry-instrumentation-redis (~> 0.25.3) diff --git a/app/controllers/api/v2_alpha/notifications/accounts_controller.rb b/app/controllers/api/v2/notifications/accounts_controller.rb similarity index 77% rename from app/controllers/api/v2_alpha/notifications/accounts_controller.rb rename to app/controllers/api/v2/notifications/accounts_controller.rb index 9933b63373..771e966388 100644 --- a/app/controllers/api/v2_alpha/notifications/accounts_controller.rb +++ b/app/controllers/api/v2/notifications/accounts_controller.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class Api::V2Alpha::Notifications::AccountsController < Api::BaseController +class Api::V2::Notifications::AccountsController < Api::BaseController before_action -> { doorkeeper_authorize! :read, :'read:notifications' } before_action :require_user! before_action :set_notifications! @@ -33,11 +33,11 @@ class Api::V2Alpha::Notifications::AccountsController < Api::BaseController end def next_path - api_v2_alpha_notification_accounts_url pagination_params(max_id: pagination_max_id) if records_continue? + api_v2_notification_accounts_url pagination_params(max_id: pagination_max_id) if records_continue? end def prev_path - api_v2_alpha_notification_accounts_url pagination_params(min_id: pagination_since_id) unless @paginated_notifications.empty? + api_v2_notification_accounts_url pagination_params(min_id: pagination_since_id) unless @paginated_notifications.empty? end def pagination_collection diff --git a/app/controllers/api/v2_alpha/notifications_controller.rb b/app/controllers/api/v2/notifications_controller.rb similarity index 89% rename from app/controllers/api/v2_alpha/notifications_controller.rb rename to app/controllers/api/v2/notifications_controller.rb index e8aa0b9e49..c070c0e5e7 100644 --- a/app/controllers/api/v2_alpha/notifications_controller.rb +++ b/app/controllers/api/v2/notifications_controller.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class Api::V2Alpha::NotificationsController < Api::BaseController +class Api::V2::NotificationsController < Api::BaseController before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, except: [:clear, :dismiss] before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, only: [:clear, :dismiss] before_action :require_user! @@ -21,7 +21,7 @@ class Api::V2Alpha::NotificationsController < Api::BaseController ActiveRecord::Associations::Preloader.new(records: @presenter.accounts, associations: [:account_stat, { user: :role }]).call end - MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#index rendering') do |span| + MastodonOTELTracer.in_span('Api::V2::NotificationsController#index rendering') do |span| statuses = @grouped_notifications.filter_map { |group| group.target_status&.id } span.add_attributes( @@ -64,7 +64,7 @@ class Api::V2Alpha::NotificationsController < Api::BaseController private def load_notifications - MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#load_notifications') do + MastodonOTELTracer.in_span('Api::V2::NotificationsController#load_notifications') do notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_grouped_paginated_by_id( limit_param(DEFAULT_NOTIFICATIONS_LIMIT), params.slice(:max_id, :since_id, :min_id, :grouped_types).permit(:max_id, :since_id, :min_id, grouped_types: []) @@ -79,7 +79,7 @@ class Api::V2Alpha::NotificationsController < Api::BaseController def load_grouped_notifications return [] if @notifications.empty? - MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#load_grouped_notifications') do + MastodonOTELTracer.in_span('Api::V2::NotificationsController#load_grouped_notifications') do NotificationGroup.from_notifications(@notifications, pagination_range: (@notifications.last.id)..(@notifications.first.id), grouped_types: params[:grouped_types]) end end @@ -101,11 +101,11 @@ class Api::V2Alpha::NotificationsController < Api::BaseController end def next_path - api_v2_alpha_notifications_url pagination_params(max_id: pagination_max_id) unless @notifications.empty? + api_v2_notifications_url pagination_params(max_id: pagination_max_id) unless @notifications.empty? end def prev_path - api_v2_alpha_notifications_url pagination_params(min_id: pagination_since_id) unless @notifications.empty? + api_v2_notifications_url pagination_params(min_id: pagination_since_id) unless @notifications.empty? end def pagination_collection diff --git a/app/helpers/kmyblue_capabilities_helper.rb b/app/helpers/kmyblue_capabilities_helper.rb index 7471ca2343..075869ee60 100644 --- a/app/helpers/kmyblue_capabilities_helper.rb +++ b/app/helpers/kmyblue_capabilities_helper.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true module KmyblueCapabilitiesHelper - KMYBLUE_API_VERSION = 1 - def fedibird_capabilities capabilities = %i( enable_wide_emoji diff --git a/app/javascript/mastodon/actions/markers.ts b/app/javascript/mastodon/actions/markers.ts index 6254e3f083..0b3280c212 100644 --- a/app/javascript/mastodon/actions/markers.ts +++ b/app/javascript/mastodon/actions/markers.ts @@ -2,7 +2,6 @@ import { debounce } from 'lodash'; import type { MarkerJSON } from 'mastodon/api_types/markers'; import { getAccessToken } from 'mastodon/initial_state'; -import { selectUseGroupedNotifications } from 'mastodon/selectors/settings'; import type { AppDispatch, RootState } from 'mastodon/store'; import { createAppAsyncThunk } from 'mastodon/store/typed_functions'; @@ -76,12 +75,7 @@ interface MarkerParam { } function getLastNotificationId(state: RootState): string | undefined { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return selectUseGroupedNotifications(state) - ? state.notificationGroups.lastReadId - : // @ts-expect-error state.notifications is not yet typed - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - state.getIn(['notifications', 'lastReadId']); + return state.notificationGroups.lastReadId; } const buildPostMarkersParams = (state: RootState) => { diff --git a/app/javascript/mastodon/actions/notification_groups.ts b/app/javascript/mastodon/actions/notification_groups.ts index 2ee46500ab..9d3fc0d425 100644 --- a/app/javascript/mastodon/actions/notification_groups.ts +++ b/app/javascript/mastodon/actions/notification_groups.ts @@ -2,7 +2,7 @@ import { createAction } from '@reduxjs/toolkit'; import { apiClearNotifications, - apiFetchNotifications, + apiFetchNotificationGroups, } from 'mastodon/api/notifications'; import type { ApiAccountJSON } from 'mastodon/api_types/accounts'; import type { @@ -71,7 +71,7 @@ function dispatchAssociatedRecords( export const fetchNotifications = createDataLoadingThunk( 'notificationGroups/fetch', async (_params, { getState }) => - apiFetchNotifications({ exclude_types: getExcludedTypes(getState()) }), + apiFetchNotificationGroups({ exclude_types: getExcludedTypes(getState()) }), ({ notifications, accounts, statuses }, { dispatch }) => { dispatch(importFetchedAccounts(accounts)); dispatch(importFetchedStatuses(statuses)); @@ -92,7 +92,7 @@ export const fetchNotifications = createDataLoadingThunk( export const fetchNotificationsGap = createDataLoadingThunk( 'notificationGroups/fetchGap', async (params: { gap: NotificationGap }, { getState }) => - apiFetchNotifications({ + apiFetchNotificationGroups({ max_id: params.gap.maxId, exclude_types: getExcludedTypes(getState()), }), @@ -108,7 +108,7 @@ export const fetchNotificationsGap = createDataLoadingThunk( export const pollRecentNotifications = createDataLoadingThunk( 'notificationGroups/pollRecentNotifications', async (_params, { getState }) => { - return apiFetchNotifications({ + return apiFetchNotificationGroups({ max_id: undefined, exclude_types: getExcludedTypes(getState()), // In slow mode, we don't want to include notifications that duplicate the already-displayed ones diff --git a/app/javascript/mastodon/actions/notification_requests.ts b/app/javascript/mastodon/actions/notification_requests.ts new file mode 100644 index 0000000000..ef9cbef03e --- /dev/null +++ b/app/javascript/mastodon/actions/notification_requests.ts @@ -0,0 +1,234 @@ +import { + apiFetchNotificationRequest, + apiFetchNotificationRequests, + apiFetchNotifications, + apiAcceptNotificationRequest, + apiDismissNotificationRequest, + apiAcceptNotificationRequests, + apiDismissNotificationRequests, +} from 'mastodon/api/notifications'; +import type { ApiAccountJSON } from 'mastodon/api_types/accounts'; +import type { + ApiNotificationGroupJSON, + ApiNotificationJSON, +} from 'mastodon/api_types/notifications'; +import type { ApiStatusJSON } from 'mastodon/api_types/statuses'; +import type { AppDispatch, RootState } from 'mastodon/store'; +import { createDataLoadingThunk } from 'mastodon/store/typed_functions'; + +import { importFetchedAccounts, importFetchedStatuses } from './importer'; +import { decreasePendingNotificationsCount } from './notification_policies'; + +// TODO: refactor with notification_groups +function dispatchAssociatedRecords( + dispatch: AppDispatch, + notifications: ApiNotificationGroupJSON[] | ApiNotificationJSON[], +) { + const fetchedAccounts: ApiAccountJSON[] = []; + const fetchedStatuses: ApiStatusJSON[] = []; + + notifications.forEach((notification) => { + if (notification.type === 'admin.report') { + fetchedAccounts.push(notification.report.target_account); + } + + if (notification.type === 'moderation_warning') { + fetchedAccounts.push(notification.moderation_warning.target_account); + } + + if ('status' in notification && notification.status) { + fetchedStatuses.push(notification.status); + } + }); + + if (fetchedAccounts.length > 0) + dispatch(importFetchedAccounts(fetchedAccounts)); + + if (fetchedStatuses.length > 0) + dispatch(importFetchedStatuses(fetchedStatuses)); +} + +export const fetchNotificationRequests = createDataLoadingThunk( + 'notificationRequests/fetch', + async (_params, { getState }) => { + let sinceId = undefined; + + if (getState().notificationRequests.items.length > 0) { + sinceId = getState().notificationRequests.items[0]?.id; + } + + return apiFetchNotificationRequests({ + since_id: sinceId, + }); + }, + ({ requests, links }, { dispatch }) => { + const next = links.refs.find((link) => link.rel === 'next'); + + dispatch(importFetchedAccounts(requests.map((request) => request.account))); + + return { requests, next: next?.uri }; + }, + { + condition: (_params, { getState }) => + !getState().notificationRequests.isLoading, + }, +); + +export const fetchNotificationRequest = createDataLoadingThunk( + 'notificationRequest/fetch', + async ({ id }: { id: string }) => apiFetchNotificationRequest(id), + { + condition: ({ id }, { getState }) => + !( + getState().notificationRequests.current.item?.id === id || + getState().notificationRequests.current.isLoading + ), + }, +); + +export const expandNotificationRequests = createDataLoadingThunk( + 'notificationRequests/expand', + async (_, { getState }) => { + const nextUrl = getState().notificationRequests.next; + if (!nextUrl) throw new Error('missing URL'); + + return apiFetchNotificationRequests(undefined, nextUrl); + }, + ({ requests, links }, { dispatch }) => { + const next = links.refs.find((link) => link.rel === 'next'); + + dispatch(importFetchedAccounts(requests.map((request) => request.account))); + + return { requests, next: next?.uri }; + }, + { + condition: (_, { getState }) => + !!getState().notificationRequests.next && + !getState().notificationRequests.isLoading, + }, +); + +export const fetchNotificationsForRequest = createDataLoadingThunk( + 'notificationRequest/fetchNotifications', + async ({ accountId }: { accountId: string }, { getState }) => { + const sinceId = + // @ts-expect-error current.notifications.items is not yet typed + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + getState().notificationRequests.current.notifications.items[0]?.get( + 'id', + ) as string | undefined; + + return apiFetchNotifications({ + since_id: sinceId, + account_id: accountId, + }); + }, + ({ notifications, links }, { dispatch }) => { + const next = links.refs.find((link) => link.rel === 'next'); + + dispatchAssociatedRecords(dispatch, notifications); + + return { notifications, next: next?.uri }; + }, + { + condition: ({ accountId }, { getState }) => { + const current = getState().notificationRequests.current; + return !( + current.item?.account_id === accountId && + current.notifications.isLoading + ); + }, + }, +); + +export const expandNotificationsForRequest = createDataLoadingThunk( + 'notificationRequest/expandNotifications', + async (_, { getState }) => { + const nextUrl = getState().notificationRequests.current.notifications.next; + if (!nextUrl) throw new Error('missing URL'); + + return apiFetchNotifications(undefined, nextUrl); + }, + ({ notifications, links }, { dispatch }) => { + const next = links.refs.find((link) => link.rel === 'next'); + + dispatchAssociatedRecords(dispatch, notifications); + + return { notifications, next: next?.uri }; + }, + { + condition: ({ accountId }: { accountId: string }, { getState }) => { + const url = getState().notificationRequests.current.notifications.next; + + return ( + !!url && + !getState().notificationRequests.current.notifications.isLoading && + getState().notificationRequests.current.item?.account_id === accountId + ); + }, + }, +); + +const selectNotificationCountForRequest = (state: RootState, id: string) => { + const requests = state.notificationRequests.items; + const thisRequest = requests.find((request) => request.id === id); + return thisRequest ? thisRequest.notifications_count : 0; +}; + +export const acceptNotificationRequest = createDataLoadingThunk( + 'notificationRequest/accept', + ({ id }: { id: string }) => apiAcceptNotificationRequest(id), + (_data, { dispatch, getState, discardLoadData, actionArg: { id } }) => { + const count = selectNotificationCountForRequest(getState(), id); + + dispatch(decreasePendingNotificationsCount(count)); + + // The payload is not used in any functions + return discardLoadData; + }, +); + +export const dismissNotificationRequest = createDataLoadingThunk( + 'notificationRequest/dismiss', + ({ id }: { id: string }) => apiDismissNotificationRequest(id), + (_data, { dispatch, getState, discardLoadData, actionArg: { id } }) => { + const count = selectNotificationCountForRequest(getState(), id); + + dispatch(decreasePendingNotificationsCount(count)); + + // The payload is not used in any functions + return discardLoadData; + }, +); + +export const acceptNotificationRequests = createDataLoadingThunk( + 'notificationRequests/acceptBulk', + ({ ids }: { ids: string[] }) => apiAcceptNotificationRequests(ids), + (_data, { dispatch, getState, discardLoadData, actionArg: { ids } }) => { + const count = ids.reduce( + (count, id) => count + selectNotificationCountForRequest(getState(), id), + 0, + ); + + dispatch(decreasePendingNotificationsCount(count)); + + // The payload is not used in any functions + return discardLoadData; + }, +); + +export const dismissNotificationRequests = createDataLoadingThunk( + 'notificationRequests/dismissBulk', + ({ ids }: { ids: string[] }) => apiDismissNotificationRequests(ids), + (_data, { dispatch, getState, discardLoadData, actionArg: { ids } }) => { + const count = ids.reduce( + (count, id) => count + selectNotificationCountForRequest(getState(), id), + 0, + ); + + dispatch(decreasePendingNotificationsCount(count)); + + // The payload is not used in any functions + return discardLoadData; + }, +); diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index b2da6ce6e9..d37f9440e5 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -18,7 +18,6 @@ import { importFetchedStatuses, } from './importer'; import { submitMarkers } from './markers'; -import { decreasePendingNotificationsCount } from './notification_policies'; import { notificationsUpdate } from "./notifications_typed"; import { register as registerPushNotifications } from './push_notifications'; import { saveSettings } from './settings'; @@ -45,26 +44,6 @@ export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ'; export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT'; export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION'; -export const NOTIFICATION_REQUESTS_FETCH_REQUEST = 'NOTIFICATION_REQUESTS_FETCH_REQUEST'; -export const NOTIFICATION_REQUESTS_FETCH_SUCCESS = 'NOTIFICATION_REQUESTS_FETCH_SUCCESS'; -export const NOTIFICATION_REQUESTS_FETCH_FAIL = 'NOTIFICATION_REQUESTS_FETCH_FAIL'; - -export const NOTIFICATION_REQUESTS_EXPAND_REQUEST = 'NOTIFICATION_REQUESTS_EXPAND_REQUEST'; -export const NOTIFICATION_REQUESTS_EXPAND_SUCCESS = 'NOTIFICATION_REQUESTS_EXPAND_SUCCESS'; -export const NOTIFICATION_REQUESTS_EXPAND_FAIL = 'NOTIFICATION_REQUESTS_EXPAND_FAIL'; - -export const NOTIFICATION_REQUEST_FETCH_REQUEST = 'NOTIFICATION_REQUEST_FETCH_REQUEST'; -export const NOTIFICATION_REQUEST_FETCH_SUCCESS = 'NOTIFICATION_REQUEST_FETCH_SUCCESS'; -export const NOTIFICATION_REQUEST_FETCH_FAIL = 'NOTIFICATION_REQUEST_FETCH_FAIL'; - -export const NOTIFICATION_REQUEST_ACCEPT_REQUEST = 'NOTIFICATION_REQUEST_ACCEPT_REQUEST'; -export const NOTIFICATION_REQUEST_ACCEPT_SUCCESS = 'NOTIFICATION_REQUEST_ACCEPT_SUCCESS'; -export const NOTIFICATION_REQUEST_ACCEPT_FAIL = 'NOTIFICATION_REQUEST_ACCEPT_FAIL'; - -export const NOTIFICATION_REQUEST_DISMISS_REQUEST = 'NOTIFICATION_REQUEST_DISMISS_REQUEST'; -export const NOTIFICATION_REQUEST_DISMISS_SUCCESS = 'NOTIFICATION_REQUEST_DISMISS_SUCCESS'; -export const NOTIFICATION_REQUEST_DISMISS_FAIL = 'NOTIFICATION_REQUEST_DISMISS_FAIL'; - export const NOTIFICATION_REQUESTS_ACCEPT_REQUEST = 'NOTIFICATION_REQUESTS_ACCEPT_REQUEST'; export const NOTIFICATION_REQUESTS_ACCEPT_SUCCESS = 'NOTIFICATION_REQUESTS_ACCEPT_SUCCESS'; export const NOTIFICATION_REQUESTS_ACCEPT_FAIL = 'NOTIFICATION_REQUESTS_ACCEPT_FAIL'; @@ -73,14 +52,6 @@ export const NOTIFICATION_REQUESTS_DISMISS_REQUEST = 'NOTIFICATION_REQUESTS_DISM export const NOTIFICATION_REQUESTS_DISMISS_SUCCESS = 'NOTIFICATION_REQUESTS_DISMISS_SUCCESS'; export const NOTIFICATION_REQUESTS_DISMISS_FAIL = 'NOTIFICATION_REQUESTS_DISMISS_FAIL'; -export const NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST = 'NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST'; -export const NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS = 'NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS'; -export const NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL = 'NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL'; - -export const NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST'; -export const NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS'; -export const NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL'; - const messages = defineMessages({ // mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' }, group: { id: 'notifications.group', defaultMessage: '{count} notifications' }, @@ -106,12 +77,6 @@ const fetchRelatedRelationships = (dispatch, notifications) => { } }; -const selectNotificationCountForRequest = (state, id) => { - const requests = state.getIn(['notificationRequests', 'items']); - const thisRequest = requests.find(request => request.get('id') === id); - return thisRequest ? thisRequest.get('notifications_count') : 0; -}; - export const loadPending = () => ({ type: NOTIFICATIONS_LOAD_PENDING, }); @@ -376,296 +341,3 @@ export function setBrowserPermission (value) { value, }; } - -export const fetchNotificationRequests = () => (dispatch, getState) => { - const params = {}; - - if (getState().getIn(['notificationRequests', 'isLoading'])) { - return; - } - - if (getState().getIn(['notificationRequests', 'items'])?.size > 0) { - params.since_id = getState().getIn(['notificationRequests', 'items', 0, 'id']); - } - - dispatch(fetchNotificationRequestsRequest()); - - api().get('/api/v1/notifications/requests', { params }).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); - dispatch(importFetchedAccounts(response.data.map(x => x.account))); - dispatch(fetchNotificationRequestsSuccess(response.data, next ? next.uri : null)); - }).catch(err => { - dispatch(fetchNotificationRequestsFail(err)); - }); -}; - -export const fetchNotificationRequestsRequest = () => ({ - type: NOTIFICATION_REQUESTS_FETCH_REQUEST, -}); - -export const fetchNotificationRequestsSuccess = (requests, next) => ({ - type: NOTIFICATION_REQUESTS_FETCH_SUCCESS, - requests, - next, -}); - -export const fetchNotificationRequestsFail = error => ({ - type: NOTIFICATION_REQUESTS_FETCH_FAIL, - error, -}); - -export const expandNotificationRequests = () => (dispatch, getState) => { - const url = getState().getIn(['notificationRequests', 'next']); - - if (!url || getState().getIn(['notificationRequests', 'isLoading'])) { - return; - } - - dispatch(expandNotificationRequestsRequest()); - - api().get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); - dispatch(importFetchedAccounts(response.data.map(x => x.account))); - dispatch(expandNotificationRequestsSuccess(response.data, next?.uri)); - }).catch(err => { - dispatch(expandNotificationRequestsFail(err)); - }); -}; - -export const expandNotificationRequestsRequest = () => ({ - type: NOTIFICATION_REQUESTS_EXPAND_REQUEST, -}); - -export const expandNotificationRequestsSuccess = (requests, next) => ({ - type: NOTIFICATION_REQUESTS_EXPAND_SUCCESS, - requests, - next, -}); - -export const expandNotificationRequestsFail = error => ({ - type: NOTIFICATION_REQUESTS_EXPAND_FAIL, - error, -}); - -export const fetchNotificationRequest = id => (dispatch, getState) => { - const current = getState().getIn(['notificationRequests', 'current']); - - if (current.getIn(['item', 'id']) === id || current.get('isLoading')) { - return; - } - - dispatch(fetchNotificationRequestRequest(id)); - - api().get(`/api/v1/notifications/requests/${id}`).then(({ data }) => { - dispatch(fetchNotificationRequestSuccess(data)); - }).catch(err => { - dispatch(fetchNotificationRequestFail(id, err)); - }); -}; - -export const fetchNotificationRequestRequest = id => ({ - type: NOTIFICATION_REQUEST_FETCH_REQUEST, - id, -}); - -export const fetchNotificationRequestSuccess = request => ({ - type: NOTIFICATION_REQUEST_FETCH_SUCCESS, - request, -}); - -export const fetchNotificationRequestFail = (id, error) => ({ - type: NOTIFICATION_REQUEST_FETCH_FAIL, - id, - error, -}); - -export const acceptNotificationRequest = (id) => (dispatch, getState) => { - const count = selectNotificationCountForRequest(getState(), id); - dispatch(acceptNotificationRequestRequest(id)); - - api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => { - dispatch(acceptNotificationRequestSuccess(id)); - dispatch(decreasePendingNotificationsCount(count)); - }).catch(err => { - dispatch(acceptNotificationRequestFail(id, err)); - }); -}; - -export const acceptNotificationRequestRequest = id => ({ - type: NOTIFICATION_REQUEST_ACCEPT_REQUEST, - id, -}); - -export const acceptNotificationRequestSuccess = id => ({ - type: NOTIFICATION_REQUEST_ACCEPT_SUCCESS, - id, -}); - -export const acceptNotificationRequestFail = (id, error) => ({ - type: NOTIFICATION_REQUEST_ACCEPT_FAIL, - id, - error, -}); - -export const dismissNotificationRequest = (id) => (dispatch, getState) => { - const count = selectNotificationCountForRequest(getState(), id); - dispatch(dismissNotificationRequestRequest(id)); - - api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ - dispatch(dismissNotificationRequestSuccess(id)); - dispatch(decreasePendingNotificationsCount(count)); - }).catch(err => { - dispatch(dismissNotificationRequestFail(id, err)); - }); -}; - -export const dismissNotificationRequestRequest = id => ({ - type: NOTIFICATION_REQUEST_DISMISS_REQUEST, - id, -}); - -export const dismissNotificationRequestSuccess = id => ({ - type: NOTIFICATION_REQUEST_DISMISS_SUCCESS, - id, -}); - -export const dismissNotificationRequestFail = (id, error) => ({ - type: NOTIFICATION_REQUEST_DISMISS_FAIL, - id, - error, -}); - -export const acceptNotificationRequests = (ids) => (dispatch, getState) => { - const count = ids.reduce((count, id) => count + selectNotificationCountForRequest(getState(), id), 0); - dispatch(acceptNotificationRequestsRequest(ids)); - - api().post(`/api/v1/notifications/requests/accept`, { id: ids }).then(() => { - dispatch(acceptNotificationRequestsSuccess(ids)); - dispatch(decreasePendingNotificationsCount(count)); - }).catch(err => { - dispatch(acceptNotificationRequestFail(ids, err)); - }); -}; - -export const acceptNotificationRequestsRequest = ids => ({ - type: NOTIFICATION_REQUESTS_ACCEPT_REQUEST, - ids, -}); - -export const acceptNotificationRequestsSuccess = ids => ({ - type: NOTIFICATION_REQUESTS_ACCEPT_SUCCESS, - ids, -}); - -export const acceptNotificationRequestsFail = (ids, error) => ({ - type: NOTIFICATION_REQUESTS_ACCEPT_FAIL, - ids, - error, -}); - -export const dismissNotificationRequests = (ids) => (dispatch, getState) => { - const count = ids.reduce((count, id) => count + selectNotificationCountForRequest(getState(), id), 0); - dispatch(acceptNotificationRequestsRequest(ids)); - - api().post(`/api/v1/notifications/requests/dismiss`, { id: ids }).then(() => { - dispatch(dismissNotificationRequestsSuccess(ids)); - dispatch(decreasePendingNotificationsCount(count)); - }).catch(err => { - dispatch(dismissNotificationRequestFail(ids, err)); - }); -}; - -export const dismissNotificationRequestsRequest = ids => ({ - type: NOTIFICATION_REQUESTS_DISMISS_REQUEST, - ids, -}); - -export const dismissNotificationRequestsSuccess = ids => ({ - type: NOTIFICATION_REQUESTS_DISMISS_SUCCESS, - ids, -}); - -export const dismissNotificationRequestsFail = (ids, error) => ({ - type: NOTIFICATION_REQUESTS_DISMISS_FAIL, - ids, - error, -}); - -export const fetchNotificationsForRequest = accountId => (dispatch, getState) => { - const current = getState().getIn(['notificationRequests', 'current']); - const params = { account_id: accountId }; - - if (current.getIn(['item', 'account']) === accountId) { - if (current.getIn(['notifications', 'isLoading'])) { - return; - } - - if (current.getIn(['notifications', 'items'])?.size > 0) { - params.since_id = current.getIn(['notifications', 'items', 0, 'id']); - } - } - - dispatch(fetchNotificationsForRequestRequest()); - - api().get('/api/v1/notifications', { params }).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); - dispatch(importFetchedAccounts(response.data.map(item => item.account))); - dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); - dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account))); - - dispatch(fetchNotificationsForRequestSuccess(response.data, next?.uri)); - }).catch(err => { - dispatch(fetchNotificationsForRequestFail(err)); - }); -}; - -export const fetchNotificationsForRequestRequest = () => ({ - type: NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST, -}); - -export const fetchNotificationsForRequestSuccess = (notifications, next) => ({ - type: NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS, - notifications, - next, -}); - -export const fetchNotificationsForRequestFail = (error) => ({ - type: NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL, - error, -}); - -export const expandNotificationsForRequest = () => (dispatch, getState) => { - const url = getState().getIn(['notificationRequests', 'current', 'notifications', 'next']); - - if (!url || getState().getIn(['notificationRequests', 'current', 'notifications', 'isLoading'])) { - return; - } - - dispatch(expandNotificationsForRequestRequest()); - - api().get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); - dispatch(importFetchedAccounts(response.data.map(item => item.account))); - dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); - dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account))); - - dispatch(expandNotificationsForRequestSuccess(response.data, next?.uri)); - }).catch(err => { - dispatch(expandNotificationsForRequestFail(err)); - }); -}; - -export const expandNotificationsForRequestRequest = () => ({ - type: NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST, -}); - -export const expandNotificationsForRequestSuccess = (notifications, next) => ({ - type: NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS, - notifications, - next, -}); - -export const expandNotificationsForRequestFail = (error) => ({ - type: NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL, - error, -}); diff --git a/app/javascript/mastodon/actions/notifications_migration.tsx b/app/javascript/mastodon/actions/notifications_migration.tsx index 0d4da765ec..cd9f5ca3d6 100644 --- a/app/javascript/mastodon/actions/notifications_migration.tsx +++ b/app/javascript/mastodon/actions/notifications_migration.tsx @@ -1,14 +1,10 @@ -import { selectUseGroupedNotifications } from 'mastodon/selectors/settings'; import { createAppAsyncThunk } from 'mastodon/store'; import { fetchNotifications } from './notification_groups'; -import { expandNotifications } from './notifications'; export const initializeNotifications = createAppAsyncThunk( 'notifications/initialize', - (_, { dispatch, getState }) => { - if (selectUseGroupedNotifications(getState())) - void dispatch(fetchNotifications()); - else void dispatch(expandNotifications({})); + (_, { dispatch }) => { + void dispatch(fetchNotifications()); }, ); diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js index 21a45e0183..a828900ec9 100644 --- a/app/javascript/mastodon/actions/streaming.js +++ b/app/javascript/mastodon/actions/streaming.js @@ -1,7 +1,5 @@ // @ts-check -import { selectUseGroupedNotifications } from 'mastodon/selectors/settings'; - import { getLocale } from '../locales'; import { connectStream } from '../stream'; @@ -106,9 +104,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti const notificationJSON = JSON.parse(data.payload); dispatch(updateNotifications(notificationJSON, messages, locale)); // TODO: remove this once the groups feature replaces the previous one - if(selectUseGroupedNotifications(getState())) { - dispatch(processNewNotificationForGroups(notificationJSON)); - } + dispatch(processNewNotificationForGroups(notificationJSON)); break; } case 'emoji_reaction': @@ -119,9 +115,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti const state = getState(); if (state.notifications.top || !state.notifications.mounted) dispatch(expandNotifications({ forceLoad: true, maxId: undefined })); - if (selectUseGroupedNotifications(state)) { - dispatch(refreshStaleNotificationGroups()); - } + dispatch(refreshStaleNotificationGroups()); break; case 'conversation': // @ts-expect-error @@ -146,21 +140,15 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti /** * @param {Function} dispatch - * @param {Function} getState */ -async function refreshHomeTimelineAndNotification(dispatch, getState) { +async function refreshHomeTimelineAndNotification(dispatch) { await dispatch(expandHomeTimeline({ maxId: undefined })); - // TODO: remove this once the groups feature replaces the previous one - if(selectUseGroupedNotifications(getState())) { - // TODO: polling for merged notifications - try { - await dispatch(pollRecentGroupNotifications()); - } catch { - // TODO - } - } else { - await dispatch(expandNotifications({})); + // TODO: polling for merged notifications + try { + await dispatch(pollRecentGroupNotifications()); + } catch { + // TODO } await dispatch(fetchAnnouncements()); diff --git a/app/javascript/mastodon/api/notifications.ts b/app/javascript/mastodon/api/notifications.ts index 88e9820dd8..5f31a9a70c 100644 --- a/app/javascript/mastodon/api/notifications.ts +++ b/app/javascript/mastodon/api/notifications.ts @@ -1,7 +1,14 @@ -import api, { apiRequest, getLinks } from 'mastodon/api'; +import api, { + apiRequest, + getLinks, + apiRequestGet, + apiRequestPost, +} from 'mastodon/api'; import type { ApiNotificationGroupsResultJSON, ApiNotificationGroupJSON, + ApiNotificationRequestJSON, + ApiNotificationJSON, } from 'mastodon/api_types/notifications'; import type { ApiStatusJSON } from 'mastodon/api_types/statuses'; @@ -16,14 +23,34 @@ const exceptInvalidNotifications = ( }); }; -export const apiFetchNotifications = async (params?: { +export const apiFetchNotifications = async ( + params?: { + account_id?: string; + since_id?: string; + }, + url?: string, +) => { + const response = await api().request({ + method: 'GET', + url: url ?? '/api/v1/notifications', + params, + }); + + return { + notifications: response.data, + links: getLinks(response), + }; +}; + +export const apiFetchNotificationGroups = async (params?: { + url?: string; exclude_types?: string[]; max_id?: string; since_id?: string; }) => { const response = await api().request({ method: 'GET', - url: '/api/v2_alpha/notifications', + url: '/api/v2/notifications', params, }); @@ -39,3 +66,43 @@ export const apiFetchNotifications = async (params?: { export const apiClearNotifications = () => apiRequest('POST', 'v1/notifications/clear'); + +export const apiFetchNotificationRequests = async ( + params?: { + since_id?: string; + }, + url?: string, +) => { + const response = await api().request({ + method: 'GET', + url: url ?? '/api/v1/notifications/requests', + params, + }); + + return { + requests: response.data, + links: getLinks(response), + }; +}; + +export const apiFetchNotificationRequest = async (id: string) => { + return apiRequestGet( + `v1/notifications/requests/${id}`, + ); +}; + +export const apiAcceptNotificationRequest = async (id: string) => { + return apiRequestPost(`v1/notifications/requests/${id}/accept`); +}; + +export const apiDismissNotificationRequest = async (id: string) => { + return apiRequestPost(`v1/notifications/requests/${id}/dismiss`); +}; + +export const apiAcceptNotificationRequests = async (id: string[]) => { + return apiRequestPost('v1/notifications/requests/accept', { id }); +}; + +export const apiDismissNotificationRequests = async (id: string[]) => { + return apiRequestPost('v1/notifications/dismiss/dismiss', { id }); +}; diff --git a/app/javascript/mastodon/api_types/notifications.ts b/app/javascript/mastodon/api_types/notifications.ts index 512bec9ae3..89ce9ee497 100644 --- a/app/javascript/mastodon/api_types/notifications.ts +++ b/app/javascript/mastodon/api_types/notifications.ts @@ -177,3 +177,12 @@ export interface ApiNotificationGroupsResultJSON { statuses: ApiStatusJSON[]; notification_groups: ApiNotificationGroupJSON[]; } + +export interface ApiNotificationRequestJSON { + id: string; + created_at: string; + updated_at: string; + notifications_count: string; + account: ApiAccountJSON; + last_status?: ApiStatusJSON; +} diff --git a/app/javascript/mastodon/components/follow_button.tsx b/app/javascript/mastodon/components/follow_button.tsx index b93da5080c..4414c75a84 100644 --- a/app/javascript/mastodon/components/follow_button.tsx +++ b/app/javascript/mastodon/components/follow_button.tsx @@ -79,14 +79,10 @@ export const FollowButton: React.FC<{ relationship.followed_by ) { label = intl.formatMessage(messages.mutual); - } else if ( - !relationship.following && - isShowItem('relationships') && - relationship.followed_by - ) { - label = intl.formatMessage(messages.followBack); } else if (relationship.following || relationship.requested) { label = intl.formatMessage(messages.unfollow); + } else if (relationship.followed_by && isShowItem('relationships')) { + label = intl.formatMessage(messages.followBack); } else { label = intl.formatMessage(messages.follow); } diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx index e05a510fc2..f2fb646df8 100644 --- a/app/javascript/mastodon/features/account/components/header.jsx +++ b/app/javascript/mastodon/features/account/components/header.jsx @@ -96,10 +96,10 @@ const messageForFollowButton = relationship => { if (relationship.get('following') && relationship.get('followed_by') && isShowItem('relationships')) { return messages.mutual; - } else if (!relationship.get('following') && relationship.get('followed_by') && isShowItem('relationships')) { - return messages.followBack; } else if (relationship.get('following') || relationship.get('requested')) { return messages.unfollow; + } else if (relationship.get('followed_by') && isShowItem('relationships')) { + return messages.followBack; } else { return messages.follow; } diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.jsx b/app/javascript/mastodon/features/notifications/components/column_settings.jsx index 968bd2b969..d5185e2bc9 100644 --- a/app/javascript/mastodon/features/notifications/components/column_settings.jsx +++ b/app/javascript/mastodon/features/notifications/components/column_settings.jsx @@ -6,7 +6,7 @@ import { FormattedMessage } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; -import { enableEmojiReaction, forceGroupedNotifications } from 'mastodon/initial_state'; +import { enableEmojiReaction } from 'mastodon/initial_state'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'mastodon/permissions'; import ClearColumnButton from './clear_column_button'; @@ -41,7 +41,6 @@ class ColumnSettings extends PureComponent { const filterAdvancedStr = ; const unreadMarkersShowStr = ; - const groupingShowStr = ; const alertStr = ; const showStr = ; const soundStr = ; @@ -73,18 +72,6 @@ class ColumnSettings extends PureComponent { - {!forceGroupedNotifications && ( -
-

- -

- -
- -
-
- )} -

diff --git a/app/javascript/mastodon/features/notifications/components/notification_request.jsx b/app/javascript/mastodon/features/notifications/components/notification_request.jsx index 2f378942bc..626929ae50 100644 --- a/app/javascript/mastodon/features/notifications/components/notification_request.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification_request.jsx @@ -12,7 +12,7 @@ import DeleteIcon from '@/material-icons/400-24px/delete.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import { initBlockModal } from 'mastodon/actions/blocks'; import { initMuteModal } from 'mastodon/actions/mutes'; -import { acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications'; +import { acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notification_requests'; import { initReport } from 'mastodon/actions/reports'; import { Avatar } from 'mastodon/components/avatar'; import { CheckBox } from 'mastodon/components/check_box'; @@ -40,11 +40,11 @@ export const NotificationRequest = ({ id, accountId, notificationsCount, checked const { push: historyPush } = useHistory(); const handleDismiss = useCallback(() => { - dispatch(dismissNotificationRequest(id)); + dispatch(dismissNotificationRequest({ id })); }, [dispatch, id]); const handleAccept = useCallback(() => { - dispatch(acceptNotificationRequest(id)); + dispatch(acceptNotificationRequest({ id })); }, [dispatch, id]); const handleMute = useCallback(() => { diff --git a/app/javascript/mastodon/features/notifications/request.jsx b/app/javascript/mastodon/features/notifications/request.jsx index 30ec004e70..a7e5180a4f 100644 --- a/app/javascript/mastodon/features/notifications/request.jsx +++ b/app/javascript/mastodon/features/notifications/request.jsx @@ -10,7 +10,13 @@ import { useSelector, useDispatch } from 'react-redux'; import DeleteIcon from '@/material-icons/400-24px/delete.svg?react'; import DoneIcon from '@/material-icons/400-24px/done.svg?react'; import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; -import { fetchNotificationRequest, fetchNotificationsForRequest, expandNotificationsForRequest, acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications'; +import { + fetchNotificationRequest, + fetchNotificationsForRequest, + expandNotificationsForRequest, + acceptNotificationRequest, + dismissNotificationRequest, +} from 'mastodon/actions/notification_requests'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; import { IconButton } from 'mastodon/components/icon_button'; @@ -44,28 +50,28 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => { const columnRef = useRef(); const intl = useIntl(); const dispatch = useDispatch(); - const notificationRequest = useSelector(state => state.getIn(['notificationRequests', 'current', 'item', 'id']) === id ? state.getIn(['notificationRequests', 'current', 'item']) : null); - const accountId = notificationRequest?.get('account'); + const notificationRequest = useSelector(state => state.notificationRequests.current.item?.id === id ? state.notificationRequests.current.item : null); + const accountId = notificationRequest?.account_id; const account = useSelector(state => state.getIn(['accounts', accountId])); - const notifications = useSelector(state => state.getIn(['notificationRequests', 'current', 'notifications', 'items'])); - const isLoading = useSelector(state => state.getIn(['notificationRequests', 'current', 'notifications', 'isLoading'])); - const hasMore = useSelector(state => !!state.getIn(['notificationRequests', 'current', 'notifications', 'next'])); - const removed = useSelector(state => state.getIn(['notificationRequests', 'current', 'removed'])); + const notifications = useSelector(state => state.notificationRequests.current.notifications.items); + const isLoading = useSelector(state => state.notificationRequests.current.notifications.isLoading); + const hasMore = useSelector(state => !!state.notificationRequests.current.notifications.next); + const removed = useSelector(state => state.notificationRequests.current.removed); const handleHeaderClick = useCallback(() => { columnRef.current?.scrollTop(); }, [columnRef]); const handleLoadMore = useCallback(() => { - dispatch(expandNotificationsForRequest()); - }, [dispatch]); + dispatch(expandNotificationsForRequest({ accountId })); + }, [dispatch, accountId]); const handleDismiss = useCallback(() => { - dispatch(dismissNotificationRequest(id)); + dispatch(dismissNotificationRequest({ id })); }, [dispatch, id]); const handleAccept = useCallback(() => { - dispatch(acceptNotificationRequest(id)); + dispatch(acceptNotificationRequest({ id })); }, [dispatch, id]); const handleMoveUp = useCallback(id => { @@ -79,12 +85,12 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => { }, [columnRef, notifications]); useEffect(() => { - dispatch(fetchNotificationRequest(id)); + dispatch(fetchNotificationRequest({ id })); }, [dispatch, id]); useEffect(() => { if (accountId) { - dispatch(fetchNotificationsForRequest(accountId)); + dispatch(fetchNotificationsForRequest({ accountId })); } }, [dispatch, accountId]); diff --git a/app/javascript/mastodon/features/notifications/requests.jsx b/app/javascript/mastodon/features/notifications/requests.jsx index 622a171fd3..ccaed312b4 100644 --- a/app/javascript/mastodon/features/notifications/requests.jsx +++ b/app/javascript/mastodon/features/notifications/requests.jsx @@ -11,7 +11,12 @@ import ArrowDropDownIcon from '@/material-icons/400-24px/arrow_drop_down.svg?rea import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import { openModal } from 'mastodon/actions/modal'; -import { fetchNotificationRequests, expandNotificationRequests, acceptNotificationRequests, dismissNotificationRequests } from 'mastodon/actions/notifications'; +import { + fetchNotificationRequests, + expandNotificationRequests, + acceptNotificationRequests, + dismissNotificationRequests, +} from 'mastodon/actions/notification_requests'; import { changeSetting } from 'mastodon/actions/settings'; import { CheckBox } from 'mastodon/components/check_box'; import Column from 'mastodon/components/column'; @@ -84,7 +89,7 @@ const SelectRow = ({selectAllChecked, toggleSelectAll, selectedItems, selectionM message: intl.formatMessage(messages.confirmAcceptMultipleMessage, { count: selectedItems.length }), confirm: intl.formatMessage(messages.confirmAcceptMultipleButton, { count: selectedItems.length}), onConfirm: () => - dispatch(acceptNotificationRequests(selectedItems)), + dispatch(acceptNotificationRequests({ ids: selectedItems })), }, })); }, [dispatch, intl, selectedItems]); @@ -97,7 +102,7 @@ const SelectRow = ({selectAllChecked, toggleSelectAll, selectedItems, selectionM message: intl.formatMessage(messages.confirmDismissMultipleMessage, { count: selectedItems.length }), confirm: intl.formatMessage(messages.confirmDismissMultipleButton, { count: selectedItems.length}), onConfirm: () => - dispatch(dismissNotificationRequests(selectedItems)), + dispatch(dismissNotificationRequests({ ids: selectedItems })), }, })); }, [dispatch, intl, selectedItems]); @@ -161,9 +166,9 @@ export const NotificationRequests = ({ multiColumn }) => { const columnRef = useRef(); const intl = useIntl(); const dispatch = useDispatch(); - const isLoading = useSelector(state => state.getIn(['notificationRequests', 'isLoading'])); - const notificationRequests = useSelector(state => state.getIn(['notificationRequests', 'items'])); - const hasMore = useSelector(state => !!state.getIn(['notificationRequests', 'next'])); + const isLoading = useSelector(state => state.notificationRequests.isLoading); + const notificationRequests = useSelector(state => state.notificationRequests.items); + const hasMore = useSelector(state => !!state.notificationRequests.next); const [selectionMode, setSelectionMode] = useState(false); const [checkedRequestIds, setCheckedRequestIds] = useState([]); @@ -182,7 +187,7 @@ export const NotificationRequests = ({ multiColumn }) => { else ids.push(id); - setSelectAllChecked(ids.length === notificationRequests.size); + setSelectAllChecked(ids.length === notificationRequests.length); return [...ids]; }); @@ -193,7 +198,7 @@ export const NotificationRequests = ({ multiColumn }) => { if(checked) setCheckedRequestIds([]); else - setCheckedRequestIds(notificationRequests.map(request => request.get('id')).toArray()); + setCheckedRequestIds(notificationRequests.map(request => request.id)); return !checked; }); @@ -217,7 +222,7 @@ export const NotificationRequests = ({ multiColumn }) => { multiColumn={multiColumn} showBackButton appendContent={ - notificationRequests.size > 0 && ( + notificationRequests.length > 0 && ( )} > @@ -236,12 +241,12 @@ export const NotificationRequests = ({ multiColumn }) => { > {notificationRequests.map(request => ( ))} diff --git a/app/javascript/mastodon/features/notifications_wrapper.jsx b/app/javascript/mastodon/features/notifications_wrapper.jsx index 4b3efeb54e..50383d5ebf 100644 --- a/app/javascript/mastodon/features/notifications_wrapper.jsx +++ b/app/javascript/mastodon/features/notifications_wrapper.jsx @@ -1,13 +1,8 @@ -import Notifications from 'mastodon/features/notifications'; import Notifications_v2 from 'mastodon/features/notifications_v2'; -import { selectUseGroupedNotifications } from 'mastodon/selectors/settings'; -import { useAppSelector } from 'mastodon/store'; export const NotificationsWrapper = (props) => { - const optedInGroupedNotifications = useAppSelector(selectUseGroupedNotifications); - return ( - optedInGroupedNotifications ? : + ); }; diff --git a/app/javascript/mastodon/features/ui/components/columns_area.jsx b/app/javascript/mastodon/features/ui/components/columns_area.jsx index 0a35a39983..e3085ee9da 100644 --- a/app/javascript/mastodon/features/ui/components/columns_area.jsx +++ b/app/javascript/mastodon/features/ui/components/columns_area.jsx @@ -73,8 +73,8 @@ export default class ColumnsArea extends ImmutablePureComponent { children: PropTypes.node, }; - // Corresponds to (max-width: $no-gap-breakpoint + 285px - 1px) in SCSS - mediaQuery = 'matchMedia' in window && window.matchMedia('(max-width: 1174px)'); + // Corresponds to (max-width: $no-gap-breakpoint - 1px) in SCSS + mediaQuery = 'matchMedia' in window && window.matchMedia('(max-width: 1206px)'); state = { renderComposePanel: !(this.mediaQuery && this.mediaQuery.matches), diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx index 0446f71c64..8db74c182e 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx @@ -40,7 +40,6 @@ import { enableDtlMenu, timelinePreview, trendsEnabled, dtlTag, enableLocalTimel import { transientSingleColumn } from 'mastodon/is_mobile'; import { canManageReports, canViewAdminDashboard } from 'mastodon/permissions'; import { selectUnreadNotificationGroupsCount } from 'mastodon/selectors/notifications'; -import { selectUseGroupedNotifications } from 'mastodon/selectors/settings'; import ColumnLink from './column_link'; import DisabledAccountBanner from './disabled_account_banner'; @@ -72,19 +71,17 @@ const messages = defineMessages({ }); const NotificationsLink = () => { - const optedInGroupedNotifications = useSelector(selectUseGroupedNotifications); - const count = useSelector(state => state.getIn(['notifications', 'unread'])); - const intl = useIntl(); - const newCount = useSelector(selectUnreadNotificationGroupsCount); + const count = useSelector(selectUnreadNotificationGroupsCount); + const intl = useIntl(); return ( } - activeIcon={} + icon={} + activeIcon={} text={intl.formatMessage(messages.notifications)} /> ); diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 02f004a55b..ecb99f38d7 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -69,7 +69,6 @@ * @property {boolean=} use_pending_items * @property {string} version * @property {string} sso_redirect - * @property {boolean} force_grouped_notifications */ /** @@ -169,7 +168,6 @@ export const criticalUpdatesPending = initialState?.critical_updates_pending; // @ts-expect-error export const statusPageUrl = getMeta('status_page_url'); export const sso_redirect = getMeta('sso_redirect'); -export const forceGroupedNotifications = getMeta('force_grouped_notifications'); /** * @returns {string | undefined} diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index 893882fe7a..fcd3080421 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -480,7 +480,6 @@ "status.detailed_status": "Vista de conversación detallada", "status.edit": "Editar", "status.edited_x_times": "Editau {count, plural, one {{count} vez} other {{count} veces}}", - "status.embed": "Incrustado", "status.filter": "Filtrar esta publicación", "status.history.created": "{name} creyó {date}", "status.history.edited": "{name} editó {date}", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 0dbeb0a190..43256506cd 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -3,7 +3,7 @@ "about.contact": "للاتصال:", "about.disclaimer": "ماستدون برنامج حر ومفتوح المصدر وعلامة تجارية لـ Mastodon GmbH.", "about.domain_blocks.no_reason_available": "السبب غير متوفر", - "about.domain_blocks.preamble": "يسمح لك ماستدون عموماً بعرض المحتوى من المستخدمين من أي خادم آخر في الفدرالية والتفاعل معهم. وهذه هي الاستثناءات التي وضعت على هذا الخادم بالذات.", + "about.domain_blocks.preamble": "يتيح مَستُدون عمومًا لمستخدميه مطالعة المحتوى من المستخدمين من الخواديم الأخرى في الفدرالية والتفاعل معهم. وهذه هي الاستثناءات التي وضعت على هذا الخادوم.", "about.domain_blocks.silenced.explanation": "لن تظهر لك ملفات التعريف الشخصية والمحتوى من هذا الخادوم، إلا إن بحثت عنه عمدًا أو تابعته.", "about.domain_blocks.silenced.title": "محدود", "about.domain_blocks.suspended.explanation": "لن يتم معالجة أي بيانات من هذا الخادم أو تخزينها أو تبادلها، مما يجعل أي تفاعل أو اتصال مع المستخدمين من هذا الخادم مستحيلا.", @@ -34,7 +34,7 @@ "account.follow_back": "تابعه بالمثل", "account.followers": "مُتابِعون", "account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.", - "account.followers_counter": "{count, plural, zero {}one {{counter} متابع} two {{counter} متابعين} few {{counter} متابعين} many {{counter} متابعين} other {{counter} متابعين}}", + "account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}", "account.following": "الاشتراكات", "account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.", "account.go_to_profile": "اذهب إلى الملف الشخصي", @@ -43,7 +43,7 @@ "account.joined_short": "انضم في", "account.languages": "تغيير اللغات المشترَك فيها", "account.link_verified_on": "تمَّ التَّحقق مِن مِلْكيّة هذا الرابط بتاريخ {date}", - "account.locked_info": "تمَّ تعيين حالة خصوصية هذا الحساب إلى مُقفَل. يُراجع المالك يدويًا من يمكنه متابعته.", + "account.locked_info": "تم ضبط حالة خصوصية هذا الحساب على أنه مؤمّن. إذ يراجع صاحبه يدويًا من يُسمح له بالمتابعة.", "account.media": "وسائط", "account.mention": "أذكُر @{name}", "account.moved_to": "أشار {name} إلى أن حسابه الجديد الآن:", @@ -443,6 +443,7 @@ "lists.subheading": "قوائمك", "load_pending": "{count, plural, one {# عنصر جديد} other {# عناصر جديدة}}", "loading_indicator.label": "جاري التحميل…", + "media_gallery.hide": "إخفاء", "moved_to_account_banner.text": "حسابك {disabledAccount} معطل حاليًا لأنك انتقلت إلى {movedToAccount}.", "mute_modal.hide_from_notifications": "إخفاء من قائمة الإشعارات", "mute_modal.hide_options": "إخفاء الخيارات", @@ -527,8 +528,6 @@ "notifications.column_settings.admin.report": "التبليغات الجديدة:", "notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:", "notifications.column_settings.alert": "إشعارات سطح المكتب", - "notifications.column_settings.beta.category": "ميزات تجريبية", - "notifications.column_settings.beta.grouping": "جمّع الإشعارات", "notifications.column_settings.favourite": "المفضلة:", "notifications.column_settings.filter_bar.advanced": "عرض جميع الفئات", "notifications.column_settings.filter_bar.category": "شريط التصفية السريعة", @@ -744,6 +743,7 @@ "status.bookmark": "أضفه إلى الفواصل المرجعية", "status.cancel_reblog_private": "إلغاء إعادة النشر", "status.cannot_reblog": "لا يمكن إعادة نشر هذا المنشور", + "status.continued_thread": "تكملة للخيط", "status.copy": "انسخ رابط الرسالة", "status.delete": "احذف", "status.detailed_status": "تفاصيل المحادثة", @@ -752,7 +752,7 @@ "status.edit": "تعديل", "status.edited": "آخر تعديل يوم {date}", "status.edited_x_times": "عُدّل {count, plural, zero {} one {مرةً واحدة} two {مرّتان} few {{count} مرات} many {{count} مرة} other {{count} مرة}}", - "status.embed": "إدماج", + "status.embed": "الحصول على شفرة الإدماج", "status.favourite": "فضّل", "status.favourites": "{count, plural, zero {}one {مفضلة واحدة} two {مفضلتان} few {# مفضلات} many {# مفضلات} other {# مفضلات}}", "status.filter": "تصفية هذا المنشور", @@ -777,6 +777,7 @@ "status.reblogs.empty": "لم يقم أي أحد بمشاركة هذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.", "status.redraft": "إزالة وإعادة الصياغة", "status.remove_bookmark": "احذفه مِن الفواصل المرجعية", + "status.replied_in_thread": "رد في خيط", "status.replied_to": "رَدًا على {name}", "status.reply": "ردّ", "status.replyAll": "رُد على الخيط", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 507703023c..219ea0d17c 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -297,7 +297,6 @@ "notifications.clear": "Borrar los avisos", "notifications.column_settings.admin.report": "Informes nuevos:", "notifications.column_settings.admin.sign_up": "Rexistros nuevos:", - "notifications.column_settings.beta.category": "Funciones esperimentales", "notifications.column_settings.follow": "Siguidores nuevos:", "notifications.column_settings.follow_request": "Solicitúes de siguimientu nueves:", "notifications.column_settings.mention": "Menciones:", @@ -419,7 +418,6 @@ "status.direct": "Mentar a @{name} per privao", "status.direct_indicator": "Mención privada", "status.edited_x_times": "Editóse {count, plural, one {{count} vegada} other {{count} vegaes}}", - "status.embed": "Empotrar", "status.filter": "Peñerar esti artículu", "status.history.created": "{name} creó {date}", "status.history.edited": "{name} editó {date}", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 412eae1481..8c28e71d2c 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -523,8 +523,6 @@ "notifications.column_settings.admin.report": "Новыя скаргі:", "notifications.column_settings.admin.sign_up": "Новыя ўваходы:", "notifications.column_settings.alert": "Апавяшчэнні на працоўным стале", - "notifications.column_settings.beta.category": "Эксперыментальныя функцыі", - "notifications.column_settings.beta.grouping": "Групаваць апавяшчэннi", "notifications.column_settings.favourite": "Упадабанае:", "notifications.column_settings.filter_bar.advanced": "Паказаць усе катэгорыі", "notifications.column_settings.filter_bar.category": "Панэль хуткай фільтрацыі", @@ -748,7 +746,6 @@ "status.edit": "Рэдагаваць", "status.edited": "Апошняе рэдагаванне {date}", "status.edited_x_times": "Рэдагавана {count, plural, one {{count} раз} few {{count} разы} many {{count} разоў} other {{count} разу}}", - "status.embed": "Убудаваць", "status.favourite": "Упадабанае", "status.favourites": "{count, plural, one {# упадабанае} few {# упадабаныя} many {# упадабаных} other {# упадабанага}}", "status.filter": "Фільтраваць гэты допіс", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index b89b539dcf..507b8d2937 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -540,8 +540,6 @@ "notifications.column_settings.admin.report": "Нови доклади:", "notifications.column_settings.admin.sign_up": "Нови регистрации:", "notifications.column_settings.alert": "Известия на работния плот", - "notifications.column_settings.beta.category": "Експериментални функции", - "notifications.column_settings.beta.grouping": "Групови известия", "notifications.column_settings.favourite": "Любими:", "notifications.column_settings.filter_bar.advanced": "Показване на всички категории", "notifications.column_settings.filter_bar.category": "Лента за бърз филтър", @@ -766,7 +764,6 @@ "status.edit": "Редактиране", "status.edited": "Последно редактирано на {date}", "status.edited_x_times": "Редактирано {count, plural,one {{count} път} other {{count} пъти}}", - "status.embed": "Вграждане", "status.favourite": "Любимо", "status.favourites": "{count, plural, one {любимо} other {любими}}", "status.filter": "Филтриране на публ.", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index df97abdff5..9512f6a92b 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -408,7 +408,6 @@ "status.detailed_status": "বিস্তারিত কথোপকথনের হিসেবে দেখতে", "status.edit": "সম্পাদন", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "এমবেড করতে", "status.favourite": "পছন্দ", "status.load_more": "আরো দেখুন", "status.media_hidden": "মিডিয়া লুকানো আছে", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 226ff756ff..18616fcef2 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -575,7 +575,6 @@ "status.edit": "Kemmañ", "status.edited": "Kemmet da ziwezhañ d'an {date}", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "Enframmañ", "status.favourite": "Muiañ-karet", "status.filter": "Silañ ar c'hannad-mañ", "status.history.created": "Krouet gant {name} {date}", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 91f28bd151..3cdeab3ae4 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Nous informes:", "notifications.column_settings.admin.sign_up": "Registres nous:", "notifications.column_settings.alert": "Notificacions d'escriptori", - "notifications.column_settings.beta.category": "Característiques experimentals", - "notifications.column_settings.beta.grouping": "Notificacions de grup", "notifications.column_settings.favourite": "Favorits:", "notifications.column_settings.filter_bar.advanced": "Mostra totes les categories", "notifications.column_settings.filter_bar.category": "Barra ràpida de filtres", @@ -789,7 +787,7 @@ "status.edit": "Edita", "status.edited": "Darrera edició {date}", "status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}", - "status.embed": "Incrusta", + "status.embed": "Obté el codi encastat", "status.favourite": "Favorit", "status.favourites": "{count, plural, one {favorit} other {favorits}}", "status.filter": "Filtra aquest tut", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index 61b81c9f31..2a3a391eab 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -539,7 +539,6 @@ "status.direct_indicator": "ئاماژەی تایبەت", "status.edit": "دەستکاری", "status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}", - "status.embed": "نیشتەجێ بکە", "status.filter": "ئەم پۆستە فلتەر بکە", "status.history.created": "{name} دروستکراوە لە{date}", "status.history.edited": "{name} دروستکاریکراوە لە{date}", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 180616b782..37eb945615 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -319,7 +319,6 @@ "status.delete": "Toglie", "status.detailed_status": "Vista in ditagliu di a cunversazione", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "Integrà", "status.load_more": "Vede di più", "status.media_hidden": "Media piattata", "status.mention": "Mintuvà @{name}", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 8dd8f31fa8..af7a012813 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -509,8 +509,6 @@ "notifications.column_settings.admin.report": "Nová hlášení:", "notifications.column_settings.admin.sign_up": "Nové registrace:", "notifications.column_settings.alert": "Oznámení na počítači", - "notifications.column_settings.beta.category": "Experimentální funkce", - "notifications.column_settings.beta.grouping": "Seskupit notifikace", "notifications.column_settings.favourite": "Oblíbené:", "notifications.column_settings.filter_bar.advanced": "Zobrazit všechny kategorie", "notifications.column_settings.filter_bar.category": "Panel rychlého filtrování", @@ -729,7 +727,6 @@ "status.edit": "Upravit", "status.edited": "Naposledy upraveno {date}", "status.edited_x_times": "Upraveno {count, plural, one {{count}krát} few {{count}krát} many {{count}krát} other {{count}krát}}", - "status.embed": "Vložit na web", "status.favourite": "Oblíbit", "status.favourites": "{count, plural, one {oblíbený} few {oblíbené} many {oblíbených} other {oblíbených}}", "status.filter": "Filtrovat tento příspěvek", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 7f058d8912..51ea1bdf3a 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Adroddiadau newydd:", "notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:", "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith", - "notifications.column_settings.beta.category": "Nodweddion arbrofol", - "notifications.column_settings.beta.grouping": "Grŵpio hysbysiadau", "notifications.column_settings.favourite": "Ffefrynnau:", "notifications.column_settings.filter_bar.advanced": "Dangos pob categori", "notifications.column_settings.filter_bar.category": "Bar hidlo cyflym", @@ -789,7 +787,6 @@ "status.edit": "Golygu", "status.edited": "Golygwyd ddiwethaf {date}", "status.edited_x_times": "Golygwyd {count, plural, one {count} two {count} other {{count} gwaith}}", - "status.embed": "Mewnblannu", "status.favourite": "Ffafrio", "status.favourites": "{count, plural, one {ffefryn} other {ffefryn}}", "status.filter": "Hidlo'r postiad hwn", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index dea313ffed..2c36869622 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Nye anmeldelser:", "notifications.column_settings.admin.sign_up": "Nye tilmeldinger:", "notifications.column_settings.alert": "Computernotifikationer", - "notifications.column_settings.beta.category": "Eksperimentelle funktioner", - "notifications.column_settings.beta.grouping": "Gruppér notifikationer", "notifications.column_settings.favourite": "Favoritter:", "notifications.column_settings.filter_bar.advanced": "Vis alle kategorier", "notifications.column_settings.filter_bar.category": "Hurtigfiltreringsbjælke", @@ -789,7 +787,7 @@ "status.edit": "Redigér", "status.edited": "Senest redigeret {date}", "status.edited_x_times": "Redigeret {count, plural, one {{count} gang} other {{count} gange}}", - "status.embed": "Indlejr", + "status.embed": "Hent indlejringskode", "status.favourite": "Favorit", "status.favourites": "{count, plural, one {# favorit} other {# favoritter}}", "status.filter": "Filtrér dette indlæg", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 46bb08d7cb..e6c086bfa2 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -236,7 +236,7 @@ "domain_pill.your_handle": "Deine Adresse:", "domain_pill.your_server": "Dein digitales Zuhause. Hier „leben“ alle Beiträge von dir. Dir gefällt es hier nicht? Du kannst jederzeit den Server wechseln und ebenso deine Follower übertragen.", "domain_pill.your_username": "Deine eindeutige Identität auf diesem Server. Es ist möglich, Profile mit dem gleichen Profilnamen auf verschiedenen Servern zu finden.", - "embed.instructions": "Du kannst diesen Beitrag außerhalb des Fediverse (z. B. auf deiner Website) einbetten, indem du diesen iFrame-Code einfügst.", + "embed.instructions": "Du kannst diesen Beitrag auf deiner Website einbetten, indem du den nachfolgenden Code kopierst.", "embed.preview": "Vorschau:", "emoji_button.activity": "Aktivitäten", "emoji_button.clear": "Leeren", @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Neue Meldungen:", "notifications.column_settings.admin.sign_up": "Neue Registrierungen:", "notifications.column_settings.alert": "Desktop-Benachrichtigungen", - "notifications.column_settings.beta.category": "Experimentelle Funktionen", - "notifications.column_settings.beta.grouping": "Benachrichtigungen gruppieren", "notifications.column_settings.favourite": "Favoriten:", "notifications.column_settings.filter_bar.advanced": "Alle Filterkategorien anzeigen", "notifications.column_settings.filter_bar.category": "Filterleiste", @@ -777,7 +775,7 @@ "status.admin_domain": "{domain} moderieren", "status.admin_status": "Beitrag moderieren", "status.block": "@{name} blockieren", - "status.bookmark": "Beitrag als Lesezeichen setzen", + "status.bookmark": "Lesezeichen setzen", "status.cancel_reblog_private": "Beitrag nicht mehr teilen", "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden", "status.continued_thread": "Fortgeführter Thread", @@ -789,7 +787,7 @@ "status.edit": "Beitrag bearbeiten", "status.edited": "Zuletzt am {date} bearbeitet", "status.edited_x_times": "{count, plural, one {{count}-mal} other {{count}-mal}} bearbeitet", - "status.embed": "Beitrag per iFrame einbetten", + "status.embed": "Code zum Einbetten", "status.favourite": "Favorisieren", "status.favourites": "{count, plural, one {Mal favorisiert} other {Mal favorisiert}}", "status.filter": "Beitrag filtern", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 64a603923e..367efe1cd9 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -551,8 +551,6 @@ "notifications.column_settings.admin.report": "Νέες αναφορές:", "notifications.column_settings.admin.sign_up": "Νέες εγγραφές:", "notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας", - "notifications.column_settings.beta.category": "Πειραματικές λειτουργίες", - "notifications.column_settings.beta.grouping": "Ομαδοποίηση ειδοποιήσεων", "notifications.column_settings.favourite": "Αγαπημένα:", "notifications.column_settings.filter_bar.advanced": "Εμφάνιση όλων των κατηγοριών", "notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου", @@ -780,7 +778,6 @@ "status.edit": "Επεξεργασία", "status.edited": "Τελευταία επεξεργασία {date}", "status.edited_x_times": "Επεξεργάστηκε {count, plural, one {{count} φορά} other {{count} φορές}}", - "status.embed": "Ενσωμάτωσε", "status.favourite": "Αγαπημένα", "status.favourites": "{count, plural, one {# αγαπημένο} other {# αγαπημένα}}", "status.filter": "Φιλτράρισμα αυτής της ανάρτησης", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index c727b8e49f..c81f389b9d 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.beta.category": "Experimental features", - "notifications.column_settings.beta.grouping": "Group notifications", "notifications.column_settings.favourite": "Favourites:", "notifications.column_settings.filter_bar.advanced": "Display all categories", "notifications.column_settings.filter_bar.category": "Quick filter bar", @@ -789,7 +787,7 @@ "status.edit": "Edit", "status.edited": "Last edited {date}", "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", - "status.embed": "Embed", + "status.embed": "Get embed code", "status.favourite": "Favourite", "status.favourites": "{count, plural, one {favorite} other {favorites}}", "status.filter": "Filter this post", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 06d409a2fd..95cf42342a 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -679,8 +679,6 @@ "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.beta.category": "Experimental features", - "notifications.column_settings.beta.grouping": "Group notifications", "notifications.column_settings.emoji_reaction": "Emoji reactions:", "notifications.column_settings.favourite": "Favorites:", "notifications.column_settings.filter_bar.advanced": "Display all categories", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index d8ec27748e..ce7201dacf 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -628,7 +628,6 @@ "status.direct_indicator": "Privata mencio", "status.edit": "Redakti", "status.edited_x_times": "Redactita {count, plural, one {{count} fojon} other {{count} fojojn}}", - "status.embed": "Enkorpigi", "status.favourite": "Ŝatata", "status.filter": "Filtri ĉi tiun afiŝon", "status.history.created": "{name} kreis {date}", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index dfba0fe5d9..968b01babc 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", - "notifications.column_settings.beta.category": "Funciones experimentales", - "notifications.column_settings.beta.grouping": "Agrupar notificaciones", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", @@ -789,7 +787,7 @@ "status.edit": "Editar", "status.edited": "Última edición: {date}", "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}", - "status.embed": "Insertar", + "status.embed": "Obtener código para insertar", "status.favourite": "Marcar como favorito", "status.favourites": "{count, plural, one {# voto} other {# votos}}", "status.filter": "Filtrar este mensaje", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 63f3d53812..d1abc392bf 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -376,7 +376,7 @@ "ignore_notifications_modal.ignore": "Ignorar notificaciones", "ignore_notifications_modal.limited_accounts_title": "¿Ignorar notificaciones de cuentas moderadas?", "ignore_notifications_modal.new_accounts_title": "¿Ignorar notificaciones de cuentas nuevas?", - "ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de personas que no te sigue?", + "ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de personas que no te siguen?", "ignore_notifications_modal.not_following_title": "¿Ignorar notificaciones de personas a las que no sigues?", "ignore_notifications_modal.private_mentions_title": "¿Ignorar notificaciones de menciones privadas no solicitadas?", "interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.", @@ -457,6 +457,7 @@ "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}", "loading_indicator.label": "Cargando…", + "media_gallery.hide": "Ocultar", "moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te has mudado a {movedToAccount}.", "mute_modal.hide_from_notifications": "Ocultar de las notificaciones", "mute_modal.hide_options": "Ocultar opciones", @@ -558,8 +559,6 @@ "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Registros nuevos:", "notifications.column_settings.alert": "Notificaciones de escritorio", - "notifications.column_settings.beta.category": "Características experimentales", - "notifications.column_settings.beta.grouping": "Agrupar notificaciones", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", @@ -779,6 +778,7 @@ "status.bookmark": "Añadir marcador", "status.cancel_reblog_private": "Eliminar retoot", "status.cannot_reblog": "Este toot no puede retootearse", + "status.continued_thread": "Continuó el hilo", "status.copy": "Copiar enlace al estado", "status.delete": "Borrar", "status.detailed_status": "Vista de conversación detallada", @@ -787,7 +787,7 @@ "status.edit": "Editar", "status.edited": "Última edición {date}", "status.edited_x_times": "Editado {count, plural, one {{count} time} other {{count} veces}}", - "status.embed": "Incrustado", + "status.embed": "Obtener código para incrustar", "status.favourite": "Favorito", "status.favourites": "{count, plural, one {favorito} other {favoritos}}", "status.filter": "Filtrar esta publicación", @@ -812,6 +812,7 @@ "status.reblogs.empty": "Nadie retooteó este toot todavía. Cuando alguien lo haga, aparecerá aquí.", "status.redraft": "Borrar y volver a borrador", "status.remove_bookmark": "Eliminar marcador", + "status.replied_in_thread": "Respondió en el hilo", "status.replied_to": "Respondió a {name}", "status.reply": "Responder", "status.replyAll": "Responder al hilo", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index b01eb68222..6a428e353b 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -376,7 +376,7 @@ "ignore_notifications_modal.ignore": "Ignorar notificaciones", "ignore_notifications_modal.limited_accounts_title": "¿Ignorar notificaciones de cuentas moderadas?", "ignore_notifications_modal.new_accounts_title": "¿Ignorar notificaciones de cuentas nuevas?", - "ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de personas que no te sigue?", + "ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de personas que no te siguen?", "ignore_notifications_modal.not_following_title": "¿Ignorar notificaciones de personas a las que no sigues?", "ignore_notifications_modal.private_mentions_title": "¿Ignorar notificaciones de menciones privadas no solicitadas?", "interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.", @@ -457,6 +457,7 @@ "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}", "loading_indicator.label": "Cargando…", + "media_gallery.hide": "Ocultar", "moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te has mudado a {movedToAccount}.", "mute_modal.hide_from_notifications": "Ocultar de las notificaciones", "mute_modal.hide_options": "Ocultar opciones", @@ -558,8 +559,6 @@ "notifications.column_settings.admin.report": "Nuevos informes:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", - "notifications.column_settings.beta.category": "Características experimentales", - "notifications.column_settings.beta.grouping": "Agrupar notificaciones", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", @@ -779,6 +778,7 @@ "status.bookmark": "Añadir marcador", "status.cancel_reblog_private": "Deshacer impulso", "status.cannot_reblog": "Esta publicación no se puede impulsar", + "status.continued_thread": "Continuó el hilo", "status.copy": "Copiar enlace a la publicación", "status.delete": "Borrar", "status.detailed_status": "Vista de conversación detallada", @@ -787,7 +787,7 @@ "status.edit": "Editar", "status.edited": "Última edición {date}", "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}", - "status.embed": "Incrustado", + "status.embed": "Obtener código para incrustar", "status.favourite": "Favorito", "status.favourites": "{count, plural, one {favorito} other {favoritos}}", "status.filter": "Filtrar esta publicación", @@ -812,6 +812,7 @@ "status.reblogs.empty": "Nadie ha impulsado esta publicación todavía. Cuando alguien lo haga, aparecerá aquí.", "status.redraft": "Borrar y volver a borrador", "status.remove_bookmark": "Eliminar marcador", + "status.replied_in_thread": "Respondió en el hilo", "status.replied_to": "Respondió a {name}", "status.reply": "Responder", "status.replyAll": "Responder al hilo", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index ca37a152fe..5b8e8369f6 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -457,6 +457,7 @@ "lists.subheading": "Sinu nimekirjad", "load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}", "loading_indicator.label": "Laadimine…", + "media_gallery.hide": "Peida", "moved_to_account_banner.text": "Kontot {disabledAccount} ei ole praegu võimalik kasutada, sest kolisid kontole {movedToAccount}.", "mute_modal.hide_from_notifications": "Peida teavituste hulgast", "mute_modal.hide_options": "Peida valikud", @@ -558,8 +559,6 @@ "notifications.column_settings.admin.report": "Uued teavitused:", "notifications.column_settings.admin.sign_up": "Uued kasutajad:", "notifications.column_settings.alert": "Töölauateated", - "notifications.column_settings.beta.category": "Eksperimentaalsed oskused", - "notifications.column_settings.beta.grouping": "Teavituste rühmitamine", "notifications.column_settings.favourite": "Lemmikud:", "notifications.column_settings.filter_bar.advanced": "Näita kõiki kategooriaid", "notifications.column_settings.filter_bar.category": "Kiirfiltri riba", @@ -779,6 +778,7 @@ "status.bookmark": "Järjehoidja", "status.cancel_reblog_private": "Lõpeta jagamine", "status.cannot_reblog": "Seda postitust ei saa jagada", + "status.continued_thread": "Jätkatud lõim", "status.copy": "Kopeeri postituse link", "status.delete": "Kustuta", "status.detailed_status": "Detailne vestluskuva", @@ -787,7 +787,7 @@ "status.edit": "Muuda", "status.edited": "Viimati muudetud {date}", "status.edited_x_times": "Muudetud {count, plural, one{{count} kord} other {{count} korda}}", - "status.embed": "Manustamine", + "status.embed": "Hangi manustamiskood", "status.favourite": "Lemmik", "status.favourites": "{count, plural, one {lemmik} other {lemmikud}}", "status.filter": "Filtreeri seda postitust", @@ -812,6 +812,7 @@ "status.reblogs.empty": "Keegi pole seda postitust veel jaganud. Kui keegi seda teeb, näeb seda siin.", "status.redraft": "Kustuta & alga uuesti", "status.remove_bookmark": "Eemalda järjehoidja", + "status.replied_in_thread": "Vastatud lõimes", "status.replied_to": "Vastas kasutajale {name}", "status.reply": "Vasta", "status.replyAll": "Vasta lõimele", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 15dd63486b..acdd27ce2b 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -457,6 +457,7 @@ "lists.subheading": "Zure zerrendak", "load_pending": "{count, plural, one {elementu berri #} other {# elementu berri}}", "loading_indicator.label": "Kargatzen…", + "media_gallery.hide": "Ezkutatu", "moved_to_account_banner.text": "Zure {disabledAccount} kontua desgaituta dago une honetan, {movedToAccount} kontura aldatu zinelako.", "mute_modal.hide_from_notifications": "Ezkutatu jakinarazpenetatik", "mute_modal.hide_options": "Ezkutatu aukerak", @@ -554,8 +555,6 @@ "notifications.column_settings.admin.report": "Txosten berriak:", "notifications.column_settings.admin.sign_up": "Izen-emate berriak:", "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak", - "notifications.column_settings.beta.category": "Ezaugarri esperimentalak", - "notifications.column_settings.beta.grouping": "Multzokatu jakinarazpenak", "notifications.column_settings.favourite": "Gogokoak:", "notifications.column_settings.filter_bar.advanced": "Bistaratu kategoria guztiak", "notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra", @@ -775,6 +774,7 @@ "status.bookmark": "Laster-marka", "status.cancel_reblog_private": "Kendu bultzada", "status.cannot_reblog": "Bidalketa honi ezin zaio bultzada eman", + "status.continued_thread": "Harian jarraitu zuen", "status.copy": "Kopiatu bidalketaren esteka", "status.delete": "Ezabatu", "status.detailed_status": "Elkarrizketaren ikuspegi xehetsua", @@ -783,7 +783,7 @@ "status.edit": "Editatu", "status.edited": "Azken edizioa: {date}", "status.edited_x_times": "{count, plural, one {behin} other {{count} aldiz}} editatua", - "status.embed": "Txertatu", + "status.embed": "Lortu txertatzeko kodea", "status.favourite": "Gogokoa", "status.favourites": "{count, plural, one {gogoko} other {gogoko}}", "status.filter": "Iragazi bidalketa hau", @@ -808,6 +808,7 @@ "status.reblogs.empty": "Inork ez dio bultzada eman bidalketa honi oraindik. Inork egiten badu, hemen agertuko da.", "status.redraft": "Ezabatu eta berridatzi", "status.remove_bookmark": "Kendu laster-marka", + "status.replied_in_thread": "Harian erantzun zuen", "status.replied_to": "{name} erabiltzaileari erantzuna", "status.reply": "Erantzun", "status.replyAll": "Erantzun harian", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index d2b520e1d2..fba8d90235 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -447,6 +447,7 @@ "lists.subheading": "سیاهه‌هایتان", "load_pending": "{count, plural, one {# مورد جدید} other {# مورد جدید}}", "loading_indicator.label": "در حال بارگذاری…", + "media_gallery.hide": "نهفتن", "moved_to_account_banner.text": "حسابتان {disabledAccount} اکنون از کار افتاده؛ چرا که به {movedToAccount} منتقل شدید.", "mute_modal.hide_from_notifications": "نهفتن از آگاهی‌ها", "mute_modal.hide_options": "گزینه‌های نهفتن", @@ -487,9 +488,13 @@ "notification.admin.report": "{name}، {target} را گزارش داد", "notification.admin.report_statuses_other": "{name}، {target} را گزارش داد", "notification.admin.sign_up": "{name} ثبت نام کرد", + "notification.admin.sign_up.name_and_others": "{name} و {count, plural, one {# نفر دیگر} other {# نفر دیگر}} ثبت‌نام کردند", "notification.favourite": "{name} فرسته‌تان را برگزید", + "notification.favourite.name_and_others_with_link": "{name} و {count, plural, one {# نفر دیگر} other {# نفر دیگر}} فرسته‌تان را برگزیدند", "notification.follow": "‫{name}‬ پی‌گیرتان شد", + "notification.follow.name_and_others": "{name} و {count, plural, one {# نفر دیگر} other {# نفر دیگر}} پیتان گرفتند", "notification.follow_request": "{name} درخواست پی‌گیریتان را داد", + "notification.follow_request.name_and_others": "{name} و {count, plural, one {# نفر دیگر} other {# نفر دیگر}} درخواست پی‌گیریتان را دادند", "notification.label.mention": "اشاره", "notification.label.private_mention": "اشارهٔ خصوصی", "notification.label.private_reply": "پاسخ خصوصی", @@ -507,6 +512,7 @@ "notification.own_poll": "نظرسنجیتان پایان یافت", "notification.poll": "نظرسنجی‌ای که در آن رأی دادید به پایان رسید", "notification.reblog": "‫{name}‬ فرسته‌تان را تقویت کرد", + "notification.reblog.name_and_others_with_link": "{name} و {count, plural, one {# نفر دیگر} other {# نفر دیگر}} فرسته‌تان را تقویت کردند", "notification.relationships_severance_event": "قطع ارتباط با {name}", "notification.relationships_severance_event.learn_more": "بیشتر بدانید", "notification.status": "{name} چیزی فرستاد", @@ -528,8 +534,6 @@ "notifications.column_settings.admin.report": "گزارش‌های جدید:", "notifications.column_settings.admin.sign_up": "ثبت نام‌های جدید:", "notifications.column_settings.alert": "آگاهی‌های میزکار", - "notifications.column_settings.beta.category": "ویژگی‌های آزمایشی", - "notifications.column_settings.beta.grouping": "گروه‌بندی آگاهی‌ها", "notifications.column_settings.favourite": "برگزیده‌ها:", "notifications.column_settings.filter_bar.advanced": "نمایش همۀ دسته‌ها", "notifications.column_settings.filter_bar.category": "نوار پالایش سریع", @@ -742,6 +746,7 @@ "status.bookmark": "نشانک", "status.cancel_reblog_private": "ناتقویت", "status.cannot_reblog": "این فرسته قابل تقویت نیست", + "status.continued_thread": "رشتهٔ دنباله دار", "status.copy": "رونوشت از پیوند فرسته", "status.delete": "حذف", "status.detailed_status": "نمایش کامل گفتگو", @@ -750,7 +755,6 @@ "status.edit": "ویرایش", "status.edited": "آخرین ویرایش {date}", "status.edited_x_times": "{count, plural, one {{count} مرتبه} other {{count} مرتبه}} ویرایش شد", - "status.embed": "جاسازی", "status.favourite": "برگزیده‌", "status.favourites": "{count, plural, one {برگزیده} other {برگزیده}}", "status.filter": "پالایش این فرسته", @@ -775,6 +779,7 @@ "status.reblogs.empty": "هنوز هیچ کسی این فرسته را تقویت نکرده است. وقتی کسی چنین کاری کند، این‌جا نمایش داده خواهد شد.", "status.redraft": "حذف و بازنویسی", "status.remove_bookmark": "برداشتن نشانک", + "status.replied_in_thread": "در رشته پاسخ داده", "status.replied_to": "به {name} پاسخ داد", "status.reply": "پاسخ", "status.replyAll": "پاسخ به رشته", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index d8c5b72040..681f5d5bb2 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Uudet raportit:", "notifications.column_settings.admin.sign_up": "Uudet rekisteröitymiset:", "notifications.column_settings.alert": "Työpöytäilmoitukset", - "notifications.column_settings.beta.category": "Kokeelliset ominaisuudet", - "notifications.column_settings.beta.grouping": "Ryhmittele ilmoitukset", "notifications.column_settings.favourite": "Suosikit:", "notifications.column_settings.filter_bar.advanced": "Näytä kaikki luokat", "notifications.column_settings.filter_bar.category": "Pikasuodatuspalkki", @@ -789,7 +787,7 @@ "status.edit": "Muokkaa", "status.edited": "Viimeksi muokattu {date}", "status.edited_x_times": "Muokattu {count, plural, one {{count} kerran} other {{count} kertaa}}", - "status.embed": "Upota", + "status.embed": "Hanki upotuskoodi", "status.favourite": "Suosikki", "status.favourites": "{count, plural, one {suosikki} other {suosikkia}}", "status.filter": "Suodata tämä julkaisu", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 6e7eb3b7c2..793a75bb05 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Nýggjar fráboðanir:", "notifications.column_settings.admin.sign_up": "Nýggjar tilmeldingar:", "notifications.column_settings.alert": "Skriviborðsfráboðanir", - "notifications.column_settings.beta.category": "Royndarhentleikar", - "notifications.column_settings.beta.grouping": "Bólkafráboðanir", "notifications.column_settings.favourite": "Dámdir postar:", "notifications.column_settings.filter_bar.advanced": "Vís allar bólkar", "notifications.column_settings.filter_bar.category": "Skjótfilturbjálki", @@ -789,7 +787,7 @@ "status.edit": "Rætta", "status.edited": "Seinast broytt {date}", "status.edited_x_times": "Rættað {count, plural, one {{count} ferð} other {{count} ferð}}", - "status.embed": "Legg inní", + "status.embed": "Fá kodu at seta inn", "status.favourite": "Dámdur postur", "status.favourites": "{count, plural, one {yndispostur} other {yndispostar}}", "status.filter": "Filtrera hendan postin", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 9f51aaaa7d..e89256bc2f 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -36,6 +36,7 @@ "account.followers.empty": "Personne ne suit ce compte pour l'instant.", "account.followers_counter": "{count, plural, one {{counter} abonné·e} other {{counter} abonné·e·s}}", "account.following": "Abonné·e", + "account.following_counter": "{count, plural, one {{counter} abonnement} other {{counter} abonnements}}", "account.follows.empty": "Ce compte ne suit personne présentement.", "account.go_to_profile": "Voir ce profil", "account.hide_reblogs": "Masquer les boosts de @{name}", @@ -456,6 +457,7 @@ "lists.subheading": "Vos listes", "load_pending": "{count, plural, one {# nouvel élément} other {# nouveaux éléments}}", "loading_indicator.label": "Chargement…", + "media_gallery.hide": "Masquer", "moved_to_account_banner.text": "Votre compte {disabledAccount} est actuellement désactivé parce que vous avez déménagé sur {movedToAccount}.", "mute_modal.hide_from_notifications": "Cacher des notifications", "mute_modal.hide_options": "Masquer les options", @@ -557,8 +559,6 @@ "notifications.column_settings.admin.report": "Nouveaux signalements:", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions:", "notifications.column_settings.alert": "Notifications navigateur", - "notifications.column_settings.beta.category": "Fonctionnalités expérimentales", - "notifications.column_settings.beta.grouping": "Grouper les notifications", "notifications.column_settings.favourite": "Favoris:", "notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories", "notifications.column_settings.filter_bar.category": "Barre de filtre rapide", @@ -778,6 +778,7 @@ "status.bookmark": "Ajouter aux signets", "status.cancel_reblog_private": "Débooster", "status.cannot_reblog": "Cette publication ne peut pas être boostée", + "status.continued_thread": "Suite du fil", "status.copy": "Copier un lien vers cette publication", "status.delete": "Supprimer", "status.detailed_status": "Vue détaillée de la conversation", @@ -786,7 +787,7 @@ "status.edit": "Modifier", "status.edited": "Dernière modification le {date}", "status.edited_x_times": "Modifiée {count, plural, one {{count} fois} other {{count} fois}}", - "status.embed": "Intégrer", + "status.embed": "Obtenir le code d'intégration", "status.favourite": "Ajouter aux favoris", "status.favourites": "{count, plural, one {favori} other {favoris}}", "status.filter": "Filtrer cette publication", @@ -811,6 +812,7 @@ "status.reblogs.empty": "Personne n’a encore boosté cette publication. Lorsque quelqu’un le fera, elle apparaîtra ici.", "status.redraft": "Supprimer et réécrire", "status.remove_bookmark": "Retirer des signets", + "status.replied_in_thread": "A répondu dans un fil de discussion", "status.replied_to": "A répondu à {name}", "status.reply": "Répondre", "status.replyAll": "Répondre à cette discussion", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 5bcc1c946b..03cb6471d6 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -36,6 +36,7 @@ "account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.", "account.followers_counter": "{count, plural, one {{counter} abonné·e} other {{counter} abonné·e·s}}", "account.following": "Abonnements", + "account.following_counter": "{count, plural, one {{counter} abonnement} other {{counter} abonnements}}", "account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.", "account.go_to_profile": "Aller au profil", "account.hide_reblogs": "Masquer les partages de @{name}", @@ -456,6 +457,7 @@ "lists.subheading": "Vos listes", "load_pending": "{count, plural, one {# nouvel élément} other {# nouveaux éléments}}", "loading_indicator.label": "Chargement…", + "media_gallery.hide": "Masquer", "moved_to_account_banner.text": "Votre compte {disabledAccount} est actuellement désactivé parce que vous l'avez déplacé à {movedToAccount}.", "mute_modal.hide_from_notifications": "Cacher des notifications", "mute_modal.hide_options": "Masquer les options", @@ -557,8 +559,6 @@ "notifications.column_settings.admin.report": "Nouveaux signalements :", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :", "notifications.column_settings.alert": "Notifications du navigateur", - "notifications.column_settings.beta.category": "Fonctionnalités expérimentales", - "notifications.column_settings.beta.grouping": "Grouper les notifications", "notifications.column_settings.favourite": "Favoris :", "notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories", "notifications.column_settings.filter_bar.category": "Barre de filtre rapide", @@ -778,6 +778,7 @@ "status.bookmark": "Ajouter aux marque-pages", "status.cancel_reblog_private": "Annuler le partage", "status.cannot_reblog": "Ce message ne peut pas être partagé", + "status.continued_thread": "Suite du fil", "status.copy": "Copier le lien vers le message", "status.delete": "Supprimer", "status.detailed_status": "Vue détaillée de la conversation", @@ -786,7 +787,7 @@ "status.edit": "Modifier", "status.edited": "Dernière modification le {date}", "status.edited_x_times": "Modifié {count, plural, one {{count} fois} other {{count} fois}}", - "status.embed": "Intégrer", + "status.embed": "Obtenir le code d'intégration", "status.favourite": "Ajouter aux favoris", "status.favourites": "{count, plural, one {favori} other {favoris}}", "status.filter": "Filtrer ce message", @@ -794,7 +795,7 @@ "status.history.edited": "modifié par {name} {date}", "status.load_more": "Charger plus", "status.media.open": "Cliquez pour ouvrir", - "status.media.show": "Cliquez pour voir", + "status.media.show": "Cliquer pour afficher", "status.media_hidden": "Média caché", "status.mention": "Mentionner @{name}", "status.more": "Plus", @@ -811,6 +812,7 @@ "status.reblogs.empty": "Personne n’a encore partagé ce message. Lorsque quelqu’un le fera, il apparaîtra ici.", "status.redraft": "Supprimer et réécrire", "status.remove_bookmark": "Retirer des marque-pages", + "status.replied_in_thread": "A répondu dans un fil de discussion", "status.replied_to": "En réponse à {name}", "status.reply": "Répondre", "status.replyAll": "Répondre au fil", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index badd6a1c21..2443692133 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -558,8 +558,6 @@ "notifications.column_settings.admin.report": "Nije rapportaazjes:", "notifications.column_settings.admin.sign_up": "Nije registraasjes:", "notifications.column_settings.alert": "Desktopmeldingen", - "notifications.column_settings.beta.category": "Eksperimintele funksjes", - "notifications.column_settings.beta.grouping": "Notifikaasjes groepearje", "notifications.column_settings.favourite": "Favoriten:", "notifications.column_settings.filter_bar.advanced": "Alle kategoryen toane", "notifications.column_settings.filter_bar.category": "Flugge filterbalke", @@ -787,7 +785,6 @@ "status.edit": "Bewurkje", "status.edited": "Lêst bywurke op {date}", "status.edited_x_times": "{count, plural, one {{count} kear} other {{count} kearen}} bewurke", - "status.embed": "Ynslute", "status.favourite": "Favoryt", "status.favourites": "{count, plural, one {favoryt} other {favoriten}}", "status.filter": "Dit berjocht filterje", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 95bb293854..11da6b64e9 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -457,6 +457,7 @@ "lists.subheading": "Do liostaí", "load_pending": "{count, plural, one {# mír nua} two {# mír nua} few {# mír nua} many {# mír nua} other {# mír nua}}", "loading_indicator.label": "Á lódáil…", + "media_gallery.hide": "Folaigh", "moved_to_account_banner.text": "Tá do chuntas {disabledAccount} díchumasaithe faoi láthair toisc gur bhog tú go {movedToAccount}.", "mute_modal.hide_from_notifications": "Folaigh ó fhógraí", "mute_modal.hide_options": "Folaigh roghanna", @@ -558,8 +559,6 @@ "notifications.column_settings.admin.report": "Tuairiscí nua:", "notifications.column_settings.admin.sign_up": "Clárúcháin nua:", "notifications.column_settings.alert": "Fógraí deisce", - "notifications.column_settings.beta.category": "Gnéithe turgnamhacha", - "notifications.column_settings.beta.grouping": "Fógraí grúpa", "notifications.column_settings.favourite": "Ceanáin:", "notifications.column_settings.filter_bar.advanced": "Taispeáin gach catagóir", "notifications.column_settings.filter_bar.category": "Barra scagairí tapa", @@ -779,6 +778,7 @@ "status.bookmark": "Leabharmharcanna", "status.cancel_reblog_private": "Dímhol", "status.cannot_reblog": "Ní féidir an phostáil seo a mholadh", + "status.continued_thread": "Snáithe ar lean", "status.copy": "Cóipeáil an nasc chuig an bpostáil", "status.delete": "Scrios", "status.detailed_status": "Amharc comhrá mionsonraithe", @@ -787,7 +787,7 @@ "status.edit": "Cuir in eagar", "status.edited": "Arna chuir in eagar anuas {date}", "status.edited_x_times": "Curtha in eagar {count, plural, one {{count} uair amháin} two {{count} uair} few {{count} uair} many {{count} uair} other {{count} uair}}", - "status.embed": "Leabaigh", + "status.embed": "Faigh cód leabú", "status.favourite": "Is fearr leat", "status.favourites": "{count, plural, one {a bhfuil grá agat do} two {gráite} few {gráite} many {gráite} other {gráite}}", "status.filter": "Déan scagadh ar an bpostáil seo", @@ -812,6 +812,7 @@ "status.reblogs.empty": "Níor mhol éinne an phostáil seo fós. Nuair a mholfaidh duine éigin í, taispeánfar anseo é sin.", "status.redraft": "Scrios ⁊ athdhréachtaigh", "status.remove_bookmark": "Bain leabharmharc", + "status.replied_in_thread": "D'fhreagair sa snáithe", "status.replied_to": "D'fhreagair {name}", "status.reply": "Freagair", "status.replyAll": "Freagair le snáithe", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index e2f67bc296..97748e0ee9 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -457,6 +457,7 @@ "lists.subheading": "Na liostaichean agad", "load_pending": "{count, plural, one {# nì ùr} two {# nì ùr} few {# nithean ùra} other {# nì ùr}}", "loading_indicator.label": "’Ga luchdadh…", + "media_gallery.hide": "Falaich", "moved_to_account_banner.text": "Tha an cunntas {disabledAccount} agad à comas on a rinn thu imrich gu {movedToAccount}.", "mute_modal.hide_from_notifications": "Falaich o na brathan", "mute_modal.hide_options": "Roghainnean falaich", @@ -558,8 +559,6 @@ "notifications.column_settings.admin.report": "Gearanan ùra:", "notifications.column_settings.admin.sign_up": "Clàraidhean ùra:", "notifications.column_settings.alert": "Brathan deasga", - "notifications.column_settings.beta.category": "Gleusan deuchainneil", - "notifications.column_settings.beta.grouping": "Buidhnich na brathan", "notifications.column_settings.favourite": "Annsachdan:", "notifications.column_settings.filter_bar.advanced": "Seall a h-uile roinn-seòrsa", "notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath", @@ -779,6 +778,7 @@ "status.bookmark": "Cuir ris na comharran-lìn", "status.cancel_reblog_private": "Na brosnaich tuilleadh", "status.cannot_reblog": "Cha ghabh am post seo brosnachadh", + "status.continued_thread": "Pàirt de shnàithlean", "status.copy": "Dèan lethbhreac dhen cheangal dhan phost", "status.delete": "Sguab às", "status.detailed_status": "Mion-shealladh a’ chòmhraidh", @@ -787,7 +787,7 @@ "status.edit": "Deasaich", "status.edited": "An deasachadh mu dheireadh {date}", "status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{count} turas} two {{count} thuras} few {{count} tursan} other {{count} turas}}", - "status.embed": "Leabaich", + "status.embed": "Faigh còd leabachaidh", "status.favourite": "Cuir ris na h-annsachdan", "status.favourites": "{count, plural, one {annsachd} two {annsachd} few {annsachdan} other {annsachd}}", "status.filter": "Criathraich am post seo", @@ -812,6 +812,7 @@ "status.reblogs.empty": "Chan deach am post seo a bhrosnachadh le duine sam bith fhathast. Nuair a bhrosnaicheas cuideigin e, nochdaidh iad an-seo.", "status.redraft": "Sguab às ⁊ dèan dreachd ùr", "status.remove_bookmark": "Thoir an comharra-lìn air falbh", + "status.replied_in_thread": "Freagairt do shnàithlean", "status.replied_to": "Air {name} fhreagairt", "status.reply": "Freagair", "status.replyAll": "Freagair dhan t-snàithlean", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index b0b530e88f..d35bcd8cf5 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -236,8 +236,8 @@ "domain_pill.your_handle": "O teu alcume:", "domain_pill.your_server": "O teu fogar dixital, onde están as túas publicacións. Non é do teu agrado? Podes cambiar de servidor cando queiras levando as túas seguidoras contigo.", "domain_pill.your_username": "O teu identificador único neste servidor. É posible que atopes usuarias co mesmo nome de usuaria en outros servidores.", - "embed.instructions": "Engade esta publicación ó teu sitio web copiando o seguinte código.", - "embed.preview": "Así será mostrado:", + "embed.instructions": "Inclúe esta publicación no teu sitio web copiando o seguinte código.", + "embed.preview": "Vaise ver así:", "emoji_button.activity": "Actividade", "emoji_button.clear": "Limpar", "emoji_button.custom": "Personalizado", @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Novas denuncias:", "notifications.column_settings.admin.sign_up": "Novas usuarias:", "notifications.column_settings.alert": "Notificacións de escritorio", - "notifications.column_settings.beta.category": "Características experimentais", - "notifications.column_settings.beta.grouping": "Notificacións de grupo", "notifications.column_settings.favourite": "Favoritas:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorías", "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", @@ -789,7 +787,7 @@ "status.edit": "Editar", "status.edited": "Última edición {date}", "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}", - "status.embed": "Incrustar", + "status.embed": "O código a incluír", "status.favourite": "Favorecer", "status.favourites": "{count, plural, one {favorecemento} other {favorecementos}}", "status.filter": "Filtrar esta publicación", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 80d9f054cc..de20d505c0 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "דו\"חות חדשים", "notifications.column_settings.admin.sign_up": "הרשמות חדשות:", "notifications.column_settings.alert": "התראות לשולחן העבודה", - "notifications.column_settings.beta.category": "יכולות ניסיוניות", - "notifications.column_settings.beta.grouping": "התראות קבוצה", "notifications.column_settings.favourite": "חיבובים:", "notifications.column_settings.filter_bar.advanced": "להציג את כל הקטגוריות", "notifications.column_settings.filter_bar.category": "שורת סינון מהיר", @@ -789,7 +787,6 @@ "status.edit": "עריכה", "status.edited": "נערך לאחרונה {date}", "status.edited_x_times": "נערך {count, plural, one {פעם {count}} other {{count} פעמים}}", - "status.embed": "הטמעה", "status.favourite": "חיבוב", "status.favourites": "{count, plural, one {חיבוב אחד} two {זוג חיבובים} other {# חיבובים}}", "status.filter": "סנן הודעה זו", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 9f5782767b..26c527f2fe 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -457,7 +457,6 @@ "status.delete": "Obriši", "status.edit": "Uredi", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "Umetni", "status.filter": "Filtriraj ovu objavu", "status.history.created": "Kreirao/la {name} prije {date}", "status.history.edited": "Uredio/la {name} prije {date}", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 1e4e02cb9d..d4ced22463 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Új jelentések:", "notifications.column_settings.admin.sign_up": "Új regisztrálók:", "notifications.column_settings.alert": "Asztali értesítések", - "notifications.column_settings.beta.category": "Kísérleti funkciók", - "notifications.column_settings.beta.grouping": "Csoportértesítések", "notifications.column_settings.favourite": "Kedvencek:", "notifications.column_settings.filter_bar.advanced": "Minden kategória megjelenítése", "notifications.column_settings.filter_bar.category": "Gyorsszűrő sáv", @@ -789,7 +787,7 @@ "status.edit": "Szerkesztés", "status.edited": "Utoljára szerkesztve {date}", "status.edited_x_times": "{count, plural, one {{count} alkalommal} other {{count} alkalommal}} szerkesztve", - "status.embed": "Beágyazás", + "status.embed": "Beágyazási kód lekérése", "status.favourite": "Kedvenc", "status.favourites": "{count, plural, one {kedvenc} other {kedvenc}}", "status.filter": "E bejegyzés szűrése", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index d1475338fd..a81abb82f0 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -448,7 +448,6 @@ "status.direct_indicator": "Մասնաւոր յիշատակում", "status.edit": "Խմբագրել", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "Ներդնել", "status.favourite": "Հավանել", "status.filter": "Զտել այս գրառումը", "status.history.created": "{name}-ը ստեղծել է՝ {date}", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 9d7e3ff2c7..9e7b583375 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -355,6 +355,7 @@ "hints.profiles.see_more_followers": "Vider plus de sequitores sur {domain}", "hints.profiles.see_more_follows": "Vider plus de sequites sur {domain}", "hints.profiles.see_more_posts": "Vider plus de messages sur {domain}", + "hints.threads.replies_may_be_missing": "Responsas de altere servitores pote esser perdite.", "hints.threads.see_more": "Vider plus de responsas sur {domain}", "home.column_settings.show_reblogs": "Monstrar impulsos", "home.column_settings.show_replies": "Monstrar responsas", @@ -534,8 +535,6 @@ "notifications.column_settings.admin.report": "Nove reportos:", "notifications.column_settings.admin.sign_up": "Nove inscriptiones:", "notifications.column_settings.alert": "Notificationes de scriptorio", - "notifications.column_settings.beta.category": "Functionalitates experimental", - "notifications.column_settings.beta.grouping": "Notificationes de gruppo", "notifications.column_settings.favourite": "Favorites:", "notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias", "notifications.column_settings.filter_bar.category": "Barra de filtro rapide", @@ -759,7 +758,6 @@ "status.edit": "Modificar", "status.edited": "Ultime modification le {date}", "status.edited_x_times": "Modificate {count, plural, one {{count} vice} other {{count} vices}}", - "status.embed": "Incastrar", "status.favourite": "Adder al favorites", "status.favourites": "{count, plural, one {favorite} other {favorites}}", "status.filter": "Filtrar iste message", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 3e2cc03145..687c32c1b1 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -583,7 +583,6 @@ "status.detailed_status": "Tampilan detail percakapan", "status.edit": "Edit", "status.edited_x_times": "Diedit {count, plural, other {{count} kali}}", - "status.embed": "Tanam", "status.filter": "Saring kiriman ini", "status.history.created": "{name} membuat {date}", "status.history.edited": "{name} mengedit {date}", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 7a176dfbb6..3226801019 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -698,7 +698,6 @@ "status.edit": "Modificar", "status.edited": "Ultimmen actualisat ye {date}", "status.edited_x_times": "Modificat {count, plural, one {{count} vez} other {{count} vezes}}", - "status.embed": "Inbedar", "status.favourite": "Favoritisar", "status.favourites": "{count, plural, one {favorit} other {favorites}}", "status.filter": "Filtrar ti-ci posta", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index d0ccb923ba..bb0a86ac2b 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -589,7 +589,6 @@ "status.direct_indicator": "Privata menciono", "status.edit": "Modifikez", "status.edited_x_times": "Modifikesis {count, plural, one {{count} foyo} other {{count} foyi}}", - "status.embed": "Eninsertez", "status.favourite": "Favorizar", "status.filter": "Filtragez ca posto", "status.history.created": "{name} kreis ye {date}", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 83932f1b4b..fb807429f7 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Nýjar kærur:", "notifications.column_settings.admin.sign_up": "Nýjar skráningar:", "notifications.column_settings.alert": "Tilkynningar á skjáborði", - "notifications.column_settings.beta.category": "Eiginleikar á tilraunastigi", - "notifications.column_settings.beta.grouping": "Tilkynningar hópa", "notifications.column_settings.favourite": "Eftirlæti:", "notifications.column_settings.filter_bar.advanced": "Birta alla flokka", "notifications.column_settings.filter_bar.category": "Skyndisíustika", @@ -789,7 +787,7 @@ "status.edit": "Breyta", "status.edited": "Síðast breytt {date}", "status.edited_x_times": "Breytt {count, plural, one {{count} sinni} other {{count} sinnum}}", - "status.embed": "Ívefja", + "status.embed": "Ná í innfellanlegan kóða", "status.favourite": "Eftirlæti", "status.favourites": "{count, plural, one {eftirlæti} other {eftirlæti}}", "status.filter": "Sía þessa færslu", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 1c8cff5490..97518c5862 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Nuove segnalazioni:", "notifications.column_settings.admin.sign_up": "Nuove iscrizioni:", "notifications.column_settings.alert": "Notifiche desktop", - "notifications.column_settings.beta.category": "Funzioni sperimentali", - "notifications.column_settings.beta.grouping": "Notifiche di gruppo", "notifications.column_settings.favourite": "Preferiti:", "notifications.column_settings.filter_bar.advanced": "Mostra tutte le categorie", "notifications.column_settings.filter_bar.category": "Barra del filtro veloce", @@ -780,6 +778,7 @@ "status.bookmark": "Aggiungi segnalibro", "status.cancel_reblog_private": "Annulla reblog", "status.cannot_reblog": "Questo post non può essere condiviso", + "status.continued_thread": "Discussione continua", "status.copy": "Copia link al post", "status.delete": "Elimina", "status.detailed_status": "Vista conversazione dettagliata", @@ -788,7 +787,7 @@ "status.edit": "Modifica", "status.edited": "Ultima modifica {date}", "status.edited_x_times": "Modificato {count, plural, one {{count} volta} other {{count} volte}}", - "status.embed": "Incorpora", + "status.embed": "Ottieni codice incorporato", "status.favourite": "Preferito", "status.favourites": "{count, plural, one {preferito} other {preferiti}}", "status.filter": "Filtra questo post", @@ -813,6 +812,7 @@ "status.reblogs.empty": "Ancora nessuno ha rebloggato questo post. Quando qualcuno lo farà, apparirà qui.", "status.redraft": "Elimina e riscrivi", "status.remove_bookmark": "Rimuovi segnalibro", + "status.replied_in_thread": "Ha risposto nella discussione", "status.replied_to": "Risposta a {name}", "status.reply": "Rispondi", "status.replyAll": "Rispondi alla conversazione", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 227d8497e0..94cab8b0f2 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -666,8 +666,6 @@ "notifications.column_settings.admin.report": "新しい通報:", "notifications.column_settings.admin.sign_up": "新規登録:", "notifications.column_settings.alert": "デスクトップ通知", - "notifications.column_settings.beta.category": "実験段階の機能", - "notifications.column_settings.beta.grouping": "通知をグループにまとめる", "notifications.column_settings.emoji_reaction": "絵文字リアクション", "notifications.column_settings.favourite": "お気に入り:", "notifications.column_settings.filter_bar.advanced": "すべてのカテゴリを表示", @@ -930,7 +928,6 @@ "status.edit": "編集", "status.edited": "最終更新日 {date}", "status.edited_x_times": "{count}回編集", - "status.embed": "埋め込み", "status.emoji_reaction": "絵文字リアクション", "status.emoji_reaction.pick": "絵文字を追加する", "status.emoji_reactions": "{count, plural, one {絵文字} other {絵文字}}", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 0bd86a2476..fc0ed0730d 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -222,7 +222,6 @@ "status.copy": "Copy link to status", "status.delete": "წაშლა", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "ჩართვა", "status.load_more": "მეტის ჩატვირთვა", "status.media_hidden": "მედია დამალულია", "status.mention": "ასახელე @{name}", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index ae783b6c24..24286a119f 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -411,7 +411,6 @@ "notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk alɣuten-inek·em i lebda?", "notifications.column_settings.admin.report": "Ineqqisen imaynuten:", "notifications.column_settings.alert": "Alɣuten n tnarit", - "notifications.column_settings.beta.grouping": "Segrew alɣuten", "notifications.column_settings.favourite": "Imenyafen:", "notifications.column_settings.filter_bar.advanced": "Sken-d akk taggayin", "notifications.column_settings.filter_bar.category": "Iri n usizdeg uzrib", @@ -584,7 +583,6 @@ "status.direct_indicator": "Abdar uslig", "status.edit": "Ẓreg", "status.edited_x_times": "Tettwaẓreg {count, plural, one {{count} n tikkelt} other {{count} n tikkal}}", - "status.embed": "Seddu", "status.favourite": "Amenyaf", "status.favourites": "{count, plural, one {n usmenyaf} other {n ismenyafen}}", "status.filter": "Sizdeg tassufeɣt-a", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index eace5d95b8..f146fc652d 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -315,7 +315,6 @@ "status.delete": "Өшіру", "status.detailed_status": "Толық пікірталас көрінісі", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "Embеd", "status.load_more": "Тағы әкел", "status.media_hidden": "Жабық медиа", "status.mention": "Аталым @{name}", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 4c78f4332e..6795bc647c 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "새 신고:", "notifications.column_settings.admin.sign_up": "새로운 가입:", "notifications.column_settings.alert": "데스크탑 알림", - "notifications.column_settings.beta.category": "실험적인 기능", - "notifications.column_settings.beta.grouping": "알림 그룹화", "notifications.column_settings.favourite": "좋아요:", "notifications.column_settings.filter_bar.advanced": "모든 범주 표시", "notifications.column_settings.filter_bar.category": "빠른 필터 막대", @@ -788,7 +786,6 @@ "status.edit": "수정", "status.edited": "{date}에 마지막으로 편집됨", "status.edited_x_times": "{count, plural, other {{count}}} 번 수정됨", - "status.embed": "임베드", "status.favourite": "좋아요", "status.favourites": "{count, plural, other {좋아요}}", "status.filter": "이 게시물을 필터", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index d69f4b0d05..dd10000d18 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -498,7 +498,6 @@ "status.direct_indicator": "Qalkirinê taybet", "status.edit": "Serrast bike", "status.edited_x_times": "{count, plural, one {{count} car} other {{count} car}} hate serrastkirin", - "status.embed": "Bi cih bike", "status.filter": "Vê şandiyê parzûn bike", "status.history.created": "{name} {date} afirand", "status.history.edited": "{name} {date} serrast kir", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index 046910daf8..60b8321d53 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -317,7 +317,6 @@ "status.delete": "Dilea", "status.detailed_status": "Gwel kesklapp a-vanyl", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "Staga", "status.load_more": "Karga moy", "status.media_hidden": "Myski kudhys", "status.mention": "Meneges @{name}", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index e63c22ec69..72bf260501 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -490,7 +490,6 @@ "notifications.column_settings.admin.report": "Muveos raportos:", "notifications.column_settings.admin.sign_up": "Muevas enrejistrasyones:", "notifications.column_settings.alert": "Avizos de ensimameza", - "notifications.column_settings.beta.category": "Funksyones eksperimentalas", "notifications.column_settings.favourite": "Te plazen:", "notifications.column_settings.filter_bar.advanced": "Amostra todas las kategorias", "notifications.column_settings.filter_bar.category": "Vara de filtrado rapido", @@ -707,7 +706,6 @@ "status.edit": "Edita", "status.edited": "Ultima edisyon: {date}", "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} vezes}}", - "status.embed": "Inkrusta", "status.favourite": "Te plaze", "status.filter": "Filtra esta publikasyon", "status.history.created": "{name} kriyo {date}", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index cc905e3a21..5a510f5b96 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -552,8 +552,6 @@ "notifications.column_settings.admin.report": "Naujos ataskaitos:", "notifications.column_settings.admin.sign_up": "Naujos registracijos:", "notifications.column_settings.alert": "Darbalaukio pranešimai", - "notifications.column_settings.beta.category": "Eksperimentinės funkcijos", - "notifications.column_settings.beta.grouping": "Grupuoti pranešimus", "notifications.column_settings.favourite": "Mėgstami:", "notifications.column_settings.filter_bar.advanced": "Rodyti visas kategorijas", "notifications.column_settings.filter_bar.category": "Spartaus filtro juosta", @@ -779,7 +777,6 @@ "status.edit": "Redaguoti", "status.edited": "Paskutinį kartą redaguota {date}", "status.edited_x_times": "Redaguota {count, plural, one {{count} kartą} few {{count} kartus} many {{count} karto} other {{count} kartų}}", - "status.embed": "Įterpti", "status.favourite": "Pamėgti", "status.favourites": "{count, plural, one {mėgstamas} few {mėgstamai} many {mėgstamų} other {mėgstamų}}", "status.filter": "Filtruoti šį įrašą", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 37dc1d06db..b53f65ab43 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -11,6 +11,7 @@ "about.not_available": "Šī informācija nav padarīta pieejama šajā serverī.", "about.powered_by": "Decentralizētu sociālo tīklu nodrošina {mastodon}", "about.rules": "Servera noteikumi", + "account.account_note_header": "Personīga piezīme", "account.add_or_remove_from_list": "Pievienot vai Noņemt no sarakstiem", "account.badges.bot": "Automatizēts", "account.badges.group": "Grupa", @@ -90,7 +91,10 @@ "block_modal.show_more": "Parādīt mazāk", "block_modal.they_cant_mention": "Nevar Tevi pieminēt vai sekot Tev.", "block_modal.they_cant_see_posts": "Nevar redzēt Tavus ierakstus, un Tu neredzēsi lietotāja.", + "block_modal.title": "Bloķēt lietotāju?", "boost_modal.combo": "Nospied {combo}, lai nākamreiz šo izlaistu", + "boost_modal.reblog": "Pastiprināt ierakstu?", + "boost_modal.undo_reblog": "Atcelt ieraksta pastiprināšanu?", "bundle_column_error.copy_stacktrace": "Kopēt kļūdu ziņojumu", "bundle_column_error.error.body": "Pieprasīto lapu nevarēja atveidot. Tas varētu būt saistīts ar kļūdu mūsu kodā, vai tā ir pārlūkprogrammas saderības problēma.", "bundle_column_error.error.title": "Ak vai!", @@ -152,6 +156,7 @@ "compose_form.poll.single": "Jāizvēlas viens", "compose_form.poll.switch_to_multiple": "Mainīt aptaujas veidu, lai atļautu vairākas izvēles", "compose_form.poll.switch_to_single": "Mainīt aptaujas veidu, lai atļautu vienu izvēli", + "compose_form.poll.type": "Stils", "compose_form.publish": "Iesūtīt", "compose_form.publish_form": "Jauns ieraksts", "compose_form.reply": "Atbildēt", @@ -163,21 +168,30 @@ "confirmations.block.confirm": "Bloķēt", "confirmations.delete.confirm": "Dzēst", "confirmations.delete.message": "Vai tiešām vēlies dzēst šo ierakstu?", + "confirmations.delete.title": "Izdzēst ierakstu?", "confirmations.delete_list.confirm": "Dzēst", "confirmations.delete_list.message": "Vai tiešām neatgriezeniski izdzēst šo sarakstu?", + "confirmations.delete_list.title": "Izdzēst sarakstu?", "confirmations.discard_edit_media.confirm": "Atmest", "confirmations.discard_edit_media.message": "Ir nesaglabātas izmaiņas informācijas nesēja aprakstā vai priekšskatījumā. Vēlies tās atmest tik un tā?", "confirmations.edit.confirm": "Labot", "confirmations.edit.message": "Labošana pārrakstīs ziņojumu, kas šobrīd tiek sastādīts. Vai tiešām turpināt?", + "confirmations.edit.title": "Pārrakstīt ierakstu?", "confirmations.logout.confirm": "Iziet", "confirmations.logout.message": "Vai tiešām vēlies izrakstīties?", + "confirmations.logout.title": "Atteikties?", "confirmations.mute.confirm": "Apklusināt", "confirmations.redraft.confirm": "Dzēst un pārrakstīt", "confirmations.redraft.message": "Vai tiešām vēlies dzēst šo ziņu un no jauna noformēt to? Izlase un pastiprinājumi tiks zaudēti, un atbildes uz sākotnējo ziņu tiks atstātas bez autoratlīdzības.", + "confirmations.redraft.title": "Dzēst un rakstīt vēlreiz?", "confirmations.reply.confirm": "Atbildēt", "confirmations.reply.message": "Tūlītēja atbildēšana pārrakstīs pašlaik sastādīto ziņu. Vai tiešām turpināt?", + "confirmations.reply.title": "Pārrakstīt ierakstu?", "confirmations.unfollow.confirm": "Pārstāt sekot", "confirmations.unfollow.message": "Vai tiešam vairs nevēlies sekot lietotājam {name}?", + "confirmations.unfollow.title": "Pārtraukt sekošanu lietotājam?", + "content_warning.hide": "Paslēpt ierakstu", + "content_warning.show": "Tomēr rādīt", "conversation.delete": "Dzēst sarunu", "conversation.mark_as_read": "Atzīmēt kā izlasītu", "conversation.open": "Skatīt sarunu", @@ -197,7 +211,11 @@ "dismissable_banner.explore_statuses": "Šie ir ieraksti, kas šodien gūst arvien lielāku ievērību visā sociālajā tīklā. Augstāk tiek kārtoti jaunāki ieraksti, kuri tiek vairāk pastiprināti un ievietoti izlasēs.", "dismissable_banner.explore_tags": "Šie tēmturi šobrīd kļūst arvien populārāki cilvēku vidū šajā un citos decentralizētā tīkla serveros.", "dismissable_banner.public_timeline": "Šie ir jaunākie publiskie ieraksti no lietotājiem sociālajā tīmeklī, kuriem {domain} seko cilvēki.", + "domain_block_modal.block": "Bloķēt serveri", "domain_block_modal.they_cant_follow": "Neviens šajā serverī nevar Tev sekot.", + "domain_block_modal.they_wont_know": "Viņi nezinās, ka tikuši bloķēti.", + "domain_block_modal.title": "Bloķēt domēnu?", + "domain_block_modal.you_will_lose_followers": "Tiks noņemti visi tavi sekotāji no šī servera.", "domain_pill.server": "Serveris", "domain_pill.username": "Lietotājvārds", "embed.instructions": "Iestrādā šo ziņu savā mājaslapā, kopējot zemāk redzamo kodu.", @@ -266,6 +284,7 @@ "filter_modal.select_filter.subtitle": "Izmanto esošu kategoriju vai izveido jaunu", "filter_modal.select_filter.title": "Filtrēt šo ziņu", "filter_modal.title.status": "Filtrēt ziņu", + "filter_warning.matches_filter": "Atbilst filtram “{title}”", "firehose.all": "Visi", "firehose.local": "Šis serveris", "firehose.remote": "Citi serveri", @@ -274,6 +293,7 @@ "follow_requests.unlocked_explanation": "Lai gan Tavs konts nav slēgts, {domain} darbinieki iedomājās, ka Tu varētu vēlēties pašrocīgi pārskatīt sekošanas pieprasījumus no šiem kontiem.", "follow_suggestions.curated_suggestion": "Darbinieku izvēle", "follow_suggestions.dismiss": "Vairs nerādīt", + "follow_suggestions.friends_of_friends_longer": "Populārs to cilvēku vidū, kuriem tu seko", "follow_suggestions.personalized_suggestion": "Pielāgots ieteikums", "follow_suggestions.similar_to_recently_followed_longer": "Līdzīgi profieliem, kuriem nesen sāki sekot", "follow_suggestions.view_all": "Skatīt visu", @@ -304,6 +324,7 @@ "hashtag.follow": "Sekot tēmturim", "hashtag.unfollow": "Pārstāt sekot tēmturim", "hashtags.and_other": "… un {count, plural, other {vēl #}}", + "hints.threads.replies_may_be_missing": "Var trūkt atbildes no citiem serveriem.", "home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus", "home.column_settings.show_replies": "Rādīt atbildes", "home.hide_announcements": "Slēpt paziņojumus", @@ -649,7 +670,6 @@ "status.edit": "Labot", "status.edited": "Pēdējoreiz labots {date}", "status.edited_x_times": "Labots {count, plural, zero {{count} reižu} one {{count} reizi} other {{count} reizes}}", - "status.embed": "Iegult", "status.favourite": "Izlasē", "status.favourites": "{count, plural, zero {izlasēs} one {izlasē} other {izlasēs}}", "status.filter": "Filtrē šo ziņu", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index 48ea29f983..5ed6f219db 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -308,7 +308,6 @@ "status.delete": "മായ്ക്കുക", "status.detailed_status": "വിശദമായ സംഭാഷണ കാഴ്‌ച", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "ഉൾച്ചേർക്കുക", "status.load_more": "കൂടുതൽ ലോഡു ചെയ്യുക", "status.media_hidden": "മീഡിയ മറച്ചു", "status.mention": "@{name} സൂചിപ്പിക്കുക", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index c6bc630bfe..44403ec959 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -613,7 +613,6 @@ "status.direct_indicator": "Sebutan peribadi", "status.edit": "Sunting", "status.edited_x_times": "Disunting {count, plural, other {{count} kali}}", - "status.embed": "Benaman", "status.favourite": "Kegemaran", "status.filter": "Tapiskan hantaran ini", "status.history.created": "{name} mencipta pada {date}", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index 2127d69baa..e93b47fd54 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -589,7 +589,6 @@ "status.direct_indicator": "သီးသန့်ဖော်ပြခြင်း။", "status.edit": "ပြင်ဆင်ရန်", "status.edited_x_times": "{count, plural, one {{count} time} other {{count} times}} ပြင်ဆင်ခဲ့သည်", - "status.embed": "Embed", "status.favourite": "Favorite", "status.filter": "ဤပို့စ်ကို စစ်ထုတ်ပါ", "status.history.created": "{name} က {date} က ဖန်တီးခဲ့သည်", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index e5d8e8d2eb..1043ca8376 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Nieuwe rapportages:", "notifications.column_settings.admin.sign_up": "Nieuwe registraties:", "notifications.column_settings.alert": "Desktopmeldingen", - "notifications.column_settings.beta.category": "Experimentele functies", - "notifications.column_settings.beta.grouping": "Gegroepeerde meldingen", "notifications.column_settings.favourite": "Favorieten:", "notifications.column_settings.filter_bar.advanced": "Alle categorieën tonen", "notifications.column_settings.filter_bar.category": "Snelle filterbalk", @@ -789,7 +787,7 @@ "status.edit": "Bewerken", "status.edited": "Laatste bewerking op {date}", "status.edited_x_times": "{count, plural, one {{count} keer} other {{count} keer}} bewerkt", - "status.embed": "Embedden", + "status.embed": "Embed-code verkrijgen", "status.favourite": "Favoriet", "status.favourites": "{count, plural, one {favoriet} other {favorieten}}", "status.filter": "Dit bericht filteren", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index d21ebffe22..c4b5f0291d 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Nye rapportar:", "notifications.column_settings.admin.sign_up": "Nyleg registrerte:", "notifications.column_settings.alert": "Skrivebordsvarsel", - "notifications.column_settings.beta.category": "Eksperimentelle funksjonar", - "notifications.column_settings.beta.grouping": "Grupper varslingar", "notifications.column_settings.favourite": "Favorittar:", "notifications.column_settings.filter_bar.advanced": "Vis alle kategoriar", "notifications.column_settings.filter_bar.category": "Snøggfilterline", @@ -789,7 +787,7 @@ "status.edit": "Rediger", "status.edited": "Sist endra {date}", "status.edited_x_times": "Redigert {count, plural, one {{count} gong} other {{count} gonger}}", - "status.embed": "Bygg inn", + "status.embed": "Få innbyggingskode", "status.favourite": "Favoritt", "status.favourites": "{count, plural, one {favoritt} other {favorittar}}", "status.filter": "Filtrer dette innlegget", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index b805b98528..1222f40424 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -727,7 +727,6 @@ "status.direct_indicator": "Privat omtale", "status.edit": "Rediger", "status.edited_x_times": "Redigert {count, plural,one {{count} gang} other {{count} ganger}}", - "status.embed": "Bygge inn", "status.favourite": "Favoritt", "status.filter": "Filtrer dette innlegget", "status.history.created": "{name} opprettet {date}", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 1d9008dbd1..22193f82aa 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -505,7 +505,6 @@ "status.direct_indicator": "Mencion privada", "status.edit": "Modificar", "status.edited_x_times": "Modificat {count, plural, un {{count} còp} other {{count} còps}}", - "status.embed": "Embarcar", "status.favourite": "Apondre als favorits", "status.filter": "Filtrar aquesta publicacion", "status.history.created": "{name} o creèt lo {date}", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index a71c01b3c1..5da88ff08f 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -320,7 +320,6 @@ "status.delete": "ਹਟਾਓ", "status.edit": "ਸੋਧ", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "ਮੜ੍ਹੋ", "status.favourite": "ਪਸੰਦ", "status.history.created": "{name} ਨੇ {date} ਨੂੰ ਬਣਾਇਆ", "status.history.edited": "{name} ਨੇ {date} ਨੂੰ ਸੋਧਿਆ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 2ef437ef04..d415bb3811 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Nowe zgłoszenia:", "notifications.column_settings.admin.sign_up": "Nowe rejestracje:", "notifications.column_settings.alert": "Powiadomienia na pulpicie", - "notifications.column_settings.beta.category": "Funkcje eksperymentalne", - "notifications.column_settings.beta.grouping": "Powiadomienia grupowe", "notifications.column_settings.favourite": "Ulubione:", "notifications.column_settings.filter_bar.advanced": "Wyświetl wszystkie kategorie", "notifications.column_settings.filter_bar.category": "Szybkie filtrowanie", @@ -789,7 +787,7 @@ "status.edit": "Edytuj", "status.edited": "Ostatnio edytowane {date}", "status.edited_x_times": "Edytowano {count, plural, one {{count} raz} other {{count} razy}}", - "status.embed": "Osadź", + "status.embed": "Kod osadzenia", "status.favourite": "Dodaj do ulubionych", "status.favourites": "{count, plural, one {polubienie} few {polubienia} other {polubień}}", "status.filter": "Filtruj ten wpis", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 9978bf7644..053ae25822 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Novas denúncias:", "notifications.column_settings.admin.sign_up": "Novas inscrições:", "notifications.column_settings.alert": "Notificações no computador", - "notifications.column_settings.beta.category": "Recursos experimentais", - "notifications.column_settings.beta.grouping": "Agrupar notificações", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Exibir todas as categorias", "notifications.column_settings.filter_bar.category": "Barra de filtro rápido", @@ -789,7 +787,7 @@ "status.edit": "Editar", "status.edited": "Última edição em {date}", "status.edited_x_times": "Editado {count, plural, one {{count} hora} other {{count} vezes}}", - "status.embed": "Incorporar", + "status.embed": "Obter código de incorporação", "status.favourite": "Favorita", "status.favourites": "{count, plural, one {favorite} other {favorites}}", "status.filter": "Filtrar esta publicação", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 24f5993112..ed4bb9ba01 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -359,6 +359,8 @@ "hints.profiles.see_more_followers": "Ver mais seguidores no {domain}", "hints.profiles.see_more_follows": "Veja mais perfis seguidos em {domain}", "hints.profiles.see_more_posts": "Ver mais publicações em {domain}", + "hints.threads.replies_may_be_missing": "As respostas de outros servidores podem estar a faltar.", + "hints.threads.see_more": "Veja mais respostas em {domain}", "home.column_settings.show_reblogs": "Mostrar impulsos", "home.column_settings.show_replies": "Mostrar respostas", "home.hide_announcements": "Ocultar comunicações", @@ -366,6 +368,17 @@ "home.pending_critical_update.link": "Ver atualizações", "home.pending_critical_update.title": "Atualização de segurança crítica disponível!", "home.show_announcements": "Exibir comunicações", + "ignore_notifications_modal.disclaimer": "O Mastodon não pode informar utilizadores que ignoraste as notificações deles. Ignorar notificações não irá parar as mensagens serem enviadas.", + "ignore_notifications_modal.filter_instead": "Filtrar em vez disso", + "ignore_notifications_modal.filter_to_act_users": "Ainda poderá aceitar, rejeitar, ou reportar utilizadores", + "ignore_notifications_modal.filter_to_avoid_confusion": "A filtragem ajuda a evitar potenciais equívocos", + "ignore_notifications_modal.filter_to_review_separately": "Pode rever as notificações filtradas separadamente", + "ignore_notifications_modal.ignore": "Ignorar notificações", + "ignore_notifications_modal.limited_accounts_title": "Ignorar notificações de contas moderadas?", + "ignore_notifications_modal.new_accounts_title": "Ignorar notificações de contas novas?", + "ignore_notifications_modal.not_followers_title": "Ignorar notificações de pessoas que não o seguem?", + "ignore_notifications_modal.not_following_title": "Ignorar notificações de pessoas que não segue?", + "ignore_notifications_modal.private_mentions_title": "Ignorar notificações de Menções Privadas não solicitadas?", "interaction_modal.description.favourite": "Com uma conta no Mastodon, pode adicionar assinalar esta publicação como favorita para que o autor saiba que gostou e guardá-la para mais tarde.", "interaction_modal.description.follow": "Com uma conta no Mastodon, pode seguir {name} para receber as suas publicações na sua página inicial.", "interaction_modal.description.reblog": "Com uma conta no Mastodon, pode impulsionar esta publicação para compartilhá-lo com os seus seguidores.", @@ -444,6 +457,7 @@ "lists.subheading": "As tuas listas", "load_pending": "{count, plural, one {# novo item} other {# novos itens}}", "loading_indicator.label": "A carregar…", + "media_gallery.hide": "Esconder", "moved_to_account_banner.text": "A sua conta {disabledAccount} está, no momento, desativada, porque você migrou para {movedToAccount}.", "mute_modal.hide_from_notifications": "Ocultar das notificações", "mute_modal.hide_options": "Ocultar opções", @@ -455,6 +469,7 @@ "mute_modal.you_wont_see_mentions": "Não verá publicações que os mencionem.", "mute_modal.you_wont_see_posts": "Eles podem continuar a ver as suas publicações, mas você não verá as deles.", "navigation_bar.about": "Sobre", + "navigation_bar.administration": "Administração", "navigation_bar.advanced_interface": "Abrir na interface web avançada", "navigation_bar.blocks": "Utilizadores bloqueados", "navigation_bar.bookmarks": "Marcadores", @@ -471,6 +486,7 @@ "navigation_bar.follows_and_followers": "Seguindo e seguidores", "navigation_bar.lists": "Listas", "navigation_bar.logout": "Sair", + "navigation_bar.moderation": "Moderação", "navigation_bar.mutes": "Utilizadores silenciados", "navigation_bar.opened_in_classic_interface": "Por norma, publicações, contas, e outras páginas específicas são abertas na interface web clássica.", "navigation_bar.personal": "Pessoal", @@ -486,9 +502,13 @@ "notification.admin.report_statuses": "{name} denunicou {target} por {category}", "notification.admin.report_statuses_other": "{name} denunciou {target}", "notification.admin.sign_up": "{name} inscreveu-se", + "notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# outro} other {# outros}} inscreveram-se", "notification.favourite": "{name} assinalou a sua publicação como favorita", + "notification.favourite.name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# outros}} assinalou a sua publicação como favorita", "notification.follow": "{name} começou a seguir-te", + "notification.follow.name_and_others": "{name} e {count, plural, one {# outro} other {# outros}} começaram a segui-lo", "notification.follow_request": "{name} pediu para segui-lo", + "notification.follow_request.name_and_others": "{name} e {count, plural, one {# outro} other {# outros}} pediram para segui-lo", "notification.label.mention": "Menção", "notification.label.private_mention": "Menção privada", "notification.label.private_reply": "Resposta privada", @@ -506,6 +526,7 @@ "notification.own_poll": "A sua sondagem terminou", "notification.poll": "Terminou uma sondagem em que votou", "notification.reblog": "{name} reforçou a tua publicação", + "notification.reblog.name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# outros}} reforçaram a sua publicação", "notification.relationships_severance_event": "Perdeu as ligações com {name}", "notification.relationships_severance_event.account_suspension": "Um administrador de {from} suspendeu {target}, o que significa que já não pode receber atualizações dele ou interagir com ele.", "notification.relationships_severance_event.domain_block": "Um administrador de {from} bloqueou {target}, incluindo {followersCount} dos seus seguidores e {followingCount, plural, one {# conta} other {# contas}} que segue.", @@ -514,21 +535,30 @@ "notification.status": "{name} acabou de publicar", "notification.update": "{name} editou uma publicação", "notification_requests.accept": "Aceitar", + "notification_requests.accept_multiple": "{count, plural, one {Aceitar # pedidos…} other {Aceitar # pedidos…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Aceitar pedido} other {Aceitar pedidos}}", + "notification_requests.confirm_accept_multiple.message": "Está prestes a aceitar {count, plural, one {um pedido de notificação} other {# pedidos de notificação}}. Tem a certeza de que pretende continuar?", + "notification_requests.confirm_accept_multiple.title": "Aceitar pedidos de notificação?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Rejeitar pedido} other {Rejeitar pedidos}}", + "notification_requests.confirm_dismiss_multiple.message": "Está prestes a rejeitar {count, plural, one {um pedido de notificação} other {# pedidos de notificação}}. Não será fácil voltar a {count, plural, one {aceder-lhe} other {aceder-lhes}}. Tem a certeza de que pretende continuar?", + "notification_requests.confirm_dismiss_multiple.title": "Rejeitar pedidos de notificação?", "notification_requests.dismiss": "Descartar", + "notification_requests.dismiss_multiple": "{count, plural, one {Rejeitar # pedido…} other {Rejeitar # pedidos…}}", + "notification_requests.edit_selection": "Editar", + "notification_requests.exit_selection": "Concluído", "notification_requests.explainer_for_limited_account": "As notificações desta conta foram filtradas porque a conta foi limitada por um moderador.", "notification_requests.explainer_for_limited_remote_account": "As notificações desta conta foram filtradas porque a conta ou o seu servidor foram limitados por um moderador.", "notification_requests.maximize": "Maximizar", "notification_requests.minimize_banner": "Minimizar o cabeçalho das notificações filtradas", "notification_requests.notifications_from": "Notificações de {name}", "notification_requests.title": "Notificações filtradas", + "notification_requests.view": "Ver notificações", "notifications.clear": "Limpar notificações", "notifications.clear_confirmation": "Queres mesmo limpar todas as notificações?", "notifications.clear_title": "Limpar notificações?", "notifications.column_settings.admin.report": "Novas denúncias:", "notifications.column_settings.admin.sign_up": "Novas inscrições:", "notifications.column_settings.alert": "Notificações no ambiente de trabalho", - "notifications.column_settings.beta.category": "Funcionalidades experimentais", - "notifications.column_settings.beta.grouping": "Agrupar notificações", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias", "notifications.column_settings.filter_bar.category": "Barra de filtros rápidos", @@ -557,6 +587,12 @@ "notifications.permission_denied": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão, solicitada pelo navegador, foi recusada anteriormente", "notifications.permission_denied_alert": "Notificações no ambiente de trabalho não podem ser ativadas, pois a permissão do navegador foi recusada anteriormente", "notifications.permission_required": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão necessária não foi concedida.", + "notifications.policy.accept": "Aceitar", + "notifications.policy.accept_hint": "Mostrar nas notificações", + "notifications.policy.drop": "Ignorar", + "notifications.policy.drop_hint": "Enviar para o vazio, para nunca mais ser visto", + "notifications.policy.filter": "Filtrar", + "notifications.policy.filter_hint": "Enviar para a caixa de notificações filtradas", "notifications.policy.filter_limited_accounts_hint": "Limitado pelos moderadores do servidor", "notifications.policy.filter_limited_accounts_title": "Contas moderadas", "notifications.policy.filter_new_accounts.hint": "Criada nos últimos {days, plural, one {um dia} other {# dias}}", @@ -567,6 +603,7 @@ "notifications.policy.filter_not_following_title": "Pessoas que você não segue", "notifications.policy.filter_private_mentions_hint": "Filtrado, a menos que seja em resposta à sua própria menção ou se você seguir o remetente", "notifications.policy.filter_private_mentions_title": "Menções privadas não solicitadas", + "notifications.policy.title": "Gerir notificações de…", "notifications_permission_banner.enable": "Ativar notificações no ambiente de trabalho", "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, ative as notificações no ambiente de trabalho. Depois da sua ativação, pode controlar precisamente quais tipos de interações geram notificações, através do botão {icon} acima.", "notifications_permission_banner.title": "Nunca perca nada", @@ -741,6 +778,7 @@ "status.bookmark": "Guardar nos marcadores", "status.cancel_reblog_private": "Deixar de reforçar", "status.cannot_reblog": "Não é possível partilhar esta publicação", + "status.continued_thread": "Continuação da conserva", "status.copy": "Copiar hiperligação para a publicação", "status.delete": "Eliminar", "status.detailed_status": "Vista pormenorizada da conversa", @@ -749,7 +787,7 @@ "status.edit": "Editar", "status.edited": "Última edição em {date}", "status.edited_x_times": "Editado {count, plural,one {{count} vez} other {{count} vezes}}", - "status.embed": "Embutir", + "status.embed": "Obter código de incorporação", "status.favourite": "Assinalar como favorito", "status.favourites": "{count, plural, one {favorito} other {favoritos}}", "status.filter": "Filtrar esta publicação", @@ -774,6 +812,7 @@ "status.reblogs.empty": "Ainda ninguém reforçou esta publicação. Quando alguém o fizer, ele irá aparecer aqui.", "status.redraft": "Apagar & reescrever", "status.remove_bookmark": "Retirar dos marcadores", + "status.replied_in_thread": "Responder na conversa", "status.replied_to": "Respondeu a {name}", "status.reply": "Responder", "status.replyAll": "Responder à conversa", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 18380928b3..73b8140de6 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -556,7 +556,6 @@ "status.direct_indicator": "Mențiune privată", "status.edit": "Modifică", "status.edited_x_times": "Modificată {count, plural, one {o dată} few {de {count} ori} other {de {count} de ori}}", - "status.embed": "Înglobează", "status.filter": "Filtrează această postare", "status.history.created": "creată de {name} pe {date}", "status.history.edited": "modificată de {name} pe {date}", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index ab89743467..4a03f2b6e8 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -502,7 +502,6 @@ "notifications.column_settings.admin.report": "Новые жалобы:", "notifications.column_settings.admin.sign_up": "Новые регистрации:", "notifications.column_settings.alert": "Уведомления на рабочем столе", - "notifications.column_settings.beta.category": "Экспериментальные функции", "notifications.column_settings.favourite": "Избранные:", "notifications.column_settings.filter_bar.advanced": "Отображать все категории", "notifications.column_settings.filter_bar.category": "Панель сортировки", @@ -716,7 +715,6 @@ "status.edit": "Изменить", "status.edited": "Дата последнего изменения: {date}", "status.edited_x_times": "{count, plural, one {{count} изменение} many {{count} изменений} other {{count} изменения}}", - "status.embed": "Встроить на свой сайт", "status.favourite": "Избранное", "status.filter": "Фильтровать этот пост", "status.history.created": "{name} создал {date}", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index ac715e718e..85bd9aa9dd 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -503,7 +503,6 @@ "status.detailed_status": "विस्तृतसंभाषणदृश्यम्", "status.edit": "सम्पादय", "status.edited_x_times": "Edited {count, plural, one {{count} वारम्} other {{count} वारम्}}", - "status.embed": "निहितम्", "status.filter": "पत्रमिदं फिल्तरं कुरु", "status.history.created": "{name} असृजत् {date}", "status.history.edited": "{name} समपादयत् {date}", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index 0e055716e1..071643a153 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -421,8 +421,6 @@ "notifications.clear_confirmation": "Seguru chi boles isboidare in manera permanente totu is notìficas tuas?", "notifications.column_settings.admin.report": "Informes noos:", "notifications.column_settings.alert": "Notìficas de iscrivania", - "notifications.column_settings.beta.category": "Funtzionalidades isperimentales", - "notifications.column_settings.beta.grouping": "Notìficas de grupu", "notifications.column_settings.favourite": "Preferidos:", "notifications.column_settings.filter_bar.advanced": "Ammustra totu is categorias", "notifications.column_settings.filter_bar.category": "Barra de filtru lestru", @@ -545,7 +543,6 @@ "status.detailed_status": "Visualizatzione de detàlliu de arresonada", "status.edit": "Modìfica", "status.edited_x_times": "Modificadu {count, plural, one {{count} # borta} other {{count} bortas}}", - "status.embed": "Afissa", "status.favourites": "{count, plural, one {preferidu} other {preferidos}}", "status.load_more": "Càrriga·nde àteros", "status.media_hidden": "Elementos multimediales cuados", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index b1b17b57db..269e29a86f 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -474,7 +474,6 @@ "status.detailed_status": "Detailt conversation view", "status.edit": "Edit", "status.edited_x_times": "Editit {count, plural, one {{count} time} other {{count} times}}", - "status.embed": "Embed", "status.filter": "Filter this post", "status.history.created": "{name} creatit {date}", "status.history.edited": "{name} editit {date}", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index a9288fd104..93ce9dd7e2 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -415,7 +415,6 @@ "status.detailed_status": "විස්තරාත්මක සංවාද දැක්ම", "status.edit": "සංස්කරණය", "status.edited_x_times": "සංශෝධිතයි {count, plural, one {වාර {count}} other {වාර {count}}}", - "status.embed": "කාවැද්දූ", "status.filter": "මෙම ලිපිය පෙරන්න", "status.history.created": "{name} නිර්මාණය {date}", "status.history.edited": "{name} සංස්කරණය {date}", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index f89e8cf5ab..d21dc5e1ab 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -702,7 +702,6 @@ "status.edit": "Upraviť", "status.edited": "Naposledy upravený {date}", "status.edited_x_times": "Upravený {count, plural, other {{count}×}}", - "status.embed": "Vložiť", "status.favourite": "Ohviezdičkované", "status.filter": "Filtrovanie tohto príspevku", "status.history.created": "Vytvorené účtom {name} {date}", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 4e83b15089..bdc1d56062 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -520,8 +520,6 @@ "notifications.column_settings.admin.report": "Nove prijave:", "notifications.column_settings.admin.sign_up": "Novi vpisi:", "notifications.column_settings.alert": "Namizna obvestila", - "notifications.column_settings.beta.category": "Poskusne funkcionalnosti", - "notifications.column_settings.beta.grouping": "Skupine obvestil", "notifications.column_settings.favourite": "Priljubljeni:", "notifications.column_settings.filter_bar.advanced": "Prikaži vse kategorije", "notifications.column_settings.filter_bar.category": "Vrstica za hitro filtriranje", @@ -746,7 +744,6 @@ "status.edit": "Uredi", "status.edited": "Zadnje urejanje {date}", "status.edited_x_times": "Urejeno {count, plural, one {#-krat} two {#-krat} few {#-krat} other {#-krat}}", - "status.embed": "Vdelaj", "status.favourite": "Priljubljen_a", "status.favourites": "{count, plural, one {priljubitev} two {priljubitvi} few {priljubitve} other {priljubitev}}", "status.filter": "Filtriraj to objavo", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 1904c186f7..ea3c6d5c7c 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Raportime të reja:", "notifications.column_settings.admin.sign_up": "Regjistrime të reja:", "notifications.column_settings.alert": "Njoftime desktopi", - "notifications.column_settings.beta.category": "Veçori eksperimentale", - "notifications.column_settings.beta.grouping": "Njoftime grupi", "notifications.column_settings.favourite": "Të parapëlqyer:", "notifications.column_settings.filter_bar.advanced": "Shfaq krejt kategoritë", "notifications.column_settings.filter_bar.category": "Shtyllë filtrimesh të shpejta", @@ -789,7 +787,7 @@ "status.edit": "Përpunojeni", "status.edited": "Përpunuar së fundi më {date}", "status.edited_x_times": "Përpunuar {count, plural, one {{count} herë} other {{count} herë}}", - "status.embed": "Trupëzim", + "status.embed": "Merrni kod trupëzimi", "status.favourite": "I vini shenjë si të parapëlqyer", "status.favourites": "{count, plural, one {i parapëlqyer} other {të parapëlqyer}}", "status.filter": "Filtroje këtë postim", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 02be70f5bf..de30ca280f 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -706,7 +706,6 @@ "status.edit": "Uredi", "status.edited": "Poslednje uređivanje {date}", "status.edited_x_times": "Uređeno {count, plural, one {{count} put} other {{count} puta}}", - "status.embed": "Ugradi", "status.favourite": "Omiljeno", "status.favourites": "{count, plural, one {# omiljeno} few {# omiljena} other {# omiljenih}}", "status.filter": "Filtriraj ovu objavu", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index dfd10579e6..255215a167 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -706,7 +706,6 @@ "status.edit": "Уреди", "status.edited": "Последње уређивање {date}", "status.edited_x_times": "Уређено {count, plural, one {{count} пут} other {{count} пута}}", - "status.embed": "Угради", "status.favourite": "Омиљено", "status.favourites": "{count, plural, one {# омиљено} few {# омиљена} other {# омиљених}}", "status.filter": "Филтрирај ову објаву", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 61cad916ca..4d560a6495 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -554,8 +554,6 @@ "notifications.column_settings.admin.report": "Nya rapporter:", "notifications.column_settings.admin.sign_up": "Nya registreringar:", "notifications.column_settings.alert": "Skrivbordsaviseringar", - "notifications.column_settings.beta.category": "Experimentella funktioner", - "notifications.column_settings.beta.grouping": "Gruppera notifikationer", "notifications.column_settings.favourite": "Favoriter:", "notifications.column_settings.filter_bar.advanced": "Visa alla kategorier", "notifications.column_settings.filter_bar.category": "Snabbfilter", @@ -783,7 +781,7 @@ "status.edit": "Redigera", "status.edited": "Senast ändrad {date}", "status.edited_x_times": "Redigerad {count, plural, one {{count} gång} other {{count} gånger}}", - "status.embed": "Bädda in", + "status.embed": "Hämta kod för inbäddning", "status.favourite": "Favoritmarkera", "status.favourites": "{count, plural, one {favorit} other {favoriter}}", "status.filter": "Filtrera detta inlägg", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 4f209b7e3e..87d6660f05 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -345,7 +345,6 @@ "status.delete": "நீக்கு", "status.detailed_status": "விரிவான உரையாடல் காட்சி", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "கிடத்து", "status.load_more": "அதிகமாய் ஏற்று", "status.media_hidden": "மீடியா மறைக்கப்பட்டது", "status.mention": "குறிப்பிடு @{name}", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index a6dc74b290..40fbd7f7bd 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -245,7 +245,6 @@ "status.delete": "తొలగించు", "status.detailed_status": "వివరణాత్మక సంభాషణ వీక్షణ", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "ఎంబెడ్", "status.load_more": "మరిన్ని లోడ్ చేయి", "status.media_hidden": "మీడియా దాచబడింది", "status.mention": "@{name}ను ప్రస్తావించు", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 81424a9490..9578431ff7 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -457,6 +457,7 @@ "lists.subheading": "รายการของคุณ", "load_pending": "{count, plural, other {# รายการใหม่}}", "loading_indicator.label": "กำลังโหลด…", + "media_gallery.hide": "ซ่อน", "moved_to_account_banner.text": "มีการปิดใช้งานบัญชีของคุณ {disabledAccount} ในปัจจุบันเนื่องจากคุณได้ย้ายไปยัง {movedToAccount}", "mute_modal.hide_from_notifications": "ซ่อนจากการแจ้งเตือน", "mute_modal.hide_options": "ซ่อนตัวเลือก", @@ -558,8 +559,6 @@ "notifications.column_settings.admin.report": "รายงานใหม่:", "notifications.column_settings.admin.sign_up": "การลงทะเบียนใหม่:", "notifications.column_settings.alert": "การแจ้งเตือนบนเดสก์ท็อป", - "notifications.column_settings.beta.category": "คุณลักษณะการทดลอง", - "notifications.column_settings.beta.grouping": "การแจ้งเตือนกลุ่ม", "notifications.column_settings.favourite": "รายการโปรด:", "notifications.column_settings.filter_bar.advanced": "แสดงหมวดหมู่ทั้งหมด", "notifications.column_settings.filter_bar.category": "แถบตัวกรองด่วน", @@ -779,6 +778,7 @@ "status.bookmark": "เพิ่มที่คั่นหน้า", "status.cancel_reblog_private": "เลิกดัน", "status.cannot_reblog": "ไม่สามารถดันโพสต์นี้", + "status.continued_thread": "กระทู้ต่อเนื่อง", "status.copy": "คัดลอกลิงก์ไปยังโพสต์", "status.delete": "ลบ", "status.detailed_status": "มุมมองการสนทนาโดยละเอียด", @@ -787,7 +787,7 @@ "status.edit": "แก้ไข", "status.edited": "แก้ไขล่าสุดเมื่อ {date}", "status.edited_x_times": "แก้ไข {count, plural, other {{count} ครั้ง}}", - "status.embed": "ฝัง", + "status.embed": "รับโค้ดฝังตัว", "status.favourite": "ชื่นชอบ", "status.favourites": "{count, plural, other {รายการโปรด}}", "status.filter": "กรองโพสต์นี้", @@ -812,6 +812,7 @@ "status.reblogs.empty": "ยังไม่มีใครดันโพสต์นี้ เมื่อใครสักคนดัน เขาจะปรากฏที่นี่", "status.redraft": "ลบแล้วร่างใหม่", "status.remove_bookmark": "เอาที่คั่นหน้าออก", + "status.replied_in_thread": "ตอบกลับในกระทู้", "status.replied_to": "ตอบกลับ {name}", "status.reply": "ตอบกลับ", "status.replyAll": "ตอบกลับกระทู้", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 0ca30c57da..6c21026bdb 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -359,7 +359,6 @@ "status.cancel_reblog_private": "o pini e pana", "status.delete": "o weka", "status.edit": "o ante", - "status.embed": "ni o lon insa pi lipu ante", "status.favourite": "o sitelen pona", "status.history.created": "{name} li pali e ni lon {date}", "status.history.edited": "{name} li ante lon {date}", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 6577737bf1..d4d7d3d113 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Yeni bildirimler:", "notifications.column_settings.admin.sign_up": "Yeni kayıtlar:", "notifications.column_settings.alert": "Masaüstü bildirimleri", - "notifications.column_settings.beta.category": "Deneysel özellikler", - "notifications.column_settings.beta.grouping": "Grup bildirimleri", "notifications.column_settings.favourite": "Favorilerin:", "notifications.column_settings.filter_bar.advanced": "Tüm kategorileri görüntüle", "notifications.column_settings.filter_bar.category": "Hızlı filtre çubuğu", @@ -789,7 +787,7 @@ "status.edit": "Düzenle", "status.edited": "Son düzenleme {date}", "status.edited_x_times": "{count, plural, one {{count} kez} other {{count} kez}} düzenlendi", - "status.embed": "Gömülü", + "status.embed": "Gömme kodunu al", "status.favourite": "Favori", "status.favourites": "{count, plural, one {beğeni} other {beğeni}}", "status.filter": "Bu gönderiyi süzgeçle", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index 1439e2ef58..01429f9431 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -410,7 +410,6 @@ "status.direct_indicator": "Хосусый искә алу", "status.edit": "Үзгәртү", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "Веб-биткә кертү", "status.history.created": "{name} ясалды {date}", "status.history.edited": "{name} төзәтте {date}", "status.load_more": "Күбрәк йөкләү", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 638a84b64f..a1d3a872df 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "Нові скарги:", "notifications.column_settings.admin.sign_up": "Нові реєстрації:", "notifications.column_settings.alert": "Сповіщення стільниці", - "notifications.column_settings.beta.category": "Експериментальні функції", - "notifications.column_settings.beta.grouping": "Групові сповіщення", "notifications.column_settings.favourite": "Уподобане:", "notifications.column_settings.filter_bar.advanced": "Показати всі категорії", "notifications.column_settings.filter_bar.category": "Панель швидкого фільтра", @@ -789,7 +787,7 @@ "status.edit": "Редагувати", "status.edited": "Востаннє змінено {date}", "status.edited_x_times": "Відредаговано {count, plural, one {{count} раз} few {{count} рази} many {{counter} разів} other {{counter} разів}}", - "status.embed": "Вбудувати", + "status.embed": "Отримати код вставки", "status.favourite": "Уподобане", "status.favourites": "{count, plural, one {вподобання} few {вподобання} many {вподобань} other {вподобання}}", "status.filter": "Фільтрувати цей допис", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 09f288469d..9fcd00ddc7 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -457,6 +457,7 @@ "lists.subheading": "Danh sách của bạn", "load_pending": "{count, plural, one {# tút mới} other {# tút mới}}", "loading_indicator.label": "Đang tải…", + "media_gallery.hide": "Ẩn", "moved_to_account_banner.text": "Tài khoản {disabledAccount} của bạn hiện không khả dụng vì bạn đã chuyển sang {movedToAccount}.", "mute_modal.hide_from_notifications": "Ẩn thông báo", "mute_modal.hide_options": "Tùy chọn ẩn", @@ -558,8 +559,6 @@ "notifications.column_settings.admin.report": "Báo cáo mới:", "notifications.column_settings.admin.sign_up": "Người mới tham gia:", "notifications.column_settings.alert": "Báo trên máy tính", - "notifications.column_settings.beta.category": "Tính năng thử nghiệm", - "notifications.column_settings.beta.grouping": "Gộp thông báo theo loại", "notifications.column_settings.favourite": "Lượt thích:", "notifications.column_settings.filter_bar.advanced": "Toàn bộ", "notifications.column_settings.filter_bar.category": "Thanh lọc nhanh", @@ -779,6 +778,7 @@ "status.bookmark": "Lưu", "status.cancel_reblog_private": "Hủy đăng lại", "status.cannot_reblog": "Không thể đăng lại tút này", + "status.continued_thread": "Tiếp tục trong chủ đề", "status.copy": "Sao chép URL", "status.delete": "Xóa", "status.detailed_status": "Xem chi tiết thêm", @@ -787,7 +787,7 @@ "status.edit": "Sửa", "status.edited": "Sửa lần cuối {date}", "status.edited_x_times": "Đã sửa {count, plural, other {{count} lần}}", - "status.embed": "Nhúng", + "status.embed": "Lấy mã nhúng", "status.favourite": "Thích", "status.favourites": "{count, plural, other {lượt thích}}", "status.filter": "Lọc tút này", @@ -812,6 +812,7 @@ "status.reblogs.empty": "Tút này chưa có ai đăng lại. Nếu có, nó sẽ hiển thị ở đây.", "status.redraft": "Xóa và viết lại", "status.remove_bookmark": "Bỏ lưu", + "status.replied_in_thread": "Trả lời trong chủ đề", "status.replied_to": "Trả lời {name}", "status.reply": "Trả lời", "status.replyAll": "Trả lời", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 9a6076f23f..6df3cde208 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "新举报:", "notifications.column_settings.admin.sign_up": "新注册:", "notifications.column_settings.alert": "桌面通知", - "notifications.column_settings.beta.category": "实验性功能", - "notifications.column_settings.beta.grouping": "通知分组", "notifications.column_settings.favourite": "喜欢:", "notifications.column_settings.filter_bar.advanced": "显示所有类别", "notifications.column_settings.filter_bar.category": "快速筛选栏", @@ -789,7 +787,7 @@ "status.edit": "编辑", "status.edited": "最近编辑于 {date}", "status.edited_x_times": "共编辑 {count, plural, one {{count} 次} other {{count} 次}}", - "status.embed": "嵌入", + "status.embed": "获取嵌入代码", "status.favourite": "喜欢", "status.favourites": "{count, plural, other {次喜欢}}", "status.filter": "过滤此嘟文", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 2a55e6fc20..6fc1b9d267 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -699,7 +699,6 @@ "status.edit": "編輯", "status.edited": "最後編輯於 {date}", "status.edited_x_times": "Edited {count, plural, one {{count} 次} other {{count} 次}}", - "status.embed": "嵌入", "status.favourite": "最愛", "status.favourites": "{count, plural, one {則最愛} other {則最愛}}", "status.filter": "篩選此帖文", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index cdc6c977b7..d69f54f7c8 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -559,8 +559,6 @@ "notifications.column_settings.admin.report": "新檢舉報告:", "notifications.column_settings.admin.sign_up": "新註冊帳號:", "notifications.column_settings.alert": "桌面通知", - "notifications.column_settings.beta.category": "實驗性功能", - "notifications.column_settings.beta.grouping": "分組通知", "notifications.column_settings.favourite": "最愛:", "notifications.column_settings.filter_bar.advanced": "顯示所有分類", "notifications.column_settings.filter_bar.category": "快速過濾器", @@ -789,7 +787,7 @@ "status.edit": "編輯", "status.edited": "上次編輯於 {date}", "status.edited_x_times": "已編輯 {count, plural, one {{count} 次} other {{count} 次}}", - "status.embed": "內嵌嘟文", + "status.embed": "取得嵌入程式碼", "status.favourite": "最愛", "status.favourites": "{count, plural, other {# 則最愛}}", "status.filter": "過濾此嘟文", diff --git a/app/javascript/mastodon/models/notification_request.ts b/app/javascript/mastodon/models/notification_request.ts new file mode 100644 index 0000000000..bd98d213d4 --- /dev/null +++ b/app/javascript/mastodon/models/notification_request.ts @@ -0,0 +1,19 @@ +import type { ApiNotificationRequestJSON } from 'mastodon/api_types/notifications'; + +export interface NotificationRequest + extends Omit { + account_id: string; + notifications_count: number; +} + +export function createNotificationRequestFromJSON( + requestJSON: ApiNotificationRequestJSON, +): NotificationRequest { + const { account, notifications_count, ...request } = requestJSON; + + return { + account_id: account.id, + notifications_count: +notifications_count, + ...request, + }; +} diff --git a/app/javascript/mastodon/reducers/accounts_map.js b/app/javascript/mastodon/reducers/accounts_map.js index 9053dcc9c0..d1229169cc 100644 --- a/app/javascript/mastodon/reducers/accounts_map.js +++ b/app/javascript/mastodon/reducers/accounts_map.js @@ -4,11 +4,10 @@ import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts'; import { importAccounts } from '../actions/accounts_typed'; import { domain } from '../initial_state'; -export const normalizeForLookup = str => { - str = str.toLowerCase(); - const trailingIndex = str.indexOf(`@${domain.toLowerCase()}`); - return (trailingIndex > 0) ? str.slice(0, trailingIndex) : str; -}; +const pattern = new RegExp(`@${domain}$`, 'gi'); + +export const normalizeForLookup = str => + str.toLowerCase().replace(pattern, ''); const initialState = ImmutableMap(); diff --git a/app/javascript/mastodon/reducers/notification_requests.js b/app/javascript/mastodon/reducers/notification_requests.js deleted file mode 100644 index f73c641965..0000000000 --- a/app/javascript/mastodon/reducers/notification_requests.js +++ /dev/null @@ -1,114 +0,0 @@ -import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; - -import { blockAccountSuccess, muteAccountSuccess } from 'mastodon/actions/accounts'; -import { - NOTIFICATION_REQUESTS_EXPAND_REQUEST, - NOTIFICATION_REQUESTS_EXPAND_SUCCESS, - NOTIFICATION_REQUESTS_EXPAND_FAIL, - NOTIFICATION_REQUESTS_FETCH_REQUEST, - NOTIFICATION_REQUESTS_FETCH_SUCCESS, - NOTIFICATION_REQUESTS_FETCH_FAIL, - NOTIFICATION_REQUEST_FETCH_REQUEST, - NOTIFICATION_REQUEST_FETCH_SUCCESS, - NOTIFICATION_REQUEST_FETCH_FAIL, - NOTIFICATION_REQUEST_ACCEPT_REQUEST, - NOTIFICATION_REQUEST_DISMISS_REQUEST, - NOTIFICATION_REQUESTS_ACCEPT_REQUEST, - NOTIFICATION_REQUESTS_DISMISS_REQUEST, - NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST, - NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS, - NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL, - NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST, - NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS, - NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL, -} from 'mastodon/actions/notifications'; - -import { notificationToMap } from './notifications'; - -const initialState = ImmutableMap({ - items: ImmutableList(), - isLoading: false, - next: null, - current: ImmutableMap({ - isLoading: false, - item: null, - removed: false, - notifications: ImmutableMap({ - items: ImmutableList(), - isLoading: false, - next: null, - }), - }), -}); - -const normalizeRequest = request => fromJS({ - ...request, - account: request.account.id, -}); - -const removeRequest = (state, id) => { - if (state.getIn(['current', 'item', 'id']) === id) { - state = state.setIn(['current', 'removed'], true); - } - - return state.update('items', list => list.filterNot(item => item.get('id') === id)); -}; - -const removeRequestByAccount = (state, account_id) => { - if (state.getIn(['current', 'item', 'account']) === account_id) { - state = state.setIn(['current', 'removed'], true); - } - - return state.update('items', list => list.filterNot(item => item.get('account') === account_id)); -}; - -export const notificationRequestsReducer = (state = initialState, action) => { - switch(action.type) { - case NOTIFICATION_REQUESTS_FETCH_SUCCESS: - return state.withMutations(map => { - map.update('items', list => ImmutableList(action.requests.map(normalizeRequest)).concat(list)); - map.set('isLoading', false); - map.update('next', next => next ?? action.next); - }); - case NOTIFICATION_REQUESTS_EXPAND_SUCCESS: - return state.withMutations(map => { - map.update('items', list => list.concat(ImmutableList(action.requests.map(normalizeRequest)))); - map.set('isLoading', false); - map.set('next', action.next); - }); - case NOTIFICATION_REQUESTS_EXPAND_REQUEST: - case NOTIFICATION_REQUESTS_FETCH_REQUEST: - return state.set('isLoading', true); - case NOTIFICATION_REQUESTS_EXPAND_FAIL: - case NOTIFICATION_REQUESTS_FETCH_FAIL: - return state.set('isLoading', false); - case NOTIFICATION_REQUEST_ACCEPT_REQUEST: - case NOTIFICATION_REQUEST_DISMISS_REQUEST: - return removeRequest(state, action.id); - case NOTIFICATION_REQUESTS_ACCEPT_REQUEST: - case NOTIFICATION_REQUESTS_DISMISS_REQUEST: - return action.ids.reduce((state, id) => removeRequest(state, id), state); - case blockAccountSuccess.type: - return removeRequestByAccount(state, action.payload.relationship.id); - case muteAccountSuccess.type: - return action.payload.relationship.muting_notifications ? removeRequestByAccount(state, action.payload.relationship.id) : state; - case NOTIFICATION_REQUEST_FETCH_REQUEST: - return state.set('current', initialState.get('current').set('isLoading', true)); - case NOTIFICATION_REQUEST_FETCH_SUCCESS: - return state.update('current', map => map.set('isLoading', false).set('item', normalizeRequest(action.request))); - case NOTIFICATION_REQUEST_FETCH_FAIL: - return state.update('current', map => map.set('isLoading', false)); - case NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST: - case NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST: - return state.setIn(['current', 'notifications', 'isLoading'], true); - case NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS: - return state.updateIn(['current', 'notifications'], map => map.set('isLoading', false).update('items', list => ImmutableList(action.notifications.map(notificationToMap)).concat(list)).update('next', next => next ?? action.next)); - case NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS: - return state.updateIn(['current', 'notifications'], map => map.set('isLoading', false).update('items', list => list.concat(ImmutableList(action.notifications.map(notificationToMap)))).set('next', action.next)); - case NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL: - case NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL: - return state.setIn(['current', 'notifications', 'isLoading'], false); - default: - return state; - } -}; diff --git a/app/javascript/mastodon/reducers/notification_requests.ts b/app/javascript/mastodon/reducers/notification_requests.ts new file mode 100644 index 0000000000..1ca92d9990 --- /dev/null +++ b/app/javascript/mastodon/reducers/notification_requests.ts @@ -0,0 +1,182 @@ +import { createReducer, isAnyOf } from '@reduxjs/toolkit'; + +import { + blockAccountSuccess, + muteAccountSuccess, +} from 'mastodon/actions/accounts'; +import { + fetchNotificationRequests, + expandNotificationRequests, + fetchNotificationRequest, + fetchNotificationsForRequest, + expandNotificationsForRequest, + acceptNotificationRequest, + dismissNotificationRequest, + acceptNotificationRequests, + dismissNotificationRequests, +} from 'mastodon/actions/notification_requests'; +import type { NotificationRequest } from 'mastodon/models/notification_request'; +import { createNotificationRequestFromJSON } from 'mastodon/models/notification_request'; + +import { notificationToMap } from './notifications'; + +interface NotificationsListState { + items: unknown[]; // TODO + isLoading: boolean; + next: string | null; +} + +interface CurrentNotificationRequestState { + item: NotificationRequest | null; + isLoading: boolean; + removed: boolean; + notifications: NotificationsListState; +} + +interface NotificationRequestsState { + items: NotificationRequest[]; + isLoading: boolean; + next: string | null; + current: CurrentNotificationRequestState; +} + +const initialState: NotificationRequestsState = { + items: [], + isLoading: false, + next: null, + current: { + item: null, + isLoading: false, + removed: false, + notifications: { + isLoading: false, + items: [], + next: null, + }, + }, +}; + +const removeRequest = (state: NotificationRequestsState, id: string) => { + if (state.current.item?.id === id) { + state.current.removed = true; + } + + state.items = state.items.filter((item) => item.id !== id); +}; + +const removeRequestByAccount = ( + state: NotificationRequestsState, + account_id: string, +) => { + if (state.current.item?.account_id === account_id) { + state.current.removed = true; + } + + state.items = state.items.filter((item) => item.account_id !== account_id); +}; + +export const notificationRequestsReducer = + createReducer(initialState, (builder) => { + builder + .addCase(fetchNotificationRequests.fulfilled, (state, action) => { + state.items = action.payload.requests + .map(createNotificationRequestFromJSON) + .concat(state.items); + state.isLoading = false; + state.next ??= action.payload.next ?? null; + }) + .addCase(expandNotificationRequests.fulfilled, (state, action) => { + state.items = state.items.concat( + action.payload.requests.map(createNotificationRequestFromJSON), + ); + state.isLoading = false; + state.next = action.payload.next ?? null; + }) + .addCase(blockAccountSuccess, (state, action) => { + removeRequestByAccount(state, action.payload.relationship.id); + }) + .addCase(muteAccountSuccess, (state, action) => { + if (action.payload.relationship.muting_notifications) + removeRequestByAccount(state, action.payload.relationship.id); + }) + .addCase(fetchNotificationRequest.pending, (state) => { + state.current = { ...initialState.current, isLoading: true }; + }) + .addCase(fetchNotificationRequest.rejected, (state) => { + state.current.isLoading = false; + }) + .addCase(fetchNotificationRequest.fulfilled, (state, action) => { + state.current.isLoading = false; + state.current.item = createNotificationRequestFromJSON(action.payload); + }) + .addCase(fetchNotificationsForRequest.fulfilled, (state, action) => { + state.current.notifications.isLoading = false; + state.current.notifications.items.unshift( + ...action.payload.notifications.map(notificationToMap), + ); + state.current.notifications.next ??= action.payload.next ?? null; + }) + .addCase(expandNotificationsForRequest.fulfilled, (state, action) => { + state.current.notifications.isLoading = false; + state.current.notifications.items.push( + ...action.payload.notifications.map(notificationToMap), + ); + state.current.notifications.next = action.payload.next ?? null; + }) + .addMatcher( + isAnyOf( + fetchNotificationRequests.pending, + expandNotificationRequests.pending, + ), + (state) => { + state.isLoading = true; + }, + ) + .addMatcher( + isAnyOf( + fetchNotificationRequests.rejected, + expandNotificationRequests.rejected, + ), + (state) => { + state.isLoading = false; + }, + ) + .addMatcher( + isAnyOf( + acceptNotificationRequest.pending, + dismissNotificationRequest.pending, + ), + (state, action) => { + removeRequest(state, action.meta.arg.id); + }, + ) + .addMatcher( + isAnyOf( + acceptNotificationRequests.pending, + dismissNotificationRequests.pending, + ), + (state, action) => { + action.meta.arg.ids.forEach((id) => { + removeRequest(state, id); + }); + }, + ) + .addMatcher( + isAnyOf( + fetchNotificationsForRequest.pending, + expandNotificationsForRequest.pending, + ), + (state) => { + state.current.notifications.isLoading = true; + }, + ) + .addMatcher( + isAnyOf( + fetchNotificationsForRequest.rejected, + expandNotificationsForRequest.rejected, + ), + (state) => { + state.current.notifications.isLoading = false; + }, + ); + }); diff --git a/app/javascript/mastodon/selectors/settings.ts b/app/javascript/mastodon/selectors/settings.ts index 22e7c13b93..e722ad0911 100644 --- a/app/javascript/mastodon/selectors/settings.ts +++ b/app/javascript/mastodon/selectors/settings.ts @@ -1,18 +1,27 @@ -import { forceGroupedNotifications } from 'mastodon/initial_state'; +import { createSelector } from '@reduxjs/toolkit'; + import type { RootState } from 'mastodon/store'; /* eslint-disable @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ // state.settings is not yet typed, so we disable some ESLint checks for those selectors -export const selectSettingsNotificationsShows = (state: RootState) => - state.settings.getIn(['notifications', 'shows']).toJS() as Record< - string, - boolean - >; +export const selectSettingsNotificationsShows = createSelector( + [ + (state) => + state.settings.getIn(['notifications', 'shows']) as Immutable.Map< + string, + boolean + >, + ], + (shows) => shows.toJS() as Record, +); -export const selectSettingsNotificationsExcludedTypes = (state: RootState) => - Object.entries(selectSettingsNotificationsShows(state)) - .filter(([_type, enabled]) => !enabled) - .map(([type, _enabled]) => type); +export const selectSettingsNotificationsExcludedTypes = createSelector( + [selectSettingsNotificationsShows], + (shows) => + Object.entries(shows) + .filter(([_type, enabled]) => !enabled) + .map(([type, _enabled]) => type), +); export const selectSettingsNotificationsQuickFilterShow = (state: RootState) => state.settings.getIn(['notifications', 'quickFilter', 'show']) as boolean; @@ -26,10 +35,6 @@ export const selectSettingsNotificationsQuickFilterAdvanced = ( ) => state.settings.getIn(['notifications', 'quickFilter', 'advanced']) as boolean; -export const selectUseGroupedNotifications = (state: RootState) => - forceGroupedNotifications || - (state.settings.getIn(['notifications', 'groupingBeta']) as boolean); - export const selectSettingsNotificationsShowUnread = (state: RootState) => state.settings.getIn(['notifications', 'showUnread']) as boolean; diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts index 544d619682..9fcc90c61b 100644 --- a/app/javascript/mastodon/store/typed_functions.ts +++ b/app/javascript/mastodon/store/typed_functions.ts @@ -33,8 +33,12 @@ interface AppThunkConfig { } type AppThunkApi = Pick, 'getState' | 'dispatch'>; -interface AppThunkOptions { +interface AppThunkOptions { useLoadingBar?: boolean; + condition?: ( + arg: Arg, + { getState }: { getState: AppThunkApi['getState'] }, + ) => boolean; } const createBaseAsyncThunk = createAsyncThunk.withTypes(); @@ -42,7 +46,7 @@ const createBaseAsyncThunk = createAsyncThunk.withTypes(); export function createThunk( name: string, creator: (arg: Arg, api: AppThunkApi) => Returned | Promise, - options: AppThunkOptions = {}, + options: AppThunkOptions = {}, ) { return createBaseAsyncThunk( name, @@ -70,6 +74,7 @@ export function createThunk( if (options.useLoadingBar) return { useLoadingBar: true }; return {}; }, + condition: options.condition, }, ); } @@ -96,7 +101,7 @@ type ArgsType = Record | undefined; export function createDataLoadingThunk( name: string, loadData: (args: Args) => Promise, - thunkOptions?: AppThunkOptions, + thunkOptions?: AppThunkOptions, ): ReturnType>; // Overload when the `onData` method returns discardLoadDataInPayload, then the payload is empty @@ -104,17 +109,19 @@ export function createDataLoadingThunk( name: string, loadData: LoadData, onDataOrThunkOptions?: - | AppThunkOptions + | AppThunkOptions | OnData, - thunkOptions?: AppThunkOptions, + thunkOptions?: AppThunkOptions, ): ReturnType>; // Overload when the `onData` method returns nothing, then the mayload is the `onData` result export function createDataLoadingThunk( name: string, loadData: LoadData, - onDataOrThunkOptions?: AppThunkOptions | OnData, - thunkOptions?: AppThunkOptions, + onDataOrThunkOptions?: + | AppThunkOptions + | OnData, + thunkOptions?: AppThunkOptions, ): ReturnType>; // Overload when there is an `onData` method returning something @@ -126,9 +133,9 @@ export function createDataLoadingThunk< name: string, loadData: LoadData, onDataOrThunkOptions?: - | AppThunkOptions + | AppThunkOptions | OnData, - thunkOptions?: AppThunkOptions, + thunkOptions?: AppThunkOptions, ): ReturnType>; /** @@ -154,6 +161,7 @@ export function createDataLoadingThunk< * @param maybeThunkOptions * Additional Mastodon specific options for the thunk. Currently supports: * - `useLoadingBar` to display a loading bar while this action is pending. Defaults to true. + * - `condition` is passed to `createAsyncThunk` (https://redux-toolkit.js.org/api/createAsyncThunk#canceling-before-execution) * @returns The created thunk */ export function createDataLoadingThunk< @@ -164,12 +172,12 @@ export function createDataLoadingThunk< name: string, loadData: LoadData, onDataOrThunkOptions?: - | AppThunkOptions + | AppThunkOptions | OnData, - maybeThunkOptions?: AppThunkOptions, + maybeThunkOptions?: AppThunkOptions, ) { let onData: OnData | undefined; - let thunkOptions: AppThunkOptions | undefined; + let thunkOptions: AppThunkOptions | undefined; if (typeof onDataOrThunkOptions === 'function') onData = onDataOrThunkOptions; else if (typeof onDataOrThunkOptions === 'object') @@ -203,6 +211,9 @@ export function createDataLoadingThunk< return undefined as Returned; else return result; }, - { useLoadingBar: thunkOptions?.useLoadingBar ?? true }, + { + useLoadingBar: thunkOptions?.useLoadingBar ?? true, + condition: thunkOptions?.condition, + }, ); } diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index e59f2257f4..e56d03bb50 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4029,7 +4029,7 @@ $ui-header-logo-wordmark-width: 99px; } &__wrapper { - background: $white; + background: $ui-base-color; border: 1px solid var(--background-border-color); margin-bottom: 10px; border-radius: 4px; @@ -10667,6 +10667,7 @@ noscript { scroll-padding: 16px; scroll-behavior: smooth; overflow-x: scroll; + scrollbar-width: none; &__card { background: var(--background-color); diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss index 0ef996aaf3..bdfeb01c25 100644 --- a/app/javascript/styles/mastodon/variables.scss +++ b/app/javascript/styles/mastodon/variables.scss @@ -92,7 +92,7 @@ $media-modal-media-max-width: 100%; // put margins on top and bottom of image to avoid the screen covered by image. $media-modal-media-max-height: 80%; -$no-gap-breakpoint: 1175px; +$no-gap-breakpoint: 1207px; $mobile-breakpoint: 630px; $font-sans-serif: 'mastodon-font-sans-serif' !default; diff --git a/app/models/account.rb b/app/models/account.rb index b504b300cf..a7284c86bf 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -287,6 +287,10 @@ class Account < ApplicationRecord suspended_at.present? && !instance_actor? end + def suspended_locally? + suspended? && suspension_origin_local? + end + def suspended_permanently? suspended? && deletion_request.nil? end diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb index dc22e32942..7a01e250e2 100644 --- a/app/models/account_migration.rb +++ b/app/models/account_migration.rb @@ -31,10 +31,14 @@ class AccountMigration < ApplicationRecord validate :validate_migration_cooldown validate :validate_target_account - scope :within_cooldown, ->(now = Time.now.utc) { where(arel_table[:created_at].gteq(now - COOLDOWN_PERIOD)) } + scope :within_cooldown, -> { where(created_at: cooldown_duration_ago..) } attr_accessor :current_password, :current_username + def self.cooldown_duration_ago + Time.current - COOLDOWN_PERIOD + end + def save_with_challenge(current_user) if current_user.encrypted_password.present? errors.add(:current_password, :invalid) unless current_user.valid_password?(current_password) diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb index 4be58ba853..7c66b6e646 100644 --- a/app/models/admin/account_action.rb +++ b/app/models/admin/account_action.rb @@ -74,7 +74,7 @@ class Admin::AccountAction end def disabled_types_for_account(account) - if account.suspended? + if account.suspended_locally? %w(silence suspend) elsif account.silenced? %w(silence) diff --git a/app/models/concerns/account/attribution_domains.rb b/app/models/concerns/account/attribution_domains.rb index 37a498a150..163c2291fe 100644 --- a/app/models/concerns/account/attribution_domains.rb +++ b/app/models/concerns/account/attribution_domains.rb @@ -13,7 +13,11 @@ module Account::AttributionDomains def attribution_domains_as_text=(str) self[:attribution_domains] = str.split.filter_map do |line| - line.strip.delete_prefix('*.') + line + .strip + .delete_prefix('http://') + .delete_prefix('https://') + .delete_prefix('*.') end end diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb index 7ca89e7dc1..4898459660 100644 --- a/app/models/custom_emoji.rb +++ b/app/models/custom_emoji.rb @@ -30,6 +30,7 @@ class CustomEmoji < ApplicationRecord include Attachmentable LIMIT = 512.kilobytes + MINIMUM_SHORTCODE_SIZE = 2 SHORTCODE_RE_FRAGMENT = '[a-zA-Z0-9_]{2,}' @@ -47,7 +48,7 @@ class CustomEmoji < ApplicationRecord normalizes :domain, with: ->(domain) { domain.downcase } validates_attachment :image, content_type: { content_type: IMAGE_MIME_TYPES }, presence: true, size: { less_than: LIMIT } - validates :shortcode, uniqueness: { scope: :domain }, format: { with: SHORTCODE_ONLY_RE }, length: { minimum: 2 } + validates :shortcode, uniqueness: { scope: :domain }, format: { with: SHORTCODE_ONLY_RE }, length: { minimum: MINIMUM_SHORTCODE_SIZE } scope :local, -> { where(domain: nil) } scope :remote, -> { where.not(domain: nil) } diff --git a/app/models/list_account.rb b/app/models/list_account.rb index e7016f2714..2ff8605717 100644 --- a/app/models/list_account.rb +++ b/app/models/list_account.rb @@ -20,13 +20,11 @@ class ListAccount < ApplicationRecord validates :account_id, uniqueness: { scope: :list_id } validate :validate_relationship - before_validation :set_follow + before_validation :set_follow, unless: :list_owner_account_is_account? private def set_follow - return if list.account_id == account.id - self.follow = Follow.find_by!(account_id: list.account_id, target_account_id: account.id) rescue ActiveRecord::RecordNotFound self.follow_request = FollowRequest.find_by!(account_id: list.account_id, target_account_id: account.id) @@ -39,4 +37,8 @@ class ListAccount < ApplicationRecord errors.add(:follow, 'mismatched accounts') if follow_id.present? && follow.target_account_id != account_id errors.add(:follow_request, 'mismatched accounts') if follow_request_id.present? && follow_request.target_account_id != account_id end + + def list_owner_account_is_account? + list.account_id == account_id + end end diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb index b3a3f5f03d..82b25d4649 100644 --- a/app/models/preview_card.rb +++ b/app/models/preview_card.rb @@ -39,7 +39,7 @@ class PreviewCard < ApplicationRecord include Attachmentable IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze - LIMIT = 2.megabytes + LIMIT = Rails.configuration.x.use_vips ? 8.megabytes : 2.megabytes BLURHASH_OPTIONS = { x_comp: 4, diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index c96e6155b1..62a7d5660b 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -147,7 +147,6 @@ class InitialStateSerializer < ActiveModel::Serializer trends_as_landing_page: Setting.trends_as_landing_page, trends_enabled: Setting.trends, version: instance_presenter.version, - force_grouped_notifications: ENV['FORCE_GROUPED_NOTIFICATIONS'] == 'true', } end diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index e51bef2c61..81d393ff57 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -133,10 +133,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer end def api_versions - { - mastodon: 1, - kmyblue: KMYBLUE_API_VERSION, - } + Mastodon::Version.api_versions end private diff --git a/app/views/admin/account_actions/new.html.haml b/app/views/admin/account_actions/new.html.haml index 5b98582d8c..c4311eba96 100644 --- a/app/views/admin/account_actions/new.html.haml +++ b/app/views/admin/account_actions/new.html.haml @@ -1,7 +1,7 @@ - content_for :page_title do = t('admin.account_actions.title', acct: @account.pretty_acct) -- if @account.suspended? +- if @account.suspended_locally? .flash-message.alert = t('admin.account_actions.already_suspended') - elsif @account.silenced? diff --git a/app/views/admin/reports/_actions.html.haml b/app/views/admin/reports/_actions.html.haml index ea0091c201..7614b4a9ea 100644 --- a/app/views/admin/reports/_actions.html.haml +++ b/app/views/admin/reports/_actions.html.haml @@ -32,7 +32,7 @@ = form.button t('admin.accounts.silence'), name: :silence, class: 'button button--destructive', - disabled: report.target_account.silenced? || report.target_account.suspended?, + disabled: report.target_account.silenced? || report.target_account.suspended_locally?, title: report.target_account.silenced? ? t('admin.account_actions.already_silenced') : '' .report-actions__item__description = t('admin.reports.actions.silence_description_html') @@ -41,8 +41,8 @@ = form.button t('admin.accounts.suspend'), name: :suspend, class: 'button button--destructive', - disabled: report.target_account.suspended?, - title: report.target_account.suspended? ? t('admin.account_actions.already_suspended') : '' + disabled: report.target_account.suspended_locally?, + title: report.target_account.suspended_locally? ? t('admin.account_actions.already_suspended') : '' .report-actions__item__description = t('admin.reports.actions.suspend_description_html') .report-actions__item diff --git a/config/initializers/regexp.rb b/config/initializers/regexp.rb new file mode 100644 index 0000000000..a820d2b5d3 --- /dev/null +++ b/config/initializers/regexp.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +# 0.5s is a fairly high timeout, but that should account for slow servers under load +Regexp.timeout = 0.5 if Regexp.respond_to?(:timeout=) diff --git a/config/locales/activerecord.es-MX.yml b/config/locales/activerecord.es-MX.yml index 882c40ae8d..4d2cba3a27 100644 --- a/config/locales/activerecord.es-MX.yml +++ b/config/locales/activerecord.es-MX.yml @@ -15,6 +15,12 @@ es-MX: user/invite_request: text: Motivo errors: + attributes: + domain: + invalid: no es un nombre de dominio válido + messages: + invalid_domain_on_line: "%{value} no es un nombre de dominio válido" + too_many_lines: excede el límite de %{limit} líneas models: account: attributes: diff --git a/config/locales/activerecord.es.yml b/config/locales/activerecord.es.yml index 569b783103..16e2c66cbe 100644 --- a/config/locales/activerecord.es.yml +++ b/config/locales/activerecord.es.yml @@ -15,6 +15,12 @@ es: user/invite_request: text: Razón errors: + attributes: + domain: + invalid: no es un nombre de dominio válido + messages: + invalid_domain_on_line: "%{value} no es un nombre de dominio válido" + too_many_lines: excede el límite de %{limit} líneas models: account: attributes: diff --git a/config/locales/activerecord.et.yml b/config/locales/activerecord.et.yml index 8cabf0e0fe..7af2c362db 100644 --- a/config/locales/activerecord.et.yml +++ b/config/locales/activerecord.et.yml @@ -15,6 +15,12 @@ et: user/invite_request: text: Põhjus errors: + attributes: + domain: + invalid: pole kehtiv domeeninimi + messages: + invalid_domain_on_line: "%{value} ei ole kehtiv domeeninimi" + too_many_lines: on üle limiidi %{limit} rida models: account: attributes: diff --git a/config/locales/activerecord.fr-CA.yml b/config/locales/activerecord.fr-CA.yml index 1a83a0e9e2..8deeeee015 100644 --- a/config/locales/activerecord.fr-CA.yml +++ b/config/locales/activerecord.fr-CA.yml @@ -15,6 +15,12 @@ fr-CA: user/invite_request: text: Raison errors: + attributes: + domain: + invalid: n'est pas un nom de domaine valide + messages: + invalid_domain_on_line: "%{value} n'est pas un nom de domaine valide" + too_many_lines: dépasse la limite de %{limit} lignes models: account: attributes: diff --git a/config/locales/activerecord.fr.yml b/config/locales/activerecord.fr.yml index 24bb39502b..2f74b16d53 100644 --- a/config/locales/activerecord.fr.yml +++ b/config/locales/activerecord.fr.yml @@ -15,6 +15,12 @@ fr: user/invite_request: text: Motif errors: + attributes: + domain: + invalid: n'est pas un nom de domaine valide + messages: + invalid_domain_on_line: "%{value} n'est pas un nom de domaine valide" + too_many_lines: dépasse la limite de %{limit} lignes models: account: attributes: diff --git a/config/locales/activerecord.ga.yml b/config/locales/activerecord.ga.yml index 1b61edb2e2..4f83bc40aa 100644 --- a/config/locales/activerecord.ga.yml +++ b/config/locales/activerecord.ga.yml @@ -15,6 +15,12 @@ ga: user/invite_request: text: Fáth errors: + attributes: + domain: + invalid: nach ainm fearainn bailí é + messages: + invalid_domain_on_line: Ní ainm fearainn bailí é %{value} + too_many_lines: thar an teorainn de %{limit} línte models: account: attributes: diff --git a/config/locales/activerecord.gd.yml b/config/locales/activerecord.gd.yml index 895f035c03..26848e2584 100644 --- a/config/locales/activerecord.gd.yml +++ b/config/locales/activerecord.gd.yml @@ -15,6 +15,12 @@ gd: user/invite_request: text: Adhbhar errors: + attributes: + domain: + invalid: "– chan eil seo ’na ainm àrainne dligheach" + messages: + invalid_domain_on_line: Chan eil %{value} ’na ainm àrainne dligheach + too_many_lines: "– tha seo thar crìoch de %{limit} nan loidhnichean" models: account: attributes: diff --git a/config/locales/activerecord.lv.yml b/config/locales/activerecord.lv.yml index 5e41f4630e..b7e2db65e8 100644 --- a/config/locales/activerecord.lv.yml +++ b/config/locales/activerecord.lv.yml @@ -15,6 +15,12 @@ lv: user/invite_request: text: Iemesls errors: + attributes: + domain: + invalid: nav derīgs domēna nosaukums + messages: + invalid_domain_on_line: "%{value} nav derīgs domēna nosaukums" + too_many_lines: pārsniedz %{limit} līniju ierobežojumu models: account: attributes: diff --git a/config/locales/activerecord.ro.yml b/config/locales/activerecord.ro.yml index 83c90eda29..1adec0b149 100644 --- a/config/locales/activerecord.ro.yml +++ b/config/locales/activerecord.ro.yml @@ -11,15 +11,21 @@ ro: locale: Localizare password: Parolă user/account: - username: Nume utilizator + username: Nume de utilizator user/invite_request: text: Motiv errors: + attributes: + domain: + invalid: nu este un nume de domeniu valid + messages: + invalid_domain_on_line: "%{value} nu este un nume de domeniu valid" + too_many_lines: este peste limita de %{limit} linii models: account: attributes: username: - invalid: doar litere, numere și sublinieri + invalid: trebuie să conțină numai litere, cifre și bară jos (_) reserved: este rezervat admin/webhook: attributes: @@ -56,4 +62,4 @@ ro: webhook: attributes: events: - invalid_permissions: nu poate include evenimente la care nu aveți drepturi + invalid_permissions: nu poate include evenimente la care nu aveți dreptul diff --git a/config/locales/activerecord.th.yml b/config/locales/activerecord.th.yml index 3b4b57a236..e1021b8afa 100644 --- a/config/locales/activerecord.th.yml +++ b/config/locales/activerecord.th.yml @@ -15,6 +15,12 @@ th: user/invite_request: text: เหตุผล errors: + attributes: + domain: + invalid: ไม่ใช่ชื่อโดเมนที่ถูกต้อง + messages: + invalid_domain_on_line: "%{value} ไม่ใช่ชื่อโดเมนที่ถูกต้อง" + too_many_lines: เกินขีดจำกัด %{limit} บรรทัด models: account: attributes: diff --git a/config/locales/activerecord.vi.yml b/config/locales/activerecord.vi.yml index 1b4ad0a4d2..b48510c2e2 100644 --- a/config/locales/activerecord.vi.yml +++ b/config/locales/activerecord.vi.yml @@ -15,6 +15,12 @@ vi: user/invite_request: text: Lý do errors: + attributes: + domain: + invalid: không phải là một tên miền hợp lệ + messages: + invalid_domain_on_line: "%{value} không phải là một tên miền hợp lệ" + too_many_lines: vượt quá giới hạn %{limit} dòng models: account: attributes: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 480feeba2d..7512e03fd5 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -53,6 +53,7 @@ ar: title: تعديل عنوان البريد الإلكتروني الخاص بـ %{username} change_role: changed_msg: تم تغيير بنجاح! + edit_roles: إدارة أدوار المستخدمين label: تغيير الدور no_role: بلا دور title: تغيير دور %{username} @@ -1164,6 +1165,11 @@ ar: view_strikes: عرض العقوبات السابقة المُطَبَّقة ضد حسابك too_fast: تم إرسال النموذج بسرعة كبيرة، حاول مرة أخرى. use_security_key: استخدام مفتاح الأمان + author_attribution: + example_title: عينة نص + more_from_html: المزيد من %{name} + s_blog: مدونة %{name} + title: إسناد المؤلف challenge: confirm: واصل hint_html: "توصية: لن نطلب منك ثانية كلمتك السرية في غضون الساعة اللاحقة." @@ -1971,6 +1977,7 @@ ar: instructions_html: قم بنسخ ولصق التعليمة البرمجية أدناه في شفرة HTML لموقعك الخاص على الويب. ثم أضف عنوان موقع الويب الخاص بك إلى أحد الحقول الإضافية في ملفك التعريفي عبر لسان "تعديل الملف التعريفي" ثم احفظ التغييرات. verification: التحقق verified_links: روابطك التي تم التحقق منها + website_verification: التحقق من موقع الويب webauthn_credentials: add: إضافة مفتاح أمان جديد create: diff --git a/config/locales/devise.lv.yml b/config/locales/devise.lv.yml index 94b4774b60..4470c8109e 100644 --- a/config/locales/devise.lv.yml +++ b/config/locales/devise.lv.yml @@ -14,9 +14,9 @@ lv: not_found_in_database: Nederīga %{authentication_keys} vai parole. omniauth_user_creation_failure: Kļūda šīs identitātes konta izveidošanā. pending: Tavs konts joprojām tiek pārskatīts. - timeout: Tava sesija ir beigusies. Lūdzu, pieraksties vēlreiz, lai turpinātu. - unauthenticated: Lai turpinātu, tev ir jāpierakstās vai jāreģistrējas. - unconfirmed: Lai turpinātu, tev ir jāapstiprina savu e-pasta adresi. + timeout: Sesijair beigusies. Lūgums vēlreiz pieteikties, lai turpinātu. + unauthenticated: Lai turpinātu, jāpiesakās vai jāreģistrējas. + unconfirmed: Lai turpinātu, jāapliecina sava e-pasta adrese. mailer: confirmation_instructions: action: Apstiprini savu e-pasta adresi @@ -108,7 +108,7 @@ lv: unlocks: send_instructions: Pēc dažām minūtēm tu saņemsi e-pastu ar norādījumiem, kā atbloķēt savu kontu. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. send_paranoid_instructions: Ja tavs konts eksistē, dažu minūšu laikā tu saņemsi e-pastu ar norādījumiem, kā to atbloķēt. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. - unlocked: Tavs konts ir veiksmīgi atbloķēts. Lūdzu, pieraksties, lai turpinātu. + unlocked: Konts tika veiksmīgi atbloķēts. Lūgums pieteikties, lai turpinātu. errors: messages: already_confirmed: jau tika apstiprināts, lūdzu, mēģini pierakstīties diff --git a/config/locales/devise.ro.yml b/config/locales/devise.ro.yml index 40cb6a7581..f570f77e1d 100644 --- a/config/locales/devise.ro.yml +++ b/config/locales/devise.ro.yml @@ -2,58 +2,58 @@ ro: devise: confirmations: - confirmed: Adresa ta de e-mail a fost confirmată cu succes. - send_instructions: Vei primi un e-mail cu instrucțiuni despre cum să confirmi adresa ta de e-mail în câteva minute. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. - send_paranoid_instructions: Dacă adresa ta de e-mail există în baza noastră de date, în câteva minute vei primi un e-mail cu instrucțiuni pentru confirmarea adresei tale de e-mail. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. + confirmed: Adresa dvs. de e-mail a fost confirmată cu succes. + send_instructions: Veți primi un e-mail în câteva minute cu instrucțiuni despre cum să vă confirmați adresa de e-mail. Vă rugăm să verificați dosarul spam dacă nu ați primit acest e-mail. + send_paranoid_instructions: Dacă adresa dvs. de e-mail există în baza noastră de date, veți primi în câteva minute un e-mail cu instrucțiuni pentru confirmarea adresei de e-mail. Vă rugăm să verificați dosarul spam dacă nu ați primit acest e-mail. failure: - already_authenticated: Ești deja conectat. - inactive: Contul tău nu este încă activat. + already_authenticated: Sunteți deja conectat. + inactive: Contul dvs. nu este încă activat. invalid: "%{authentication_keys} sau parolă greșită." - last_attempt: Mai ai încă o încercare înainte ca contul tău să fie blocat. - locked: Contul tău este blocat. + last_attempt: Mai aveți o încercare înainte ca contul dvs. să fie blocat. + locked: Contul dvs. este blocat. not_found_in_database: "%{authentication_keys} sau parolă greșită." omniauth_user_creation_failure: Eroare la crearea unui cont pentru această identitate. - pending: Contul tău este încă în curs de revizuire. - timeout: Sesiunea ta a expirat. Te rugăm să te conectezi din nou pentru a continua. - unauthenticated: Trebuie să te conectezi sau să te înregistrezi înainte de a continua. - unconfirmed: Trebuie să confirmi adresa ta de e-mail înainte de a continua. + pending: Contul dvs. este încă în curs de revizuire. + timeout: Sesiunea dvs. a expirat. Vă rugăm să vă conectați din nou pentru a continua. + unauthenticated: Trebuie să vă conectați sau să vă înregistrați înainte de a continua. + unconfirmed: Trebuie să vă confirmați adresa de e-mail înainte de a continua. mailer: confirmation_instructions: - action: Verifică adresa de e-mail + action: Verificare adresă de e-mail action_with_app: Confirmați și reveniți la %{app} - explanation: Ai creat un cont pe %{host} cu această adresă de e-mail. Ești la un clic distanță de a-l activa. Dacă nu ai fost tu, ignoră acest e-mail. - explanation_when_pending: Ai solicitat o invitație către %{host} cu această adresă de e-mail. Odată ce îți confirmi adresa de e-mail, îți vom revizui cererea. Te poți autentifica pentru a-ți schimba detaliile sau pentru a-ți șterge contul, dar nu poți accesa majoritatea funcțiilor până când contul tău nu este aprobat. Dacă cererea ta este respinsă, datele tale vor fi șterse, astfel încât nu va fi necesară nicio altă acțiune din partea ta. Dacă nu ai fost tu, ignoră acest e-mail. + explanation: Ați creat un cont pe %{host} cu această adresă de e-mail. Sunteți la un clic distanță de a-l activa. Dacă nu ați fost dvs., vă rugăm să ignorați acest e-mail. + explanation_when_pending: Ați aplicat pentru o invitație pentru %{host} cu această adresă de e-mail. Odată ce vă confirmați adresa de e-mail, vă vom examina cererea. Vă puteți autentifica pentru a vă schimba detaliile sau pentru a vă șterge contul, dar nu puteți accesa majoritatea funcțiilor până când contul dvs. nu este aprobat. Dacă cererea dvs. este respinsă, datele dvs. vor fi șterse, astfel încât nu va fi necesară nicio acțiune suplimentară din partea dvs. Dacă nu ați fost dvs., vă rugăm să ignorați acest e-mail. extra_html: Te rugăm să verifici și regulile serverului și termenii noștri de serviciu. subject: 'Mastodon: Instrucțiuni de confirmare pentru %{instance}' - title: Verifică adresa de e-mail + title: Verificați adresa de e-mail email_changed: - explanation: 'Adresa de e-mail pentru contul tău este schimbată la:' - extra: Dacă nu v-ați schimbat adresa de e-mail, probabil că cineva a obținut acces la contul dvs. Te rugăm să îți schimbi parola imediat sau să contactezi administratorul serverului dacă nu ai acces la contul tău. - subject: 'Mastodon: E-mail schimbat' - title: Noua adresa de e-mail + explanation: 'Adresa de e-mail a contului dvs. este schimbată în:' + extra: Dacă nu v-ați schimbat adresa de e-mail, probabil că cineva a obținut acces la contul dvs. Vă rugăm să vă schimbați parola imediat sau să contactați administratorul serverului dacă nu aveți acces la contul dvs. + subject: 'Mastodon: Adresă de e-mail schimbată' + title: Adresă de e-mail nouă password_change: - explanation: Parola contului tău a fost schimbată. - extra: Dacă nu v-ați schimbat parola, este posibil ca cineva să fi obținut acces la contul dvs. Te rugăm să îți schimbi parola imediat sau să contactezi administratorul serverului dacă nu ai acces la contul tău. + explanation: Parola pentru contul dvs. a fost schimbată. + extra: Dacă nu v-ați schimbat parola, probabil că cineva a obținut acces la contul dvs. Vă rugăm să vă schimbați parola imediat sau să contactați administratorul serverului dacă nu aveți acces la contul dvs. subject: 'Mastodon: Parolă schimbată' title: Parolă schimbată reconfirmation_instructions: - explanation: Confirmă noua adresă pentru a schimba adresa de e-mail. + explanation: Confirmați noua adresă pentru a vă schimba adresa de e-mail. extra: Dacă această modificare nu a fost inițiată de dvs., vă rugăm să ignorați acest e-mail. Adresa de e-mail pentru contul Mastodon nu se va schimba până când nu accesați link-ul de mai sus. subject: 'Mastodon: Confirmați e-mailul pentru %{instance}' - title: Verifică adresa de e-mail + title: Verificați adresa de e-mail reset_password_instructions: - action: Schimbă parola + action: Schimbați parola explanation: Ați solicitat o nouă parolă pentru contul dvs. - extra: Dacă nu ați solicitat acest lucru, ignorați acest e-mail. Parola dvs. nu se va schimba până când nu veți accesa link-ul de mai sus și nu veți crea unul nou. + extra: Dacă nu ați solicitat acest lucru, vă rugăm să ignorați acest e-mail. Parola dvs. nu se va schimba până când nu veți accesa link-ul de mai sus și nu veți crea unul nou. subject: 'Mastodon: Instrucțiuni pentru resetarea parolei' title: Resetare parolă two_factor_disabled: explanation: Conectarea este acum posibilă folosind doar adresa de e-mail și parola. - subject: 'Mastodon: Autentificare cu doi factori dezactivată' + subject: 'Mastodon: Autentificarea cu doi factori dezactivată' subtitle: Autentificarea cu doi factori pentru contul dvs. a fost dezactivată. title: A2F dezactivată two_factor_enabled: - explanation: Pentru autentificare va fi necesar un token generat de aplicația TOTP asociată. + explanation: Pentru conectare va fi necesar un token generat de aplicația TOTP asociată. subject: 'Mastodon: Autentificare în doi pași activată' subtitle: Autentificarea cu doi factori a fost activată pentru contul dvs. title: A2F activată @@ -61,18 +61,18 @@ ro: explanation: Codurile de recuperare anterioare au fost invalidate și s-au generat altele noi. subject: 'Mastodon: Coduri de recuperare în doi pași regenerate' subtitle: Codurile de recuperare anterioare au fost invalidate și s-au generat altele noi. - title: Codurile de recuperare în doi pași au fost modificate + title: Codurile de recuperare în doi pași modificate unlock_instructions: subject: 'Mastodon: Instrucțiuni de deblocare' webauthn_credential: added: - explanation: Următoarea cheie de securitate a fost adăugată în contul tău + explanation: Următoarea cheie de securitate a fost adăugată în contul dvs. subject: 'Mastodon: Noua cheie de securitate' title: A fost adăugată o nouă cheie de securitate deleted: - explanation: Următoarea cheie de securitate a fost ștearsă din contul tău + explanation: Următoarea cheie de securitate a fost ștearsă din contul dvs. subject: 'Mastodon: Cheie de securitate ștearsă' - title: Una dintre cheile tale de securitate a fost ștearsă + title: Una dintre cheile dvs. de securitate a fost ștearsă webauthn_disabled: explanation: Autentificarea cu chei de securitate a fost dezactivată pentru contul dvs. extra: Conectarea este acum posibilă folosind doar token-ul generat de aplicația TOTP asociată. @@ -84,31 +84,31 @@ ro: subject: 'Mastodon: Autentificarea prin chei de securitate activată' title: Chei de securitate activate omniauth_callbacks: - failure: Nu te-am putut autentifica de la %{kind} deoarece "%{reason}". + failure: Nu v-am putut autentifica de la %{kind} deoarece "%{reason}". success: Autentificat cu succes din contul %{kind}. passwords: - no_token: Nu puteți accesa această pagină fără să veniți dintr-un e-mail de resetare a parolei. Dacă vii dintr-un e-mail de resetare a parolei, te rugăm să te asiguri că ai folosit URL-ul complet furnizat. - send_instructions: Dacă adresa ta de e-mail există în baza noastră de date, vei primi în câteva minute un link de recuperare a parolei la adresa ta de e-mail. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. - send_paranoid_instructions: Dacă adresa ta de e-mail există în baza noastră de date, vei primi în câteva minute un link de recuperare a parolei la adresa ta de e-mail. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. - updated: Parola ta a fost schimbată cu succes. Acum ești conectat. - updated_not_active: Parola ta a fost schimbată cu succes. + no_token: Nu puteți accesa această pagină fără să veniți dintr-un e-mail de resetare a parolei. Dacă veniți dintr-un e-mail de resetare a parolei, vă rugăm asigurați-vă că ați folosit URL-ul complet furnizat. + send_instructions: Dacă adresa dvs. de e-mail există în baza noastră de date, veți primi în câteva minute un link de recuperare a parolei la adresa dvs. de e-mail. Vă rugăm să verificați dosarul spam dacă nu ați primit acest e-mail. + send_paranoid_instructions: Dacă adresa dvs. de e-mail există în baza noastră de date, veți primi în câteva minute un link de recuperare a parolei la adresa dvs. de e-mail. Vă rugăm să verificați dosarul spam dacă nu ați primit acest e-mail. + updated: Parola dvs. a fost schimbată cu succes. Acum sunteți conectat. + updated_not_active: Parola dvs. a fost schimbată cu succes. registrations: - destroyed: La revedere! Contul tău a fost anulat cu succes. Sperăm să te vedem din nou în curând. + destroyed: La revedere! Contul dvs. a fost anulat cu succes. Sperăm să vă vedem din nou în curând. signed_up: Bine ați venit! V-ați înregistrat cu succes. signed_up_but_inactive: V-ați înregistrat cu succes. Cu toate acestea, nu vă putem conecta deoarece contul dvs. nu este încă activat. signed_up_but_locked: V-ați înregistrat cu succes. Cu toate acestea, nu vă putem conecta deoarece contul dvs. este blocat. - signed_up_but_pending: Un mesaj cu un link de confirmare a fost trimis la adresa ta de e-mail. După ce faceți clic pe link, vă vom revizui cererea. Veți fi notificat dacă este aprobat. - signed_up_but_unconfirmed: Un mesaj cu un link de confirmare a fost trimis la adresa ta de e-mail. Vă rugăm să urmați link-ul pentru a vă activa contul. Vă rugăm să verificați folderul spam dacă nu ați primit acest e-mail. - update_needs_confirmation: Ți-ai actualizat contul cu succes, dar trebuie să verificăm noua ta adresă de e-mail. Vă rugăm să verificați adresa de e-mail și să urmați link-ul de confirmare pentru a confirma noua dvs. adresă de e-mail. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. + signed_up_but_pending: Un mesaj cu un link de confirmare a fost trimis la adresa dvs. de e-mail. După ce faceți clic pe link, vă vom revizui cererea. Veți fi notificat dacă este aprobat. + signed_up_but_unconfirmed: Un mesaj cu un link de confirmare a fost trimis la adresa dvs. de e-mail. Vă rugăm să urmați link-ul pentru a vă activa contul. Vă rugăm să verificați folderul spam dacă nu ați primit acest e-mail. + update_needs_confirmation: V-ați actualizat contul cu succes, dar trebuie să verificăm noua dvs. adresă de e-mail. Vă rugăm să verificați adresa de e-mail și să urmați link-ul de confirmare pentru a confirma noua dvs. adresă de e-mail. Vă rugăm să verificați dosarul spam dacă nu ați primit acest e-mail. updated: Contul dvs. a fost actualizat cu succes. sessions: already_signed_out: Deconectat cu succes. signed_in: Conectat cu succes. signed_out: Deconectat cu succes. unlocks: - send_instructions: Veți primi un e-mail cu instrucțiuni despre cum să vă deblocați contul în câteva minute. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. - send_paranoid_instructions: Dacă contul tău există, vei primi un e-mail cu instrucțiuni pentru cum să-l deblochezi în câteva minute. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. - unlocked: Contul tău a fost deblocat cu succes. Te rugăm să te autentifici pentru a continua. + send_instructions: Veți primi un e-mail cu instrucțiuni despre cum să vă deblocați contul în câteva minute. Vă rugăm să verificați dosarul spam dacă nu ați primit acest e-mail. + send_paranoid_instructions: Dacă contul dvs. există, veți primi un e-mail cu instrucțiuni pentru cum să-l deblocați în câteva minute. Vă rugăm să verificați dosarul spam dacă nu ați primit acest e-mail. + unlocked: Contul dvs. a fost deblocat cu succes. Vă rugăm să vă autentificați pentru a continua. errors: messages: already_confirmed: a fost deja confirmat, încercați să vă conectați diff --git a/config/locales/doorkeeper.lv.yml b/config/locales/doorkeeper.lv.yml index 11c5020305..0f05adf148 100644 --- a/config/locales/doorkeeper.lv.yml +++ b/config/locales/doorkeeper.lv.yml @@ -83,6 +83,7 @@ lv: access_denied: Resursa īpašnieks vai autorizācijas serveris pieprasījumu noraidīja. credential_flow_not_configured: Resursa īpašnieka paroles akreditācijas datu plūsma neizdevās, jo Doorkeeper.configure.resource_owner_from_credentials nebija konfigurēts. invalid_client: Klienta autentifikācija neizdevās nezināma klienta, klienta autentifikācijas vai neatbalstītas autentifikācijas metodes dēļ. + invalid_code_challenge_method: Koda izaicinājuma veidam jābūt S256, vienkāršs netiek atbalstīts. invalid_grant: Sniegtā autorizācijas piekrišana nav derīga, tai ir beidzies derīguma termiņš, tā ir atsaukta, tā neatbilst autorizācijas pieprasījumā izmantotajam novirzīšanas URI vai tika izsniegta citam klientam. invalid_redirect_uri: Iekļauts novirzīšanas uri nav derīgs. invalid_request: diff --git a/config/locales/doorkeeper.ro.yml b/config/locales/doorkeeper.ro.yml index fa28373521..7091bcaf7b 100644 --- a/config/locales/doorkeeper.ro.yml +++ b/config/locales/doorkeeper.ro.yml @@ -3,10 +3,10 @@ ro: activerecord: attributes: doorkeeper/application: - name: Numele aplicației + name: Nume aplicație redirect_uri: URI de redirecționare scopes: Domenii - website: Pagina web a aplicației + website: Website aplicație errors: models: doorkeeper/application: @@ -19,60 +19,60 @@ ro: doorkeeper: applications: buttons: - authorize: Autorizează - cancel: Anulează - destroy: Distruge - edit: Editează - submit: Trimite + authorize: Autorizare + cancel: Anulare + destroy: Distrugere + edit: Editare + submit: Trimitere confirmations: - destroy: Ești sigur? + destroy: Sunteți sigur? edit: - title: Editați aplicația + title: Editare aplicație form: error: Ups! Verificați formularul pentru posibile erori help: native_redirect_uri: Utilizați %{native_redirect_uri} pentru teste locale - redirect_uri: Folosește câte o linie per URI + redirect_uri: Folosiți câte o linie per URI scopes: Separați domeniile cu spații. Lăsați necompletat pentru a utiliza domeniile implicite. index: application: Aplicație - callback_url: URL pentru callback - delete: Șterge + callback_url: Callback URL + delete: Ștergere empty: Nu aveți aplicații. name: Nume new: Aplicație nouă scopes: Domenii - show: Arată - title: Aplicațiile tale + show: Afișare + title: Aplicațiile dvs. new: title: Aplicație nouă show: actions: Acțiuni application_id: Cheie client - callback_urls: URL-uri de callback + callback_urls: Callback URL-uri scopes: Domenii - secret: Codul secret al clientului + secret: Secretul clientului title: 'Aplicație: %{name}' authorizations: buttons: - authorize: Autorizează - deny: Interzice + authorize: Autorizare + deny: Refuzare error: title: A apărut o eroare new: prompt_html: "%{client_name} dorește să îți acceseze contul. Este o aplicație terță. Dacă nu aveți încredere în ea, atunci nu ar trebui să o autorizați." - review_permissions: Revizuiește permisiunile + review_permissions: Revizuiți permisiunile title: Autorizare necesară show: title: Copiați acest cod de autorizare și lipiți-l în aplicație. authorized_applications: buttons: - revoke: Revocați + revoke: Revocare confirmations: - revoke: Ești sigur? + revoke: Sunteți sigur? index: authorized_at: Autorizat pe %{date} - description_html: Acestea sunt aplicațiile care vă pot accesa contul folosind API. Dacă există aplicații pe care nu le recunoașteți, sau o aplicație se comportă necorespunzător, puteți revoca accesul. + description_html: Acestea sunt aplicațiile care vă pot accesa contul folosind API-ul. Dacă există aplicații pe care nu le recunoașteți, sau o aplicație se comportă necorespunzător, puteți revoca accesul. last_used_at: Utilizat ultima dată pe %{date} never_used: Nu a fost folosit niciodată scopes: Permisiuni @@ -86,9 +86,9 @@ ro: invalid_grant: Acordarea autorizației furnizată este invalidă, expirată, revocată, nu corespunde URI-ului de redirecționare folosit în cererea de autorizare, sau a fost eliberat altui client. invalid_redirect_uri: Uri-ul de redirecționare inclus nu este valid. invalid_request: - missing_param: 'Lipseste parametrul necesar: %{value}.' + missing_param: 'Lipsește parametrul necesar: %{value}.' request_not_authorized: Solicitarea trebuie să fie autorizată. Parametrul necesar pentru solicitarea de autorizare lipsește sau este invalid. - unknown: Solicitarea nu are un parametru necesar, include un parametru nesuportat sau este dealtfel formatat incorect. + unknown: Solicitarea nu are un parametru necesar, include un parametru nesuportat sau este formatat incorect. invalid_resource_owner: Acreditările proprietarului de resurse nu sunt valide sau proprietarul de resurse nu poate fi găsit invalid_scope: Domeniul de aplicare solicitat este invalid, necunoscut sau incorect. invalid_token: @@ -137,12 +137,12 @@ ro: notifications: Notificări push: Notificări push reports: Rapoarte - search: Caută + search: Căutare statuses: Postări layouts: admin: nav: - applications: Aplicaţii + applications: Aplicații oauth2_provider: Furnizor OAuth2 application: title: Este necesară autorizarea OAuth @@ -160,7 +160,7 @@ ro: read:accounts: vede informațiile privind conturile read:blocks: vede blocurile tale read:bookmarks: vede marcajele tale - read:favourites: vezi favoritele tale + read:favourites: vede favoritele tale read:filters: vede filtrele tale read:follows: vede urmăririle tale read:lists: vede listele tale @@ -168,7 +168,7 @@ ro: read:notifications: vede notificările tale read:reports: vede raportările tale read:search: caută în numele tău - read:statuses: vede toate stările + read:statuses: vede toate postările write: modifică toate datele contului tău write:accounts: modifică profilul tău write:blocks: blochează conturile și domeniile diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 050388c180..ebe26c3f14 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -24,6 +24,8 @@ es-MX: admin: account_actions: action: Realizar acción + already_silenced: Esta cuenta ya ha sido limitada. + already_suspended: Esta cuenta ya ha sido suspendida. title: Moderar %{acct} account_moderation_notes: create: Crear @@ -45,6 +47,7 @@ es-MX: title: Cambiar el correo electrónico de %{username} change_role: changed_msg: Rol cambiado exitosamente! + edit_roles: Administrar roles de usuario label: Cambiar de rol no_role: Sin rol title: Cambiar el rol para %{username} @@ -601,6 +604,7 @@ es-MX: suspend_description_html: La cuenta y todos sus contenidos serán inaccesibles y eventualmente eliminados, e interactuar con ella será imposible. Reversible durante 30 días. Cierra todos los reportes contra esta cuenta. actions_description_html: Decide qué medidas tomar para resolver esta denuncia. Si tomas una acción punitiva contra la cuenta denunciada, se le enviará a dicha cuenta una notificación por correo electrónico, excepto cuando se seleccione la categoría Spam. actions_description_remote_html: Decide qué medidas tomar para resolver este reporte. Esto solo afectará a la forma en que tu servidor se comunica con esta cuenta remota y gestiona su contenido. + actions_no_posts: Este informe no tiene ningún mensaje asociado para eliminar add_to_report: Añadir más al reporte already_suspended_badges: local: Ya suspendido en este servidor @@ -907,8 +911,8 @@ es-MX: trends: allow: Permitir approved: Aprobado - confirm_allow: "¿Estás seguro de que deseas permitir la etiqueta seleccionada?" - confirm_disallow: "¿Estás seguro de que deseas restringir la etiqueta seleccionada?" + confirm_allow: "¿Estás seguro de que deseas permitir las etiquetas seleccionadas?" + confirm_disallow: "¿Estás seguro de que deseas restringir las etiquetas seleccionadas?" disallow: Rechazar links: allow: Permitir enlace @@ -976,7 +980,7 @@ es-MX: used_by_over_week: one: Usada por una persona durante la última semana other: Usada por %{count} personas durante la última semana - title: Recomendaciones y tendencias + title: Recomendaciones y Tendencias trending: En tendencia warning_presets: add_new: Añadir nuevo @@ -1156,6 +1160,12 @@ es-MX: view_strikes: Ver amonestaciones pasadas contra tu cuenta too_fast: Formulario enviado demasiado rápido, inténtelo de nuevo. use_security_key: Usar la clave de seguridad + author_attribution: + example_title: Texto de ejemplo + hint_html: Controla cómo se te dará atribución cuando se compartan enlaces en Mastodon. + more_from_html: Más de %{name} + s_blog: Blog de %{name} + title: Atribución del autor challenge: confirm: Continuar hint_html: "Tip: No volveremos a preguntarte por la contraseña durante la siguiente hora." @@ -1933,6 +1943,7 @@ es-MX: instructions_html: Copia y pega el siguiente código en el HTML de tu sitio web. A continuación, añade la dirección de su sitio web en uno de los campos extra de tu perfil desde la pestaña "Editar perfil" y guarda los cambios. verification: Verificación verified_links: Tus links verificados + website_verification: Verificación del sitio web webauthn_credentials: add: Agregar nueva clave de seguridad create: diff --git a/config/locales/es.yml b/config/locales/es.yml index 81a547ad88..c652876f3a 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -24,6 +24,8 @@ es: admin: account_actions: action: Realizar acción + already_silenced: Esta cuenta ya ha sido limitada. + already_suspended: Esta cuenta ya ha sido suspendida. title: Moderar %{acct} account_moderation_notes: create: Crear @@ -45,6 +47,7 @@ es: title: Cambiar el correo electrónico de %{username} change_role: changed_msg: "¡Rol cambiado con éxito!" + edit_roles: Administrar roles de usuario label: Cambiar rol no_role: Sin rol title: Cambiar rol para %{username} @@ -601,6 +604,7 @@ es: suspend_description_html: La cuenta y todos sus contenidos serán inaccesibles y finalmente eliminados, e interactuar con ella será imposible. Reversible durante 30 días. Cierra todos los informes contra esta cuenta. actions_description_html: Decide qué medidas tomar para resolver esta denuncia. Si tomas una acción punitiva contra la cuenta denunciada, se le enviará a dicha cuenta una notificación por correo electrónico, excepto cuando se seleccione la categoría Spam. actions_description_remote_html: Decide qué medidas tomar para resolver este informe. Esto solo afectará a la forma en que tu servidor se comunica con esta cuenta remota y gestiona su contenido. + actions_no_posts: Este informe no tiene ningún mensaje asociado para eliminar add_to_report: Añadir más al reporte already_suspended_badges: local: Ya suspendido en este servidor @@ -907,8 +911,8 @@ es: trends: allow: Permitir approved: Aprobadas - confirm_allow: "¿Estás seguro de que deseas permitir la etiqueta seleccionada?" - confirm_disallow: "¿Estás seguro de que deseas restringir la etiqueta seleccionada?" + confirm_allow: "¿Estás seguro de que deseas permitir las etiquetas seleccionadas?" + confirm_disallow: "¿Estás seguro de que deseas restringir las etiquetas seleccionadas?" disallow: No permitir links: allow: Permitir enlace @@ -976,7 +980,7 @@ es: used_by_over_week: one: Usada por una persona durante la última semana other: Usada por %{count} personas durante la última semana - title: Recomendaciones y tendencias + title: Recomendaciones y Tendencias trending: En tendencia warning_presets: add_new: Añadir nuevo @@ -1156,6 +1160,12 @@ es: view_strikes: Ver amonestaciones pasadas contra tu cuenta too_fast: Formulario enviado demasiado rápido, inténtelo de nuevo. use_security_key: Usar la clave de seguridad + author_attribution: + example_title: Texto de ejemplo + hint_html: Controla cómo se te dará atribución cuando se compartan enlaces en Mastodon. + more_from_html: Más de %{name} + s_blog: Blog de %{name} + title: Atribución del autor challenge: confirm: Continuar hint_html: "Tip: No volveremos a preguntarte por la contraseña durante la siguiente hora." @@ -1933,6 +1943,7 @@ es: instructions_html: Copia y pega el siguiente código en el HTML de tu sitio web. A continuación, añade la dirección de su sitio web en uno de los campos extra de tu perfil desde la pestaña "Editar perfil" y guarda los cambios. verification: Verificación verified_links: Tus enlaces verificados + website_verification: Verificación del sitio web webauthn_credentials: add: Agregar nueva clave de seguridad create: diff --git a/config/locales/et.yml b/config/locales/et.yml index d8cdbf4143..aca4f93c4d 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -24,6 +24,7 @@ et: admin: account_actions: action: Täida tegevus + already_silenced: See konto on juba piiratud. already_suspended: See konto on juba peatatud. title: Rakenda moderaatori tegevus kasutajale %{acct} account_moderation_notes: @@ -133,6 +134,7 @@ et: resubscribe: Telli taas role: Roll search: Otsi + search_same_email_domain: Muud kasutajad sama e-posti domeeniga search_same_ip: Teised kasutajad, kellel on sama IP security: Turvalisus security_measures: @@ -173,21 +175,26 @@ et: approve_appeal: Rahulda vaidlustus approve_user: Kinnita kasutaja assigned_to_self_report: Määras Teavituse + change_email_user: Muuda kasutaja e-posti change_role_user: Muuda kasutaja rolli confirm_user: Kasutaja kinnitatud create_account_warning: Lisas hoiatuse create_announcement: Lisas teadaande + create_canonical_email_block: Loo e-posti blokeering create_custom_emoji: Lisas kohandatud emotikoni create_domain_allow: Lisas lubatud domeeni create_domain_block: Domeeni blokeerimine + create_email_domain_block: Loo e-posti domeeni blokeering create_ip_block: IP-reegli lisamine create_unavailable_domain: Kättesaamatu domeeni lisamine create_user_role: Loo roll demote_user: Alandas kasutaja destroy_announcement: Eemaldas teadaande + destroy_canonical_email_block: Kustuta e-posti blokeering destroy_custom_emoji: Eemaldas kohandatud emotikoni destroy_domain_allow: Eemaldas lubatud domeeni destroy_domain_block: Domeeniblokeeringu eemaldamine + destroy_email_domain_block: Kustuta e-posti domeeni blokeering destroy_instance: Domeeni kustutamine destroy_ip_block: IP-reegli kustutamine destroy_status: Kustuta postitus @@ -228,20 +235,26 @@ et: approve_appeal_html: "%{name} kiitis heaks modereerimise otsuse vaidlustuse %{target} poolt" approve_user_html: "%{name} kiitis heaks registreerimise %{target} poolt" assigned_to_self_report_html: "%{name} määras raporti %{target} endale" + change_email_user_html: "%{name} muutis kasutaja %{target} e-postiaadressi" change_role_user_html: "%{name} muutis %{target} rolli" + confirm_user_html: "%{name} kinnitas kasutaja %{target} e-postiaadressi" create_account_warning_html: "%{name} saatis %{target} hoiatuse" create_announcement_html: "%{name} lõi uue teate %{target}" + create_canonical_email_block_html: "%{name} blokeeris e-posti räsiga %{target}" create_custom_emoji_html: "%{name} laadis üles uue emotikoni %{target}" create_domain_allow_html: "%{name} lubas föderatsiooni domeeniga %{target}" create_domain_block_html: "%{name} keelas domeeni %{target}" + create_email_domain_block_html: "%{name} blokeeris e-posti domeeni %{target}" create_ip_block_html: "%{name} lõi IP-aadressile %{target} reegli" create_unavailable_domain_html: "%{name} lõpetas edastamise domeeni %{target}" create_user_role_html: "%{name} lõi rolli %{target}" demote_user_html: "%{name} alandas kasutajat %{target}" destroy_announcement_html: "%{name} kustutas teadaande %{target}" + destroy_canonical_email_block_html: "%{name} eemaldas blokeeringu e-postilt räsiga %{target}" destroy_custom_emoji_html: "%{name} kustutas emotikoni %{target}" destroy_domain_allow_html: "%{name} keelas föderatsiooni domeeniga %{target}" destroy_domain_block_html: "%{name} lubas domeeni %{target}" + destroy_email_domain_block_html: "%{name} eemaldas blokeeringu e-posti domeenilt %{target}" destroy_instance_html: "%{name} kustutas domeeni %{target}" destroy_ip_block_html: "%{name} kustutas IP-aadressi %{target} reegli" destroy_status_html: "%{name} kustutas %{target} postituse" @@ -260,6 +273,7 @@ et: reject_user_html: "%{name} lükkas %{target} liitumissoovi tagasi" remove_avatar_user_html: "%{name} eemaldas %{target} avatari" reopen_report_html: "%{name} taasavas raporti %{target}" + resend_user_html: "%{name} lähtestas %{target} kinnituskirja e-posti" reset_password_user_html: "%{name} lähtestas %{target} salasõna" resolve_report_html: "%{name} lahendas raporti %{target}" sensitive_account_html: "%{name} märkis %{target} meedia kui tundlik sisu" @@ -420,6 +434,7 @@ et: attempts_over_week: one: "%{count} katse viimase nädala kestel" other: "%{count} liitumiskatset viimase nädala kestel" + created_msg: E-posti domeen edukalt blokeeritud delete: Kustuta dns: types: @@ -428,8 +443,12 @@ et: new: create: Lisa domeen resolve: Domeeni lahendamine + title: Blokeeri uus e-posti domeen + no_email_domain_block_selected: Ühtegi e-posti domeeni blokeeringut ei muudetud, kuna ühtegi ei valitud not_permitted: Ei ole lubatud + resolved_dns_records_hint_html: Domeeninimi lahendatakse järgmistele MX-domeenidele, mis on lõppkokkuvõttes vastutavad e-kirjade vastuvõtmise eest. MX-domeeni blokeerimine blokeerib registreerimise mis tahes e-posti aadressilt, mis kasutab sama MX-domeeni, isegi kui nähtav domeeninimi on erinev. Ole ettevaatlik, et mitte blokeerida peamisi e-posti teenusepakkujaid. resolved_through_html: Lahendatud %{domain} kaudu + title: Blokeeritud e-posti domeenid export_domain_allows: new: title: Lubatud domeenide import @@ -583,6 +602,7 @@ et: resolve_description_html: Raporteeritud konto suhtes ei võeta midagi ette, juhtumit ei registreerita ja raport suletakse. silence_description_html: Konto saab olema nähtav ainult senistele jälgijatele või otsestele pöördujatele, mõjutates avalikku levi. On tagasipööratav. Sulgeb kõik konto suhtes esitatud raportid. suspend_description_html: See konto ja kogu selle sisu muutub kättesaamatuks ning kustub lõpuks ja igasugune suhtlus sellega muutub võimatuks. Tagasipööratav 30 päeva jooksul. Lõpetab kõik selle konto kohta esitatud kaebused. + actions_description_html: Otsusta, milliseid meetmeid selle raporti lahendamiseks võtta. Kui võtad raporteeritud konto suhtes karistusmeetme, saadetakse talle e-posti teade, välja arvatud juhul, kui valid kategooria Rämps. actions_description_remote_html: Otsusta, mida teha selle raporti lahendamiseks. See mõjutab ainult seda, kuidas Sinu server selle kaugkontoga suhtleb ning selle sisu käsitleb. actions_no_posts: Selle raportiga pole seotud ühtegi postitust, mida kustutada add_to_report: Lisa raportile juurde @@ -648,6 +668,7 @@ et: delete_data_html: Kustuta tänasest 30 päeva pärast kasutaja @%{acct} profiil ja sisu, kui vahepeal tema kontot ei taastata preview_preamble_html: "@%{acct} saab järgmise sisuga hoiatuse:" record_strike_html: Salvesta @%{acct} kohta juhtum, et aidata selle konto tulevaste rikkumiste puhul reageerida + send_email_html: Saada hoiatuskiri @%{acct} warning_placeholder: Valikuline täiendav põhjendus modereerimisele. target_origin: Raporteeritud konto päritolu title: Teavitused @@ -687,6 +708,7 @@ et: manage_appeals: Vaidlustuste haldamine manage_appeals_description: Lubab kasutajail läbi vaadata modereerimisotsuste vaidlustusi manage_blocks: Keeldude haldamine + manage_blocks_description: Lubab kasutajatel blokeerida e-posti teenusepakkujaid ja IP-aadresse manage_custom_emojis: Halda isetehtud emotikone manage_custom_emojis_description: Lubab kasutajatel hallata serveris isetehtud emotikone manage_federation: Halda födereerumist @@ -704,6 +726,7 @@ et: manage_taxonomies: Halda taksonoomiaid manage_taxonomies_description: Luba kasutajatel populaarset sisu üle vaadata ning uuendada siltide sätteid manage_user_access: Halda kasutajate ligipääsu + manage_user_access_description: Võimaldab kasutajatel keelata teiste kasutajate kaheastmelise autentimise, muuta oma e-posti aadressi ja lähtestada oma parooli manage_users: Kasutajate haldamine manage_users_description: Lubab kasutajail näha teiste kasutajate üksikasju ja teha nende suhtes modereerimisotsuseid manage_webhooks: Halda webhook'e @@ -1137,6 +1160,12 @@ et: view_strikes: Vaata enda eelnevaid juhtumeid too_fast: Vorm esitatud liiga kiirelt, proovi uuesti. use_security_key: Kasuta turvavõtit + author_attribution: + example_title: Näidistekst + hint_html: Määra, kuidas sind krediteeritakse, kui linke Mastodonis jagatakse. + more_from_html: Rohkem kasutajalt %{name} + s_blog: Kasutaja %{name} blogi + title: Autori tunnustamine challenge: confirm: Jätka hint_html: "Nõuanne: Me ei küsi salasõna uuesti järgmise tunni jooksul." @@ -1418,6 +1447,16 @@ et: unsubscribe: action: Jah, lõpeta tellimine complete: Tellimine lõpetatud + confirmation_html: Kas oled kindel, et soovid loobuda %{type} tellimisest oma e-postiaadressile %{email} Mastodonist kohas %{domain}? Saad alati uuesti tellida oma e-posti teavituste seadetest. + emails: + notification_emails: + favourite: lemmikuks märkimise teavituskirjade + follow: jälgimiste teavituskirjade + follow_request: jälgimistaotluste teavituskirjade + mention: mainimiste teavituskirjade + reblog: jagamiste teavituskirjade + resubscribe_html: Kui loobusid tellimisest ekslikult, saad uuesti tellida oma e-posti teavituste seadetest. + success_html: Sa ei saa enam %{type} teateid oma e-postile %{email} Mastodonist kohas %{domain}. title: Loobu tellimisest media_attachments: validations: @@ -1906,6 +1945,7 @@ et: instructions_html: Kopeeri ja kleebi allpool olev kood oma lehe HTML lähtekoodi. Seejärel lisa oma kodulehe aadress profiili "Muuda profiili" taabi ühte lisavälja ning salvesta muudatused. verification: Kinnitamine verified_links: Sinu kontrollitud lingid + website_verification: Veebilehe kontrollimine webauthn_credentials: add: Uue turvavõtme lisamine create: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index f2fe134e32..996c8d6cd2 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -24,12 +24,15 @@ fa: admin: account_actions: action: انجامِ کنش + already_silenced: این جساب از پیش محدود شده. + already_suspended: این جساب از پیش معلّق شده. title: انجام کنش مدیریتی روی %{acct} account_moderation_notes: create: افزودن یادداشت created_msg: یادداشت مدیر با موفقیت ساخته شد! destroyed_msg: یادداشت نظارتی با موفقیت نابود شد! accounts: + add_email_domain_block: انسداد دامنهٔ رایانامه approve: پذیرفتن approved_msg: کارهٔ ثبت‌نام %{username} با موفقیت تأیید شد are_you_sure: مطمئنید؟ @@ -44,6 +47,7 @@ fa: title: تغییر رایانامه برای %{username} change_role: changed_msg: نقش با موفقیت تغییر کرد! + edit_roles: مدیریت نقش‌های کاربر label: تغییر نقش no_role: بدون نقش title: تغییر نقش برای %{username} @@ -56,6 +60,7 @@ fa: demote: تنزل‌دادن destroyed_msg: داده‌های %{username} در صف حدف قرار گرفتند disable: از کار انداختن + disable_sign_in_token_auth: از کار انداختن تأیید هویت ژتون رایانامه‌ای disable_two_factor_authentication: از کار انداختن ورود دومرحله‌ای disabled: از کار افتاده display_name: نام نمایشی @@ -64,6 +69,7 @@ fa: email: رایانامه email_status: وضعیت رایانامه enable: به کار انداختن + enable_sign_in_token_auth: به کار انداختن تأیید هویت ژتون رایانامه‌ای enabled: به کار افتاده enabled_msg: حساب %{username} با موفقیت به کار انداخته شد followers: پیگیران @@ -128,6 +134,7 @@ fa: resubscribe: اشتراک دوباره role: نقش search: جست‌وجو + search_same_email_domain: دیگر کاربران با دامنهٔ رایانامهٔ یکسان search_same_ip: دیگر کاربران با IP یکسان security: امنیت security_measures: @@ -168,13 +175,16 @@ fa: approve_appeal: پذیرش درخواست تجدیدنظر approve_user: تایید کاربر assigned_to_self_report: واگذاری گزارش + change_email_user: تغییر رایانامه برای کاربر change_role_user: تغیر نقش کاربر confirm_user: تأیید کاربر create_account_warning: ایجاد هشدار create_announcement: ایجاد اعلامیه + create_canonical_email_block: ایجاد انسداد رایانامه create_custom_emoji: ایجاد اموجی سفارشی create_domain_allow: ایجاد اجازهٔ دامنه create_domain_block: ایجاد انسداد دامنه + create_email_domain_block: ایجاد انسداد دامنهٔ رایانامه create_ip_block: ایجاد قاعدهٔ آی‌پی create_unavailable_domain: ایجاد دامنهٔ ناموجود create_user_role: ایجاد نقش @@ -214,6 +224,7 @@ fa: update_custom_emoji: به‌روز رسانی اموجی سفارشی update_domain_block: به‌روزرسانی مسدودسازی دامنه update_ip_block: بروزرسانی قاعدهٔ آی‌پی + update_report: به‌روز رسانی گزارش update_status: به‌روز رسانی وضعیت update_user_role: به روزرسانی نقش actions: @@ -250,6 +261,7 @@ fa: reject_user_html: "%{name} ثبت نام %{target} را رد کرد" remove_avatar_user_html: "%{name} تصویر نمایهٔ %{target} را حذف کرد" reopen_report_html: "%{name} گزارش %{target} را دوباره به جریان انداخت" + resend_user_html: "%{name} رایانامهٔ تأیید برای %{target} را دوباره فرستاد" reset_password_user_html: "%{name} گذرواژه کاربر %{target} را بازنشاند" resolve_report_html: "%{name} گزارش %{target} را رفع کرد" sensitive_account_html: "%{name} رسانهٔ %{target} را به عنوان حساس علامت‌گذاری کرد" @@ -264,6 +276,7 @@ fa: update_custom_emoji_html: "%{name} شکلک %{target} را به‌روز کرد" update_domain_block_html: "%{name} مسدودسازی دامنه را برای %{target} به‌روزرسانی کرد" update_ip_block_html: "%{name} قانون آی‌پی %{target} را تغییر داد" + update_report_html: "%{name} گزارش %{target} را به‌روز کرد" update_status_html: "%{name} نوشتهٔ %{target} را به‌روز کرد" update_user_role_html: "%{name} نقش %{target} را تغییر داد" deleted_account: حساب حذف شد @@ -271,6 +284,7 @@ fa: filter_by_action: پالایش بر اساس کنش filter_by_user: پالایش بر اساس کاربر title: سیاههٔ بازرسی + unavailable_instance: "(نام دامنه ناموجود)" announcements: destroyed_msg: اعلامیه با موفقیت حذف شد! edit: @@ -405,6 +419,7 @@ fa: attempts_over_week: one: "%{count} تلاش در هفتهٔ گذشته" other: "%{count} تلاش ورود در هفتهٔ گذشته" + created_msg: دامنهٔ رایانامه با موفقیت مسدود شد delete: پاک‌کردن dns: types: @@ -413,7 +428,10 @@ fa: new: create: ساختن مسدودسازی resolve: حل و فصل دامنه + title: مسدودسازی دامنهٔ رایانامهٔ جدید + no_email_domain_block_selected: هیچ انسداد دامنهٔ رایانامه‌ای تغییر نکرد زیرا هیچ‌کدامشان انتخاب نشده بودند not_permitted: مجاز نیست + title: دامنه‌های رایانامهٔ مسدود شده export_domain_allows: new: title: درون‌ریزی اجازه‌های دامنه @@ -586,6 +604,7 @@ fa: target_origin: خاستگاه حساب گزارش‌شده title: گزارش‌ها unassign: پس‌گرفتن مسئولیت + unknown_action_msg: 'کنش ناشناخته: %{action}' unresolved: حل‌نشده updated_at: به‌روز شد view_profile: دیدن نمایه @@ -625,6 +644,7 @@ fa: manage_taxonomies: مدیریت طیقه‌بندی‌ها manage_user_access: مدیریت دسترسی کاربران manage_users: مدیریت کاربران + manage_webhooks: مدیریت قلّاب‌های وب view_dashboard: دیدن داشبورد view_dashboard_description: اجازه به کاربران برای دسترسی به داشتبورد و سنجه‌های مختلف view_devops: دواپس @@ -643,6 +663,8 @@ fa: appearance: preamble: سفارشی‌سازی رابطس وب ماستودون. title: ظاهر + branding: + title: ویژندگی default_noindex: title: درخواست خروج از اندیس‌گذاری پیش‌گزیدهٔ موتور جست‌وجو discovery: @@ -743,6 +765,16 @@ fa: action: برای اطّلاعات بیش‌تر این‌جا را بررسی کنید message_html: "ذخیره‌سازتان بد پیکربندی شده. محرمانگی کاربرانتان در خطر است." tags: + moderation: + not_trendable: غیر قابل داغ شدن + not_usable: غير قابل استفاده + pending_review: بازبینی منتظر + review_requested: بازبینی درخواست شده + reviewed: بازبینی شده + title: وضعیت + trendable: قابل داغ شدن + unreviewed: بررسی نشده + usable: قابل استفاده review: وضعیت بازبینی updated_msg: تنظیمات برچسب‌ها با موفقیت به‌روز شد title: مدیریت @@ -753,15 +785,25 @@ fa: links: allow: اجازه به پیوند allow_provider: اجازه به ناشر + confirm_disallow: مطمئنید که می خواهید پیوندهای گزیده را ممنوع کنید؟ + confirm_disallow_provider: مطمئنید که می خواهید فراهم کننده‌های گزیده را ممنوع کنید؟ disallow: اجازه ندادن به پیوند disallow_provider: اجازه ندادن به ناشر no_link_selected: هیچ پیوندی تغییر نکرد زیرا هیچ‌کدام از آن‌ها انتخاب نشده بودند + publishers: + no_publisher_selected: هیچ ناشری تغییر نکرد زیرا هیچ‌کدام از آن‌ها انتخاب نشده بودند title: پیوندهای داغ + not_allowed_to_trend: اجازهٔ داغ شدن ندارد pending_review: بازبینی منتظر preview_card_providers: title: ناشران rejected: رد شده statuses: + allow: اجازه به فرسته + allow_account: اجازه به نگارنده + disallow: ممنوع کردن فرسته + disallow_account: ممنوع کردن نگارنده + no_status_selected: هیچ فرستهٔ داغی تغییری نکرد زیرا هیچ‌کدام از آن‌ها انتخاب نشده بودند title: فرسته‌های داغ tags: current_score: امتیاز کنونی %{score} @@ -845,7 +887,9 @@ fa: guide_link_text: همه می‌توانند کمک کنند. sensitive_content: محتوای حساس application_mailer: + notification_preferences: تغییر ترجیحات رایانامه salutation: "%{name}،" + settings: 'تغییر ترجیحات رایانامه: %{link}' unsubscribe: لغو اشتراک view: 'نمایش:' view_profile: دیدن نمایه @@ -863,6 +907,7 @@ fa: captcha_confirmation: title: بررسی های امنیتی confirmations: + awaiting_review_title: ثبت‌نامتان دارد بررسی می‌شود login_link: ورود welcome_title: خوش آمدید، %{name}! delete_account: پاک‌کردن حساب @@ -914,6 +959,10 @@ fa: view_strikes: دیدن شکایت‌های گذشته از حسابتان too_fast: فرم با سرعت بسیار زیادی فرستاده شد، دوباره تلاش کنید. use_security_key: استفاده از کلید امنیتی + author_attribution: + example_title: متن نمونه + more_from_html: بیش‌تر از %{name} + s_blog: بلاگ %{name} challenge: confirm: ادامه hint_html: "نکته: ما در یک ساعت آینده گذرواژه‌تان را از شما نخواهیم پرسید." @@ -1079,6 +1128,9 @@ fa: none: هیچ‌کدام order_by: مرتب‌سازی save_changes: ذخیرهٔ تغییرات + select_all_matching_items: + one: گزینش %{count} مورد مطابق با جست‌وجویتان. + other: گزینش %{count} مورد مطابق با جست‌وجویتان. today: امروز validation_errors: one: یک چیزی هنوز درست نیست! لطفاً خطاهای زیر را ببینید @@ -1087,6 +1139,7 @@ fa: errors: over_rows_processing_limit: دارای بیش از %{count} ردیف too_large: حجم فایل خیلی بزرگ است + failures: شکست‌ها imported: وارد شد modes: merge: ادغام @@ -1103,11 +1156,23 @@ fa: status: وضعیت success: داده‌های شما با موفقیت بارگذاری شد و به زودی پردازش می‌شود time_started: آغاز شده در + titles: + blocking: درون ریختن حساب‌های مسدود + bookmarks: درون ریختن نشانک‌ها + domain_blocking: درون ریختن دامنه‌های مسدود + following: درون ریختن حساب‌های پی‌گرفته + lists: درون ریختن سیاهه‌ها + muting: درون ریختن حساب‌های خموش + type: گونهٔ درون‌ریزی + type_groups: + constructive: پی‌گیری‌ها و نشانک‌ها + destructive: انسدادها و خموشی‌ها types: blocking: سیاههٔ انسداد bookmarks: نشانک‌ها domain_blocking: سیاههٔ انسداد دامنه following: سیاههٔ پی‌گیری + lists: سیاهه‌ها muting: سیاههٔ خموشی upload: بارگذاری invites: @@ -1140,6 +1205,7 @@ fa: authentication_methods: otp: کارهٔ تأیید هویت دوعاملی password: گذرواژه + sign_in_token: کد امنیتی رایانامه‌ای webauthn: کلیدهای امنیتی description_html: اگر فعالیتی می‌بینید که تشخیصش نمی‌دهید، تغییر گذرواژه و به کار انداختن تأیید هویت دوعاملی را در نظر داشته باشید. empty: هیچ تاریخچه‌ای از تأییدهویت موجود نیست @@ -1315,6 +1381,8 @@ fa: over_daily_limit: شما از حد مجاز %{limit} فرسته زمان‌بندی‌شده در آن روز فراتر رفته‌اید over_total_limit: شما از حد مجاز %{limit} فرسته زمان‌بندی‌شده فراتر رفته‌اید too_soon: زمان تعیین‌شده باید در آینده باشد + self_destruct: + title: این کارساز دارد بسته می‌شود sessions: activity: آخرین فعالیت browser: مرورگر @@ -1339,6 +1407,7 @@ fa: unknown_browser: مرورگر ناشناخته weibo: وبیو current_session: نشست فعلی + date: تاریخ description: "%{browser} روی %{platform}" explanation: مرورگرهای زیر هم‌اینک به حساب شما وارد شده‌اند. ip: آی‌پی @@ -1375,6 +1444,7 @@ fa: import: درون‌ریزی import_and_export: درون‌ریزی و برون‌بری migrate: انتقال حساب + notifications: آگاهی‌های رایانامه‌ای preferences: ترجیحات profile: نمایه relationships: پیگیری‌ها و پیگیران @@ -1382,6 +1452,9 @@ fa: strikes: شکایت‌های مدیریتی two_factor_authentication: ورود دومرحله‌ای webauthn_authentication: کلیدهای امنیتی + severed_relationships: + download: بارگیری (%{count}) + type: رویداد statuses: attached: audio: @@ -1520,7 +1593,16 @@ fa: silence: حساب محدود شده است suspend: حساب معلق شده است welcome: + apps_android_action: گرفتن از پلی گوگل + apps_ios_action: بارگیری روی فروشگاه کاره + apps_step: بارگیری کارهٔ رسمیمان. + apps_title: کاره‌های ماستودون + edit_profile_action: شخصی سازی explanation: نکته‌هایی که برای آغاز کار به شما کمک می‌کنند + follow_action: پی‌گیری + post_action: ایجاد + share_action: هم‌رسانی + sign_in_action: ورود subject: به ماستودون خوش آمدید title: خوش آمدید، کاربر %{name}! users: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 30837b6003..b48b499bbe 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1162,8 +1162,10 @@ fi: use_security_key: Käytä suojausavainta author_attribution: example_title: Esimerkkiteksti + hint_html: Määrää, kuinka tulet tunnustetuksi, kun Mastodonissa jaetaan linkkejä. more_from_html: Lisää tekijältä %{name} s_blog: Käyttäjän %{name} blogi + title: Tekijän tunnustus challenge: confirm: Jatka hint_html: "Vihje: Emme pyydä sinulta salasanaa uudelleen seuraavan tunnin aikana." diff --git a/config/locales/fo.yml b/config/locales/fo.yml index d5127b4ad3..266b73bb10 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1913,6 +1913,9 @@ fo: follows_subtitle: Fylg vælkendar kontur follows_title: Hvørji tú átti at fylgt follows_view_more: Sí fleiri fólk at fylgja + hashtags_recent_count: + one: "%{people} fólk seinastu 2 dagarnar" + other: "%{people} fólk seinastu 2 dagarnar" hashtags_subtitle: Kanna rákið seinastu 2 dagarnar hashtags_title: Vælumtókt frámerki hashtags_view_more: Sí fleiri vælumtókt frámerki diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index a47d7447a1..b70a515fd1 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -24,6 +24,7 @@ fr-CA: admin: account_actions: action: Effectuer l'action + already_silenced: Ce compte a déjà été limité. already_suspended: Ce compte est déjà suspendu. title: Effectuer une action de modération sur %{acct} account_moderation_notes: @@ -133,7 +134,7 @@ fr-CA: resubscribe: Se réabonner role: Rôle search: Rechercher - search_same_email_domain: Autres utilisateurs avec le même domaine de courriel + search_same_email_domain: Autres utilisateur·rice·s ayant le même domaine de messagerie search_same_ip: Autres utilisateur·rice·s avec la même IP security: Sécurité security_measures: @@ -270,6 +271,7 @@ fr-CA: reject_user_html: "%{name} a rejeté l’inscription de %{target}" remove_avatar_user_html: "%{name} a supprimé l'avatar de %{target}" reopen_report_html: "%{name} a rouvert le signalement %{target}" + resend_user_html: "%{name} a renvoyé l'e-mail de confirmation pour %{target}" reset_password_user_html: "%{name} a réinitialisé le mot de passe de l'utilisateur·rice %{target}" resolve_report_html: "%{name} a résolu le signalement %{target}" sensitive_account_html: "%{name} a marqué le média de %{target} comme sensible" @@ -284,6 +286,7 @@ fr-CA: update_custom_emoji_html: "%{name} a mis à jour l'émoji %{target}" update_domain_block_html: "%{name} a mis à jour le blocage de domaine pour %{target}" update_ip_block_html: "%{name} a modifié la règle pour l'IP %{target}" + update_report_html: "%{name} a mis à jour le rapport de signalement %{target}" update_status_html: "%{name} a mis à jour le message de %{target}" update_user_role_html: "%{name} a changé le rôle %{target}" deleted_account: compte supprimé @@ -439,7 +442,12 @@ fr-CA: create: Créer le blocage resolve: Résoudre le domaine title: Blocage d'un nouveau domaine de messagerie électronique + no_email_domain_block_selected: Aucun blocage de domaine de messagerie n'a été modifié comme aucun n'a été sélectionné not_permitted: Non autorisé + resolved_dns_records_hint_html: |- + Le nom de domaine se réfère aux domaines MX suivants, qui sont à leur tour responsables de la réception des courriels. + + Le blocage d'un domaine MX empêchera l'inscription depuis toute adresse électronique ayant recours au même domaine MX, et ce même si le nom de domaine visible est différent. Veillez à ne pas bloquer les principaux fournisseurs de services de messagerie. resolved_through_html: Résolu par %{domain} title: Domaines de messagerie électronique bloqués export_domain_allows: @@ -595,7 +603,9 @@ fr-CA: resolve_description_html: Aucune mesure ne sera prise contre le compte signalé, aucune sanction ne sera enregistrée et le sigalement sera clôturé. silence_description_html: Le compte ne sera visible que par ceux qui le suivent déjà ou qui le recherchent manuellement, ce qui limite fortement sa portée. Cette action peut toujours être annulée. Cloture tous les signalements concernant ce compte. suspend_description_html: Le compte et tous ses contenus seront inaccessibles et finalement supprimés, et il sera impossible d'interagir avec lui. Réversible dans les 30 jours. Cloture tous les signalements concernant ce compte. + actions_description_html: Décidez de l'action à entreprendre pour résoudre ce signalement. Si vous prenez une mesure punitive à l'encontre du compte signalé, une notification par courrier électronique lui sera envoyée, excepté lorsque la catégorie Spam est sélectionnée. actions_description_remote_html: Décidez des mesures à prendre pour résoudre ce signalement. Cela n'affectera que la manière dont votre serveur communique avec ce compte distant et traite son contenu. + actions_no_posts: Ce signalement n'a pas de messages qui lui sont associés et qui devraient être supprimés add_to_report: Ajouter davantage au rapport already_suspended_badges: local: Déjà suspendu sur ce serveur @@ -717,6 +727,7 @@ fr-CA: manage_taxonomies: Gérer les taxonomies manage_taxonomies_description: Permet aux utilisateur⋅rice⋅s d'examiner les contenus tendance et de mettre à jour les paramètres des hashtags manage_user_access: Gérer l'accès utilisateur + manage_user_access_description: Permet aux utilisateur·rice·s de désactiver l'authentification à deux facteurs des autres utilisateur·rice·s, de modifier leur adresse électronique et de réinitialiser leur mot de passe manage_users: Gérer les utilisateur·rice·s manage_users_description: Permet aux utilisateur⋅rice⋅s de voir les détails des autres utilisateur⋅rice⋅s et d'effectuer des actions de modération en conséquence manage_webhooks: Gérer les points d’ancrage web @@ -879,16 +890,19 @@ fr-CA: message_html: "Votre serveur web est mal configuré. La confidentialité de vos utilisateurs est en péril." tags: moderation: + not_trendable: Ne peut être en tendance not_usable: Non utilisable pending_review: En attente de traitement review_requested: Révision requise reviewed: Traité title: État + trendable: Peut s'afficher dans les tendances unreviewed: Non traité usable: Utilisable name: Nom newest: Plus récents oldest: Plus anciens + open: Afficher publiquement reset: Réinitialiser review: État du traitement search: Recherche @@ -1147,6 +1161,12 @@ fr-CA: view_strikes: Voir les sanctions précédemment appliquées à votre compte too_fast: Formulaire envoyé trop rapidement, veuillez réessayer. use_security_key: Utiliser la clé de sécurité + author_attribution: + example_title: Exemple de texte + hint_html: Déterminez la façon dont vous êtes crédité lorsque des liens sont partagés sur Mastodon. + more_from_html: Plus via %{name} + s_blog: Blog de %{name} + title: Attribution de l'auteur·e challenge: confirm: Continuer hint_html: "Astuce : Nous ne vous demanderons plus votre mot de passe pour la prochaine heure." @@ -1428,6 +1448,15 @@ fr-CA: unsubscribe: action: Oui, me désabonner complete: Désabonné·e + emails: + notification_emails: + favourite: e-mails de notifications de favoris + follow: e-mails de notifications d’abonnements + follow_request: e-mails de demandes d’abonnements + mention: e-mails de notifications de mentions + reblog: e-mails de notifications de partages + resubscribe_html: Si vous vous êtes désinscrit par erreur, vous pouvez vous réinscrire à partir de vos paramètres de notification par e-mail. + success_html: Vous ne recevrez plus de %{type} pour Mastodon sur %{domain} à votre adresse e-mail à %{email}. title: Se désabonner media_attachments: validations: @@ -1914,6 +1943,7 @@ fr-CA: instructions_html: Copiez et collez le code ci-dessous dans le code HTML de votre site web. Ajoutez ensuite l’adresse de votre site dans l’un des champs supplémentaires de votre profil à partir de l‘onglet "Modifier le profil" et enregistrez les modifications. verification: Vérification verified_links: Vos liens vérifiés + website_verification: Vérification du site web webauthn_credentials: add: Ajouter une nouvelle clé de sécurité create: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index b2c692ea6f..bc616d2896 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -24,6 +24,7 @@ fr: admin: account_actions: action: Effectuer l'action + already_silenced: Ce compte a déjà été limité. already_suspended: Ce compte est déjà suspendu. title: Effectuer une action de modération sur %{acct} account_moderation_notes: @@ -133,7 +134,7 @@ fr: resubscribe: Se réabonner role: Rôle search: Rechercher - search_same_email_domain: Autres utilisateurs avec le même domaine de courriel + search_same_email_domain: Autres utilisateur·rice·s ayant le même domaine de messagerie search_same_ip: Autres utilisateur·rice·s avec la même IP security: Sécurité security_measures: @@ -270,6 +271,7 @@ fr: reject_user_html: "%{name} a rejeté l’inscription de %{target}" remove_avatar_user_html: "%{name} a supprimé l'avatar de %{target}" reopen_report_html: "%{name} a rouvert le signalement %{target}" + resend_user_html: "%{name} a renvoyé l'e-mail de confirmation pour %{target}" reset_password_user_html: "%{name} a réinitialisé le mot de passe de l'utilisateur·rice %{target}" resolve_report_html: "%{name} a résolu le signalement %{target}" sensitive_account_html: "%{name} a marqué le média de %{target} comme sensible" @@ -284,6 +286,7 @@ fr: update_custom_emoji_html: "%{name} a mis à jour l'émoji %{target}" update_domain_block_html: "%{name} a mis à jour le blocage de domaine pour %{target}" update_ip_block_html: "%{name} a modifié la règle pour l'IP %{target}" + update_report_html: "%{name} a mis à jour le rapport de signalement %{target}" update_status_html: "%{name} a mis à jour le message de %{target}" update_user_role_html: "%{name} a changé le rôle %{target}" deleted_account: compte supprimé @@ -439,7 +442,12 @@ fr: create: Créer le blocage resolve: Résoudre le domaine title: Blocage d'un nouveau domaine de messagerie électronique + no_email_domain_block_selected: Aucun blocage de domaine de messagerie n'a été modifié comme aucun n'a été sélectionné not_permitted: Non autorisé + resolved_dns_records_hint_html: |- + Le nom de domaine se réfère aux domaines MX suivants, qui sont à leur tour responsables de la réception des courriels. + + Le blocage d'un domaine MX empêchera l'inscription depuis toute adresse électronique ayant recours au même domaine MX, et ce même si le nom de domaine visible est différent. Veillez à ne pas bloquer les principaux fournisseurs de services de messagerie. resolved_through_html: Résolu par %{domain} title: Domaines de messagerie électronique bloqués export_domain_allows: @@ -595,7 +603,9 @@ fr: resolve_description_html: Aucune mesure ne sera prise contre le compte signalé, aucune sanction ne sera enregistrée et le sigalement sera clôturé. silence_description_html: Le compte ne sera visible que par ceux qui le suivent déjà ou qui le recherchent manuellement, ce qui limite fortement sa portée. Cette action peut toujours être annulée. Cloture tous les signalements concernant ce compte. suspend_description_html: Le compte et tous ses contenus seront inaccessibles et finalement supprimés, et il sera impossible d'interagir avec lui. Réversible dans les 30 jours. Cloture tous les signalements concernant ce compte. + actions_description_html: Décidez de l'action à entreprendre pour résoudre ce signalement. Si vous prenez une mesure punitive à l'encontre du compte signalé, une notification par courrier électronique lui sera envoyée, excepté lorsque la catégorie Spam est sélectionnée. actions_description_remote_html: Décidez des mesures à prendre pour résoudre ce signalement. Cela n'affectera que la manière dont votre serveur communique avec ce compte distant et traite son contenu. + actions_no_posts: Ce signalement n'a pas de messages qui lui sont associés et qui devraient être supprimés add_to_report: Ajouter davantage au rapport already_suspended_badges: local: Déjà suspendu sur ce serveur @@ -717,6 +727,7 @@ fr: manage_taxonomies: Gérer les taxonomies manage_taxonomies_description: Permet aux utilisateur⋅rice⋅s d'examiner les contenus tendance et de mettre à jour les paramètres des hashtags manage_user_access: Gérer l'accès utilisateur + manage_user_access_description: Permet aux utilisateur·rice·s de désactiver l'authentification à deux facteurs des autres utilisateur·rice·s, de modifier leur adresse électronique et de réinitialiser leur mot de passe manage_users: Gérer les utilisateur·rice·s manage_users_description: Permet aux utilisateur⋅rice⋅s de voir les détails des autres utilisateur⋅rice⋅s et d'effectuer des actions de modération en conséquence manage_webhooks: Gérer les points d’ancrage web @@ -879,16 +890,19 @@ fr: message_html: "Votre serveur web est mal configuré. La confidentialité de vos utilisateurs est en péril." tags: moderation: + not_trendable: Ne peut être en tendance not_usable: Non utilisable pending_review: En attente de traitement review_requested: Révision requise reviewed: Traité title: État + trendable: Peut s'afficher dans les tendances unreviewed: Non traité usable: Utilisable name: Nom newest: Plus récents oldest: Plus anciens + open: Afficher publiquement reset: Réinitialiser review: État du traitement search: Recherche @@ -1147,6 +1161,12 @@ fr: view_strikes: Voir les sanctions précédemment appliquées à votre compte too_fast: Formulaire envoyé trop rapidement, veuillez réessayer. use_security_key: Utiliser la clé de sécurité + author_attribution: + example_title: Exemple de texte + hint_html: Déterminez la façon dont vous êtes crédité lorsque des liens sont partagés sur Mastodon. + more_from_html: Plus via %{name} + s_blog: Blog de %{name} + title: Attribution de l'auteur·e challenge: confirm: Continuer hint_html: "Astuce : Nous ne vous demanderons plus votre mot de passe pour la prochaine heure." @@ -1428,6 +1448,15 @@ fr: unsubscribe: action: Oui, se désinscrire complete: Désinscrit + emails: + notification_emails: + favourite: e-mails de notifications de favoris + follow: e-mails de notifications d’abonnements + follow_request: e-mails de demandes d’abonnements + mention: e-mails de notifications de mentions + reblog: e-mails de notifications de partages + resubscribe_html: Si vous vous êtes désinscrit par erreur, vous pouvez vous réinscrire à partir de vos paramètres de notification par e-mail. + success_html: Vous ne recevrez plus de %{type} pour Mastodon sur %{domain} à votre adresse e-mail à %{email}. title: Se désinscrire media_attachments: validations: @@ -1914,6 +1943,7 @@ fr: instructions_html: Copiez et collez le code ci-dessous dans le code HTML de votre site web. Ajoutez ensuite l’adresse de votre site dans l’un des champs supplémentaires de votre profil à partir de l‘onglet « Modifier le profil » et enregistrez les modifications. verification: Vérification verified_links: Vos liens vérifiés + website_verification: Vérification du site web webauthn_credentials: add: Ajouter une nouvelle clé de sécurité create: diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 09d5f7ae18..1071871c95 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -30,6 +30,7 @@ ga: admin: account_actions: action: Déan gníomh + already_silenced: Tá teorainn leis an gcuntas seo cheana féin. already_suspended: Tá an cuntas seo curtha ar fionraí cheana féin. title: Dean gníomh modhnóireachta ar %{acct} account_moderation_notes: @@ -1213,6 +1214,12 @@ ga: view_strikes: Féach ar stailceanna san am atá caite i gcoinne do chuntais too_fast: Cuireadh an fhoirm isteach róthapa, triail arís. use_security_key: Úsáid eochair shlándála + author_attribution: + example_title: Téacs samplach + hint_html: Rialú conas a chuirtear chun sochair tú nuair a roinntear naisc ar Mastodon. + more_from_html: Tuilleadh ó %{name} + s_blog: Blag %{name} + title: Leithdháil an údair challenge: confirm: Lean ar aghaidh hint_html: "Leid: Ní iarrfaimid do phasfhocal ort arís go ceann uair an chloig eile." @@ -2029,6 +2036,7 @@ ga: instructions_html: Cóipeáil agus greamaigh an cód thíos isteach i HTML do shuíomh Gréasáin. Ansin cuir seoladh do shuíomh Gréasáin isteach i gceann de na réimsí breise ar do phróifíl ón gcluaisín "Cuir próifíl in eagar" agus sábháil athruithe. verification: Fíorú verified_links: Do naisc fhíoraithe + website_verification: Fíorú láithreán gréasáin webauthn_credentials: add: Cuir eochair shlándála nua leis create: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 3f30d37823..5e63b5bd23 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -28,6 +28,7 @@ gd: admin: account_actions: action: Gabh an gnìomh + already_silenced: Chaidh an cunntas seo a chuingeachadh mu thràth. already_suspended: Chaidh an cunntas seo a chur à rèim mu thràth. title: Gabh gnìomh maorsainneachd air %{acct} account_moderation_notes: @@ -1195,6 +1196,12 @@ gd: view_strikes: Seall na rabhaidhean a fhuair an cunntas agad roimhe too_fast: Chaidh am foirm a chur a-null ro luath, feuch ris a-rithist. use_security_key: Cleachd iuchair tèarainteachd + author_attribution: + example_title: Ball-sampaill teacsa + hint_html: Stùirich mar a thèid iomradh a thoirt ort nuair a thèid ceangal a cho-roinneadh air Mastodon. + more_from_html: Barrachd o %{name} + s_blog: Bloga aig %{name} + title: Aithris air an ùghdar challenge: confirm: Lean air adhart hint_html: "Gliocas: Chan iarr sinn am facal-faire agad ort a-rithist fad uair a thìde." @@ -1998,6 +2005,7 @@ gd: instructions_html: Dèan lethbhreac dhen chòd gu h-ìosal is cuir a-steach ann an HTML na làraich-lìn agad e. An uairsin, cuir seòladh na làraich-lìn agad ri fear dhe na raointean a bharrachd air a’ phròifil agad o thaba “Deasaich a’ phròifil” agus sàbhail na h-atharraichean. verification: Dearbhadh verified_links: Na ceanglaichean dearbhte agad + website_verification: Dearbhadh làraich-lìn webauthn_credentials: add: Cuir iuchair tèarainteachd ùr ris create: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 42495053e9..fa07eb6f59 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -421,9 +421,21 @@ lt: domain: Domenas new: create: Pridėto domeną + export_domain_allows: + new: + title: Importuoti domeno leidžiamus + no_file: Nėra pasirinkto failo export_domain_blocks: import: description_html: Netrukus importuosi domenų blokavimų sąrašą. Labai atidžiai peržiūrėk šį sąrašą, ypač jei ne tu jį sudarei. + existing_relationships_warning: Esami sekimo sąryšiai + private_comment_description_html: 'Kad būtų lengviau atsekti, iš kur importuoti blokavimai, importuoti blokavimai bus kuriami su šiuo privačiu komentaru: %{comment}' + private_comment_template: Importuota iš %{source}, %{date} + title: Importuoti domeno blokavimus + invalid_domain_block: 'Vienas ar daugiau domenų blokavimų buvo praleisti dėl toliau nurodytos (-ų) klaidos (-ų): %{error}' + new: + title: Importuoti domeno blokavimus + no_file: Nėra pasirinkto failo follow_recommendations: language: Kalbui status: Būsena @@ -853,18 +865,18 @@ lt: exports: archive_takeout: date: Data - download: Parsisiųsti archyvą - hint_html: Jūs galite prašyti savo įrašų bei medijos archyvo. Eksportuota informacija bus ActivityPub formatu, skaitoma suderintų programų. Galite prašyti archyvo, kas 7 dienas. + download: Atsisiųsti archyvą + hint_html: Gali paprašyti savo įrašų ir įkeltos medijos archyvo. Eksportuoti duomenys bus „ActivityPub“ formatu, kurį galima perskaityti bet kuria suderinama programine įranga. Archyvo galima prašyti kas 7 dienas. in_progress: Sudaromas archyvas... request: Prašyti savo archyvo size: Dydis - blocks: Jūs blokuojate + blocks: Blokuoji bookmarks: Žymės csv: CSV - domain_blocks: Domeno blokai + domain_blocks: Domeno blokavimai lists: Sąrašai - mutes: Jūs tildote - storage: Medijos sandėlis + mutes: Nutildei + storage: Medijos saugykla featured_tags: add_new: Pridėti naują hint_html: "Savo profilyje parodyk svarbiausius saitažodžius. Tai puikus įrankis kūrybiniams darbams ir ilgalaikiams projektams sekti, todėl svarbiausios saitažodžiai rodomi matomoje vietoje profilyje ir leidžia greitai pasiekti tavo paties įrašus." @@ -904,7 +916,7 @@ lt: merge_long: Išsaugoti esančius įrašus ir pridėti naujus overwrite: Perrašyti overwrite_long: Pakeisti senus įrašus naujais - preface: Jūs galite importuoti informaciją iš kito serverio, tokią kaip sąrašą žmonių kuriuos sekate. + preface: Gali importuoti duomenis, kuriuos eksportavai iš kito serverio, pavyzdžiui, sekamų arba blokuojamų žmonių sąrašą. success: Jūsų informacija sėkmingai įkelta ir bus apdorota kaip įmanoma greičiau types: blocking: Blokuojamų sąrašas @@ -955,6 +967,8 @@ lt: migrations: acct: Perkelta į cancel: Atšaukti nukreipimą + warning: + disabled_account: Po to tavo dabartine paskyra nebus galima naudotis visiškai. Tačiau turėsi prieigą prie duomenų eksporto ir pakartotinio aktyvavimo. moderation: title: Prižiūrėjimas notification_mailer: @@ -1079,6 +1093,7 @@ lt: export: Duomenų eksportas featured_tags: Rodomi saitažodžiai import: Importuoti + import_and_export: Importas ir eksportas migrate: Paskyros migracija notifications: El. laiško pranešimai preferences: Nuostatos diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 09e6b9ba0e..55a0751811 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -26,6 +26,8 @@ lv: admin: account_actions: action: Veikt darbību + already_silenced: Šis konts jau ir ierobežots. + already_suspended: Šis konts jau ir aizturēts. title: Veikt moderācijas darbību %{acct} account_moderation_notes: create: Atstāt piezīmi @@ -46,6 +48,7 @@ lv: title: Mainīt e-pastu %{username} change_role: changed_msg: Loma veiksmīgi nomainīta! + edit_roles: Pārvaldīt lietotāju lomas label: Mainīt lomu no_role: Nav lomas title: Mainīt lomu %{username} @@ -131,6 +134,7 @@ lv: resubscribe: Pieteikties vēlreiz role: Loma search: Meklēt + search_same_email_domain: Citi lietotāji ar tādu pašu e-pasta domēnu search_same_ip: Citi lietotāji ar tādu pašu IP security: Drošība security_measures: @@ -171,6 +175,7 @@ lv: approve_appeal: Apstiprināt Apelāciju approve_user: Apstiprināt lietotāju assigned_to_self_report: Piešķirt Pārskatu + change_email_user: Mainīt lietotāja e-pasta adresi change_role_user: Mainīt lietotāja lomu confirm_user: Apstiprināt lietotāju create_account_warning: Izveidot Brīdinājumu @@ -217,13 +222,16 @@ lv: update_custom_emoji: Atjaunināt pielāgoto emocijzīmi update_domain_block: Atjaunināt Domēna Bloku update_ip_block: Atjaunināt IP noteikumu + update_report: Atjaunināt atskaiti update_status: Atjaunināt ziņu update_user_role: Atjaunināt lomu actions: approve_appeal_html: "%{name} apstiprināja moderācijas lēmuma apelāciju no %{target}" approve_user_html: "%{name} apstiprināja reģistrēšanos no %{target}" assigned_to_self_report_html: "%{name} piešķīra pārskatu %{target} sev" + change_email_user_html: "%{name} nomainīja lietotāja %{target} e-pasta adresi" change_role_user_html: "%{name} nomainīja lomu uz %{target}" + confirm_user_html: "%{name} apstiprināja lietotāja %{target} e-pasta adresi" create_account_warning_html: "%{name} nosūtīja brīdinājumu %{target}" create_announcement_html: "%{name} izveidoja jaunu paziņojumu %{target}" create_custom_emoji_html: "%{name} augšupielādēja jaunu emocijzīmi %{target}" @@ -253,6 +261,7 @@ lv: reject_user_html: "%{name} noraidīja reģistrēšanos no %{target}" remove_avatar_user_html: "%{name} noņēma %{target} profila attēlu" reopen_report_html: "%{name} atkārtoti atvēra ziņojumu %{target}" + resend_user_html: "%{name} atkārtoti nosūtīja %{target} apstiprinājuma e-pasta ziņojumu" reset_password_user_html: "%{name} atiestatīja paroli lietotājam %{target}" resolve_report_html: "%{name} atrisināja ziņojumu %{target}" sensitive_account_html: "%{name} atzīmēja %{target} multividi kā sensitīvu" @@ -267,6 +276,7 @@ lv: update_custom_emoji_html: "%{name} atjaunināja emocijzīmi %{target}" update_domain_block_html: "%{name} atjaunināja domēna bloku %{target}" update_ip_block_html: "%{name} mainīja nosacījumu priekš IP %{target}" + update_report_html: "%{name} atjaunināja %{target} pārskatu" update_status_html: "%{name} atjaunināja ziņu %{target}" update_user_role_html: "%{name} nomainīja %{target} lomu" deleted_account: dzēsts konts @@ -274,6 +284,7 @@ lv: filter_by_action: Filtrēt pēc darbības filter_by_user: Filtrēt pēc lietotāja title: Auditācijas pieraksti + unavailable_instance: "(domēna vārds nav pieejams)" announcements: destroyed_msg: Paziņojums ir veiksmīgi izdzēsts! edit: @@ -450,6 +461,9 @@ lv: title: Sekošanas ieteikumi unsuppress: Atjaunot sekošanas rekomendāciju instances: + audit_log: + title: Nesenie pārbaudes žurnāli + view_all: Skatīt pilnus pārbaudes žurnālus availability: description_html: one: Ja piegāde uz domēnu neizdodas %{count} dienu bez panākumiem, turpmāki piegādes mēģinājumi netiks veikti, ja vien netiks saņemta piegāde no domēna. @@ -580,7 +594,9 @@ lv: resolve_description_html: Pret norādīto kontu netiks veiktas nekādas darbības, netiks reģistrēts brīdinājums, un ziņojums tiks slēgts. silence_description_html: Konts būs redzams tikai tiem, kas tam jau seko vai meklē to manuāli, ievērojami ierobežojot tā sasniedzamību. To vienmēr var atgriezt. Tiek aizvērti visi šī konta pārskati. suspend_description_html: Konts un viss tā saturs nebūs pieejams un galu galā tiks izdzēsts, un mijiedarbība ar to nebūs iespējama. Atgriežams 30 dienu laikā. Tiek aizvērti visi šī konta pārskati. + actions_description_html: Izlem, kādas darbības jāveic, lai atrisinātu šo ziņojumu. Ja tiks pieņemti sodoši mēri pret kontu, par kuru ziņots, tam e-pastā tiks nosūtīts paziņojums, izņemot gadījumus, kad ir atlasīta kategorija Mēstules. actions_description_remote_html: Izlem, kādas darbības jāveic, lai atrisinātu šo ziņojumu. Tas ietekmēs tikai to, kā tavs serveris sazinās ar šo attālo kontu un apstrādā tā saturu. + actions_no_posts: Šim ziņojumam nav saistītu ierakstu, kurus izdzēst add_to_report: Pievienot varāk paziņošanai are_you_sure: Vai esi pārliecināts? assign_to_self: Piešķirt man @@ -855,7 +871,13 @@ lv: action: Pārbaudi šeit, lai iegūtu plašāku informāciju message_html: "Tava objektu krātuve ir nepareizi konfigurēta. Tavu lietotāju privātums ir apdraudēts." tags: + moderation: + not_usable: Nav izmantojams + pending_review: Gaida pārskatīšanu + review_requested: Pieprasīta pārskatīšana + reviewed: Pārskatīts review: Pārskatīt stāvokli + title: Tēmturi updated_msg: Tēmtura iestatījumi ir veiksmīgi atjaunināti title: Administrēšana trends: @@ -929,6 +951,7 @@ lv: delete: Dzēst edit_preset: Labot iepriekš iestatītus brīdinājumus empty: Tu vēl neesi definējis iepriekš iestatītos brīdinājumus. + title: Brīdinājumu priekšiestatījums webhooks: add_new: Pievienot galapunktu delete: Dzēst @@ -1004,7 +1027,9 @@ lv: guide_link_text: Ikviens var piedalīties. sensitive_content: Sensitīvs saturs application_mailer: + notification_preferences: Mainīt e-pasta uztādījumus salutation: "%{name}," + settings: 'Mainīt e-pasta uztādījumus: %{link}' unsubscribe: Atcelt abonēšanu view: 'Skatīt:' view_profile: Skatīt profilu @@ -1024,6 +1049,7 @@ lv: hint_html: Vēl tikai viena lieta! Mums ir jāapstiprina, ka tu esi cilvēks (tas ir tāpēc, lai mēs varētu nepieļaut surogātpasta izsūtīšanu!). Atrisini tālāk norādīto CAPTCHA un noklikšķini uz "Turpināt". title: Drošības pārbaude confirmations: + awaiting_review: E-pasta adrese ir apstiprināta. %{domain} darbinieki tagad pārskata reģistrāciju. Tiks saņemts e-pasta ziņojums, ja viņi apstiprinās kontu. awaiting_review_title: Tava reģistrācija tiek izskatīta clicking_this_link: klikšķinot šo saiti login_link: pieteikties @@ -1031,6 +1057,7 @@ lv: redirect_to_app_html: Tev vajadzētu būt novirzītam uz lietotni %{app_name}. Ja tas nenotika, mēģini %{clicking_this_link} vai manuāli atgriezieties lietotnē. registration_complete: Tava reģistrācija domēnā %{domain} tagad ir pabeigta! welcome_title: Laipni lūdzam, %{name}! + wrong_email_hint: Ja šī e-pasta adrese nav pareiza, to var mainīt konta iestatījumos. delete_account: Dzēst kontu delete_account_html: Ja vēlies dzēst savu kontu, tu vari turpināt šeit. Tev tiks lūgts apstiprinājums. description: @@ -1051,6 +1078,7 @@ lv: or_log_in_with: Vai piesakies ar privacy_policy_agreement_html: Esmu izlasījis un piekrītu privātuma politikai progress: + confirm: Apstiprināt e-pasta adresi details: Tavi dati review: Mūsu apskats rules: Pieņemt noteikumus @@ -1072,8 +1100,10 @@ lv: security: Drošība set_new_password: Iestatīt jaunu paroli setup: + email_below_hint_html: Jāpārbauda sava surogātpasta mape vai jāpieprasa vēl vienu! Savu e-pasta adresi var labot, ja tā ir nepareiza. email_settings_hint_html: Noklikšķini uz saites, kuru mēs tev nosūtījām, lai apstiprinātu %{email}. Mēs tepat pagaidīsim. link_not_received: Vai nesaņēmi sati? + new_confirmation_instructions_sent: Pēc dažām minūtēm saņemsi jaunu e-pasta ziņojumu ar apstiprinājuma saiti. title: Pārbaudi savu iesūtni sign_in: preamble_html: Jāpiesakās ar saviem %{domain} piekļuves datiem. Ja Tavs konts tiek mitināts citā serverī, Tu nevarēsi šeit pieteikties. @@ -1084,6 +1114,7 @@ lv: title: Atļauj tevi iestatīt %{domain}. status: account_status: Konta statuss + confirming: Gaida e-pasta adreses apstiprināšanas pabeigšanu. functional: Tavs konts ir pilnā darba kārtībā. redirecting_to: Tavs konts ir neaktīvs, jo pašlaik tas tiek novirzīts uz %{acct}. self_destruct: Tā kā %{domain} tiek slēgts, tu iegūsi tikai ierobežotu piekļuvi savam kontam. @@ -1094,7 +1125,7 @@ lv: confirm: Turpināt hint_html: "Padoms: Nākamās stundas laikā mēs tev vairs neprasīsim paroli." invalid_password: Nepareiza parole - prompt: Lai turpinātu, apstiprini paroli + prompt: Lai turpinātu, jāapstiprina parole crypto: errors: invalid_key: nav derīga Ed25519 vai Curve25519 atslēga diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 489fb2b89b..f155490eb5 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -24,6 +24,7 @@ pt-PT: admin: account_actions: action: Executar acção + already_silenced: Esta conta já foi limitada. already_suspended: Esta conta já foi suspensa. title: Executar ação de moderação em %{acct} account_moderation_notes: @@ -272,6 +273,7 @@ pt-PT: reject_user_html: "%{name} rejeitou a inscrição de %{target}" remove_avatar_user_html: "%{name} removeu a imagem de perfil de %{target}" reopen_report_html: "%{name} reabriu a denúncia %{target}" + resend_user_html: "%{name} reenviou e-mail de confirmação para %{target}" reset_password_user_html: "%{name} restabeleceu a palavra-passe do utilizador %{target}" resolve_report_html: "%{name} resolveu a denúncia %{target}" sensitive_account_html: "%{name} marcou a media de %{target} como sensível" @@ -432,6 +434,7 @@ pt-PT: attempts_over_week: one: "%{count} tentativa na última semana" other: "%{count} tentativas de inscrição na última semana" + created_msg: Domínio de e-mail bloqueado com sucesso delete: Eliminar dns: types: @@ -440,8 +443,12 @@ pt-PT: new: create: Adicionar domínio resolve: Domínio de resolução + title: Bloquear novo domínio de e-mail + no_email_domain_block_selected: Não foram alterados quaisquer bloqueios de domínios de e-mail, uma vez que nenhum foi selecionado not_permitted: Não permitido + resolved_dns_records_hint_html: O nome de domínio resolve para os seguintes domínios MX, que são, em última análise, responsáveis por aceitar o e-mail. Bloquear um domínio MX irá bloquear as inscrições de qualquer endereço de e-mail que use o mesmo domínio MX, mesmo quando o nome de domínio visível é diferente. Cuidado para não bloquear os principais provedores de e-mail. resolved_through_html: Resolvido através de %{domain} + title: Domínios de e-mail bloqueados export_domain_allows: new: title: Importar permissões de domínio @@ -595,7 +602,9 @@ pt-PT: resolve_description_html: Nenhuma ação será tomada contra a conta denunciada, não será registada nenhuma reprimenda, e a denúncia será fechada. silence_description_html: O perfil será visível apenas para aqueles que já o seguem ou o procurem manualmente, limitando fortemente o seu alcance. Pode sempre ser revertido. Encerrar todas as denúncias contra esta conta. suspend_description_html: A conta e todo o seu conteúdo ficará inacessível e, eventualmente apagado, pelo que interagir com ela será impossível. Reversível durante 30 dias. Encerra todas as denúncias contra esta conta. + actions_description_html: Decida a ação a tomar para resolver esta denúncia. Se decidir por uma ação punitiva contra a conta denunciada, um e-mail de notificação será enviado, excetuando quando selecionada a categoria Spam. actions_description_remote_html: Decida quais as medidas a tomar para resolver esta denúncia. Isso apenas afetará como o seu servido comunica com esta conta remota e gere o seu conteúdo. + actions_no_posts: Este relatório não tem nenhuma publicação associada para eliminar add_to_report: Adicionar mais à denúncia already_suspended_badges: local: Já suspenso neste servidor @@ -659,6 +668,7 @@ pt-PT: delete_data_html: Eliminar o perfil de @%{acct} e conteúdos daqui a 30 dias, a menos que entretanto sejam suspensos preview_preamble_html: "@%{acct} receberá um aviso com o seguinte conteúdo:" record_strike_html: Registar um ataque contra @%{acct} para ajudar a escalar futuras violações desta conta + send_email_html: Enviar um e-mail de aviso a @%{acct} warning_placeholder: Argumentos adicionais opcionais para a acção de moderação. target_origin: Origem da conta denunciada title: Denúncias @@ -698,6 +708,7 @@ pt-PT: manage_appeals: Gerir apelos manage_appeals_description: Permite aos utilizadores rever recursos de moderação manage_blocks: Gerir bloqueios + manage_blocks_description: Permite aos utilizadores bloquear fornecedores de e-mail e endereços IP manage_custom_emojis: Gerir emojis personalizados manage_custom_emojis_description: Permite aos utilizadores gerirem os emojis personalizados do servidor manage_federation: Gerir federação @@ -715,6 +726,7 @@ pt-PT: manage_taxonomies: Gerir taxonomias manage_taxonomies_description: Permite aos utilizadores rever o conteúdo em tendência e atualizar as configurações de hashtag manage_user_access: Gerir acesso de utilizador + manage_user_access_description: Permite aos utilizadores desativar a autenticação de dois factores de outros utilizadores, alterar o seu e-mail e reiniciar a sua palavra-passe manage_users: Gerir utilizadores manage_users_description: Permite aos utilizadores ver os detalhes de outros utilizadores e executar ações de moderação contra eles manage_webhooks: Gerir webhooks @@ -789,6 +801,7 @@ pt-PT: destroyed_msg: Envio do site eliminado com sucesso! software_updates: critical_update: Crítico — por favor, atualize rapidamente + description: Recomenda-se que mantenha a sua instalação do Mastodon atualizada para beneficiar das últimas correções e funcionalidades. Além disso, é por vezes crítico atualizar o Mastodon de forma atempada para evitar problemas de segurança. Por estas razões, o Mastodon verifica se há actualizações a cada 30 minutos e notifica-o de acordo com as suas preferências de notificação por e-mail. documentation_link: Saber mais release_notes: Notas de lançamento title: Atualizações disponíveis @@ -888,6 +901,7 @@ pt-PT: name: Nome newest: Mais recente oldest: Mais antiga + open: Visualizar Publicamente reset: Repor review: Estado da revisão search: Pesquisar @@ -897,10 +911,16 @@ pt-PT: trends: allow: Permitir approved: Aprovado + confirm_allow: Tem a certeza que pretende permitir as etiquetas selecionadas? + confirm_disallow: Tem a certeza que pretende rejeitar as etiquetas selecionadas? disallow: Não permitir links: allow: Permitir hiperligação allow_provider: Permitir editor + confirm_allow: Tem a certeza que pretende permitir as hiperligações selecionadas? + confirm_allow_provider: Tem a certeza que pretende permitir os fornecedores selecionados? + confirm_disallow: Tem a certeza que pretende rejeitar as hiperligações selecionadas? + confirm_disallow_provider: Tem a certeza que pretende rejeitar os fornecedores selecionados? description_html: Estas são as ligações que presentemente estão a ser muito partilhadas por contas visíveis pelo seu servidor. Estas podem ajudar os seus utilizador a descobrir o que está a acontecer no mundo. Nenhuma ligação é exibida publicamente até que o editor a aprove. Também pode permitir ou rejeitar ligações em avulso. disallow: Não permitir ligação disallow_provider: Não permitir editor @@ -924,6 +944,10 @@ pt-PT: statuses: allow: Permitir publicação allow_account: Permitir autor + confirm_allow: Tem a certeza que pretende aceitar os estados selecionados? + confirm_allow_account: Tem a certeza que pretende aceitar as contas selecionadas? + confirm_disallow: Tem a certeza que pretende rejeitar os estados selecionados? + confirm_disallow_account: Tem a certeza que pretende rejeitar as contas selecionadas? description_html: Estas são publicações que o seu servidor conhece e que atualmente estão a ser frequentemente partilhadas e adicionadas aos favoritos. Isto pode ajudar os seus utilizadores, novos e retornados, a encontrar mais pessoas para seguir. Nenhuma publicação será exibida publicamente até que aprove o autor, e o autor permita que a sua conta seja sugerida a outros. Você também pode permitir ou rejeitar publicações individualmente. disallow: Não permitir publicação disallow_account: Não permitir autor @@ -1041,7 +1065,9 @@ pt-PT: guide_link_text: Todos podem contribuir. sensitive_content: Conteúdo problemático application_mailer: + notification_preferences: Alterar preferências de e-mail salutation: "%{name}," + settings: 'Alterar preferências de e-mail: %{link}' unsubscribe: Cancelar subscrição view: 'Ver:' view_profile: Ver perfil @@ -1061,6 +1087,7 @@ pt-PT: hint_html: Só mais uma coisa! Precisamos confirmar que você é um humano (isto para que possamos evitar spam!). Resolva o CAPTCHA abaixo e clique em "Continuar". title: Verificação de segurança confirmations: + awaiting_review: O seu endereço de e-mail está confirmado! A equipa de %{domain} está agora a analisar a sua inscrição. Receberá um e-mail se a sua conta for aprovada! awaiting_review_title: A sua inscrição está a ser revista clicking_this_link: clicar nesta hiperligação login_link: iniciar sessão @@ -1068,6 +1095,7 @@ pt-PT: redirect_to_app_html: Devia ter sido reencaminhado para a aplicação %{app_name}. Se isso não aconteceu, tente %{clicking_this_link} ou volte manualmente para a aplicação. registration_complete: O seu registo sem %{domain} está agora concluído! welcome_title: Bem-vindo(a), %{name}! + wrong_email_hint: Se este endereço de correio eletrónico não estiver correto, pode alterá-lo nas definições de conta. delete_account: Eliminar conta delete_account_html: Se deseja eliminar a sua conta, pode continuar aqui. Uma confirmação será solicitada. description: @@ -1088,6 +1116,7 @@ pt-PT: or_log_in_with: Ou iniciar sessão com privacy_policy_agreement_html: Eu li e concordo com a política de privacidade progress: + confirm: Confirmar e-mail details: Os seus dados review: A nossa avaliação rules: Aceitar regras @@ -1109,8 +1138,10 @@ pt-PT: security: Alterar palavra-passe set_new_password: Editar palavra-passe setup: + email_below_hint_html: Verifique a sua pasta de spam ou solicite outra. Pode corrigir o seu endereço de e-mail se estiver errado. email_settings_hint_html: Clique no link que enviamos para verificar %{email}. Esperaremos aqui. link_not_received: Não recebeu um link? + new_confirmation_instructions_sent: Irá receber uma nova mensagem de e-mail com a ligação de confirmação dentro de alguns minutos! title: Verifique a caixa de entrada do seu e-mail sign_in: preamble_html: Iniciar sessão com as suas credenciais de %{domain}. Se a sua conta estiver hospedada noutro servidor, não poderá iniciar sessão aqui. @@ -1121,12 +1152,20 @@ pt-PT: title: Vamos lá inscrevê-lo em %{domain}. status: account_status: Estado da conta + confirming: A aguardar a confirmação do e-mail para ser concluída. functional: A sua conta está totalmente operacional. + pending: A sua inscrição está a ser analisada pela nossa equipa. Este processo pode demorar algum tempo. Receberá um e-mail se a sua inscrição for aprovada. redirecting_to: A sua conta está inativa porque está atualmente a ser redirecionada para %{acct}. self_destruct: Como %{domain} vai fechar, só terá acesso limitado à sua conta. view_strikes: Veja as reprimendas anteriores sobre a sua conta too_fast: Formulário enviado demasiado rapidamente, tente novamente. use_security_key: Usar chave de segurança + author_attribution: + example_title: Texto de exemplo + hint_html: Controle a forma como é creditado quando as hiperligações são partilhadas no Mastodon. + more_from_html: Mais de %{name} + s_blog: Blog de %{name} + title: Atribuição de autor challenge: confirm: Continuar hint_html: "Dica: Não vamos pedir novamente a sua palavra-passe durante a próxima hora." @@ -1164,6 +1203,9 @@ pt-PT: before: 'Antes de continuar, por favor leia cuidadosamente estas notas:' caches: O conteúdo que foi armazenado em cache por outras instâncias pode perdurar data_removal: As suas publicações e outros dados serão eliminados permanentemente + email_change_html: Pode alterar o seu e-mail sem eliminar a sua conta + email_contact_html: Se ainda assim não o recebeu, pode enviar um e-mail para %{email} para obter ajuda + email_reconfirmation_html: Se não recebeu a mensagem de e-mail de confirmação, pode solicitá-la novamente irreversible: Não será possível restaurar ou reativar sua conta more_details_html: Para mais pormenores, leia a política de privacidade. username_available: O seu nome de utilizador ficará novamente disponível @@ -1394,6 +1436,7 @@ pt-PT: authentication_methods: otp: aplicação de autenticação em duas etapas password: palavra-passe + sign_in_token: código de segurança de e-mail webauthn: chaves de segurança description_html: Se vê atividade que não reconhece, considere alterar a sua palavra-passe e ativar a autenticação em duas etapas. empty: Sem histórico de autenticação disponível diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 0a665fb784..b591cdca57 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -3,6 +3,7 @@ ar: simple_form: hints: account: + attribution_domains_as_text: يحمي من الإسناد الزائف. discoverable: يمكن عرض مشاركاتك العامة وملفك الشخصي أو التوصية به في مختلف مناطق ماستدون ويمكن اقتراح ملفك الشخصي على مستخدمين آخرين. display_name: اسمك الكامل أو اسمك المرح. fields: صفحتك الرئيسية، ضمائرك، عمرك، أي شيء تريده. diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index ff66bcb59e..2a2d06ce9b 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -3,6 +3,7 @@ es-MX: simple_form: hints: account: + attribution_domains_as_text: Protege frente atribuciones fraudulentas. discoverable: Tu perfil y las publicaciones públicas pueden ser destacadas o recomendadas en varias áreas de Mastodon y tu perfil puede ser sugerido a otros usuarios. display_name: Tu nombre completo o tu nick. fields: Tu página de inicio, pronombres, edad, todo lo que quieras. @@ -130,6 +131,7 @@ es-MX: name: Sólo se puede cambiar el cajón de las letras, por ejemplo, para que sea más legible user: chosen_languages: Cuando se marca, solo se mostrarán los toots en los idiomas seleccionados en los timelines públicos + role: El rol controla qué permisos tiene el usuario. user_role: color: Color que se utilizará para el rol a lo largo de la interfaz de usuario, como RGB en formato hexadecimal highlighted: Esto hace que el rol sea públicamente visible @@ -142,6 +144,7 @@ es-MX: url: Donde los eventos serán enviados labels: account: + attribution_domains_as_text: Solo permitir sitios web específicos discoverable: Destacar el perfil y las publicaciones en el algoritmo de descubrimiento fields: name: Etiqueta diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 143c5d8075..b22701aae7 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -3,6 +3,7 @@ es: simple_form: hints: account: + attribution_domains_as_text: Protege frente atribuciones fraudulentas. discoverable: Tu perfil y publicaciones públicas pueden ser destacadas o recomendadas en varias áreas de Mastodon y tu perfil puede ser sugerido a otros usuarios. display_name: Tu nombre completo o tu apodo. fields: Tu carta de presentación, pronombres, edad, lo que quieras. @@ -130,6 +131,7 @@ es: name: Sólo se puede cambiar el cajón de las letras, por ejemplo, para que sea más legible user: chosen_languages: Cuando se marca, solo se mostrarán las publicaciones en los idiomas seleccionados en las líneas de tiempo públicas + role: El rol controla qué permisos tiene el usuario. user_role: color: Color que se utilizará para el rol a lo largo de la interfaz de usuario, como RGB en formato hexadecimal highlighted: Esto hace que el rol sea públicamente visible @@ -142,6 +144,7 @@ es: url: Donde los eventos serán enviados labels: account: + attribution_domains_as_text: Solo permitir sitios web específicos discoverable: Destacar perfil y publicaciones en algoritmos de descubrimiento fields: name: Etiqueta diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index 4a9245682d..8d045cfcfe 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -3,6 +3,7 @@ et: simple_form: hints: account: + attribution_domains_as_text: Kaitseb valede omistuste eest. discoverable: Su profiili ja avalikke postitusi võidakse Mastodoni erinevates piirkondades esile tõsta või soovitada ning su profiili soovitada teistele kasutajatele. display_name: Su täisnimi või naljanimi. fields: Su koduleht, sugu, vanus. Mistahes, mida soovid. @@ -143,6 +144,7 @@ et: url: Kuhu sündmused saadetakse labels: account: + attribution_domains_as_text: Luba vaid kindlad veebilehed discoverable: Tõsta postitused ja profiil avastamise algoritmides esile fields: name: Nimetus diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index a2b29566f6..5c85367dbb 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -3,6 +3,7 @@ fi: simple_form: hints: account: + attribution_domains_as_text: Suojaa vääriltä tunnustuksilta. discoverable: Julkisia julkaisujasi ja profiiliasi voidaan pitää esillä tai suositella Mastodonin eri alueilla ja profiiliasi voidaan ehdottaa toisille käyttäjille. display_name: Koko nimesi tai lempinimesi. fields: Verkkosivustosi, pronominisi, ikäsi ja mitä ikinä haluatkaan ilmoittaa. diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index 1128335f11..90a268f411 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -3,6 +3,7 @@ fr-CA: simple_form: hints: account: + attribution_domains_as_text: Protège contre les fausses attributions. discoverable: Vos messages publics et votre profil peuvent être mis en avant ou recommandés dans diverses parties de Mastodon et votre profil peut être suggéré à d’autres utilisateurs. display_name: Votre nom complet ou votre nom cool. fields: Votre page d'accueil, pronoms, âge, tout ce que vous voulez. @@ -77,9 +78,11 @@ fr-CA: warn: Cacher le contenu filtré derrière un avertissement mentionnant le nom du filtre form_admin_settings: activity_api_enabled: Nombre de messages publiés localement, de comptes actifs et de nouvelles inscriptions par tranche hebdomadaire + app_icon: WEBP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. backups_retention_period: Les utilisateur·rice·s ont la possibilité de générer des archives de leurs messages pour les télécharger plus tard. Lorsqu'elles sont définies à une valeur positive, ces archives seront automatiquement supprimées de votre stockage après le nombre de jours spécifié. bootstrap_timeline_accounts: Ces comptes seront épinglés en tête de liste des recommandations pour les nouveaux utilisateurs. closed_registrations_message: Affiché lorsque les inscriptions sont fermées + content_cache_retention_period: Tous les messages provenant d'autres serveurs (y compris les partages et les réponses) seront supprimés passé le nombre de jours spécifié, sans tenir compte de l'interaction de l'utilisateur·rice local·e avec ces messages. Cela inclut les messages qu'un·e utilisateur·rice aurait marqué comme signets ou comme favoris. Les mentions privées entre utilisateur·rice·s de différentes instances seront également perdues et impossibles à restaurer. L'utilisation de ce paramètre est destinée à des instances spécifiques et contrevient à de nombreuses attentes des utilisateurs lorsqu'elle est appliquée à des fins d'utilisation ordinaires. custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon. favicon: WEBP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. mascot: Remplace l'illustration dans l'interface Web avancée. @@ -141,6 +144,7 @@ fr-CA: url: Là où les événements seront envoyés labels: account: + attribution_domains_as_text: Autoriser uniquement des sites Web spécifiques discoverable: Autoriser des algorithmes de découverte à mettre en avant votre profil et vos messages fields: name: Étiquette diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index c064532984..370f5c1e46 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -3,6 +3,7 @@ fr: simple_form: hints: account: + attribution_domains_as_text: Protège contre les fausses attributions. discoverable: Vos messages publics et votre profil peuvent être mis en avant ou recommandés dans diverses parties de Mastodon et votre profil peut être suggéré à d’autres utilisateurs. display_name: Votre nom complet ou votre nom rigolo. fields: Votre page personnelle, vos pronoms, votre âge, ce que vous voulez. @@ -77,9 +78,11 @@ fr: warn: Cacher le contenu filtré derrière un avertissement mentionnant le nom du filtre form_admin_settings: activity_api_enabled: Nombre de messages publiés localement, de comptes actifs et de nouvelles inscriptions par tranche hebdomadaire + app_icon: WEBP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. backups_retention_period: Les utilisateur·rice·s ont la possibilité de générer des archives de leurs messages pour les télécharger plus tard. Lorsqu'elles sont définies à une valeur positive, ces archives seront automatiquement supprimées de votre stockage après le nombre de jours spécifié. bootstrap_timeline_accounts: Ces comptes seront épinglés en tête de liste des recommandations pour les nouveaux utilisateurs. closed_registrations_message: Affiché lorsque les inscriptions sont fermées + content_cache_retention_period: Tous les messages provenant d'autres serveurs (y compris les partages et les réponses) seront supprimés passé le nombre de jours spécifié, sans tenir compte de l'interaction de l'utilisateur·rice local·e avec ces messages. Cela inclut les messages qu'un·e utilisateur·rice aurait marqué comme signets ou comme favoris. Les mentions privées entre utilisateur·rice·s de différentes instances seront également perdues et impossibles à restaurer. L'utilisation de ce paramètre est destinée à des instances spécifiques et contrevient à de nombreuses attentes des utilisateurs lorsqu'elle est appliquée à des fins d'utilisation ordinaires. custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon. favicon: WEBP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. mascot: Remplace l'illustration dans l'interface Web avancée. @@ -141,6 +144,7 @@ fr: url: Là où les événements seront envoyés labels: account: + attribution_domains_as_text: Autoriser uniquement des sites Web spécifiques discoverable: Autoriser des algorithmes de découverte à mettre en avant votre profil et vos messages fields: name: Étiquette diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index 7c125b165a..772f996ca6 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -3,6 +3,7 @@ ga: simple_form: hints: account: + attribution_domains_as_text: Cosnaíonn sé ó sannadh bréagach. discoverable: Seans go mbeidh do phostálacha poiblí agus do phróifíl le feiceáil nó molta i réimsí éagsúla de Mastodon agus is féidir do phróifíl a mholadh d’úsáideoirí eile. display_name: D'ainm iomlán nó d'ainm spraoi. fields: Do leathanach baile, forainmneacha, aois, rud ar bith is mian leat. @@ -143,6 +144,7 @@ ga: url: An áit a seolfar imeachtaí chuig labels: account: + attribution_domains_as_text: Ná ceadaigh ach láithreáin ghréasáin ar leith discoverable: Próifíl gné agus postálacha in halgartaim fionnachtana fields: name: Lipéad diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index 9b6c156de7..de585c7a21 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -3,6 +3,7 @@ gd: simple_form: hints: account: + attribution_domains_as_text: Dìonadh seo o bhuaidh-aithrisean cearra. discoverable: Dh’fhaoidte gun dèid na postaichean poblach ’s a’ phròifil agad a bhrosnachadh no a mholadh ann an caochladh roinnean de Mhastodon agus gun dèid a’ phròifil agad a mholadh do chàch. display_name: D’ ainm slàn no spòrsail. fields: An duilleag-dhachaigh agad, roimhearan, aois, rud sam bith a thogras tu. @@ -143,6 +144,7 @@ gd: url: Far an dèid na tachartasan a chur labels: account: + attribution_domains_as_text: Na ceadaich ach làraichean-lìnn sònraichte discoverable: Brosnaich a’ phròifil is postaichean agad sna h-algairimean rùrachaidh fields: name: Leubail diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index 41f55f183d..5d3a02993b 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -90,6 +90,8 @@ lt: timeline_preview: Atsijungę lankytojai galės naršyti naujausius viešus įrašus, esančius serveryje. trends: Trendai rodo, kurios įrašai, saitažodžiai ir naujienų istorijos tavo serveryje sulaukia didžiausio susidomėjimo. trends_as_landing_page: Rodyti tendencingą turinį atsijungusiems naudotojams ir lankytojams vietoj šio serverio aprašymo. Reikia, kad tendencijos būtų įjungtos. + imports: + data: CSV failas, eksportuotas iš kito „Mastodon“ serverio. invite_request: text: Tai padės mums peržiūrėti tavo paraišką rule: diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index d96f57058b..4369c3c42b 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -3,6 +3,7 @@ lv: simple_form: hints: account: + attribution_domains_as_text: Aizsargā no nepatiesas piedēvēšanas. discoverable: Tavas publiskās ziņas un profils var tikt piedāvāti vai ieteikti dažādās Mastodon vietās, un tavs profils var tikt ieteikts citiem lietotājiem. display_name: Tavs pilnais vārds vai tavs joku vārds. fields: Tava mājas lapa, vietniekvārdi, vecums, viss, ko vēlies. @@ -128,6 +129,7 @@ lv: name: Tu vari mainīt tikai burtu lielumu, piemēram, lai tie būtu vieglāk lasāmi user: chosen_languages: Ja ieķeksēts, publiskos laika grafikos tiks parādītas tikai ziņas noteiktajās valodās + role: Loma nosaka, kādas lietotājam ir atļaujas. user_role: color: Krāsa, kas jāizmanto lomai visā lietotāja saskarnē, kā RGB hex formātā highlighted: Tas padara lomu publiski redzamu @@ -140,6 +142,7 @@ lv: url: Kur notikumi tiks nosūtīti labels: account: + attribution_domains_as_text: Ļaut tikai noteiktas tīmekļvietnes discoverable: Funkcijas profils un ziņas atklāšanas algoritmos fields: name: Marķējums @@ -208,6 +211,7 @@ lv: setting_default_privacy: Publicēšanas privātums setting_default_sensitive: Atļaut atzīmēt multividi kā sensitīvu setting_delete_modal: Parādīt apstiprinājuma dialogu pirms ziņas dzēšanas + setting_disable_hover_cards: Atspējot profila priekšskatījumu pēc kursora novietošanas setting_disable_swiping: Atspējot vilkšanas kustības setting_display_media: Multivides rādīšana setting_display_media_default: Noklusējums @@ -239,11 +243,13 @@ lv: warn: Paslēpt ar brīdinājumu form_admin_settings: activity_api_enabled: Publicējiet apkopotu statistiku par lietotāju darbībām API + app_icon: Lietotnes ikona backups_retention_period: Lietotāja arhīva glabāšanas periods bootstrap_timeline_accounts: Vienmēr iesaki šos kontus jaunajiem lietotājiem closed_registrations_message: Pielāgots ziņojums, ja reģistrēšanās nav pieejama content_cache_retention_period: Attālā satura paturēšanas laika posms custom_css: Pielāgots CSS + favicon: Favikona mascot: Pielāgots talismans (mantots) media_cache_retention_period: Multivides kešatmiņas saglabāšanas periods peers_api_enabled: Publicēt API atklāto serveru sarakstu @@ -308,6 +314,7 @@ lv: listable: Atļaut šim tēmturim parādīties meklējumos un ieteikumos name: Tēmturis trendable: Atļaut šim tēmturim parādīties zem tendencēm + usable: Ļaut ierakstos vietēji izmantot šo tēmturi user: role: Loma time_zone: Laika josla diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 8bd782c140..1ecd672a97 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -3,6 +3,7 @@ th: simple_form: hints: account: + attribution_domains_as_text: ปกป้องจากการระบุแหล่งที่มาที่ผิด discoverable: อาจแสดงหรือแนะนำโพสต์และโปรไฟล์สาธารณะของคุณในพื้นที่ต่าง ๆ ของ Mastodon และอาจเสนอแนะโปรไฟล์ของคุณให้กับผู้ใช้อื่น ๆ display_name: ชื่อเต็มของคุณหรือชื่อแบบสนุกสนานของคุณ fields: หน้าแรก, สรรพนาม, อายุของคุณ สิ่งใดก็ตามที่คุณต้องการ @@ -143,6 +144,7 @@ th: url: ที่ซึ่งจะส่งเหตุการณ์ไปยัง labels: account: + attribution_domains_as_text: อนุญาตเฉพาะเว็บไซต์ที่เฉพาะเจาะจงเท่านั้น discoverable: แสดงโปรไฟล์และโพสต์ในอัลกอริทึมการค้นพบ fields: name: ป้ายชื่อ diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index 4e7c8b0a97..eab025c665 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -3,6 +3,7 @@ vi: simple_form: hints: account: + attribution_domains_as_text: Bảo vệ khỏi những sự gán ghép sai. discoverable: Các tút và hồ sơ công khai của bạn có thể được giới thiệu hoặc đề xuất ở nhiều khu vực khác nhau của Mastodon và hồ sơ của bạn có thể được đề xuất cho những người dùng khác. display_name: Tên đầy đủ hoặc biệt danh đều được. fields: Trang blog của bạn, nghề nghiệp, tuổi hoặc bất cứ thứ gì. @@ -143,6 +144,7 @@ vi: url: Nơi những sự kiện được gửi đến labels: account: + attribution_domains_as_text: Chỉ cho phép các website đặc biệt discoverable: Cho phép khám phá hồ sơ fields: name: Nhãn diff --git a/config/locales/th.yml b/config/locales/th.yml index cbacdfac48..65424f4eb6 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -22,6 +22,7 @@ th: admin: account_actions: action: ทำการกระทำ + already_silenced: มีการจำกัดบัญชีนี้ไปแล้ว already_suspended: มีการระงับบัญชีนี้ไปแล้ว title: ทำการกระทำการกลั่นกรองต่อ %{acct} account_moderation_notes: @@ -1141,6 +1142,12 @@ th: view_strikes: ดูการดำเนินการที่ผ่านมาต่อบัญชีของคุณ too_fast: ส่งแบบฟอร์มเร็วเกินไป ลองอีกครั้ง use_security_key: ใช้กุญแจความปลอดภัย + author_attribution: + example_title: ข้อความตัวอย่าง + hint_html: ควบคุมวิธีที่ให้เครดิตแก่คุณเมื่อมีการแบ่งปันลิงก์ใน Mastodon + more_from_html: เพิ่มเติมจาก %{name} + s_blog: บล็อกของ %{name} + title: การระบุแหล่งที่มาผู้สร้าง challenge: confirm: ดำเนินการต่อ hint_html: "เคล็ดลับ: เราจะไม่ถามรหัสผ่านของคุณกับคุณสำหรับชั่วโมงถัดไป" @@ -1905,6 +1912,7 @@ th: instructions_html: คัดลอกแล้ววางโค้ดด้านล่างลงใน HTML ของเว็บไซต์ของคุณ จากนั้นเพิ่มที่อยู่ของเว็บไซต์ของคุณลงในหนึ่งในช่องพิเศษในโปรไฟล์ของคุณจากแท็บ "แก้ไขโปรไฟล์" และบันทึกการเปลี่ยนแปลง verification: การตรวจสอบ verified_links: ลิงก์ที่ยืนยันแล้วของคุณ + website_verification: การตรวจสอบเว็บไซต์ webauthn_credentials: add: เพิ่มกุญแจความปลอดภัยใหม่ create: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index a03b46c911..8f047a2cb7 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -22,6 +22,7 @@ vi: admin: account_actions: action: Thực hiện hành động + already_silenced: Tài khoản này đã bị hạn chế. already_suspended: Tài khoản này đã bị vô hiệu hóa. title: Áp đặt kiểm duyệt với %{acct} account_moderation_notes: @@ -1141,6 +1142,12 @@ vi: view_strikes: Xem những lần cảnh cáo cũ too_fast: Nghi vấn đăng ký spam, xin thử lại. use_security_key: Dùng khóa bảo mật + author_attribution: + example_title: Văn bản mẫu + hint_html: Kiểm soát cách bạn được ghi nhận khi chia sẻ liên kết trên Mastodon. + more_from_html: Thêm từ %{name} + s_blog: "%{name}'s Blog" + title: Ghi nhận tác giả challenge: confirm: Tiếp tục hint_html: "Mẹo: Chúng tôi sẽ không hỏi lại mật khẩu của bạn sau này." @@ -1905,6 +1912,7 @@ vi: instructions_html: Sao chép và dán mã bên dưới vào mã nguồn trang web của bạn. Sau đó, thêm địa chỉ trang web của bạn vào một trong các trường metadata trên hồ sơ của bạn từ tab "Sửa hồ sơ" và lưu thay đổi. verification: Xác minh verified_links: Những liên kết bạn đã xác minh + website_verification: Xác minh website webauthn_credentials: add: Thêm khóa bảo mật mới create: diff --git a/config/routes/api.rb b/config/routes/api.rb index 20d7cf9349..f3f7d39710 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -351,6 +351,21 @@ namespace :api, format: false do end end + concern :grouped_notifications do + resources :notifications, param: :group_key, only: [:index, :show] do + collection do + post :clear + get :unread_count + end + + member do + post :dismiss + end + + resources :accounts, only: [:index], module: :notifications + end + end + namespace :v2 do get '/search', to: 'search#index', as: :search @@ -376,21 +391,12 @@ namespace :api, format: false do namespace :notifications do resource :policy, only: [:show, :update] end + + concerns :grouped_notifications end - namespace :v2_alpha do - resources :notifications, param: :group_key, only: [:index, :show] do - collection do - post :clear - get :unread_count - end - - member do - post :dismiss - end - - resources :accounts, only: [:index], module: :notifications - end + namespace :v2_alpha, module: 'v2' do + concerns :grouped_notifications end namespace :web do diff --git a/docker-compose.yml b/docker-compose.yml index 8053b436ce..c4e8cb7374 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,7 @@ services: web: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/mastodon/mastodon:v4.3.0-beta.1 + image: ghcr.io/mastodon/mastodon:v4.3.0-beta.2 restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -83,7 +83,7 @@ services: # build: # dockerfile: ./streaming/Dockerfile # context: . - image: ghcr.io/mastodon/mastodon-streaming:v4.3.0-beta.1 + image: ghcr.io/mastodon/mastodon-streaming:v4.3.0-beta.2 restart: always env_file: .env.production command: node ./streaming/index.js @@ -101,7 +101,7 @@ services: sidekiq: build: . - image: ghcr.io/mastodon/mastodon:v4.3.0-beta.1 + image: ghcr.io/mastodon/mastodon:v4.3.0-beta.2 restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index abf317b81c..a9b5838575 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -2,6 +2,8 @@ module Mastodon module Version + KMYBLUE_API_VERSION = 1 + module_function def kmyblue_major @@ -31,7 +33,7 @@ module Mastodon end def default_prerelease - 'beta.1' + 'beta.2' end def prerelease @@ -90,6 +92,13 @@ module Mastodon kmyblue_flag == 'dev' end + def api_versions + { + mastodon: 2, + kmyblue: KMYBLUE_API_VERSION, + } + end + def repository ENV.fetch('GITHUB_REPOSITORY', 'kmycode/mastodon') end diff --git a/spec/fabricators/list_account_fabricator.rb b/spec/fabricators/list_account_fabricator.rb index 00dde83cdf..fe5a471209 100644 --- a/spec/fabricators/list_account_fabricator.rb +++ b/spec/fabricators/list_account_fabricator.rb @@ -2,6 +2,8 @@ Fabricator(:list_account) do list - account - before_create { |list_account, _| list_account.list.account.follow!(account) } + + initialize_with do + resolved_class.new(list: list, account: list.account) + end end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index ff6772fdd3..524b4f423f 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -10,10 +10,39 @@ RSpec.describe Account do let(:bob) { Fabricate(:account, username: 'bob') } + describe '#suspended_locally?' do + context 'when the account is not suspended' do + it 'returns false' do + expect(subject.suspended_locally?).to be false + end + end + + context 'when the account is suspended locally' do + before do + subject.update!(suspended_at: 1.day.ago, suspension_origin: :local) + end + + it 'returns true' do + expect(subject.suspended_locally?).to be true + end + end + + context 'when the account is suspended remotely' do + before do + subject.update!(suspended_at: 1.day.ago, suspension_origin: :remote) + end + + it 'returns false' do + expect(subject.suspended_locally?).to be false + end + end + end + describe '#suspend!' do it 'marks the account as suspended and creates a deletion request' do expect { subject.suspend! } .to change(subject, :suspended?).from(false).to(true) + .and change(subject, :suspended_locally?).from(false).to(true) .and(change { AccountDeletionRequest.exists?(account: subject) }.from(false).to(true)) end @@ -986,6 +1015,34 @@ RSpec.describe Account do end end + describe '#attribution_domains_as_text=' do + subject { Fabricate(:account) } + + it 'sets attribution_domains accordingly' do + subject.attribution_domains_as_text = "hoge.com\nexample.com" + + expect(subject.attribution_domains).to contain_exactly('hoge.com', 'example.com') + end + + it 'strips leading "*."' do + subject.attribution_domains_as_text = "hoge.com\n*.example.com" + + expect(subject.attribution_domains).to contain_exactly('hoge.com', 'example.com') + end + + it 'strips the protocol if present' do + subject.attribution_domains_as_text = "http://hoge.com\nhttps://example.com" + + expect(subject.attribution_domains).to contain_exactly('hoge.com', 'example.com') + end + + it 'strips a combination of leading "*." and protocol' do + subject.attribution_domains_as_text = "http://*.hoge.com\nhttps://*.example.com" + + expect(subject.attribution_domains).to contain_exactly('hoge.com', 'example.com') + end + end + describe 'Normalizations' do describe 'username' do it { is_expected.to normalize(:username).from(" \u3000bob \t \u00a0 \n ").to('bob') } diff --git a/spec/models/bookmark_spec.rb b/spec/models/bookmark_spec.rb new file mode 100644 index 0000000000..e0d91000e7 --- /dev/null +++ b/spec/models/bookmark_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Bookmark do + describe 'Associations' do + it { is_expected.to belong_to(:account).required } + it { is_expected.to belong_to(:status).required } + end + + describe 'Validations' do + subject { Fabricate.build :bookmark } + + it { is_expected.to validate_uniqueness_of(:status_id).scoped_to(:account_id) } + end + + describe 'Callbacks' do + describe 'reblog statuses' do + context 'when status is not a reblog' do + let(:status) { Fabricate :status } + + it 'keeps status set to assigned value' do + bookmark = Fabricate.build :bookmark, status: status + + expect { bookmark.valid? } + .to_not change(bookmark, :status) + end + end + + context 'when status is a reblog' do + let(:original) { Fabricate :status } + let(:status) { Fabricate :status, reblog: original } + + it 'keeps status set to assigned value' do + bookmark = Fabricate.build :bookmark, status: status + + expect { bookmark.valid? } + .to change(bookmark, :status).to(original) + end + end + end + end +end diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb index c3780bef8e..069ad49be0 100644 --- a/spec/models/custom_emoji_spec.rb +++ b/spec/models/custom_emoji_spec.rb @@ -130,4 +130,13 @@ RSpec.describe CustomEmoji, :attachment_processing do it { is_expected.to normalize(:domain).from(nil).to(nil) } end end + + describe 'Validations' do + subject { Fabricate.build :custom_emoji } + + it { is_expected.to validate_uniqueness_of(:shortcode).scoped_to(:domain) } + it { is_expected.to validate_length_of(:shortcode).is_at_least(described_class::MINIMUM_SHORTCODE_SIZE) } + it { is_expected.to allow_values('cats').for(:shortcode) } + it { is_expected.to_not allow_values('@#$@#$', 'X').for(:shortcode) } + end end diff --git a/spec/models/list_account_spec.rb b/spec/models/list_account_spec.rb new file mode 100644 index 0000000000..b2ec17a563 --- /dev/null +++ b/spec/models/list_account_spec.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ListAccount do + describe 'Callbacks to set follows' do + context 'when list owner follows account' do + let!(:follow) { Fabricate :follow } + let(:list) { Fabricate :list, account: follow.account } + + it 'finds and sets the follow with the list account' do + list_account = Fabricate :list_account, list: list, account: follow.target_account + expect(list_account) + .to have_attributes( + follow: eq(follow), + follow_request: be_nil + ) + end + end + + context 'when list owner has a follow request for account' do + let!(:follow_request) { Fabricate :follow_request } + let(:list) { Fabricate :list, account: follow_request.account } + + it 'finds and sets the follow request with the list account' do + list_account = Fabricate :list_account, list: list, account: follow_request.target_account + expect(list_account) + .to have_attributes( + follow: be_nil, + follow_request: eq(follow_request) + ) + end + end + + context 'when list owner is the account' do + it 'does not set follow or follow request' do + list_account = Fabricate :list_account + expect(list_account) + .to have_attributes( + follow: be_nil, + follow_request: be_nil + ) + end + end + end +end diff --git a/spec/models/preview_card_spec.rb b/spec/models/preview_card_spec.rb index 2f0ea38ee4..c0bc2b6e0e 100644 --- a/spec/models/preview_card_spec.rb +++ b/spec/models/preview_card_spec.rb @@ -3,6 +3,12 @@ require 'rails_helper' RSpec.describe PreviewCard do + describe 'file size limit', :attachment_processing do + it 'is set differently whether vips is enabled or not' do + expect(described_class::LIMIT).to eq(Rails.configuration.x.use_vips ? 8.megabytes : 2.megabytes) + end + end + describe 'validations' do describe 'urls' do it 'allows http schemes' do diff --git a/spec/requests/api/v2_alpha/notifications/accounts_spec.rb b/spec/requests/api/v2/notifications/accounts_spec.rb similarity index 84% rename from spec/requests/api/v2_alpha/notifications/accounts_spec.rb rename to spec/requests/api/v2/notifications/accounts_spec.rb index 3c5bcd8996..102b009c0b 100644 --- a/spec/requests/api/v2_alpha/notifications/accounts_spec.rb +++ b/spec/requests/api/v2/notifications/accounts_spec.rb @@ -8,9 +8,9 @@ RSpec.describe 'Accounts in grouped notifications' do let(:scopes) { 'read:notifications write:notifications' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - describe 'GET /api/v2_alpha/notifications/:group_key/accounts', :inline_jobs do + describe 'GET /api/v2/notifications/:group_key/accounts', :inline_jobs do subject do - get "/api/v2_alpha/notifications/#{user.account.notifications.first.group_key}/accounts", headers: headers, params: params + get "/api/v2/notifications/#{user.account.notifications.first.group_key}/accounts", headers: headers, params: params end let(:params) { {} } @@ -71,8 +71,8 @@ RSpec.describe 'Accounts in grouped notifications' do expect(response) .to include_pagination_headers( - prev: api_v2_alpha_notification_accounts_url(limit: params[:limit], min_id: notifications.first.id), - next: api_v2_alpha_notification_accounts_url(limit: params[:limit], max_id: notifications.second.id) + prev: api_v2_notification_accounts_url(limit: params[:limit], min_id: notifications.first.id), + next: api_v2_notification_accounts_url(limit: params[:limit], max_id: notifications.second.id) ) end end diff --git a/spec/requests/api/v2/notifications_spec.rb b/spec/requests/api/v2/notifications_spec.rb new file mode 100644 index 0000000000..edf333ecd8 --- /dev/null +++ b/spec/requests/api/v2/notifications_spec.rb @@ -0,0 +1,343 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Notifications' do + let(:user) { Fabricate(:user, account_attributes: { username: 'alice' }) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:notifications write:notifications' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + describe 'GET /api/v2/notifications/unread_count', :inline_jobs do + subject do + get '/api/v2/notifications/unread_count', headers: headers, params: params + end + + let(:params) { {} } + + before do + first_status = PostStatusService.new.call(user.account, text: 'Test') + ReblogService.new.call(Fabricate(:account), first_status) + PostStatusService.new.call(Fabricate(:account), text: 'Hello @alice') + FavouriteService.new.call(Fabricate(:account), first_status) + FavouriteService.new.call(Fabricate(:account), first_status) + FollowService.new.call(Fabricate(:account), user.account) + end + + it_behaves_like 'forbidden for wrong scope', 'write write:notifications' + + context 'with no options' do + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:count]).to eq 4 + end + end + + context 'with grouped_types parameter' do + let(:params) { { grouped_types: %w(reblog) } } + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:count]).to eq 5 + end + end + + context 'with a read marker' do + before do + id = user.account.notifications.browserable.order(id: :desc).offset(2).first.id + user.markers.create!(timeline: 'notifications', last_read_id: id) + end + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:count]).to eq 2 + end + end + + context 'with exclude_types param' do + let(:params) { { exclude_types: %w(mention) } } + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:count]).to eq 3 + end + end + + context 'with a user-provided limit' do + let(:params) { { limit: 2 } } + + it 'returns a capped value' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:count]).to eq 2 + end + end + + context 'when there are more notifications than the limit' do + before do + stub_const('Api::V2::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT', 2) + end + + it 'returns a capped value' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:count]).to eq Api::V2::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT + end + end + end + + describe 'GET /api/v2/notifications', :inline_jobs do + subject do + get '/api/v2/notifications', headers: headers, params: params + end + + let(:bob) { Fabricate(:user) } + let(:tom) { Fabricate(:user) } + let(:params) { {} } + + before do + first_status = PostStatusService.new.call(user.account, text: 'Test') + ReblogService.new.call(bob.account, first_status) + PostStatusService.new.call(bob.account, text: 'Hello @alice') + FavouriteService.new.call(bob.account, first_status) + FavouriteService.new.call(tom.account, first_status) + FollowService.new.call(bob.account, user.account) + end + + it_behaves_like 'forbidden for wrong scope', 'write write:notifications' + + context 'when there are no notifications' do + before do + user.account.notifications.destroy_all + end + + it 'returns 0 notifications' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:notification_groups]).to eq [] + end + end + + context 'with no options' do + it 'returns expected notification types', :aggregate_failures do + subject + + expect(response).to have_http_status(200) + expect(body_json_types).to include('reblog', 'mention', 'favourite', 'follow') + end + end + + context 'with grouped_types param' do + let(:params) { { grouped_types: %w(reblog) } } + + it 'returns everything, but does not group favourites' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:notification_groups]).to contain_exactly( + a_hash_including( + type: 'reblog', + sample_account_ids: [bob.account_id.to_s] + ), + a_hash_including( + type: 'mention', + sample_account_ids: [bob.account_id.to_s] + ), + a_hash_including( + type: 'favourite', + sample_account_ids: [bob.account_id.to_s] + ), + a_hash_including( + type: 'favourite', + sample_account_ids: [tom.account_id.to_s] + ), + a_hash_including( + type: 'follow', + sample_account_ids: [bob.account_id.to_s] + ) + ) + end + end + + context 'with exclude_types param' do + let(:params) { { exclude_types: %w(mention) } } + + it 'returns everything but excluded type', :aggregate_failures do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body.size).to_not eq 0 + expect(body_json_types.uniq).to_not include 'mention' + end + end + + context 'with types param' do + let(:params) { { types: %w(mention) } } + + it 'returns only requested type', :aggregate_failures do + subject + + expect(response).to have_http_status(200) + expect(body_json_types.uniq).to eq ['mention'] + expect(response.parsed_body.dig(:notification_groups, 0, :page_min_id)).to_not be_nil + end + end + + context 'with limit param' do + let(:params) { { limit: 3 } } + let(:notifications) { user.account.notifications.reorder(id: :desc) } + + it 'returns the requested number of notifications paginated', :aggregate_failures do + subject + + expect(response.parsed_body[:notification_groups].size) + .to eq(params[:limit]) + + expect(response) + .to include_pagination_headers( + prev: api_v2_notifications_url(limit: params[:limit], min_id: notifications.first.id), + # TODO: one downside of the current approach is that we return the first ID matching the group, + # not the last that has been skipped, so pagination is very likely to give overlap + next: api_v2_notifications_url(limit: params[:limit], max_id: notifications[3].id) + ) + end + end + + context 'with since_id param' do + let(:params) { { since_id: notifications[2].id } } + let(:notifications) { user.account.notifications.reorder(id: :desc) } + + it 'returns the requested number of notifications paginated', :aggregate_failures do + subject + + expect(response.parsed_body[:notification_groups].size) + .to eq(2) + + expect(response) + .to include_pagination_headers( + prev: api_v2_notifications_url(limit: params[:limit], min_id: notifications.first.id), + # TODO: one downside of the current approach is that we return the first ID matching the group, + # not the last that has been skipped, so pagination is very likely to give overlap + next: api_v2_notifications_url(limit: params[:limit], max_id: notifications[1].id) + ) + end + end + + context 'when requesting stripped-down accounts' do + let(:params) { { expand_accounts: 'partial_avatars' } } + + let(:recent_account) { Fabricate(:account) } + + before do + FavouriteService.new.call(recent_account, user.account.statuses.first) + end + + it 'returns an account in "partial_accounts", with the expected keys', :aggregate_failures do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:partial_accounts].size).to be > 0 + expect(response.parsed_body[:partial_accounts][0].keys.map(&:to_sym)).to contain_exactly(:acct, :avatar, :avatar_static, :bot, :id, :locked, :url) + expect(response.parsed_body[:partial_accounts].pluck(:id)).to_not include(recent_account.id.to_s) + expect(response.parsed_body[:accounts].pluck(:id)).to include(recent_account.id.to_s) + end + end + + context 'when passing an invalid value for "expand_accounts"' do + let(:params) { { expand_accounts: 'unknown_foobar' } } + + it 'returns http bad request' do + subject + + expect(response).to have_http_status(400) + end + end + + def body_json_types + response.parsed_body[:notification_groups].pluck(:type) + end + end + + describe 'GET /api/v2/notifications/:id' do + subject do + get "/api/v2/notifications/#{notification.group_key}", headers: headers + end + + let(:notification) { Fabricate(:notification, account: user.account, group_key: 'foobar') } + + it_behaves_like 'forbidden for wrong scope', 'write write:notifications' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + context 'when notification belongs to someone else' do + let(:notification) { Fabricate(:notification, group_key: 'foobar') } + + it 'returns http not found' do + subject + + expect(response).to have_http_status(404) + end + end + end + + describe 'POST /api/v2/notifications/:id/dismiss' do + subject do + post "/api/v2/notifications/#{notification.group_key}/dismiss", headers: headers + end + + let!(:notification) { Fabricate(:notification, account: user.account, group_key: 'foobar') } + + it_behaves_like 'forbidden for wrong scope', 'read read:notifications' + + it 'destroys the notification' do + subject + + expect(response).to have_http_status(200) + expect { notification.reload }.to raise_error(ActiveRecord::RecordNotFound) + end + + context 'when notification belongs to someone else' do + let(:notification) { Fabricate(:notification) } + + it 'returns http not found' do + subject + + expect(response).to have_http_status(404) + end + end + end + + describe 'POST /api/v2/notifications/clear' do + subject do + post '/api/v2/notifications/clear', headers: headers + end + + before do + Fabricate(:notification, account: user.account) + end + + it_behaves_like 'forbidden for wrong scope', 'read read:notifications' + + it 'clears notifications for the account' do + subject + + expect(user.account.reload.notifications).to be_empty + expect(response).to have_http_status(200) + end + end +end diff --git a/spec/requests/api/v2_alpha/notifications_spec.rb b/spec/requests/api/v2_alpha/notifications_spec.rb index b7821de561..6d7df45b65 100644 --- a/spec/requests/api/v2_alpha/notifications_spec.rb +++ b/spec/requests/api/v2_alpha/notifications_spec.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +# TODO: remove this before 4.3.0-rc1 + require 'rails_helper' RSpec.describe 'Notifications' do @@ -84,14 +86,14 @@ RSpec.describe 'Notifications' do context 'when there are more notifications than the limit' do before do - stub_const('Api::V2Alpha::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT', 2) + stub_const('Api::V2::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT', 2) end it 'returns a capped value' do subject expect(response).to have_http_status(200) - expect(response.parsed_body[:count]).to eq Api::V2Alpha::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT + expect(response.parsed_body[:count]).to eq Api::V2::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT end end end @@ -206,10 +208,10 @@ RSpec.describe 'Notifications' do expect(response) .to include_pagination_headers( - prev: api_v2_alpha_notifications_url(limit: params[:limit], min_id: notifications.first.id), + prev: api_v2_notifications_url(limit: params[:limit], min_id: notifications.first.id), # TODO: one downside of the current approach is that we return the first ID matching the group, # not the last that has been skipped, so pagination is very likely to give overlap - next: api_v2_alpha_notifications_url(limit: params[:limit], max_id: notifications[3].id) + next: api_v2_notifications_url(limit: params[:limit], max_id: notifications[3].id) ) end end @@ -226,10 +228,10 @@ RSpec.describe 'Notifications' do expect(response) .to include_pagination_headers( - prev: api_v2_alpha_notifications_url(limit: params[:limit], min_id: notifications.first.id), + prev: api_v2_notifications_url(limit: params[:limit], min_id: notifications.first.id), # TODO: one downside of the current approach is that we return the first ID matching the group, # not the last that has been skipped, so pagination is very likely to give overlap - next: api_v2_alpha_notifications_url(limit: params[:limit], max_id: notifications[1].id) + next: api_v2_notifications_url(limit: params[:limit], max_id: notifications[1].id) ) end end diff --git a/yarn.lock b/yarn.lock index d22495e15a..771a97e90f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3680,12 +3680,12 @@ __metadata: linkType: hard "@types/jest@npm:^29.5.2": - version: 29.5.12 - resolution: "@types/jest@npm:29.5.12" + version: 29.5.13 + resolution: "@types/jest@npm:29.5.13" dependencies: expect: "npm:^29.0.0" pretty-format: "npm:^29.0.0" - checksum: 10c0/25fc8e4c611fa6c4421e631432e9f0a6865a8cb07c9815ec9ac90d630271cad773b2ee5fe08066f7b95bebd18bb967f8ce05d018ee9ab0430f9dfd1d84665b6f + checksum: 10c0/9c31af0b155387b9860908830de63c6b79011d7c87c8b61b39da124e26e55423dd51b006749aafe4f0ef3a065016619a1f93ef4b055157d43727f448e67824b7 languageName: node linkType: hard @@ -3787,13 +3787,13 @@ __metadata: linkType: hard "@types/pg@npm:^8.6.6": - version: 8.11.8 - resolution: "@types/pg@npm:8.11.8" + version: 8.11.10 + resolution: "@types/pg@npm:8.11.10" dependencies: "@types/node": "npm:*" pg-protocol: "npm:*" pg-types: "npm:^4.0.1" - checksum: 10c0/040eb04edda338a13dccee47585b4479549fd54561e1bc3768690545adb8708a089b178e04fab9241935d7bad361314fc57af3ad87b391cfb9dc0895dd049763 + checksum: 10c0/c8800d0ab2c6424308e6c6b40c73f19583ee1aed758462bd07694844b0a551b5841442205a4ee05207b80109ba502f33f20241b1bd9b4902e713611fb9e08f6c languageName: node linkType: hard @@ -9563,11 +9563,11 @@ __metadata: linkType: hard "husky@npm:^9.0.11": - version: 9.1.5 - resolution: "husky@npm:9.1.5" + version: 9.1.6 + resolution: "husky@npm:9.1.6" bin: husky: bin.js - checksum: 10c0/f42efb95a026303eb880898760f802d88409780dd72f17781d2dfc302177d4f80b641cf1f1694f53f6d97c536c7397684133d8c8fe4a4426f7460186a7d1c6b8 + checksum: 10c0/705673db4a247c1febd9c5df5f6a3519106cf0335845027bb50a15fba9b1f542cb2610932ede96fd08008f6d9f49db0f15560509861808b0031cdc0e7c798bac languageName: node linkType: hard @@ -13116,10 +13116,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": - version: 1.0.1 - resolution: "picocolors@npm:1.0.1" - checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": + version: 1.1.0 + resolution: "picocolors@npm:1.1.0" + checksum: 10c0/86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023 languageName: node linkType: hard @@ -14078,13 +14078,13 @@ __metadata: linkType: hard "postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.41": - version: 8.4.45 - resolution: "postcss@npm:8.4.45" + version: 8.4.47 + resolution: "postcss@npm:8.4.47" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.1" - source-map-js: "npm:^1.2.0" - checksum: 10c0/ad6f8b9b1157d678560373696109745ab97a947d449f8a997acac41c7f1e4c0f3ca4b092d6df1387f430f2c9a319987b1780dbdc27e35800a88cde9b606c1e8f + picocolors: "npm:^1.1.0" + source-map-js: "npm:^1.2.1" + checksum: 10c0/929f68b5081b7202709456532cee2a145c1843d391508c5a09de2517e8c4791638f71dd63b1898dba6712f8839d7a6da046c72a5e44c162e908f5911f57b5f44 languageName: node linkType: hard @@ -16048,10 +16048,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10c0/7e5f896ac10a3a50fe2898e5009c58ff0dc102dcb056ed27a354623a0ece8954d4b2649e1a1b2b52ef2e161d26f8859c7710350930751640e71e374fe2d321a4 +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf languageName: node linkType: hard