diff --git a/.devcontainer/compose.yaml b/.devcontainer/compose.yaml
index 1e2e1ba7de..f87082013c 100644
--- a/.devcontainer/compose.yaml
+++ b/.devcontainer/compose.yaml
@@ -69,7 +69,7 @@ services:
hard: -1
libretranslate:
- image: libretranslate/libretranslate:v1.5.7
+ image: libretranslate/libretranslate:v1.6.0
restart: unless-stopped
volumes:
- lt-data:/home/libretranslate/.local
diff --git a/Gemfile b/Gemfile
index 3fcde202ad..af05ec8402 100644
--- a/Gemfile
+++ b/Gemfile
@@ -149,7 +149,7 @@ group :test do
gem 'rails-controller-testing', '~> 1.0'
# Validate schemas in specs
- gem 'json-schema', '~> 4.0'
+ gem 'json-schema', '~> 5.0'
# Test harness fo rack components
gem 'rack-test', '~> 2.1'
@@ -210,7 +210,7 @@ group :development, :test do
gem 'test-prof'
# RSpec runner for rails
- gem 'rspec-rails', '~> 6.0'
+ gem 'rspec-rails', '~> 7.0'
end
group :production do
diff --git a/Gemfile.lock b/Gemfile.lock
index 11e8aee83b..6d13efdb66 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -347,7 +347,7 @@ GEM
rainbow (>= 2.2.2, < 4.0)
terminal-table (>= 1.5.1)
idn-ruby (0.1.5)
- inline_svg (1.9.0)
+ inline_svg (1.10.0)
activesupport (>= 3.0)
nokogiri (>= 1.6)
io-console (0.7.2)
@@ -373,8 +373,8 @@ GEM
json-ld-preloaded (3.3.0)
json-ld (~> 3.3)
rdf (~> 3.3)
- json-schema (4.3.1)
- addressable (>= 2.8)
+ json-schema (5.0.0)
+ addressable (~> 2.8)
jsonapi-renderer (0.2.2)
jwt (2.7.1)
kaminari (1.2.2)
@@ -724,10 +724,10 @@ GEM
rspec-mocks (3.13.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
- rspec-rails (6.1.4)
- actionpack (>= 6.1)
- activesupport (>= 6.1)
- railties (>= 6.1)
+ rspec-rails (7.0.0)
+ actionpack (>= 7.0)
+ activesupport (>= 7.0)
+ railties (>= 7.0)
rspec-core (~> 3.13)
rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13)
@@ -906,7 +906,7 @@ GEM
xorcist (1.1.3)
xpath (3.2.0)
nokogiri (~> 1.8)
- zeitwerk (2.6.17)
+ zeitwerk (2.6.18)
PLATFORMS
ruby
@@ -965,7 +965,7 @@ DEPENDENCIES
irb (~> 1.8)
json-ld
json-ld-preloaded (~> 3.2)
- json-schema (~> 4.0)
+ json-schema (~> 5.0)
kaminari (~> 1.2)
kt-paperclip (~> 7.2)
letter_opener (~> 1.8)
@@ -1024,7 +1024,7 @@ DEPENDENCIES
redis-namespace (~> 1.10)
rqrcode (~> 2.2)
rspec-github (~> 2.4)
- rspec-rails (~> 6.0)
+ rspec-rails (~> 7.0)
rspec-sidekiq (~> 5.0)
rubocop
rubocop-capybara
diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb
index 932a3420db..ba096427cf 100644
--- a/app/helpers/jsonld_helper.rb
+++ b/app/helpers/jsonld_helper.rb
@@ -200,14 +200,6 @@ module JsonLdHelper
nil
end
- def merge_context(context, new_context)
- if context.is_a?(Array)
- context << new_context
- else
- [context, new_context]
- end
- end
-
def response_successful?(response)
(200...300).cover?(response.code)
end
diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json
index 0a985a0310..bb409b63c1 100644
--- a/app/javascript/mastodon/locales/fy.json
+++ b/app/javascript/mastodon/locales/fy.json
@@ -11,6 +11,7 @@
"about.not_available": "Dizze ynformaasje is troch dizze server net iepenbier makke.",
"about.powered_by": "Desintralisearre sosjale media, mooglik makke troch {mastodon}",
"about.rules": "Serverrigels",
+ "account.account_note_header": "Persoanlike opmerking",
"account.add_or_remove_from_list": "Tafoegje oan of fuortsmite út listen",
"account.badges.bot": "Automatisearre",
"account.badges.group": "Groep",
@@ -96,6 +97,8 @@
"block_modal.title": "Brûker blokkearje?",
"block_modal.you_wont_see_mentions": "Jo sjogge gjin berjochten mear dy’t dizze account fermelde.",
"boost_modal.combo": "Jo kinne op {combo} drukke om dit de folgjende kear oer te slaan",
+ "boost_modal.reblog": "Berjocht booste?",
+ "boost_modal.undo_reblog": "Berjocht net langer booste?",
"bundle_column_error.copy_stacktrace": "Flaterrapport kopiearje",
"bundle_column_error.error.body": "De opfrege side koe net werjûn wurde. It kin wêze troch in flater yn ús koade, of in probleem mei browserkompatibiliteit.",
"bundle_column_error.error.title": "Oh nee!",
@@ -169,21 +172,30 @@
"confirmations.block.confirm": "Blokkearje",
"confirmations.delete.confirm": "Fuortsmite",
"confirmations.delete.message": "Binne jo wis dat jo dit berjocht fuortsmite wolle?",
+ "confirmations.delete.title": "Berjocht fuortsmite?",
"confirmations.delete_list.confirm": "Fuortsmite",
"confirmations.delete_list.message": "Binne jo wis dat jo dizze list foar permanint fuortsmite wolle?",
+ "confirmations.delete_list.title": "List fuortsmite?",
"confirmations.discard_edit_media.confirm": "Fuortsmite",
"confirmations.discard_edit_media.message": "Jo hawwe net-bewarre wizigingen yn de mediabeskriuwing of foarfertoaning, wolle jo dizze dochs fuortsmite?",
"confirmations.edit.confirm": "Bewurkje",
"confirmations.edit.message": "Troch no te bewurkjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?",
+ "confirmations.edit.title": "Berjocht oerskriuwe?",
"confirmations.logout.confirm": "Ofmelde",
"confirmations.logout.message": "Binne jo wis dat jo ôfmelde wolle?",
+ "confirmations.logout.title": "Ofmelde?",
"confirmations.mute.confirm": "Negearje",
"confirmations.redraft.confirm": "Fuortsmite en opnij opstelle",
"confirmations.redraft.message": "Binne jo wis dat jo dit berjocht fuortsmite en opnij opstelle wolle? Favoriten en boosts geane dan ferlern en reaksjes op it oarspronklike berjocht reitsje jo kwyt.",
+ "confirmations.redraft.title": "Berjocht fuortsmite en opnij opstelle?",
"confirmations.reply.confirm": "Reagearje",
"confirmations.reply.message": "Troch no te reagearjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?",
+ "confirmations.reply.title": "Berjocht oerskriuwe?",
"confirmations.unfollow.confirm": "Net mear folgje",
"confirmations.unfollow.message": "Binne jo wis dat jo {name} net mear folgje wolle?",
+ "confirmations.unfollow.title": "Brûker net mear folgje?",
+ "content_warning.hide": "Berjocht ferstopje",
+ "content_warning.show": "Dochs toane",
"conversation.delete": "Petear fuortsmite",
"conversation.mark_as_read": "As lêzen markearje",
"conversation.open": "Petear toane",
@@ -220,7 +232,9 @@
"domain_pill.username": "Brûkersnamme",
"domain_pill.whats_in_a_handle": "Wat is in fediverse-adres?",
"domain_pill.who_they_are": "Omdat jo oan in fediverse-adres sjen kinne hoe’t ien hjit en op hokker server dy sit, kinne jo mei minsken op it troch sosjale web (fediverse) kommunisearje.",
+ "domain_pill.who_you_are": "Omdat jo oan in fediverse-adres sjen kinne hoe’t jo hjitte en op hokker server jo sitte, kinne jo mei minsken op it troch sosjale web (fediverse) kommunisearje.",
"domain_pill.your_handle": "Jo fediverse-adres:",
+ "domain_pill.your_server": "Jo digitale thús, wer't al jo berjochten stean. Is dizze server dochs net nei jo winsk? Dan kinne jo op elk momint nei in oare server ferhúzje en ek jo folgers oerbringe.",
"domain_pill.your_username": "Jo unike identifikaasje-adres op dizze server. It is mooglik dat der brûkers mei deselde brûkersnamme op ferskate servers te finen binne.",
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Sa komt it der út te sjen:",
@@ -258,6 +272,7 @@
"empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
"empty_column.lists": "Jo hawwe noch gjin inkelde list. Wannear’t jo der ien oanmakke hawwe, falt dat hjir te sjen.",
"empty_column.mutes": "Jo hawwe noch gjin brûkers negearre.",
+ "empty_column.notification_requests": "Hielendal leech! Der is hjir neat. Wannear’t jo nije meldingen ûntfange, ferskine dizze hjir neffens jo ynstellingen.",
"empty_column.notifications": "Jo hawwe noch gjin meldingen. Ynteraksjes mei oare minsken sjogge jo hjir.",
"empty_column.public": "Der is hjir neat! Skriuw eat publyklik, of folgje sels brûkers fan oare servers om it hjir te foljen",
"error.unexpected_crash.explanation": "Troch in bug in ús koade of in probleem mei de komptabiliteit fan jo browser, koe dizze side net toand wurde.",
@@ -288,6 +303,8 @@
"filter_modal.select_filter.subtitle": "In besteande kategory brûke of in nije oanmeitsje",
"filter_modal.select_filter.title": "Dit berjocht filterje",
"filter_modal.title.status": "In berjocht filterje",
+ "filter_warning.matches_filter": "Komt oerien mei filter ‘{title}’",
+ "filtered_notifications_banner.pending_requests": "Fan {count, plural, =0 {net ien} one {ien persoan} other {# persoanen}} dy’t jo mooglik kinne",
"filtered_notifications_banner.title": "Filtere meldingen",
"firehose.all": "Alles",
"firehose.local": "Dizze server",
@@ -336,6 +353,14 @@
"hashtag.follow": "Hashtag folgje",
"hashtag.unfollow": "Hashtag ûntfolgje",
"hashtags.and_other": "…en {count, plural, one {}other {# mear}}",
+ "hints.profiles.followers_may_be_missing": "Folgers foar dit profyl kinne ûntbrekke.",
+ "hints.profiles.follows_may_be_missing": "De folgers foar dit profyl kinne ûntbrekke.",
+ "hints.profiles.posts_may_be_missing": "Der ûntbrekke mooglik berjochten fan dit profyl.",
+ "hints.profiles.see_more_followers": "Besjoch mear folgers op {domain}",
+ "hints.profiles.see_more_follows": "Besjoch mear folge accounts op {domain}",
+ "hints.profiles.see_more_posts": "Besjoch mear berjochten op {domain}",
+ "hints.threads.replies_may_be_missing": "Antwurden fan oare servers kinne ûntbrekke.",
+ "hints.threads.see_more": "Besjoch mear reaksjes op {domain}",
"home.column_settings.show_reblogs": "Boosts toane",
"home.column_settings.show_replies": "Reaksjes toane",
"home.hide_announcements": "Meidielingen ferstopje",
@@ -343,6 +368,17 @@
"home.pending_critical_update.link": "Fernijingen besjen",
"home.pending_critical_update.title": "Kritike befeiligingsfernijing beskikber!",
"home.show_announcements": "Meidielingen toane",
+ "ignore_notifications_modal.disclaimer": "Mastodon kin brûkers net ynformearje dat jo harren meldingen negearre hawwe. Meldingen negearje sil net foarkomme dat de berjochten sels ferstjoerd wurde.",
+ "ignore_notifications_modal.filter_instead": "Yn stee derfan filterje",
+ "ignore_notifications_modal.filter_to_act_users": "Jo binne noch hieltyd yn steat om folchfersiken goed- of ôf te karren en om brûkers te rapportearjen",
+ "ignore_notifications_modal.filter_to_avoid_confusion": "Filterjen foarkomt potinsjele betizing",
+ "ignore_notifications_modal.filter_to_review_separately": "Jo kinne filtere meldingen ôfsûnderlik beoardiele",
+ "ignore_notifications_modal.ignore": "Meldingen negearje",
+ "ignore_notifications_modal.limited_accounts_title": "Meldingen fan beheinde accounts negearje?",
+ "ignore_notifications_modal.new_accounts_title": "Meldingen fan nije accounts negearje?",
+ "ignore_notifications_modal.not_followers_title": "Meldingen negearje fan minsken dy’t jo net folgje?",
+ "ignore_notifications_modal.not_following_title": "Meldingen negearje fan minsken dy’t josels net folgje?",
+ "ignore_notifications_modal.private_mentions_title": "Meldingen negearje fan net frege priveeberjochten?",
"interaction_modal.description.favourite": "Jo kinne mei in Mastodon-account dit berjocht as favoryt markearje, om dy brûker witte te litten dat jo it berjocht wurdearje en om it te bewarjen.",
"interaction_modal.description.follow": "Jo kinne mei in Mastodon-account {name} folgje, om sa harren berjochten op jo starttiidline te ûntfangen.",
"interaction_modal.description.reblog": "Jo kinne mei in Mastodon-account dit berjocht booste, om it sa mei jo folgers te dielen.",
@@ -433,6 +469,7 @@
"mute_modal.you_wont_see_mentions": "Jo sjogge gjin berjochten mear dy’t dizze account fermelde.",
"mute_modal.you_wont_see_posts": "De persoan kin jo berjochten noch hieltyd sjen, mar jo sjogge harren berjochten net mear.",
"navigation_bar.about": "Oer",
+ "navigation_bar.administration": "Behear",
"navigation_bar.advanced_interface": "Yn avansearre webomjouwing iepenje",
"navigation_bar.blocks": "Blokkearre brûkers",
"navigation_bar.bookmarks": "Blêdwizers",
@@ -449,6 +486,7 @@
"navigation_bar.follows_and_followers": "Folgers en folgjenden",
"navigation_bar.lists": "Listen",
"navigation_bar.logout": "Ofmelde",
+ "navigation_bar.moderation": "Moderaasje",
"navigation_bar.mutes": "Negearre brûkers",
"navigation_bar.opened_in_classic_interface": "Berjochten, accounts en oare spesifike siden, wurde standert iepene yn de klassike webinterface.",
"navigation_bar.personal": "Persoanlik",
@@ -464,9 +502,18 @@
"notification.admin.report_statuses": "{name} rapportearre {target} foar {category}",
"notification.admin.report_statuses_other": "{name} hat {target} rapportearre",
"notification.admin.sign_up": "{name} hat harren registrearre",
+ "notification.admin.sign_up.name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe harren registrearre",
"notification.favourite": "{name} hat jo berjocht as favoryt markearre",
+ "notification.favourite.name_and_others_with_link": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe jo berjocht as favoryt markearre",
"notification.follow": "{name} folget dy",
+ "notification.follow.name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe jo folge",
"notification.follow_request": "{name} hat dy in folchfersyk stjoerd",
+ "notification.follow_request.name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe frege om jo te folgjen",
+ "notification.label.mention": "Fermelding",
+ "notification.label.private_mention": "Priveeberjocht",
+ "notification.label.private_reply": "Priveereaksje",
+ "notification.label.reply": "Beäntwurdzje",
+ "notification.mention": "Fermelding",
"notification.moderation-warning.learn_more": "Mear ynfo",
"notification.moderation_warning": "Jo hawwe in moderaasje-warskôging ûntfongen",
"notification.moderation_warning.action_delete_statuses": "Guon fan jo berjochten binne fuortsmiten.",
@@ -479,23 +526,44 @@
"notification.own_poll": "Jo poll is beëinige",
"notification.poll": "In enkête dêr’t jo oan meidien hawwe is beëinige",
"notification.reblog": "{name} hat jo berjocht boost",
+ "notification.reblog.name_and_others_with_link": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe jo berjocht boost",
"notification.relationships_severance_event": "Ferlerne ferbiningen mei {name}",
"notification.relationships_severance_event.account_suspension": "In behearder fan {from} hat {target} útsteld, wat betsjut dat jo gjin updates mear fan harren ûntfange kinne of mei harren kommunisearje kinne.",
"notification.relationships_severance_event.domain_block": "In behearder fan {from} hat {target} blokkearre, ynklusyf {followersCount} fan jo folgers en {followingCount, plural, one {# account} other {# accounts}} dy’t jo folgje.",
"notification.relationships_severance_event.learn_more": "Mear ynfo",
+ "notification.relationships_severance_event.user_domain_block": "Jo hawwe {target} blokkearre, wêrmei’t jo {followersCount} fan jo folgers en {followingCount, plural, one {# account} other {# accounts}} dy’t jo folgje ferlern binne.",
"notification.status": "{name} hat in berjocht pleatst",
"notification.update": "{name} hat in berjocht bewurke",
"notification_requests.accept": "Akseptearje",
+ "notification_requests.accept_multiple": "{count, plural, one {# fersyk akseptearje…} other {# fersiken akseptearje…}}",
+ "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Fersyk akseptearje} other {Fersiken akseptearje}}",
+ "notification_requests.confirm_accept_multiple.message": "Jo steane op it punt om {count, plural, one {ien meldingsfersyk} other {# meldingsfersiken}} te akseptearjen. Binne jo wis dat jo trochgean wolle?",
+ "notification_requests.confirm_accept_multiple.title": "Meldingsfersiken akseptearje?",
+ "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Fersyk ôfwize} other {Fersiken ôfwize}}",
+ "notification_requests.confirm_dismiss_multiple.message": "Jo steane op it punt om {count, plural, one {ien meldingsfersyk} other {# meldingsfersiken}} ôf te wizen. Jo sille net yn steat wêze om {count, plural, one {hier} other {hier}} wer maklik tagong ta te krijen. Wolle jo trochgean?",
+ "notification_requests.confirm_dismiss_multiple.title": "Meldingsfersiken ôfwize?",
"notification_requests.dismiss": "Ofwize",
+ "notification_requests.dismiss_multiple": "{count, plural, one {# fersyk ôfwize…} other {# fersiken ôfwize…}}",
+ "notification_requests.edit_selection": "Bewurkje",
+ "notification_requests.exit_selection": "Klear",
+ "notification_requests.explainer_for_limited_account": "Meldingen fan dizze account binne filtere, omdat dizze account troch in moderator beheind is.",
+ "notification_requests.explainer_for_limited_remote_account": "Meldingen fan dizze account binne filtere, omdat dizze account of harren server troch in moderator beheind is.",
+ "notification_requests.maximize": "Maksimalisearje",
+ "notification_requests.minimize_banner": "Banner mei filtere meldingen minimalisearje",
"notification_requests.notifications_from": "Meldingen fan {name}",
"notification_requests.title": "Filtere meldingen",
+ "notification_requests.view": "Meldingen besjen",
"notifications.clear": "Meldingen wiskje",
"notifications.clear_confirmation": "Binne jo wis dat jo al jo meldingen permanint fuortsmite wolle?",
+ "notifications.clear_title": "Meldingen fuortsmite?",
"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",
"notifications.column_settings.follow": "Nije folgers:",
"notifications.column_settings.follow_request": "Nij folchfersyk:",
"notifications.column_settings.mention": "Fermeldingen:",
@@ -521,6 +589,23 @@
"notifications.permission_denied": "Desktopmeldingen binne net beskikber, omdat in eardere browsertastimming wegere waard",
"notifications.permission_denied_alert": "Desktopmeldingen kinne net ynskeakele wurde, omdat in eardere browsertastimming wegere waard",
"notifications.permission_required": "Desktopmeldingen binne net beskikber, omdat de nedige tastimming net ferliend is.",
+ "notifications.policy.accept": "Akseptearje",
+ "notifications.policy.accept_hint": "Yn meldingen toane",
+ "notifications.policy.drop": "Negearje",
+ "notifications.policy.drop_hint": "Permanint fuortsmite",
+ "notifications.policy.filter": "Filter",
+ "notifications.policy.filter_hint": "Nei filtere ynboks foar meldingen ferstjoere",
+ "notifications.policy.filter_limited_accounts_hint": "Beheind troch servermoderatoren",
+ "notifications.policy.filter_limited_accounts_title": "Moderearre accounts",
+ "notifications.policy.filter_new_accounts.hint": "Yn de ôfrûne {days, plural, one {dei} other {# dagen}} registrearre",
+ "notifications.policy.filter_new_accounts_title": "Nije accounts",
+ "notifications.policy.filter_not_followers_hint": "Ynklusyf minsken dy’t jo koarter as {days, plural, one {dei} other {# dagen}} folgje",
+ "notifications.policy.filter_not_followers_title": "Minsken dy’t jo net folgje",
+ "notifications.policy.filter_not_following_hint": "Oant jo se hânmjittich goedkarre",
+ "notifications.policy.filter_not_following_title": "Minsken dy’t josels net folgje",
+ "notifications.policy.filter_private_mentions_hint": "Unsichtber útsein it in antwurd is op in priveeberjocht fan jo of wannear’t jo de ôfstjoerder folgje",
+ "notifications.policy.filter_private_mentions_title": "Net frege priveeberjochten",
+ "notifications.policy.title": "Meldingen beheare fan…",
"notifications_permission_banner.enable": "Desktopmeldingen ynskeakelje",
"notifications_permission_banner.how_to_control": "Om meldingen te ûntfangen wannear’t Mastodon net iepen stiet. Jo kinne krekt bepale hokker soarte fan ynteraksjes wol of gjin desktopmeldingen jouwe fia de boppesteande {icon} knop.",
"notifications_permission_banner.title": "Mis neat",
@@ -647,6 +732,7 @@
"report.unfollow_explanation": "Jo folgje dizze account. Om harren berjochten net mear op jo starttiidline te sjen, kinne jo dyjinge ûntfolgje.",
"report_notification.attached_statuses": "{count, plural, one {{count} berjocht} other {{count} berjochten}} tafoege",
"report_notification.categories.legal": "Juridysk",
+ "report_notification.categories.legal_sentence": "yllegale ynhâld",
"report_notification.categories.other": "Oars",
"report_notification.categories.other_sentence": "oars",
"report_notification.categories.spam": "Spam",
@@ -680,8 +766,11 @@
"server_banner.about_active_users": "Oantal brûkers yn de ôfrûne 30 dagen (MAU)",
"server_banner.active_users": "warbere brûkers",
"server_banner.administered_by": "Beheard troch:",
+ "server_banner.is_one_of_many": "{domain} is ien fan de protte ôfhinklike Mastodon-servers dy’t jo brûke kinne om diel te nimmen oan de fediverse.",
"server_banner.server_stats": "Serverstatistiken:",
"sign_in_banner.create_account": "Account registrearje",
+ "sign_in_banner.follow_anyone": "Folgje elkenien yn de fediverse en sjoch it allegearre yn gronologyske folchoarder. Gjin algoritmen, advertinsjes of clickbaits.",
+ "sign_in_banner.mastodon_is": "Mastodon is de beste manier om wat der bart by te hâlden.",
"sign_in_banner.sign_in": "Oanmelde",
"sign_in_banner.sso_redirect": "Oanmelde of Registrearje",
"status.admin_account": "Moderaasje-omjouwing fan @{name} iepenje",
diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json
index 9bf89ce716..f575c005d8 100644
--- a/app/javascript/mastodon/locales/ia.json
+++ b/app/javascript/mastodon/locales/ia.json
@@ -98,6 +98,7 @@
"block_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.",
"boost_modal.combo": "Tu pote premer {combo} pro saltar isto le proxime vice",
"boost_modal.reblog": "Impulsar le message?",
+ "boost_modal.undo_reblog": "Cessar de impulsar le message?",
"bundle_column_error.copy_stacktrace": "Copiar reporto de error",
"bundle_column_error.error.body": "Le pagina requestate non pote esser visualisate. Pote esser a causa de un defecto in nostre codice o de un problema de compatibilitate del navigator.",
"bundle_column_error.error.title": "Oh, no!",
diff --git a/app/javascript/mastodon/reducers/notification_groups.ts b/app/javascript/mastodon/reducers/notification_groups.ts
index b3535d7b67..f3c83ccd8d 100644
--- a/app/javascript/mastodon/reducers/notification_groups.ts
+++ b/app/javascript/mastodon/reducers/notification_groups.ts
@@ -248,8 +248,9 @@ function processNewNotification(
}
function trimNotifications(state: NotificationGroupsState) {
- if (state.scrolledToTop) {
+ if (state.scrolledToTop && state.groups.length > NOTIFICATIONS_TRIM_LIMIT) {
state.groups.splice(NOTIFICATIONS_TRIM_LIMIT);
+ ensureTrailingGap(state.groups);
}
}
@@ -400,6 +401,28 @@ function ensureLeadingGap(
}
}
+// Ensure the groups list ends with a gap suitable for loading more, mutating it to append one if needed
+function ensureTrailingGap(
+ groups: NotificationGroupsState['groups'],
+): NotificationGap {
+ const groupOrGap = groups.at(-1);
+
+ if (groupOrGap?.type === 'gap') {
+ // We're expecting older notifications, so discard sinceId if it's set
+ groupOrGap.sinceId = undefined;
+
+ return groupOrGap;
+ } else {
+ const gap: NotificationGap = {
+ type: 'gap',
+ maxId: groupOrGap?.page_min_id,
+ };
+
+ groups.push(gap);
+ return gap;
+ }
+}
+
export const notificationGroupsReducer = createReducer(
initialState,
(builder) => {
diff --git a/app/models/mention.rb b/app/models/mention.rb
index af9bb7378b..a508ed630e 100644
--- a/app/models/mention.rb
+++ b/app/models/mention.rb
@@ -29,8 +29,4 @@ class Mention < ApplicationRecord
to: :account,
prefix: true
)
-
- def active?
- !silent?
- end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index b33d7dcae0..df8444e2d3 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -246,10 +246,6 @@ class User < ApplicationRecord
unconfirmed? || pending?
end
- def inactive_message
- approved? ? super : :pending
- end
-
def approve!
return if approved?
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index 77b8483ba4..427137545f 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -150,7 +150,7 @@ class PostStatusService < BaseService
@media = @account.media_attachments.where(status_id: nil).where(id: @options[:media_ids].take(Status::MEDIA_ATTACHMENTS_LIMIT).map(&:to_i))
- not_found_ids = @options[:media_ids] - @media.map(&:id)
+ not_found_ids = @options[:media_ids].map(&:to_i) - @media.map(&:id)
raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_found', ids: not_found_ids.join(', ')) if not_found_ids.any?
raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if @media.size > 1 && @media.find(&:audio_or_video?)
diff --git a/app/services/update_status_service.rb b/app/services/update_status_service.rb
index ced876c5a3..5ae53751e9 100644
--- a/app/services/update_status_service.rb
+++ b/app/services/update_status_service.rb
@@ -74,7 +74,7 @@ class UpdateStatusService < BaseService
media_attachments = @status.account.media_attachments.where(status_id: [nil, @status.id]).where(scheduled_status_id: nil).where(id: @options[:media_ids].take(Status::MEDIA_ATTACHMENTS_LIMIT).map(&:to_i)).to_a
- not_found_ids = @options[:media_ids] - media_attachments.map(&:id)
+ not_found_ids = @options[:media_ids].map(&:to_i) - media_attachments.map(&:id)
raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_found', ids: not_found_ids.join(', ')) if not_found_ids.any?
raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if media_attachments.size > 1 && media_attachments.find(&:audio_or_video?)
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index d8de84c283..9a8f32117e 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -1412,6 +1412,7 @@ ca:
media_attachments:
validations:
images_and_video: No es pot adjuntar un vídeo a una publicació que ja contingui imatges
+ not_found: No s'ha trobat el contingut multimèdia %{ids} o ja s'ha adjuntat a una altra publicació
not_ready: No es poden adjuntar fitxers que no s'hagin acabat de processar. Torna-ho a provar en un moment!
too_many: No es poden adjuntar més de 4 fitxers
migrations:
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 94f2369f8e..1366370eb0 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -1454,6 +1454,7 @@ da:
media_attachments:
validations:
images_and_video: En video kan ikke vedhæftes et indlæg med billedindhold
+ not_found: Mediet %{ids} ikke fundet eller allerede vedhæftet andet indlæg
not_ready: Filer under behandling kan ikke vedhæftes. Forsøg igen senere!
too_many: Maks. 4 filer kan vedhæftes
migrations:
diff --git a/config/locales/de.yml b/config/locales/de.yml
index a852c736cf..e5e3f37a36 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -1454,6 +1454,7 @@ de:
media_attachments:
validations:
images_and_video: Es kann kein Video an einen Beitrag angehängt werden, der bereits Bilder enthält
+ not_found: Medien %{ids} nicht verfügbar oder bereits an einen anderen Beitrag angehängt
not_ready: Dateien, die noch nicht verarbeitet wurden, können nicht angehängt werden. Versuche es gleich noch einmal!
too_many: Mehr als vier Dateien können nicht angehängt werden
migrations:
diff --git a/config/locales/doorkeeper.fy.yml b/config/locales/doorkeeper.fy.yml
index 1cf2d32212..f15389faf9 100644
--- a/config/locales/doorkeeper.fy.yml
+++ b/config/locales/doorkeeper.fy.yml
@@ -83,6 +83,7 @@ fy:
access_denied: De boarne-eigener of autorisaasjeserver hat it fersyk wegere.
credential_flow_not_configured: De wachtwurdgegevens-flow fan de boarne-eigener is mislearre, omdat Doorkeeper.configure.resource_owner_from_credentials net ynsteld is.
invalid_client: Clientferifikaasje is mislearre troch in ûnbekende client, ûntbrekkende client-autentikaasje of in net stipe autentikaasjemetoade.
+ invalid_code_challenge_method: De koadechallengemetoade moat S256 wezen, plain wurdt net stipe.
invalid_grant: De opjûne autorisaasje is ûnjildich, ferrûn, ynlutsen, komt net oerien mei de redirect-URI dy’t opjûn is of útjûn waard oan in oere client.
invalid_redirect_uri: De opjûne redirect-URI is ûnjildich.
invalid_request:
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index b0882e0a27..ab0dcb58fa 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -1454,6 +1454,7 @@ es-AR:
media_attachments:
validations:
images_and_video: No se puede adjuntar un video a un mensaje que ya contenga imágenes
+ not_found: Medios %{ids} no encontrados o ya adjuntados a otro mensaje
not_ready: No se pueden adjuntar archivos que no se han terminado de procesar. ¡Intentá de nuevo en un rato!
too_many: No se pueden adjuntar más de 4 archivos
migrations:
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 95190d8846..42d1977662 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -1454,6 +1454,7 @@ fi:
media_attachments:
validations:
images_and_video: Videota ei voi liittää tilapäivitykseen, jossa on jo kuvia
+ not_found: Mediaa %{ids} ei löytynyt, tai se on jo liitetty toiseen julkaisuun
not_ready: Ei voi liittää tiedostoja, joiden käsittely on kesken. Yritä hetken kuluttua uudelleen!
too_many: Tiedostoja voi liittää enintään 4
migrations:
diff --git a/config/locales/fo.yml b/config/locales/fo.yml
index b2309694b1..0c3620ad42 100644
--- a/config/locales/fo.yml
+++ b/config/locales/fo.yml
@@ -1454,6 +1454,7 @@ fo:
media_attachments:
validations:
images_and_video: Kann ikki viðfesta sjónfílu til ein post, sum longu inniheldur myndir
+ not_found: Miðilin %{ids} ikki funnin ella longu knýttur at øðrum posti
not_ready: Kann ikki viðfesta fílur, sum ikki eru liðugt viðgjørdar. Roynd aftur um eina løtu!
too_many: Kann ikki viðfest fleiri enn 4 fílur
migrations:
diff --git a/config/locales/fy.yml b/config/locales/fy.yml
index 62889c0b28..d0127f77b1 100644
--- a/config/locales/fy.yml
+++ b/config/locales/fy.yml
@@ -31,6 +31,7 @@ fy:
created_msg: Oanmeitsjen fan opmerking foar moderatoaren slagge!
destroyed_msg: Fuortsmiten fan opmerking foar moderatoaren slagge!
accounts:
+ add_email_domain_block: E-maildomein blokkearje
approve: Goedkarre
approved_msg: It goedkarren fan de account fan %{username} is slagge
are_you_sure: Binne jo wis?
@@ -57,6 +58,7 @@ fy:
demote: Degradearje
destroyed_msg: It fuortsmiten fan de gegevens fan %{username} stiet no yn de wachtrige
disable: Befrieze
+ disable_sign_in_token_auth: Ferifikaasje mei in tagongskoade fia e-mail útskeakelje
disable_two_factor_authentication: 2FA útskeakelje
disabled: Beferzen
display_name: Werjeftenamme
@@ -65,6 +67,7 @@ fy:
email: E-mailadres
email_status: E-mailsteat
enable: Untteie
+ enable_sign_in_token_auth: Ferifikaasje mei in tagongskoade fia e-mail ynskeakelje
enabled: Ynskeakele
enabled_msg: It ûntteie fan de account fan %{username} is slagge
followers: Folgers
@@ -129,6 +132,7 @@ fy:
resubscribe: Opnij abonnearje
role: Rol
search: Sykje
+ search_same_email_domain: Oare brûkers mei itselde e-maildomein
search_same_ip: Oare brûkers mei itselde IP-adres
security: Befeiliging
security_measures:
@@ -169,21 +173,26 @@ fy:
approve_appeal: Beswier goedkarre
approve_user: Brûker goedkarre
assigned_to_self_report: Rapportaazje tawize
+ change_email_user: E-mailadres fan brûker wizigje
change_role_user: Brûkersrol wizigje
confirm_user: Brûker befêstigje
create_account_warning: Warskôging oanmeitsje
create_announcement: Meidieling oanmeitsje
+ create_canonical_email_block: E-mailblokkade oanmeitsje
create_custom_emoji: Lokale emoji oanmeitsje
create_domain_allow: Domeingoedkarring oanmeitsje
create_domain_block: Domeinblokkade oanmeitsje
+ create_email_domain_block: E-maildomeinblokkade oanmeitsje
create_ip_block: IP-rigel oanmeitsje
create_unavailable_domain: Net beskikber domein oanmeitsje
create_user_role: Rol oanmeitsje
demote_user: Brûker degradearje
destroy_announcement: Meidieling fuortsmite
+ destroy_canonical_email_block: E-mailblokkade fuortsmite
destroy_custom_emoji: Lokale emoji fuortsmite
destroy_domain_allow: Domeingoedkarring fuortsmite
destroy_domain_block: Domeinblokkade fuortsmite
+ destroy_email_domain_block: E-maildomeinblokkade fuortsmite
destroy_instance: Domein folslein fuortsmite
destroy_ip_block: IP-rigel fuortsmite
destroy_status: Toot fuortsmite
@@ -191,8 +200,10 @@ fy:
destroy_user_role: Rol permanint fuortsmite
disable_2fa_user: Twa-stapsferifikaasje útskeakelje
disable_custom_emoji: Lokale emoji útskeakelje
+ disable_sign_in_token_auth_user: Ferifikaasje mei in tagongskoade fia e-mail foar de brûker útskeakelje
disable_user: Brûker útskeakelje
enable_custom_emoji: Lokale emoji ynskeakelje
+ enable_sign_in_token_auth_user: Ferifikaasje mei in tagongskoade fia e-mail foar de brûker ynskeakelje
enable_user: Brûker ynskeakelje
memorialize_account: De account yn in Yn memoriam wizigje
promote_user: Brûker promovearje
@@ -222,20 +233,26 @@ fy:
approve_appeal_html: "%{name} hat it beswier tsjin de moderaasjemaatregel fan %{target} goedkard"
approve_user_html: "%{name} hat de registraasje fan %{target} goedkard"
assigned_to_self_report_html: "%{name} hat rapportaazje %{target} oan harrensels tawiisd"
+ change_email_user_html: "%{name} hat it e-mailadres fan brûker %{target} wizige"
change_role_user_html: "%{name} hat de rol fan %{target} wizige"
+ confirm_user_html: E-mailadres fan brûker %{target} is troch %{name} befêstige
create_account_warning_html: "%{name} hat in warskôging nei %{target} ferstjoerd"
create_announcement_html: "%{name} hat de nije meidieling %{target} oanmakke"
+ create_canonical_email_block_html: "%{name} hat it e-mailberjocht mei de hash %{target} blokkearre"
create_custom_emoji_html: Nije emoji %{target} is troch %{name} opladen
create_domain_allow_html: "%{name} hat de federaasje mei it domein %{target} goedkard"
create_domain_block_html: Domein %{target} is troch %{name} blokkearre
+ create_email_domain_block_html: "%{name} hat it e-maildomein %{target} blokkearre"
create_ip_block_html: "%{name} hat de rigel foar IP %{target} oanmakke"
create_unavailable_domain_html: "%{name} hat de besoarging foar domein %{target} beëinige"
create_user_role_html: "%{name} hat de rol %{target} oanmakke"
demote_user_html: Brûker %{target} is troch %{name} degradearre
destroy_announcement_html: "%{name} hat de meidieling %{target} fuortsmiten"
+ destroy_canonical_email_block_html: "%{name} hat it e-mailberjocht mei de hash %{target} deblokkearre"
destroy_custom_emoji_html: Emoji %{target} is troch %{name} fuortsmiten
destroy_domain_allow_html: "%{name} hat de federaasje mei it domein %{target} ôfkard"
destroy_domain_block_html: Domein %{target} is troch %{name} deblokkearre
+ destroy_email_domain_block_html: "%{name} hat it e-maildomein %{target} deblokkearre"
destroy_instance_html: "%{name} hat it domein %{target} folslein fuortsmiten"
destroy_ip_block_html: "%{name} hat de rigel foar IP %{target} fuortsmiten"
destroy_status_html: Berjocht fan %{target} is troch %{name} fuortsmiten
@@ -243,8 +260,10 @@ fy:
destroy_user_role_html: "%{name} hat de rol %{target} fuortsmiten"
disable_2fa_user_html: De fereaske twa-stapsferifikaasje foar %{target} is troch %{name} útskeakele
disable_custom_emoji_html: Emoji %{target} is troch %{name} útskeakele
+ disable_sign_in_token_auth_user_html: "%{name} hat ferifikaasje mei in tagongskoade fia e-mail útskeakele foar %{target}"
disable_user_html: Oanmelden foar %{target} is troch %{name} útskeakele
enable_custom_emoji_html: Emoji %{target} is troch %{name} ynskeakele
+ enable_sign_in_token_auth_user_html: "%{name} hat ferifikaasje mei in tagongskoade fia e-mail ynskeakele foar %{target}"
enable_user_html: Oanmelden foar %{target} is troch %{name} ynskeakele
memorialize_account_html: De account %{target} is troch %{name} yn in Yn memoriam wizige
promote_user_html: Brûker %{target} is troch %{name} promovearre
@@ -252,6 +271,7 @@ fy:
reject_user_html: "%{name} hat de registraasje fan %{target} ôfwêzen"
remove_avatar_user_html: "%{name} hat de profylfoto fan %{target} fuortsmiten"
reopen_report_html: "%{name} hat rapportaazje %{target} opnij iepene"
+ resend_user_html: "%{name} hat it befêstigings-e-mailberjocht foar %{target} opnij ferstjoerd"
reset_password_user_html: Wachtwurd fan brûker %{target} is troch %{name} opnij ynsteld
resolve_report_html: "%{name} hat rapportaazje %{target} oplost"
sensitive_account_html: "%{name} markearre de media fan %{target} as gefoelich"
@@ -412,6 +432,7 @@ fy:
attempts_over_week:
one: "%{count} registraasjebesykjen yn de ôfrûne wike"
other: "%{count} registraasjebesykjen yn de ôfrûne wike"
+ created_msg: E-maildomein blokkearjen slagge
delete: Fuortsmite
dns:
types:
@@ -420,8 +441,12 @@ fy:
new:
create: Domein tafoegje
resolve: Domein opsykje
+ title: Nije e-maildomein blokkearje
+ no_email_domain_block_selected: Der binne gjin e-maildomeinblokkaden wizige, omdat der gjin ien selektearre waard
not_permitted: Net tastien
+ resolved_dns_records_hint_html: De domeinnamme slacht op de folgjende MX-domeinen dy’t úteinlik ferantwurdlik binne foar it akseptearjen fan e-mail. It blokkearjen fan in MX-domein blokkearret oanmeldingen fan elk e-mailadres dat itselde MX-domein brûkt, sels as de sichtbere domeinnamme oars is. Pas op dat jo gjin grutte e-mailproviders blokkearje.
resolved_through_html: Blokkearre fia %{domain}
+ title: Blokkearre e-maildomeinen
export_domain_allows:
new:
title: Tastiene domeinen ymportearje
@@ -575,6 +600,7 @@ fy:
resolve_description_html: Der wurdt tsjin it rapportearre account gjin maatregel nommen, gjin oertrêding registrearre en de rapportaazje wurdt markearre as oplost.
silence_description_html: De account sil allinnich sichtber wêze foar dyjinge dy’t it al folgje of it hânmjittich opsykje, wêrtroch it berik earnstich beheind wurdt. Kin altyd weromdraaid wurde. Dit slút alle rapportaazjes oer dizze account.
suspend_description_html: De account en alle ynhâld sil net tagonklik wêze en úteinlik fuortsmiten wurde, en ynteraksje hjirmei sil net mooglik wêze. Binnen 30 dagen werom te draaien. Dit slút alle rapportaazjes oer dizze account.
+ actions_description_html: Beslis hokker maatregel nommen wurde moat om dizze rapportaazje op te lossen. Wannear’t jo in (straf)maatregel tsjin it rapportearre account nimme, kriget de account in e-mailmelding, behalve wannear’t de spam-kategory keazen is.
actions_description_remote_html: Beslút hokker aksje nommen wurde moat om dizze rapportaazje ôf te hanneljen. Dit hat allinnich ynfloed op hoe’t jo server kommunisearret mei dizze eksterne account en omgiet mei de ynhâld.
add_to_report: Mear oan de rapportaazje tafoegje
already_suspended_badges:
@@ -639,6 +665,7 @@ fy:
delete_data_html: It profyl en de ynhâld fan @%{acct} wurde nei 30 dagen fan no ôf fuortsmiten, útsein as de account yn de tuskentiid net mear blokkearre wurdt
preview_preamble_html: "@%{acct} sil in warskôging ûntfange mei de folgjende ynhâld:"
record_strike_html: In ban tsjin @%{acct} ynstelle, om jo te helpen by takomstige skeiningen fan dizze acount te eskalearjen
+ send_email_html: Stjoer @%{acct} in warskôgings-e-mailberjocht
warning_placeholder: Ekstra opsjonele reden foar de moderaasje-aksje.
target_origin: Orizjineel fan rapportearre account
title: Rapportaazjes
@@ -678,6 +705,7 @@ fy:
manage_appeals: Beswieren beheare
manage_appeals_description: Stiet brûkers ta om beswieren tsjin moderaasjemaatregelen te beoardielen
manage_blocks: Blokkaden beheare
+ manage_blocks_description: Stiet brûkers ta om e-mailproviders en IP-adressen te blokkearjen
manage_custom_emojis: Lokale emoji’s beheare
manage_custom_emojis_description: Stiet brûkers ta om lokale emoji’s op de server te behearen
manage_federation: Federaasje beheare
@@ -695,6 +723,7 @@ fy:
manage_taxonomies: Trends en hashtags beheare
manage_taxonomies_description: Stiet brûkers ta om trending ynhâld te besjen en om hashtagynstellingen by te wurkjen
manage_user_access: Brûkerstagong beheare
+ manage_user_access_description: Stiet brûkers ta om twa-stapsferifikaasje fan oare brûkers út te skeakeljen, om harren e-mailadres te wizigjen en om harren wachtwurd opnij yn te stellen
manage_users: Brûkers beheare
manage_users_description: Stiet brûkers ta om brûkersdetails fan oaren te besjen en moderaasjemaatregelen tsjin harren te nimmen
manage_webhooks: Webhooks beheare
@@ -769,6 +798,7 @@ fy:
destroyed_msg: Fuortsmiten website-oplaad slagge!
software_updates:
critical_update: Krityk — fernij sa gau as mooglik
+ description: It wurdt oanrekommandearre om jo Mastodon-ynstallaasje by-de-tiid te hâlden om gebrûk meitsje te kinnen fan de nijste oplossingen en funksjes. Boppe dat is it somtiden krúsjaal om Mastodon tidich by te wurkjen om feiligheidsproblemen foar te kommen. Om dizze redenen kontrolearret Mastodon elke 30 minuten fernijingen en bringt jo hjirfan op de hichte neffens jo foarkarren foar e-mailmeldingen.
documentation_link: Mear ynfo
release_notes: Utjefte-opmerkingen
title: Beskikbere fernijingen
@@ -855,16 +885,39 @@ fy:
action: Klik hjir foar mear ynformaasje
message_html: "Jo objektûnthâld is ferkeard konfigurearre. De privacy fan jo brûkers is yn gefaar."
tags:
+ moderation:
+ not_trendable: Net trendber
+ not_usable: Net brûkber
+ pending_review: Moat noch beoardiele wurde
+ review_requested: Beoardieling oanfrege
+ reviewed: Beoardiele
+ title: Status
+ trendable: Trendber
+ unreviewed: Net beoardiele
+ usable: Brûkber
+ name: Namme
+ newest: Nijste
+ oldest: Aldste
+ open: Yn it iepenbier besjen
+ reset: Opnij ynstelle
review: Steat beoardiele
+ search: Sykje
+ title: Hashtags
updated_msg: Hashtagynstellingen mei sukses bywurke
title: Behear
trends:
allow: Tastean
approved: Goedkarre
+ confirm_allow: Binne jo wis dat jo de selektearre hashtags tastean wolle?
+ confirm_disallow: Binne jo wis dat jo de selektearre hashtags ôfkarre wolle?
disallow: Ofkarre
links:
allow: Keppeling goedkarre
allow_provider: Auteur goedkarre
+ confirm_allow: Binne jo wis dat jo de selektearre keppelingen tastean wolle?
+ confirm_allow_provider: Binne jo wis dat jo de selektearre websites tastean wolle?
+ confirm_disallow: Binne jo wis dat jo de selektearre keppelingen ôfkarre wolle?
+ confirm_disallow_provider: Binne jo wis dat jo de selektearre providers ôfkarre wolle?
description_html: Dit binne keppelingen dy’t op dit stuit in protte dield wurde troch accounts wêr’t jo server berjochten fan ûntfangt. Hjirtroch kinne jo brûkers sjen wat der yn de wrâld oan de hân is. Der wurde gjin keppelingen werjûn oant jo de website goedkard hawwe. Jo kinne ek yndividuele keppelingen goed- of ôfkarre.
disallow: Keppeling ôfkarre
disallow_provider: Website ôfkarre
@@ -888,6 +941,10 @@ fy:
statuses:
allow: Berjocht goedkarre
allow_account: Account goedkarre
+ confirm_allow: Binne jo wis dat jo de selektearre statussen ofkarre wolle?
+ confirm_allow_account: Binne jo wis dat jo de selektearre accounts tastean wolle?
+ confirm_disallow: Binne jo wis dat jo de selektearre statussen ôfkarre wolle?
+ confirm_disallow_account: Binne jo wis dat jo de selektearre accounts ôfkarre wolle?
description_html: Dit binne berjochten dy’t op jo server bekend binne en dy’t op dit stuit in protte dield wurde en as favoryt markearre wurde. Hjirmei kinne nije en weromkearende brûkers mear minsken fine om te folgjen. Der wurde gjin berjochten yn it iepenbier werjûn oant de account troch jo goedkard is en de brûker tastiet dat harren account oan oaren oanrekommandearre wurdt. Jo kinne ek yndividuele berjochten goed- of ôfkarre.
disallow: Berjocht ôfkarre
disallow_account: Account ôfkarre
@@ -920,6 +977,7 @@ fy:
used_by_over_week:
one: Dizze wike troch ien persoan brûkt
other: Dizze wike troch %{count} persoanen brûkt
+ title: Oanrekommandaasjes & trends
trending: Trending
warning_presets:
add_new: Nije tafoegje
@@ -1004,7 +1062,9 @@ fy:
guide_link_text: Elkenien kin bydrage.
sensitive_content: Gefoelige ynhâld
application_mailer:
+ notification_preferences: E-mailynstellingen wizigje
salutation: "%{name},"
+ settings: 'E-mailfoarkarren wizigje: %{link}'
unsubscribe: Ofmelde
view: 'Besjoch:'
view_profile: Profyl besjen
@@ -1024,6 +1084,7 @@ fy:
hint_html: Noch ien ding! Jo moatte befêstigje dat jo in minske binne (dit is om de spam bûten de doar te hâlden!). Los de ûndersteande CAPTCHA op en klik op ‘Trochgean’.
title: Befeiligingskontrôle
confirmations:
+ awaiting_review: Jo e-mailadres is befêstige! De %{domain}-meiwurkers binne no dwaande mei it besjen fan jo registraasje. Jo ûntfange in e-mailberjocht as de jo account goedkarre!
awaiting_review_title: Jo registraasje wurdt beoardield
clicking_this_link: klik op dizze keppeling
login_link: oanmelde
@@ -1031,6 +1092,7 @@ fy:
redirect_to_app_html: Jo soene omlaad wêze moatte nei de %{app_name} app. As dat net bard is, probearje dan %{clicking_this_link} of kear hânmjittich werom nei de app.
registration_complete: Jo registraasje op %{domain} is no foltôge!
welcome_title: Wolkom, %{name}!
+ wrong_email_hint: As it e-mailadres net korrekt is, kinne jo dat wizigje yn de accountynstellingen.
delete_account: Account fuortsmite
delete_account_html: Wannear’t jo jo account graach fuortsmite wolle, kinne jo dat hjir dwaan. Wy freegje jo dêr om in befêstiging.
description:
@@ -1051,6 +1113,7 @@ fy:
or_log_in_with: Of oanmelde mei
privacy_policy_agreement_html: Ik haw it privacybelied lêzen en gean dêrmei akkoard
progress:
+ confirm: E-mailadres werhelje
details: Jo gegevens
review: Us beoardieling
rules: Regels akseptearje
@@ -1072,8 +1135,10 @@ fy:
security: Befeiliging
set_new_password: Nij wachtwurd ynstelle
setup:
+ email_below_hint_html: Kontrolearje jo map Net-winske, of freegje in nije befêstigingskeppeling oan. Jo kinne jo e-mailadres wizigje as it ferkeard is.
email_settings_hint_html: Klik op de keppeling dy’t wy jo stjoerd hawwe om %{email} te ferifiearjen. Wy wachtsje wol even.
link_not_received: Gjin keppeling krigen?
+ new_confirmation_instructions_sent: Jo ûntfange binnen inkelde minuten in nij e-mailberjocht mei de befêstigingskeppeling!
title: Kontrolearje jo Postfek YN
sign_in:
preamble_html: Meld jo oan mei de oanmeldgegevens fan %{domain}. As jo account op in oare server stiet, kinne jo hjir net oanmelde.
@@ -1084,7 +1149,9 @@ fy:
title: Litte wy jo account op %{domain} ynstelle.
status:
account_status: Accountsteat
+ confirming: Oan it wachtsjen oant it e-mailadres befêstige is.
functional: Jo account kin folslein brûkt wurde.
+ pending: Jo oanfraach moat noch beoardiele wurde troch ien fan ús meiwurkers. Dit kin miskien efkes duorje. Jo ûntfangt in e-mailberjocht wannear’t jo oanfraach goedkard is.
redirecting_to: Jo account is ynaktyf, omdat it op dit stuit trochferwezen wurdt nei %{acct}.
self_destruct: Omdat %{domain} sluten sil, krije jo mar beheind tagong ta jo account.
view_strikes: Besjoch de earder troch moderatoaren fêststelde skeiningen dy’t jo makke hawwe
@@ -1127,6 +1194,9 @@ fy:
before: 'Lês dizze tekst soarchfâldich eardat jo troch gean:'
caches: Berjochten en media dy’t op oare servers bewarre binne kinne dêr efterbliuwe
data_removal: Jo berjochten en oare gegevens wurde permanint fuortmiten
+ email_change_html: Jo kinne jo e-mailadres wizigje sûnder dat jo jo account fuort hoege te smiten
+ email_contact_html: Wannear’t it noch hieltyd net oankomt, kinne jo foar help in e-mailberjocht stjoere nei %{email}
+ email_reconfirmation_html: Wannear’t jo it befêstigings-e-mailberjocht net ûntfongen hawwe, kinne jo dizze opnij oanfreegje
irreversible: Jo sille net yn steat wêze om jo account te werstellen of te de-aktivearjen
more_details_html: Sjoch it privacybelied foar mear ynformaasje.
username_available: Jo brûkersnamme sil wer beskikber komme
@@ -1359,6 +1429,7 @@ fy:
authentication_methods:
otp: twa-stapsferifikaasje-app
password: wachtwurd
+ sign_in_token: befeiligingskoade fia e-mailberjocht
webauthn: befeiligingskaaien
description_html: Wannear’t jo aktiviteit sjogge dy’t jo net werkenne, tink dan nei om jo wachtwurd te wizigjen en twa-stapsferifikaasje yn te skeakeljen.
empty: Gjin oanmeldskiednis beskikber
@@ -1369,6 +1440,16 @@ fy:
unsubscribe:
action: Ja, ôfmelde
complete: Ofmelden
+ confirmation_html: Binne jo wis dat jo jo ôfmelde wolle foar it ûntfangen fan %{type} fan Mastodon op %{domain} op jo e-mailadres %{email}? Jo kinne jo altyd opnij abonnearje yn jo ynstellingen foar e-mailmeldingen.
+ emails:
+ notification_emails:
+ favourite: e-mailmeldingen foar favoriten
+ follow: e-mailmeldingen foar nije folgers
+ follow_request: e-mailmeldingen foar folchfersiken
+ mention: e-mailmeldingen foar fermeldingen
+ reblog: e-mailmeldingen foar boosts
+ resubscribe_html: As jo jo mei fersin ôfmeld hawwe, kinne jo jo opnij abonnearje yn jo ynstellingen foar e-mailmeldingen.
+ success_html: Jo ûntfange net langer %{type} fan Mastodon op %{domain} op jo e-mailadres %{email}.
title: Ofmelde
media_attachments:
validations:
@@ -1449,6 +1530,8 @@ fy:
update:
subject: "%{name} hat in berjocht bewurke"
notifications:
+ administration_emails: E-mailmeldingen behearder
+ email_events: E-mailmeldingen foar eveneminten
email_events_hint: 'Selektearje eveneminten wêrfoar’t jo meldingen ûntfange wolle:'
number:
human:
@@ -1607,6 +1690,7 @@ fy:
import: Ymportearje
import_and_export: Ymportearje en eksportearje
migrate: Accountmigraasje
+ notifications: E-mailmeldingen
preferences: Ynstellingen
profile: Profyl
relationships: Folgers en folgjenden
@@ -1853,6 +1937,7 @@ fy:
invalid_otp_token: Unjildige twa-stapstagongskoade
otp_lost_help_html: As jo tagong ta beide kwytrekke binne, nim dan kontakt op fia %{email}
rate_limited: Te folle autentikaasjebesykjen, probearje it letter opnij.
+ seamless_external_login: Jo binne oanmeld fia in eksterne tsjinst, dêrom binne wachtwurden en e-mailynstellingen net beskikber.
signed_in_as: 'Oanmeld as:'
verification:
extra_instructions_html: Tip: De keppeling op jo website kin ûnsichtber wêze. It wichtige part is rel="me" dat ympersonaasje op websites mei user-generated ynhâld foarkomt. Jo kinne sels in link-label brûke yn de header fan de side yn stee fan a, mar de HTML moat ek sûnder JavaScript tagonklik wêze.
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 71df4c8d93..b43ec5d172 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -1454,6 +1454,7 @@ gl:
media_attachments:
validations:
images_and_video: Non podes anexar un vídeo a unha publicación que xa contén imaxes
+ not_found: Non se atopou o multimedia %{ids} ou xa é adxunto noutra publicación
not_ready: Non se poden anexar ficheiros que aínda se están a procesar. Agarda un intre!
too_many: Non pode anexar máis de 4 ficheiros
migrations:
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index c282a17f92..5596aacf2d 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -661,6 +661,7 @@ ia:
delete_data_html: Deler le profilo e contento de @%{acct} in 30 dies excepte si le suspension es disfacite intertanto
preview_preamble_html: "@%{acct} recipera un advertimento con le sequente contento:"
record_strike_html: Registra un sanction contra @%{acct} pro adjutar te a prender mesuras adequate in caso de futur violationes committite desde iste conto
+ send_email_html: Inviar un e-mail de advertimento a @%{acct}
warning_placeholder: Motivation supplementari facultative pro le action de moderation.
target_origin: Origine del conto reportate
title: Reportos
@@ -700,6 +701,7 @@ ia:
manage_appeals: Gerer appellos
manage_appeals_description: Permitte que usatores revide appellos contra actiones de moderation
manage_blocks: Gerer blocadas
+ manage_blocks_description: Permitter que usatores bloca le fornitores de e-mail e le adresses IP
manage_custom_emojis: Gerer emojis personalisate
manage_custom_emojis_description: Permitte que usatores gere emojis personalisate sur le servitor
manage_federation: Gerer federation
@@ -717,6 +719,7 @@ ia:
manage_taxonomies: Gerer taxonomias
manage_taxonomies_description: Permitte que usatores revide contento in tendentias e actualisa le parametros de hashtag
manage_user_access: Gerer le accesso de usatores
+ manage_user_access_description: Permitte que usatores disactiva le authentication bifactorial de altere usatores, cambia lor adresses de e-mail, e reinitialisa lor contrasigno
manage_users: Gerer usatores
manage_users_description: Permitte que usatores vide le detalios de altere usatores e exeque actiones de moderation contra illes
manage_webhooks: Gerer Webhooks
@@ -791,6 +794,7 @@ ia:
destroyed_msg: Le file incargate al sito ha essite delite!
software_updates:
critical_update: Critic – per favor, actualisa rapidemente
+ description: Il es recommendate mantener tu installation de Mastodon actualisate pro beneficiar del ultime reparationes e functiones. In ultra, de tempore a tempore, il es de importantia critic actualisar Mastodon in tempore utile pro evitar problemas de securitate. Pro iste rationes, Mastodon verifica le presentia de actualisationes cata 30 minutas, e te notificara secundo tu preferentias de notification in e-mail.
documentation_link: Pro saper plus
release_notes: Notas de version
title: Actualisationes disponibile
@@ -878,6 +882,7 @@ ia:
message_html: "Tu immagazinage de objectos es mal configurate. Le confidentialitate de tu usatores es in risco."
tags:
moderation:
+ not_trendable: Non pro tendentia
pending_review: Attende revision
title: Stato
name: Nomine
diff --git a/config/locales/it.yml b/config/locales/it.yml
index bc60b6ea50..54e122fd75 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -1456,6 +1456,7 @@ it:
media_attachments:
validations:
images_and_video: Impossibile allegare video a un post che contiene già immagini
+ not_found: Media %{ids} non trovato o già collegato a un altro post
not_ready: Impossibile allegare file per cui l'elaborazione non è finita. Riprova tra poco!
too_many: Impossibile allegare più di 4 file
migrations:
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index e919e183d4..9632a3027b 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -1430,6 +1430,7 @@ ko:
media_attachments:
validations:
images_and_video: 이미 사진이 첨부된 게시물엔 동영상을 첨부할 수 없습니다.
+ not_found: 미디어 %{ids}는 찾을 수 없거나 이미 다른 게시물에 첨부되었습니다
not_ready: 처리가 끝나지 않은 파일은 첨부할 수 없습니다. 잠시 후에 다시 시도해 주세요!
too_many: 최대 4개까지 첨부할 수 있습니다
migrations:
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 6cc35d939d..8c3b8e2e73 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -941,6 +941,7 @@ lt:
media_attachments:
validations:
images_and_video: Negalima pridėti video prie statuso, kuris jau turi nuotrauką
+ not_found: Medija %{ids} nerasta arba jau pridėta prie kito įrašo.
too_many: Negalima pridėti daugiau nei 4 failų
migrations:
acct: Perkelta į
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index cdd71112e9..46ed411776 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -1454,6 +1454,7 @@ nl:
media_attachments:
validations:
images_and_video: Een video kan niet aan een bericht met afbeeldingen worden gekoppeld
+ not_found: Media %{ids} niet gevonden of al toegevoegd aan een ander bericht
not_ready: Kan geen bestanden toevoegen die nog niet zijn verwerkt. Probeer het later opnieuw!
too_many: Er kunnen niet meer dan 4 afbeeldingen toegevoegd worden
migrations:
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index d79df666e5..95746bd10b 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -1506,6 +1506,7 @@ pl:
media_attachments:
validations:
images_and_video: Nie możesz załączyć pliku wideo do wpisu, który zawiera już zdjęcia
+ not_found: Nie znaleziono mediów %{ids}, lub są już dołączone do innego wpisu
not_ready: Nie można załączyć plików których przetwarzanie nie zostało ukończone. Spróbuj ponownie za chwilę!
too_many: Nie możesz załączyć więcej niż 4 plików
migrations:
diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml
index bde97237f6..e6c1b0ee82 100644
--- a/config/locales/simple_form.fy.yml
+++ b/config/locales/simple_form.fy.yml
@@ -314,6 +314,7 @@ fy:
listable: Tastean dat dizze hashtag yn sykopdrachten en oanrekommandaasjes te sjen is
name: Hashtag
trendable: Goedkarre dat dizze hashtag ûnder trends te sjen is
+ usable: Berjochten tastean dizze hashtag lokaal te brûken
user:
role: Rol
time_zone: Tiidsône
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index ffaa8e00b9..b3d273024b 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -1446,6 +1446,7 @@ sq:
media_attachments:
validations:
images_and_video: S’mund të bashkëngjitet video te një gjendje që përmban figura tashmë
+ not_found: S’u gjet media %{ids}, ose është bashkëngjitur tashmë një tjetër postimi
not_ready: S’mund të bashkëngjiten kartela që s’kanë përfunduar së përpunuari. Riprovoni pas një çasti!
too_many: S’mund të bashkëngjiten më shumë se 4 kartela
migrations:
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index c24ed77aef..544e2671c6 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -1506,6 +1506,7 @@ uk:
media_attachments:
validations:
images_and_video: Не можна додати відео до допису з зображеннями
+ not_found: Медіа %{ids} не знайдено або вже прикріплено до іншого допису
not_ready: Не можна прикріпити файли, оброблення яких ще не закінчилося. Спробуйте ще раз через хвилину!
too_many: Не можна додати більше 4 файлів
migrations:
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 9b3d2a1d75..2f607d1ecb 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -1428,6 +1428,7 @@ vi:
media_attachments:
validations:
images_and_video: Không thể đính kèm video vào tút đã chứa hình ảnh
+ not_found: Không tìm thấy %{ids} hoặc nó đã bị đính kèm với tút khác
not_ready: Tập tin này vẫn chưa xử lý xong. Hãy thử lại sau!
too_many: Không thể đính kèm hơn 4 tệp
migrations:
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index f85646b5bc..97a4399b21 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -1430,6 +1430,7 @@ zh-TW:
media_attachments:
validations:
images_and_video: 無法於已有圖片之嘟文中加入影片
+ not_found: 找不到多媒體 %{ids} 或已附加於另一嘟文中
not_ready: 修但幾勒!不能附加未完成處理的檔案欸,咁按呢?
too_many: 無法加入超過 4 個檔案
migrations:
diff --git a/config/secrets.yml b/config/secrets.yml
deleted file mode 100644
index 51681d7a5c..0000000000
--- a/config/secrets.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-# Be sure to restart your server when you modify this file.
-
-# Your secret key is used for verifying the integrity of signed cookies.
-# If you change this key, all old signed cookies will become invalid!
-
-# Make sure the secret is at least 30 characters and all random,
-# no regular words or you'll be exposed to dictionary attacks.
-# You can use `rails secret` to generate a secure secret key.
-
-# Make sure the secrets in this file are kept private
-# if you're sharing your code publicly.
-
-development:
- secret_key_base: d4398e4af52f1fc5be5c3c8764e9ecce7beac5462826cb8b649373b2aad5a0f133598ed817c4e9931e943041460d6b6eda40a854e825e1bbd510c4594b1538f2
-
-test:
- secret_key_base: 5be187ddbd651211a906f9aa399f4a148edf6e06b971c7c0b5429b9483df6e21d262cc846447d0f89b89c32d56a99e151039df5dd874ede7f712afbe041a9269
-
-# Do not keep production secrets in the repository,
-# instead read values from the environment.
-production:
- secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
diff --git a/spec/helpers/json_ld_helper_spec.rb b/spec/helpers/json_ld_helper_spec.rb
index 4855085027..f4b849d7a1 100644
--- a/spec/helpers/json_ld_helper_spec.rb
+++ b/spec/helpers/json_ld_helper_spec.rb
@@ -21,6 +21,34 @@ describe JsonLdHelper do
end
end
+ describe '#uri_from_bearcap' do
+ subject { helper.uri_from_bearcap(string) }
+
+ context 'when a bear string has a u param' do
+ let(:string) { 'bear:?t=TOKEN&u=https://example.com/foo' }
+
+ it 'returns the value from the u query param' do
+ expect(subject).to eq('https://example.com/foo')
+ end
+ end
+
+ context 'when a bear string does not have a u param' do
+ let(:string) { 'bear:?t=TOKEN&h=https://example.com/foo' }
+
+ it 'returns nil' do
+ expect(subject).to be_nil
+ end
+ end
+
+ context 'when a non-bear string' do
+ let(:string) { 'http://example.com' }
+
+ it 'returns the string' do
+ expect(subject).to eq('http://example.com')
+ end
+ end
+ end
+
describe '#first_of_value' do
context 'when value.is_a?(Array)' do
it 'returns value.first' do
diff --git a/spec/helpers/statuses_helper_spec.rb b/spec/helpers/statuses_helper_spec.rb
index ba6fe361d9..b7531ec0b7 100644
--- a/spec/helpers/statuses_helper_spec.rb
+++ b/spec/helpers/statuses_helper_spec.rb
@@ -23,12 +23,6 @@ describe StatusesHelper do
end
end
- def status_text_summary(status)
- return if status.spoiler_text.blank?
-
- I18n.t('statuses.content_warning', warning: status.spoiler_text)
- end
-
describe 'fa_visibility_icon' do
context 'with a status that is public' do
let(:status) { Status.new(visibility: 'public') }
diff --git a/spec/lib/annual_report_spec.rb b/spec/lib/annual_report_spec.rb
new file mode 100644
index 0000000000..ffb742697b
--- /dev/null
+++ b/spec/lib/annual_report_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe AnnualReport do
+ describe '#generate' do
+ subject { described_class.new(account, Time.zone.now.year) }
+
+ let(:account) { Fabricate :account }
+
+ it 'builds a report for an account' do
+ expect { subject.generate }
+ .to change(GeneratedAnnualReport, :count).by(1)
+ end
+ end
+end
diff --git a/spec/requests/api/v1/accounts_spec.rb b/spec/requests/api/v1/accounts_spec.rb
index 3d9eb65019..3432106a46 100644
--- a/spec/requests/api/v1/accounts_spec.rb
+++ b/spec/requests/api/v1/accounts_spec.rb
@@ -114,10 +114,11 @@ describe '/api/v1/accounts' do
expect(response).to have_http_status(200)
- json = body_as_json
-
- expect(json[:following]).to be true
- expect(json[:requested]).to be false
+ expect(body_as_json)
+ .to include(
+ following: true,
+ requested: false
+ )
expect(user.account.following?(other_account)).to be true
end
@@ -133,10 +134,11 @@ describe '/api/v1/accounts' do
expect(response).to have_http_status(200)
- json = body_as_json
-
- expect(json[:following]).to be false
- expect(json[:requested]).to be true
+ expect(body_as_json)
+ .to include(
+ following: false,
+ requested: true
+ )
expect(user.account.requested?(other_account)).to be true
end
diff --git a/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb b/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb
index 3f33b50f39..0cddf2c69e 100644
--- a/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb
+++ b/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb
@@ -96,10 +96,11 @@ RSpec.describe 'Canonical Email Blocks' do
subject
expect(response).to have_http_status(200)
- json = body_as_json
-
- expect(json[:id]).to eq(canonical_email_block.id.to_s)
- expect(json[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash)
+ expect(body_as_json)
+ .to include(
+ id: eq(canonical_email_block.id.to_s),
+ canonical_email_hash: eq(canonical_email_block.canonical_email_hash)
+ )
end
end
diff --git a/spec/requests/api/v1/admin/domain_blocks_spec.rb b/spec/requests/api/v1/admin/domain_blocks_spec.rb
index 3aa79d3ce5..7f7b9aa48a 100644
--- a/spec/requests/api/v1/admin/domain_blocks_spec.rb
+++ b/spec/requests/api/v1/admin/domain_blocks_spec.rb
@@ -133,10 +133,8 @@ RSpec.describe 'Domain Blocks' do
it 'creates a domain block with the expected domain name and severity', :aggregate_failures do
subject
- body = body_as_json
-
expect(response).to have_http_status(200)
- expect(body).to match a_hash_including(
+ expect(body_as_json).to match a_hash_including(
{
domain: 'foo.bar.com',
severity: 'silence',
@@ -156,10 +154,8 @@ RSpec.describe 'Domain Blocks' do
it 'creates a domain block with the expected domain name and severity', :aggregate_failures do
subject
- body = body_as_json
-
expect(response).to have_http_status(200)
- expect(body).to match a_hash_including(
+ expect(body_as_json).to match a_hash_including(
{
domain: 'foo.bar.com',
severity: 'suspend',
diff --git a/spec/requests/api/v1/admin/ip_blocks_spec.rb b/spec/requests/api/v1/admin/ip_blocks_spec.rb
index 98b954dd49..bd4015b2d9 100644
--- a/spec/requests/api/v1/admin/ip_blocks_spec.rb
+++ b/spec/requests/api/v1/admin/ip_blocks_spec.rb
@@ -88,10 +88,12 @@ RSpec.describe 'IP Blocks' do
subject
expect(response).to have_http_status(200)
- json = body_as_json
- expect(json[:ip]).to eq("#{ip_block.ip}/#{ip_block.ip.prefix}")
- expect(json[:severity]).to eq(ip_block.severity.to_s)
+ expect(body_as_json)
+ .to include(
+ ip: eq("#{ip_block.ip}/#{ip_block.ip.prefix}"),
+ severity: eq(ip_block.severity.to_s)
+ )
end
context 'when ip block does not exist' do
@@ -118,11 +120,12 @@ RSpec.describe 'IP Blocks' do
subject
expect(response).to have_http_status(200)
- json = body_as_json
-
- expect(json[:ip]).to eq("#{params[:ip]}/32")
- expect(json[:severity]).to eq(params[:severity])
- expect(json[:comment]).to eq(params[:comment])
+ expect(body_as_json)
+ .to include(
+ ip: eq("#{params[:ip]}/32"),
+ severity: eq(params[:severity]),
+ comment: eq(params[:comment])
+ )
end
context 'when the required ip param is not provided' do
diff --git a/spec/requests/api/v1/apps_spec.rb b/spec/requests/api/v1/apps_spec.rb
index 1f01bddf3c..81d6c68126 100644
--- a/spec/requests/api/v1/apps_spec.rb
+++ b/spec/requests/api/v1/apps_spec.rb
@@ -61,9 +61,10 @@ RSpec.describe 'Apps' do
expect(response).to have_http_status(200)
expect(Doorkeeper::Application.find_by(name: client_name)).to be_present
- body = body_as_json
-
- expect(body[:scopes]).to eq Doorkeeper.config.default_scopes.to_a
+ expect(body_as_json)
+ .to include(
+ scopes: Doorkeeper.config.default_scopes.to_a
+ )
end
end
@@ -81,9 +82,10 @@ RSpec.describe 'Apps' do
expect(app).to be_present
expect(app.scopes.to_s).to eq 'read'
- body = body_as_json
-
- expect(body[:scopes]).to eq ['read']
+ expect(body_as_json)
+ .to include(
+ scopes: %w(read)
+ )
end
end
@@ -163,10 +165,11 @@ RSpec.describe 'Apps' do
expect(app.redirect_uri).to eq redirect_uris
expect(app.redirect_uris).to eq redirect_uris.split
- body = body_as_json
-
- expect(body[:redirect_uri]).to eq redirect_uris
- expect(body[:redirect_uris]).to eq redirect_uris.split
+ expect(body_as_json)
+ .to include(
+ redirect_uri: redirect_uris,
+ redirect_uris: redirect_uris.split
+ )
end
end
@@ -184,10 +187,11 @@ RSpec.describe 'Apps' do
expect(app.redirect_uri).to eq redirect_uris.join "\n"
expect(app.redirect_uris).to eq redirect_uris
- body = body_as_json
-
- expect(body[:redirect_uri]).to eq redirect_uris.join "\n"
- expect(body[:redirect_uris]).to eq redirect_uris
+ expect(body_as_json)
+ .to include(
+ redirect_uri: redirect_uris.join("\n"),
+ redirect_uris: redirect_uris
+ )
end
end
diff --git a/spec/requests/api/v1/blocks_spec.rb b/spec/requests/api/v1/blocks_spec.rb
index c6c2d56f36..06d2c4d997 100644
--- a/spec/requests/api/v1/blocks_spec.rb
+++ b/spec/requests/api/v1/blocks_spec.rb
@@ -55,10 +55,8 @@ RSpec.describe 'Blocks' do
it 'queries the blocks in range according to max_id', :aggregate_failures do
subject
- response_body = body_as_json
-
- expect(response_body.size).to be 1
- expect(response_body[0][:id]).to eq(blocks[0].target_account.id.to_s)
+ expect(body_as_json)
+ .to contain_exactly(include(id: blocks.first.target_account.id.to_s))
end
end
@@ -68,10 +66,8 @@ RSpec.describe 'Blocks' do
it 'queries the blocks in range according to since_id', :aggregate_failures do
subject
- response_body = body_as_json
-
- expect(response_body.size).to be 1
- expect(response_body[0][:id]).to eq(blocks[2].target_account.id.to_s)
+ expect(body_as_json)
+ .to contain_exactly(include(id: blocks[2].target_account.id.to_s))
end
end
end
diff --git a/spec/requests/api/v1/featured_tags_spec.rb b/spec/requests/api/v1/featured_tags_spec.rb
index 4b96988704..81e99e015b 100644
--- a/spec/requests/api/v1/featured_tags_spec.rb
+++ b/spec/requests/api/v1/featured_tags_spec.rb
@@ -37,9 +37,7 @@ RSpec.describe 'FeaturedTags' do
it 'returns an empty body' do
get '/api/v1/featured_tags', headers: headers
- body = body_as_json
-
- expect(body).to be_empty
+ expect(body_as_json).to be_empty
end
end
@@ -49,10 +47,10 @@ RSpec.describe 'FeaturedTags' do
it 'returns only the featured tags belonging to the requesting user' do
get '/api/v1/featured_tags', headers: headers
- body = body_as_json
- expected_ids = user_featured_tags.pluck(:id).map(&:to_s)
-
- expect(body.pluck(:id)).to match_array(expected_ids)
+ expect(body_as_json.pluck(:id))
+ .to match_array(
+ user_featured_tags.pluck(:id).map(&:to_s)
+ )
end
end
end
@@ -69,9 +67,10 @@ RSpec.describe 'FeaturedTags' do
it 'returns the correct tag name' do
post '/api/v1/featured_tags', headers: headers, params: params
- body = body_as_json
-
- expect(body[:name]).to eq(params[:name])
+ expect(body_as_json)
+ .to include(
+ name: params[:name]
+ )
end
it 'creates a new featured tag for the requesting user' do
@@ -142,9 +141,7 @@ RSpec.describe 'FeaturedTags' do
it 'returns an empty body' do
delete "/api/v1/featured_tags/#{id}", headers: headers
- body = body_as_json
-
- expect(body).to be_empty
+ expect(body_as_json).to be_empty
end
it 'deletes the featured tag', :inline_jobs do
diff --git a/spec/requests/api/v1/markers_spec.rb b/spec/requests/api/v1/markers_spec.rb
index b04adf2594..2dbb9d205a 100644
--- a/spec/requests/api/v1/markers_spec.rb
+++ b/spec/requests/api/v1/markers_spec.rb
@@ -17,13 +17,12 @@ RSpec.describe 'API Markers' do
end
it 'returns markers', :aggregate_failures do
- json = body_as_json
-
expect(response).to have_http_status(200)
- expect(json.key?(:home)).to be true
- expect(json[:home][:last_read_id]).to eq '123'
- expect(json.key?(:notifications)).to be true
- expect(json[:notifications][:last_read_id]).to eq '456'
+ expect(body_as_json)
+ .to include(
+ home: include(last_read_id: '123'),
+ notifications: include(last_read_id: '456')
+ )
end
end
diff --git a/spec/requests/api/v1/mutes_spec.rb b/spec/requests/api/v1/mutes_spec.rb
index 019bf16584..988bb3c399 100644
--- a/spec/requests/api/v1/mutes_spec.rb
+++ b/spec/requests/api/v1/mutes_spec.rb
@@ -58,10 +58,8 @@ RSpec.describe 'Mutes' do
it 'queries mutes in range according to max_id', :aggregate_failures do
subject
- body = body_as_json
-
- expect(body.size).to eq 1
- expect(body[0][:id]).to eq mutes[0].target_account_id.to_s
+ expect(body_as_json)
+ .to contain_exactly(include(id: mutes.first.target_account_id.to_s))
end
end
@@ -71,10 +69,8 @@ RSpec.describe 'Mutes' do
it 'queries mutes in range according to since_id', :aggregate_failures do
subject
- body = body_as_json
-
- expect(body.size).to eq 1
- expect(body[0][:id]).to eq mutes[1].target_account_id.to_s
+ expect(body_as_json)
+ .to contain_exactly(include(id: mutes[1].target_account_id.to_s))
end
end
diff --git a/spec/requests/api/v1/statuses/reblogs_spec.rb b/spec/requests/api/v1/statuses/reblogs_spec.rb
index 503d804ed0..77542d294e 100644
--- a/spec/requests/api/v1/statuses/reblogs_spec.rb
+++ b/spec/requests/api/v1/statuses/reblogs_spec.rb
@@ -24,11 +24,14 @@ describe 'API V1 Statuses Reblogs' do
expect(user.account.reblogged?(status)).to be true
- hash_body = body_as_json
-
- expect(hash_body[:reblog][:id]).to eq status.id.to_s
- expect(hash_body[:reblog][:reblogs_count]).to eq 1
- expect(hash_body[:reblog][:reblogged]).to be true
+ expect(body_as_json)
+ .to include(
+ reblog: include(
+ id: status.id.to_s,
+ reblogs_count: 1,
+ reblogged: true
+ )
+ )
end
end
@@ -57,11 +60,12 @@ describe 'API V1 Statuses Reblogs' do
expect(user.account.reblogged?(status)).to be false
- hash_body = body_as_json
-
- expect(hash_body[:id]).to eq status.id.to_s
- expect(hash_body[:reblogs_count]).to eq 0
- expect(hash_body[:reblogged]).to be false
+ expect(body_as_json)
+ .to include(
+ id: status.id.to_s,
+ reblogs_count: 0,
+ reblogged: false
+ )
end
end
@@ -81,11 +85,12 @@ describe 'API V1 Statuses Reblogs' do
expect(user.account.reblogged?(status)).to be false
- hash_body = body_as_json
-
- expect(hash_body[:id]).to eq status.id.to_s
- expect(hash_body[:reblogs_count]).to eq 0
- expect(hash_body[:reblogged]).to be false
+ expect(body_as_json)
+ .to include(
+ id: status.id.to_s,
+ reblogs_count: 0,
+ reblogged: false
+ )
end
end
diff --git a/spec/requests/api/v1/suggestions_spec.rb b/spec/requests/api/v1/suggestions_spec.rb
index dc89613fc5..b900c910df 100644
--- a/spec/requests/api/v1/suggestions_spec.rb
+++ b/spec/requests/api/v1/suggestions_spec.rb
@@ -32,10 +32,8 @@ RSpec.describe 'Suggestions' do
it 'returns accounts' do
subject
- body = body_as_json
-
- expect(body.size).to eq 2
- expect(body.pluck(:id)).to match_array([bob, jeff].map { |i| i.id.to_s })
+ expect(body_as_json)
+ .to contain_exactly(include(id: bob.id.to_s), include(id: jeff.id.to_s))
end
context 'with limit param' do
diff --git a/spec/requests/api/v2/filters/keywords_spec.rb b/spec/requests/api/v2/filters/keywords_spec.rb
index 55fb2afd95..69eff5a064 100644
--- a/spec/requests/api/v2/filters/keywords_spec.rb
+++ b/spec/requests/api/v2/filters/keywords_spec.rb
@@ -42,9 +42,11 @@ RSpec.describe 'API V2 Filters Keywords' do
it 'creates a filter', :aggregate_failures do
expect(response).to have_http_status(200)
- json = body_as_json
- expect(json[:keyword]).to eq 'magic'
- expect(json[:whole_word]).to be false
+ expect(body_as_json)
+ .to include(
+ keyword: 'magic',
+ whole_word: false
+ )
filter = user.account.custom_filters.first
expect(filter).to_not be_nil
@@ -71,9 +73,11 @@ RSpec.describe 'API V2 Filters Keywords' do
it 'responds with the keyword', :aggregate_failures do
expect(response).to have_http_status(200)
- json = body_as_json
- expect(json[:keyword]).to eq 'foo'
- expect(json[:whole_word]).to be false
+ expect(body_as_json)
+ .to include(
+ keyword: 'foo',
+ whole_word: false
+ )
end
context "when trying to access another user's filter keyword" do
diff --git a/spec/requests/api/v2/filters/statuses_spec.rb b/spec/requests/api/v2/filters/statuses_spec.rb
index 26d2fb00e1..5969327829 100644
--- a/spec/requests/api/v2/filters/statuses_spec.rb
+++ b/spec/requests/api/v2/filters/statuses_spec.rb
@@ -43,8 +43,10 @@ RSpec.describe 'API V2 Filters Statuses' do
it 'creates a filter', :aggregate_failures do
expect(response).to have_http_status(200)
- json = body_as_json
- expect(json[:status_id]).to eq status.id.to_s
+ expect(body_as_json)
+ .to include(
+ status_id: status.id.to_s
+ )
filter = user.account.custom_filters.first
expect(filter).to_not be_nil
@@ -71,8 +73,10 @@ RSpec.describe 'API V2 Filters Statuses' do
it 'responds with the filter', :aggregate_failures do
expect(response).to have_http_status(200)
- json = body_as_json
- expect(json[:status_id]).to eq status_filter.status_id.to_s
+ expect(body_as_json)
+ .to include(
+ status_id: status_filter.status.id.to_s
+ )
end
context "when trying to access another user's filter keyword" do
diff --git a/spec/requests/api/v2/filters_spec.rb b/spec/requests/api/v2/filters_spec.rb
index 8609e7dca1..036a6a65a9 100644
--- a/spec/requests/api/v2/filters_spec.rb
+++ b/spec/requests/api/v2/filters_spec.rb
@@ -58,12 +58,15 @@ RSpec.describe 'Filters' do
it 'returns a filter with keywords', :aggregate_failures do
subject
- json = body_as_json
-
- expect(json[:title]).to eq 'magic'
- expect(json[:filter_action]).to eq 'hide'
- expect(json[:context]).to eq ['home']
- expect(json[:keywords].map { |keyword| keyword.slice(:keyword, :whole_word) }).to match [{ keyword: 'magic', whole_word: true }]
+ expect(body_as_json)
+ .to include(
+ title: 'magic',
+ filter_action: 'hide',
+ context: %w(home),
+ keywords: contain_exactly(
+ include(keyword: 'magic', whole_word: true)
+ )
+ )
end
it 'creates a filter', :aggregate_failures do
diff --git a/spec/requests/well_known/webfinger_spec.rb b/spec/requests/well_known/webfinger_spec.rb
index 0aafdf5624..cd8a35c702 100644
--- a/spec/requests/well_known/webfinger_spec.rb
+++ b/spec/requests/well_known/webfinger_spec.rb
@@ -129,9 +129,11 @@ describe 'The /.well-known/webfinger endpoint' do
end
it 'returns links for the internal account' do
- json = body_as_json
- expect(json[:subject]).to eq 'acct:mastodon.internal@cb6e6126.ngrok.io'
- expect(json[:aliases]).to eq ['https://cb6e6126.ngrok.io/actor']
+ expect(body_as_json)
+ .to include(
+ subject: 'acct:mastodon.internal@cb6e6126.ngrok.io',
+ aliases: ['https://cb6e6126.ngrok.io/actor']
+ )
end
end
diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb
index 5857263f61..7e44789628 100644
--- a/spec/services/post_status_service_spec.rb
+++ b/spec/services/post_status_service_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe PostStatusService do
it 'schedules a status for future creation and does not create one immediately' do
media = Fabricate(:media_attachment, account: account)
- status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future)
+ status = subject.call(account, text: 'Hi future!', media_ids: [media.id.to_s], scheduled_at: future)
expect(status)
.to be_a(ScheduledStatus)
@@ -42,7 +42,7 @@ RSpec.describe PostStatusService do
scheduled_at: eq(future),
params: include(
'text' => eq('Hi future!'),
- 'media_ids' => contain_exactly(media.id)
+ 'media_ids' => contain_exactly(media.id.to_s)
)
)
expect(media.reload.status).to be_nil
@@ -219,7 +219,7 @@ RSpec.describe PostStatusService do
status = subject.call(
account,
text: 'test status update',
- media_ids: [media.id]
+ media_ids: [media.id.to_s]
)
expect(media.reload.status).to eq status
@@ -233,7 +233,7 @@ RSpec.describe PostStatusService do
subject.call(
account,
text: 'test status update',
- media_ids: [media.id]
+ media_ids: [media.id.to_s]
)
end.to raise_error(
Mastodon::ValidationError,
@@ -249,7 +249,7 @@ RSpec.describe PostStatusService do
subject.call(
account,
text: 'test status update',
- media_ids: Array.new(2) { Fabricate(:media_attachment, account: account) }.map(&:id)
+ media_ids: Array.new(2) { Fabricate(:media_attachment, account: account) }.map { |m| m.id.to_s }
)
end.to raise_error(
Mastodon::ValidationError,
@@ -271,7 +271,7 @@ RSpec.describe PostStatusService do
media_ids: [
video,
image,
- ].map(&:id)
+ ].map { |m| m.id.to_s }
)
end.to raise_error(
Mastodon::ValidationError,
diff --git a/spec/services/update_status_service_spec.rb b/spec/services/update_status_service_spec.rb
index 47be53f4fc..de06fb13c6 100644
--- a/spec/services/update_status_service_spec.rb
+++ b/spec/services/update_status_service_spec.rb
@@ -69,7 +69,7 @@ RSpec.describe UpdateStatusService do
before do
status.media_attachments << detached_media_attachment
- subject.call(status, status.account_id, text: 'Foo', media_ids: [attached_media_attachment.id])
+ subject.call(status, status.account_id, text: 'Foo', media_ids: [attached_media_attachment.id.to_s])
end
it 'updates media attachments' do
@@ -95,7 +95,7 @@ RSpec.describe UpdateStatusService do
before do
status.media_attachments << media_attachment
- subject.call(status, status.account_id, text: 'Foo', media_ids: [media_attachment.id], media_attributes: [{ id: media_attachment.id, description: 'New description' }])
+ subject.call(status, status.account_id, text: 'Foo', media_ids: [media_attachment.id.to_s], media_attributes: [{ id: media_attachment.id, description: 'New description' }])
end
it 'does not detach media attachment' do