From 7dca2427959d23f0b1bb691d21240faebc0adcce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 09:53:32 +0100 Subject: [PATCH 1/8] New Crowdin Translations (automated) (#33835) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/az.json | 12 +++++ app/javascript/mastodon/locales/cy.json | 13 +++++ app/javascript/mastodon/locales/da.json | 62 +++++++++++----------- app/javascript/mastodon/locales/en-GB.json | 4 ++ app/javascript/mastodon/locales/ga.json | 13 +++++ app/javascript/mastodon/locales/pl.json | 3 ++ config/locales/cy.yml | 1 + config/locales/da.yml | 30 +++++------ config/locales/ga.yml | 1 + config/locales/pl.yml | 1 + config/locales/simple_form.cy.yml | 3 ++ config/locales/simple_form.da.yml | 14 ++--- config/locales/simple_form.en-GB.yml | 1 + config/locales/simple_form.ga.yml | 3 ++ config/locales/simple_form.pl.yml | 7 +++ config/locales/sk.yml | 1 + 16 files changed, 116 insertions(+), 53 deletions(-) diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index 5f1efe3d7273a5..a60087890bb308 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -86,6 +86,13 @@ "alert.unexpected.message": "Bilinməyən bir xəta baş verdi.", "alert.unexpected.title": "Ah!", "alt_text_badge.title": "Alternativ mətn", + "alt_text_modal.add_alt_text": "Alternativ mətn əlavə et", + "alt_text_modal.add_text_from_image": "Şəkildəki mətni əlavə et", + "alt_text_modal.cancel": "İmtina", + "alt_text_modal.change_thumbnail": "Miniatürü dəyişdir", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Eşitmə məhdudiyyətli insanlar üçün bunu izah et…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Görmə məhdudiyyətli insanlar üçün bunu təsvir et…", + "alt_text_modal.done": "Oldu", "announcement.announcement": "Elan", "annual_report.summary.archetype.booster": "Trend ovçusu", "annual_report.summary.archetype.lurker": "Lurker", @@ -211,6 +218,10 @@ "confirmations.logout.confirm": "Çıxış et", "confirmations.logout.message": "Çıxmaq istədiyinizə əminsiniz?", "confirmations.logout.title": "Çıxış edilsin?", + "confirmations.missing_alt_text.confirm": "Alternativ mətn əlavə et", + "confirmations.missing_alt_text.message": "Paylaşımınız alternativ mətn ehtiva etmir. Təsvir əlavə etmək onun daha çox insan üçün əlçatan olmasına kömək edir.", + "confirmations.missing_alt_text.secondary": "Yenə də paylaş", + "confirmations.missing_alt_text.title": "Alternativ mətn əlavə edilsin?", "confirmations.mute.confirm": "Səssizləşdir", "confirmations.redraft.confirm": "Sil və qaralamaya köçür", "confirmations.redraft.message": "Bu paylaşımı silmək və qaralamaya köçürmək istədiyinizə əminsiniz? Bəyənmələr və gücləndirmələr itəcək və orijinal paylaşıma olan cavablar tənha qalacaq.", @@ -241,6 +252,7 @@ "dismissable_banner.dismiss": "Bağla", "dismissable_banner.explore_links": "Bu xəbərlər bu gün fediversedə ən çox paylaşılır. Daha fərqli insanlar tərəfindən dərc edilən daha yeni xəbərlər daha yuxarıda sıralanır.", "dismissable_banner.explore_statuses": "Fediversedən olan bu paylaşımlar bu gün maraq qazanır. Daha çox gücləndirici və bəyənmə olan daha yeni paylaşımlar daha yuxarıda sıralanır.", + "dismissable_banner.explore_tags": "Bu heşteqlər fediverse-də trend olublar. Daha çox fərqli insanlar tərəfindən istifadə olunan heşteqlər daha yuxarıda sıralanır.", "domain_block_modal.block_account_instead": "@{name} istifadəçisini blokla", "domain_block_modal.they_can_interact_with_old_posts": "Bu serverdən olan insanlar köhnə paylaşımlarınızla əlaqə qura bilər." } diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index b30ae5e2158693..c9a22ff8f16cd7 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -86,6 +86,13 @@ "alert.unexpected.message": "Digwyddodd gwall annisgwyl.", "alert.unexpected.title": "Wps!", "alt_text_badge.title": "Testun Amgen", + "alt_text_modal.add_alt_text": "Ychwanegu testun amgen", + "alt_text_modal.add_text_from_image": "Ychwanegu testun o'r ddelwedd", + "alt_text_modal.cancel": "Diddymu", + "alt_text_modal.change_thumbnail": "Newid llun bach", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Disgrifiwch hyn ar gyfer pobl â nam ar eu clyw…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Disgrifiwch hyn ar gyfer pobl â nam ar eu golwg…", + "alt_text_modal.done": "Gorffen", "announcement.announcement": "Cyhoeddiad", "annual_report.summary.archetype.booster": "Y hyrwyddwr", "annual_report.summary.archetype.lurker": "Yr arsylwr", @@ -211,6 +218,10 @@ "confirmations.logout.confirm": "Allgofnodi", "confirmations.logout.message": "Ydych chi'n siŵr eich bod am allgofnodi?", "confirmations.logout.title": "Allgofnodi?", + "confirmations.missing_alt_text.confirm": "Ychwanegu testun amgen", + "confirmations.missing_alt_text.message": "Mae eich postiad yn cynnwys cyfryngau heb destun amgen. Mae ychwanegu disgrifiadau yn helpu i wneud eich cynnwys yn hygyrch i fwy o bobl.", + "confirmations.missing_alt_text.secondary": "Postio beth bynnag", + "confirmations.missing_alt_text.title": "Ychwanegu testun amgen?", "confirmations.mute.confirm": "Tewi", "confirmations.redraft.confirm": "Dileu ac ailddrafftio", "confirmations.redraft.message": "Ydych chi wir eisiau'r dileu'r postiad hwn a'i ailddrafftio? Bydd ffefrynnau a hybiau'n cael eu colli, a bydd atebion i'r post gwreiddiol yn mynd yn amddifad.", @@ -407,6 +418,8 @@ "ignore_notifications_modal.not_followers_title": "Anwybyddu hysbysiadau gan bobl nad ydynt yn eich dilyn?", "ignore_notifications_modal.not_following_title": "Anwybyddu hysbysiadau gan bobl nad ydych yn eu dilyn?", "ignore_notifications_modal.private_mentions_title": "Anwybyddu hysbysiadau o Grybwylliadau Preifat digymell?", + "info_button.label": "Cymorth", + "info_button.what_is_alt_text": "

Beth yw testun amgen?

Mae Testun Amgen yn darparu disgrifiadau delwedd ar gyfer pobl â nam ar eu golwg, cysylltiadau lled band isel, neu'r rhai sy'n ceisio cyd-destun ychwanegol.

Gallwch wella hygyrchedd a dealltwriaeth i bawb trwy ysgrifennu testun amgen clir, cryno a gwrthrychol.

", "interaction_modal.action.favourite": "I barhau, mae angen i chi hoffi o'ch cyfrif.", "interaction_modal.action.follow": "I barhau, mae angen i chi ddilyn o'ch cyfrif.", "interaction_modal.action.reblog": "I barhau, mae angen i chi ail-flogio o'ch cyfrif.", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index e25921f764f684..3fa92cd53ebcbf 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -29,7 +29,7 @@ "account.endorse": "Fremhæv på profil", "account.featured_tags.last_status_at": "Seneste indlæg {date}", "account.featured_tags.last_status_never": "Ingen indlæg", - "account.featured_tags.title": "{name}s fremhævede hashtags", + "account.featured_tags.title": "{name}s fremhævede etiketter", "account.follow": "Følg", "account.follow_back": "Følg tilbage", "account.followers": "Følgere", @@ -102,12 +102,12 @@ "annual_report.summary.followers.followers": "følgere", "annual_report.summary.followers.total": "{count} i alt", "annual_report.summary.here_it_is": "Her er dit {year} i sammendrag:", - "annual_report.summary.highlighted_post.by_favourites": "mest favoritmærkede indlæg", + "annual_report.summary.highlighted_post.by_favourites": "mest favoritmarkerede indlæg", "annual_report.summary.highlighted_post.by_reblogs": "mest fremhævede indlæg", "annual_report.summary.highlighted_post.by_replies": "mest besvarede indlæg", "annual_report.summary.highlighted_post.possessive": "{name}s", "annual_report.summary.most_used_app.most_used_app": "mest benyttede app", - "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede hashtag", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede etiket", "annual_report.summary.most_used_hashtag.none": "Intet", "annual_report.summary.new_posts.new_posts": "nye indlæg", "annual_report.summary.percentile.text": "Det betyder, at man er i topaf {domain}-brugere.", @@ -181,7 +181,7 @@ "compose.saved.body": "Indlæg gemt.", "compose_form.direct_message_warning_learn_more": "Få mere at vide", "compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende-krypteret. Del derfor ikke sensitiv information via Mastodon.", - "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, da kun offentlige indlæg er søgbare via hashtags.", + "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under nogen etiket, da kun offentlige indlæg er søgbare via etiketter.", "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Hvad tænker du på?", @@ -250,9 +250,9 @@ "disabled_account_banner.text": "Din konto {disabledAccount} er pt. deaktiveret.", "dismissable_banner.community_timeline": "Disse er de seneste offentlige indlæg fra personer med konti hostet af {domain}.", "dismissable_banner.dismiss": "Afvis", - "dismissable_banner.explore_links": "Disse nyhedshistorier deles mest på fediverset i dag. Nyere nyhedshistorier lagt op af flere forskellige personer rangeres højere.", + "dismissable_banner.explore_links": "Disse nyhedshistorier deles mest på fødiverset i dag. Nyere nyhedshistorier lagt op af flere forskellige personer rangeres højere.", "dismissable_banner.explore_statuses": "Disse indlæg på tværs af fødiverset opnår momentum i dag. Nyere indlæg med flere fremhævninger og favoritmærker rangeres højere.", - "dismissable_banner.explore_tags": "Disse hashtags opnår momentum på fødiverset i dag. Hashtags brugt af flere forskellige personer rangeres højere.", + "dismissable_banner.explore_tags": "Disse etiketter opnår momentum på fødiverset i dag. Etiketter brugt af flere forskellige personer rangeres højere.", "dismissable_banner.public_timeline": "Dette er de seneste offentlige indlæg fra personer på fødiverset, som folk på {domain} følger.", "domain_block_modal.block": "Blokér server", "domain_block_modal.block_account_instead": "Blokér i stedet @{name}", @@ -300,14 +300,14 @@ "empty_column.blocks": "Ingen brugere blokeret endnu.", "empty_column.bookmarked_statuses": "Du har ingen bogmærkede indlæg endnu. Når du bogmærker ét, vil det dukke op hér.", "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at sætte tingene i gang!", - "empty_column.direct": "Der er endnu ingen private omtaler. Når en sendes eller modtages, dukker den op hér.", + "empty_column.direct": "Der er endnu ingen private omtaler. Når en sendes eller modtages, dukker den op her.", "empty_column.domain_blocks": "Ingen blokerede domæner endnu.", "empty_column.explore_statuses": "Ingen nye tendenser lige nu. Tjek igen senere!", - "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du favoritmarkerer ét, vil det dukke op hér.", - "empty_column.favourites": "Ingen har endnu favoritmarkeret dette indlæg. Når nogen gør dét, vil det dukke op her.", + "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du føjer et opslag til favoritter, vil det dukke op her.", + "empty_column.favourites": "Ingen har endnu føjet dette indlæg til favoritter. Når nogen gør det, vil det dukke op her.", "empty_column.follow_requests": "Du har endnu ingen følgeanmodninger. Når du modtager én, vil den dukke op her.", - "empty_column.followed_tags": "Ingen hashtags følges endnu. Når det sker, vil de fremgå her.", - "empty_column.hashtag": "Der er intet med dette hashtag endnu.", + "empty_column.followed_tags": "Ingen etiketter følges endnu. Når det sker, vil de fremgå her.", + "empty_column.hashtag": "Der er intet med denne etiket endnu.", "empty_column.home": "Din hjemmetidslinje er tom! Følg nogle personer, for at fylde den op.", "empty_column.list": "Der er ikke noget på denne liste endnu. Når medlemmer af listen udgiver nye indlæg vil de fremgå her.", "empty_column.mutes": "Du har endnu ikke skjult nogle brugere.", @@ -324,7 +324,7 @@ "explore.title": "Udforsk", "explore.trending_links": "Nyheder", "explore.trending_statuses": "Indlæg", - "explore.trending_tags": "Hashtags", + "explore.trending_tags": "Etiketter", "filter_modal.added.context_mismatch_explanation": "Denne filterkategori omfatter ikke konteksten, hvorunder dette indlæg er tilgået. Redigér filteret, hvis indlægget også ønskes filtreret i denne kontekst.", "filter_modal.added.context_mismatch_title": "Kontekstmisforhold!", "filter_modal.added.expired_explanation": "Denne filterkategori er udløbet. Ændr dens udløbsdato, for at anvende den.", @@ -365,7 +365,7 @@ "follow_suggestions.similar_to_recently_followed_longer": "Svarende til profiler, som for nylig er fulgt", "follow_suggestions.view_all": "Vis alle", "follow_suggestions.who_to_follow": "Hvem, som skal følges", - "followed_tags": "Hashtag, som følges", + "followed_tags": "Etiketter, som følges", "footer.about": "Om", "footer.directory": "Profiloversigt", "footer.get_app": "Hent appen", @@ -381,7 +381,7 @@ "hashtag.column_header.tag_mode.any": "eller {additional}", "hashtag.column_header.tag_mode.none": "uden {additional}", "hashtag.column_settings.select.no_options_message": "Ingen forslag fundet", - "hashtag.column_settings.select.placeholder": "Angiv hashtags…", + "hashtag.column_settings.select.placeholder": "Angiv etiketter…", "hashtag.column_settings.tag_mode.all": "Alle disse", "hashtag.column_settings.tag_mode.any": "Nogle af disse", "hashtag.column_settings.tag_mode.none": "Ingen af disse", @@ -389,8 +389,8 @@ "hashtag.counter_by_accounts": "{count, plural, one {{counter} deltager} other {{counter} deltagere}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag", - "hashtag.follow": "Følg hashtag", - "hashtag.unfollow": "Stop med at følge hashtag", + "hashtag.follow": "Følg etiket", + "hashtag.unfollow": "Stop med at følge etiket", "hashtags.and_other": "…og {count, plural, one {}other {# flere}}", "hints.profiles.followers_may_be_missing": "Der kan mangle følgere for denne profil.", "hints.profiles.follows_may_be_missing": "Fulgte kan mangle for denne profil.", @@ -420,7 +420,7 @@ "ignore_notifications_modal.private_mentions_title": "Ignorér notifikationer fra uopfordrede Private omtaler?", "info_button.label": "Hjælp", "info_button.what_is_alt_text": "

Hvad er alt-tekst?

Alt-tekst leverer billedbeskrivelser til folk med synsnedsættelser, lav båndbredde-forbindelser eller med ønske om ekstra kontekst.

Tilgængelighed og forståelse kan forbedres for alle ved at skrive klar, kortfattet og objektiv alt-tekst.

", - "interaction_modal.action.favourite": "For at fortsætte, skal man vælge Gør til favorit fra sin konto.", + "interaction_modal.action.favourite": "For at fortsætte, skal du føje til favoritter fra din konto.", "interaction_modal.action.follow": "For at fortsætte, skal man vælge Følg fra sin konto.", "interaction_modal.action.reblog": "For at fortsætte, skal man vælge Fremhæv fra sin konto.", "interaction_modal.action.reply": "For at fortsætte, skal man besvar fra sin konto.", @@ -429,7 +429,7 @@ "interaction_modal.no_account_yet": "Har endnu ingen konto?", "interaction_modal.on_another_server": "På en anden server", "interaction_modal.on_this_server": "På denne server", - "interaction_modal.title.favourite": "Favoritmarkér {name}s indlæg", + "interaction_modal.title.favourite": "Føj {name}s indlæg til favoritter", "interaction_modal.title.follow": "Følg {name}", "interaction_modal.title.reblog": "Fremhæv {name}s indlæg", "interaction_modal.title.reply": "Besvar {name}s indlæg", @@ -447,7 +447,7 @@ "keyboard_shortcuts.direct": "for at åbne kolonnen private omtaler", "keyboard_shortcuts.down": "Flyt nedad på listen", "keyboard_shortcuts.enter": "Åbn indlæg", - "keyboard_shortcuts.favourite": "Favoritmarkér indlæg", + "keyboard_shortcuts.favourite": "Føj indlæg til favoritter", "keyboard_shortcuts.favourites": "Åbn favoritlisten", "keyboard_shortcuts.federated": "Åbn fødereret tidslinje", "keyboard_shortcuts.heading": "Tastaturgenveje", @@ -536,7 +536,7 @@ "navigation_bar.favourites": "Favoritter", "navigation_bar.filters": "Skjulte ord", "navigation_bar.follow_requests": "Følgeanmodninger", - "navigation_bar.followed_tags": "Hashtag, som følges", + "navigation_bar.followed_tags": "Etiketter, som følges", "navigation_bar.follows_and_followers": "Følges og følgere", "navigation_bar.lists": "Lister", "navigation_bar.logout": "Log af", @@ -559,10 +559,10 @@ "notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# anden} other {# andre}} tilmeldte sig", "notification.annual_report.message": "{year} #Wrapstodon venter! Afslør årets højdepunkter og mindeværdige øjeblikke på Mastodon!", "notification.annual_report.view": "Vis #Wrapstodon", - "notification.favourite": "{name} favoritmarkerede dit indlæg", - "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} favoritmarkerede dit indlæg", - "notification.favourite_pm": "{name} favoritmarkerede din private omtale", - "notification.favourite_pm.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} favoritmarkerede dit indlæg", + "notification.favourite": "{name} føjede dit indlæg til favoritter", + "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} føjede dit indlæg til favoritter", + "notification.favourite_pm": "{name} føjede din private omtale til favoritter", + "notification.favourite_pm.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} føjede dit indlæg til favoritter", "notification.follow": "{name} begyndte at følge dig", "notification.follow.name_and_others": "{name} og {count, plural, one {# andre} other {# andre}} begyndte at følge dig", "notification.follow_request": "{name} har anmodet om at følge dig", @@ -677,7 +677,7 @@ "onboarding.profile.display_name": "Vist navn", "onboarding.profile.display_name_hint": "Dit fulde navn eller dit sjove navn…", "onboarding.profile.note": "Bio", - "onboarding.profile.note_hint": "Man kan @omtale andre personer eller #hashtags…", + "onboarding.profile.note_hint": "Man kan @omtale andre personer eller #etiketter…", "onboarding.profile.save_and_continue": "Gem og fortsæt", "onboarding.profile.title": "Profilopsætning", "onboarding.profile.upload_avatar": "Upload profilbillede", @@ -702,7 +702,7 @@ "privacy.private.short": "Følgere", "privacy.public.long": "Alle på og udenfor Mastodon", "privacy.public.short": "Offentlig", - "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i realtids-strømme/hashtags, udforsk eller Mastodon-søgning, selv hvis valget gælder hele kontoen.", + "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i realtids-strømme/etiketter, udforsk eller Mastodon-søgning, selv hvis valget gælder hele kontoen.", "privacy.unlisted.long": "Færre algoritmiske fanfarer", "privacy.unlisted.short": "Stille offentligt", "privacy_policy.last_updated": "Senest opdateret {date}", @@ -779,7 +779,7 @@ "search.placeholder": "Søg", "search.quick_action.account_search": "Profiler matchende {x}", "search.quick_action.go_to_account": "Gå til profilen {x}", - "search.quick_action.go_to_hashtag": "Gå til hashtagget {x}", + "search.quick_action.go_to_hashtag": "Gå til etiketten {x}", "search.quick_action.open_url": "Åbn URL i Mastodon", "search.quick_action.status_search": "Indlæg matchende {x}", "search.search_or_paste": "Søg efter eller angiv URL", @@ -793,19 +793,19 @@ "search_popout.user": "bruger", "search_results.accounts": "Profiler", "search_results.all": "Alle", - "search_results.hashtags": "Hashtags", + "search_results.hashtags": "Etiketter", "search_results.no_results": "Ingen resultater.", - "search_results.no_search_yet": "Prøv at søge efter indlæg, profiler eller hashtags.", + "search_results.no_search_yet": "Prøv at søge efter indlæg, profiler eller etiketter.", "search_results.see_all": "Vis alle", "search_results.statuses": "Indlæg", "search_results.title": "Søg efter \"{q}\"", "server_banner.about_active_users": "Folk, som brugte denne server de seneste 30 dage (månedlige aktive brugere)", "server_banner.active_users": "aktive brugere", "server_banner.administered_by": "Håndteres af:", - "server_banner.is_one_of_many": "{domain} er en af de mange uafhængige Mastodon-servere, man kan bruge for at deltage i fediverset.", + "server_banner.is_one_of_many": "{domain} er en af de mange uafhængige Mastodon-servere, man kan bruge for at deltage i fødiverset.", "server_banner.server_stats": "Serverstatstik:", "sign_in_banner.create_account": "Opret konto", - "sign_in_banner.follow_anyone": "Følg alle på tværs af fediverset og se alt i kronologisk rækkefølge. Ingen algoritmer, annoncer eller clickbait i syne.", + "sign_in_banner.follow_anyone": "Følg alle på tværs af fødiverset og se alt i kronologisk rækkefølge. Ingen algoritmer, annoncer eller clickbait i syne.", "sign_in_banner.mastodon_is": "Mastodon er den bedste måde at holde sig ajour med, hvad der sker.", "sign_in_banner.sign_in": "Log ind", "sign_in_banner.sso_redirect": "Log ind eller Tilmeld", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 70a194e1fb6013..1974d1e62b9302 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "Log out", "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.logout.title": "Log out?", + "confirmations.missing_alt_text.confirm": "Add alt text", + "confirmations.missing_alt_text.message": "Your post contains media without alt text. Adding descriptions helps make your content accessible to more people.", + "confirmations.missing_alt_text.secondary": "Post anyway", + "confirmations.missing_alt_text.title": "Add alt text?", "confirmations.mute.confirm": "Mute", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 2e899b2804fd2e..54bc7fd380d9a0 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -86,6 +86,13 @@ "alert.unexpected.message": "Tharla earráid gan choinne.", "alert.unexpected.title": "Hiúps!", "alt_text_badge.title": "Téacs alt", + "alt_text_modal.add_alt_text": "Cuir téacs alt leis", + "alt_text_modal.add_text_from_image": "Cuir téacs ón íomhá leis", + "alt_text_modal.cancel": "Cealaigh", + "alt_text_modal.change_thumbnail": "Athraigh mionsamhail", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Déan cur síos air seo do dhaoine le lagú éisteachta…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Déan cur síos air seo do dhaoine a bhfuil lagú amhairc orthu…", + "alt_text_modal.done": "Déanta", "announcement.announcement": "Fógra", "annual_report.summary.archetype.booster": "An sealgair fionnuar", "annual_report.summary.archetype.lurker": "An lurker", @@ -211,6 +218,10 @@ "confirmations.logout.confirm": "Logáil amach", "confirmations.logout.message": "An bhfuil tú cinnte gur mhaith leat logáil amach?", "confirmations.logout.title": "Logáil Amach?", + "confirmations.missing_alt_text.confirm": "Cuir téacs alt leis", + "confirmations.missing_alt_text.message": "Tá meáin gan alt téacs i do phostáil. Má chuirtear tuairiscí leis, cabhraíonn sé seo leat d’inneachar a rochtain do níos mó daoine.", + "confirmations.missing_alt_text.secondary": "Post ar aon nós", + "confirmations.missing_alt_text.title": "Cuir téacs alt leis?", "confirmations.mute.confirm": "Balbhaigh", "confirmations.redraft.confirm": "Scrios ⁊ athdhréachtaigh", "confirmations.redraft.message": "An bhfuil tú cinnte gur mhaith leat an postáil seo a scriosadh agus é a athdhréachtú? Caillfear ceanáin agus treisithe, agus dílleachtaí freagraí ar an mbunphostála.", @@ -407,6 +418,8 @@ "ignore_notifications_modal.not_followers_title": "An dtugann tú aird ar fhógraí ó dhaoine nach leanann tú?", "ignore_notifications_modal.not_following_title": "An ndéanann tú neamhaird de fhógraí ó dhaoine nach leanann tú?", "ignore_notifications_modal.private_mentions_title": "An dtugann tú aird ar fhógraí ó Luaintí Príobháideacha gan iarraidh?", + "info_button.label": "Cabhrú", + "info_button.what_is_alt_text": "

Cad is téacs altach ann?

Soláthraíonn téacs Alt cur síos ar íomhánna do dhaoine le lagú radhairc, naisc íseal-bandaleithead, nó daoine atá ag lorg comhthéacs breise.

Is féidir leat inrochtaineacht agus tuiscint a fheabhsú do chách trí théacs alt soiléir, gonta, oibiachtúil a scríobh.

", "interaction_modal.action.favourite": "Chun leanúint ar aghaidh, ní mór duit an ceann is fearr leat ó do chuntas.", "interaction_modal.action.follow": "Chun leanúint ar aghaidh, ní mór duit leanúint ó do chuntas.", "interaction_modal.action.reblog": "Chun leanúint ar aghaidh, ní mór duit athbhlagáil ó do chuntas.", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 8e3b8a26fac44e..f31de0151d63bb 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -218,6 +218,7 @@ "confirmations.logout.confirm": "Wyloguj", "confirmations.logout.message": "Czy na pewno chcesz się wylogować?", "confirmations.logout.title": "Wylogować?", + "confirmations.missing_alt_text.message": "Twój wpis zawiera treści graficzne bez opisu pomocniczego. Dodając opis, sprawisz, że będzie on bardziej dostępny dla większej liczby osób.", "confirmations.mute.confirm": "Wycisz", "confirmations.redraft.confirm": "Usuń i przeredaguj", "confirmations.redraft.message": "Czy na pewno chcesz usunąć i przeredagować ten wpis? Polubienia i podbicia zostaną utracone, a odpowiedzi do oryginalnego wpisu zostaną osierocone.", @@ -414,6 +415,8 @@ "ignore_notifications_modal.not_followers_title": "Ignoruj powiadomienia od użytkowników którzy cię nie obserwują?", "ignore_notifications_modal.not_following_title": "Ignoruj powiadomienia od użytkowników których nie obserwujesz?", "ignore_notifications_modal.private_mentions_title": "Ignoruj powiadomienia o nieproszonych wzmiankach prywatnych?", + "info_button.label": "Pomoc", + "info_button.what_is_alt_text": "

Czym jest tekst pomocniczy obrazków?

Tekst pomocniczy zapewnia osobom z zaburzeniem widzenia, słabym łączem internetowym oraz tym, którzy szukają dodatkowego kontekstu opis grafik i zdjęć.

\n

Możesz zwiększyć jego dostępność i zrozumienie poprzez jasne, zwięzłe i obiektywne sformułowanie tekstu pomocniczego.

\n", "interaction_modal.action.favourite": "Aby kontynuować, musisz dodać do ulubionych na swoim koncie.", "interaction_modal.action.follow": "Aby kontynuować, musisz obserwować ze swojego konta.", "interaction_modal.action.reblog": "Aby kontynuować, musisz podać dalej ze swojego konta.", diff --git a/config/locales/cy.yml b/config/locales/cy.yml index c2cf6855035c52..f64040a267c38f 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1285,6 +1285,7 @@ cy: too_fast: Cafodd y ffurflen ei chyflwyno'n rhy gyflym, ceisiwch eto. use_security_key: Defnyddiwch allwedd diogelwch user_agreement_html: Rwyf wedi darllen ac yn cytuno i delerau gwasanaeth a'r polisi preifatrwydd + user_privacy_agreement_html: Rwyf wedi darllen ac yn cytuno i'r polisi preifatrwydd author_attribution: example_title: Testun enghreifftiol hint_html: Ydych chi'n ysgrifennu erthyglau newyddion neu flog y tu allan i Mastodon? Rheolwch sut y byddwch yn cael eich cydnabod pan fyddan nhw'n cael eu rhannu ar Mastodon. diff --git a/config/locales/da.yml b/config/locales/da.yml index 59f4789d5b56f8..3ed9d40db97106 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -374,7 +374,7 @@ da: other: "%{count} verserende anmeldelser" pending_tags_html: one: "%{count} afventende hashtag" - other: "%{count} afventende hashtags" + other: "%{count} afventende etiketter" pending_users_html: one: "%{count} afventende bruger" other: "%{count} afventende brugere" @@ -735,7 +735,7 @@ da: manage_settings: Håndtere indstillinger manage_settings_description: Tillader brugere at ændre webstedsindstillinger manage_taxonomies: Håndtere taksonomier - manage_taxonomies_description: Tillader brugere at gennemse tenderende indhold og opdatere hashtag-indstillinger + manage_taxonomies_description: Tillader brugere at gennemse tenderende indhold og opdatere etiket-indstillinger manage_user_access: Håndtere brugeradgang manage_user_access_description: Tillader brugere at deaktivere andre brugeres tofaktorgodkendelse, skifte deres e-mailadresse og nulstille deres adgangskode manage_users: Håndtere brugere @@ -925,7 +925,7 @@ da: reset: Nulstil review: Gennmgangsstatus search: Søg - title: Hashtags + title: Etiketter updated_msg: Hashtag-indstillinger opdateret terms_of_service: back: Tilbage til Tjenestevilkår @@ -1014,14 +1014,14 @@ da: tag_servers_dimension: Topservere tag_servers_measure: forskellige servere tag_uses_measure: anvendelser i alt - description_html: Disse er hashtags, som pt. vises i en masse indlæg, som serveren ser. Det kan hjælpe brugerne til at finde ud af, hvad folk taler mest om pt. Ingen hashtags vises offentligt, før man godkender dem. + description_html: Disse er etiketter, som pt. vises i en masse indlæg, som serveren ser. Det kan hjælpe brugerne til at finde ud af, hvad folk taler mest om pt. Ingen etiketter vises offentligt, før man godkender dem. listable: Kan foreslås no_tag_selected: Intet tag ændret (da intet var valgt) not_listable: Foreslås ikke not_trendable: Vises ikke under tendenser not_usable: Kan ikke anvendes peaked_on_and_decaying: Toppede pr. %{date}, nu for nedadgående - title: Populære hashtags + title: Populære etiketter trendable: Kan vises under tendenser trending_rank: 'Populær #%{rank}' usable: Kan anvendes @@ -1093,7 +1093,7 @@ da: new_trending_statuses: title: Populære opslag new_trending_tags: - title: Populære hashtags + title: Populære etiketter subject: Nye tendenser klar til gennemgang på %{instance} aliases: add_new: Opret alias @@ -1104,7 +1104,7 @@ da: remove: Fjern aliaslinkning appearance: advanced_web_interface: Avanceret webgrænseflade - advanced_web_interface_hint: 'Ønsker du udnytte hele skærmbredden, lader den avancerede webgrænseflade dig opsætte mange forskellige kolonner for at se så meget information på samme tid som ønsket: Hjem, notifikationer, federeret tidslinje, et hvilket som helst antal lister og hashtags.' + advanced_web_interface_hint: 'Ønsker du udnytte hele skærmbredden, lader den avancerede netgrænseflade dig opsætte mange forskellige kolonner for at se så meget information på samme tid som ønsket: Hjem, notifikationer, fødereret tidslinje, et hvilket som helst antal lister og etiketter.' animations_and_accessibility: Animationer og tilgængelighed confirmation_dialogs: Bekræftelsesdialoger discovery: Opdagelse @@ -1331,8 +1331,8 @@ da: featured_tags: add_new: Tilføj nyt errors: - limit: Det maksimale antal hashtags er allerede fremhævet - hint_html: "Hvad er fremhævede hashtags? De vises i en fremtrædende position på din offentlige profil og giver folk mulighed for at gennemse dine offentlige indlæg specifikt under disse hashtags. De er et fantastisk værktøj til at holde styr på kreative værker eller langsigtede projekter." + limit: Det maksimale antal etiketter er allerede fremhævet + hint_html: "Hvad er fremhævede etiketter? De vises i en fremtrædende position på din offentlige profil og giver folk mulighed for at gennemse dine offentlige indlæg specifikt under disse etiketter. De er et fantastisk værktøj til at holde styr på kreative værker eller langsigtede projekter." filters: contexts: account: Profiler @@ -1704,7 +1704,7 @@ da: content_warning: 'Indholdsadvarsel:' descriptions: account: Offentlige indlæg fra @%{acct} - tag: 'Offentlige indlæg tagget #%{hashtag}' + tag: 'Offentlige indlæg etiketteret #%{hashtag}' scheduled_statuses: over_daily_limit: Den daglige grænse på %{limit} planlagte indlæg er nået over_total_limit: Grænsen på %{limit} planlagte indlæg er nået @@ -1769,7 +1769,7 @@ da: development: Udvikling edit_profile: Redigér profil export: Eksport - featured_tags: Udvalgte hashtags + featured_tags: Udvalgte etiketter import: Import import_and_export: Import og eksport migrate: Kontomigrering @@ -1809,8 +1809,8 @@ da: content_warning: 'Indholdsadvarsel: %{warning}' default_language: Samme som UI-sproget disallowed_hashtags: - one: 'indeholdte et ikke tilladt hashtag: %{tags}' - other: 'indeholdte de ikke tilladte hashtags: %{tags}' + one: 'indeholdte en ikke tilladt etiket: %{tags}' + other: 'indeholdte de ikke tilladte etiketter: %{tags}' edited_at_html: Redigeret %{date} errors: in_reply_not_found: Indlægget, der forsøges besvaret, ser ikke ud til at eksistere. @@ -2003,8 +2003,8 @@ da: one: "%{people} person de seneste 2 dage" other: "%{people} personer de seneste 2 dage" hashtags_subtitle: Udforsk de seneste 2 dages tendenser - hashtags_title: Populære hashtags - hashtags_view_more: Se flere populære hashtags + hashtags_title: Populære etiketter + hashtags_view_more: Se flere populære etiketter post_action: Skriv post_step: Sig hej til verden med tekst, fotos, videoer eller afstemninger. post_title: Opret det første indlæg diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 56f66609c31a7c..9945e44c07343e 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -1266,6 +1266,7 @@ ga: too_fast: Cuireadh an fhoirm isteach róthapa, triail arís. use_security_key: Úsáid eochair shlándála user_agreement_html: Léigh mé agus aontaím leis na téarmaí seirbhíse agus polasaí príobháideachais + user_privacy_agreement_html: Léigh mé agus aontaím leis an polasaí príobháideachais author_attribution: example_title: Téacs samplach hint_html: An bhfuil tú ag scríobh altanna nuachta nó blag lasmuigh de Mastodon? Rialú conas a gheobhaidh tú creidmheas nuair a roinntear iad ar Mastodon. diff --git a/config/locales/pl.yml b/config/locales/pl.yml index e2e28600591a3c..5770b4ce0cdeaa 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1247,6 +1247,7 @@ pl: too_fast: Zbyt szybko przesłano formularz, spróbuj ponownie. use_security_key: Użyj klucza bezpieczeństwa user_agreement_html: Przeczytałem i akceptuję warunki korzystania z usługi oraz politykę prywatności + user_privacy_agreement_html: Przeczytałem/am/o i akceptuję politykę prywatności author_attribution: example_title: Przykładowy tekst hint_html: Piszesz wiadomości albo bloga poza Mastodonem? Kontroluj jak będą ci przypisywane podczas dizielenia się nimi na Mastodonie. diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 1220ceabf3aca9..805f8f93af57dd 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -3,6 +3,7 @@ cy: simple_form: hints: account: + attribution_domains: Un i bob llinell. Yn amddiffyn rhag priodoli ffug. discoverable: Mae'n bosibl y bydd eich postiadau cyhoeddus a'ch proffil yn cael sylw neu'n cael eu hargymell mewn gwahanol feysydd o Mastodon ac efallai y bydd eich proffil yn cael ei awgrymu i ddefnyddwyr eraill. display_name: Eich enw llawn neu'ch enw hwyl. fields: Eich tudalen cartref, rhagenwau, oed, neu unrhyw beth. @@ -155,6 +156,7 @@ cy: url: I ble bydd digwyddiadau'n cael eu hanfon labels: account: + attribution_domains: Gwefannau sy'n cael caniatâd i'ch cydnabod chi discoverable: Proffil nodwedd a phostiadau mewn algorithmau darganfod fields: name: Label @@ -231,6 +233,7 @@ cy: setting_display_media_show_all: Dangos popeth setting_expand_spoilers: Dangos postiadau wedi'u marcio â rhybudd cynnwys bob tro setting_hide_network: Cuddio eich graff cymdeithasol + setting_missing_alt_text_modal: Dangos deialog cadarnhau cyn postio cyfrwng heb destun amgen setting_reduce_motion: Lleihau mudiant mewn animeiddiadau setting_system_font_ui: Defnyddio ffont rhagosodedig y system setting_system_scrollbars_ui: Defnyddiwch far sgrolio rhagosodedig y system diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index b92341c4e81162..1548e3e24e5b10 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -8,7 +8,7 @@ da: display_name: Dit fulde navn eller dit sjove navn. fields: Din hjemmeside, dine pronominer, din alder, eller hvad du har lyst til. indexable: Dine offentlige indlæg vil kunne vises i Mastodon-søgeresultater. Folk, som har interageret med dem, vil kunne finde dem uanset. - note: 'Du kan @omtale andre personer eller #hashtags.' + note: 'Du kan @omtale andre personer eller #etiketter.' show_collections: Folk vil ikke kunne tjekke dine Følger og Følgere. Folk, du selv følger, vil stadig kunne se dette. unlocked: Man vil kunne følges af folk uden først at godkende dem. Ønsker man at gennemgå Følg-anmodninger og individuelt acceptere/afvise nye følgere, så fjern markeringen. account_alias: @@ -16,7 +16,7 @@ da: account_migration: acct: Angiv brugernavn@domain for den konto, hvortil du vil flytte account_warning_preset: - text: Du kan bruge indlægssyntaks, såsom URL'er, hashtags og omtaler + text: Du kan bruge indlægssyntaks, såsom URL'er, etiketter og omtaler title: Valgfri. Ikke synlig for modtageren admin_account_action: include_statuses: Brugeren vil se, hvilke indlæg, som har forårsaget modereringen/advarslen @@ -71,7 +71,7 @@ da: domain: Dette kan være domænenavnet vist i den benyttede i e-mailadresse eller MX-post. Begge tjekkes under tilmelding. with_dns_records: Et forsøg på at opløse det givne domænes DNS-poster foretages, og resultaterne blokeres ligeledes featured_tag: - name: 'Her er nogle af dine hyppigst brugte hashtags:' + name: 'Her er nogle af dine hyppigst brugte etiketter:' filters: action: Vælg handlingen til eksekvering, når et indlæg matcher filteret actions: @@ -102,7 +102,7 @@ da: thumbnail: Et ca. 2:1 billede vist sammen med serveroplysningerne. timeline_preview: Udloggede besøgende kan gennemse serverens seneste offentlige indlæg. trendable_by_default: Spring manuel gennemgang af trendindhold over. Individuelle elementer kan stadig fjernes fra trends efter kendsgerningen. - trends: Tendenser viser, hvilke indlæg, hashtags og nyheder opnår momentum på serveren. + trends: Tendenser viser, hvilke indlæg, etiketter og nyheder opnår momentum på serveren. trends_as_landing_page: Vis tendensindhold til udloggede brugere og besøgende i stedet for en beskrivelse af denne server. Kræver, at tendenser er aktiveret. form_challenge: current_password: Du bevæger dig ind på et sikkert område @@ -327,10 +327,10 @@ da: indexable: Inkludér profilside i søgemaskiner show_application: Vis, fra hvilken app et indlæg er sendt tag: - listable: Tillad visning af dette hashtag i søgninger og forslag + listable: Tillad visning af denne etiket i søgninger og forslag name: Hashtag - trendable: Tillad visning af dette hashtag under trends - usable: Tillad indlæg at benytte dette hashtag lokalt + trendable: Tillad visning af denne etiket under tendenser + usable: Tillad indlæg at benytte denne etiket lokalt terms_of_service: changelog: Hvad der er ændret? text: Tjenestevilkår diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index fa7868cc765fca..8a4cb247c76542 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -233,6 +233,7 @@ en-GB: setting_display_media_show_all: Show all setting_expand_spoilers: Always expand posts marked with content warnings setting_hide_network: Hide your social graph + setting_missing_alt_text_modal: Show confirmation dialogue before posting media without alt text setting_reduce_motion: Reduce motion in animations setting_system_font_ui: Use system's default font setting_system_scrollbars_ui: Use system's default scrollbar diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index 93eff4a89ddee8..93a1090cf811f1 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: Ceann in aghaidh an líne. 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. @@ -155,6 +156,7 @@ ga: url: An áit a seolfar imeachtaí chuig labels: account: + attribution_domains: Tá cead ag suíomhanna Gréasáin creidmheas a thabhairt duit discoverable: Próifíl gné agus postálacha in halgartaim fionnachtana fields: name: Lipéad @@ -231,6 +233,7 @@ ga: setting_display_media_show_all: Taispeáin uile setting_expand_spoilers: Méadaigh postálacha atá marcáilte le rabhaidh inneachair i gcónaí setting_hide_network: Folaigh do ghraf sóisialta + setting_missing_alt_text_modal: Taispeáin dialóg deimhnithe sula bpostálann tú meán gan alt téacs setting_reduce_motion: Laghdú ar an tairiscint i beochan setting_system_font_ui: Úsáid cló réamhshocraithe an chórais setting_system_scrollbars_ui: Bain úsáid as scrollbharra réamhshocraithe an chórais diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index efa17c1a9bd12d..74dc8218a9a10d 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -137,6 +137,10 @@ pl: admin_email: Zawiadomienia prawne obejmują środki zapobiegawcze, nakazy sądowe, wnioski o popełnienie sprawy oraz wnioski organów ścigania. arbitration_address: Może być taki sam jak adres fizyczny powyżej lub „N/A” jeśli używasz adresu e-mail arbitration_website: Może być formularzem internetowym lub „N/A”, jeśli używasz adresu e-mail + dmca_address: W przypadku operatorów z USA należy użyć adresu zarejestrowanego w DMCA Designated Agent Directory. Lista skrytek pocztowych dostępna jest na bezpośrednią prośbę użytkownika. Użyj DMCA Agent Post Office Box Waiver Request, aby wysłać email do Copyright Office z informacją, że jesteś domowym administratorm treści i z powodu obawy o zemstę lub odwetu za swoje działania, musisz użyć skrytki pocztowej, żeby usunąć swój adres domowy z dostępu publicznego. + dmca_email: Adres email może być taki sam jak wcześniejszy "adres e-mail przeznaczony do celów prawnych" + domain: Unikalny numer identyfikacji świadczonej przez Ciebie usługi online. + jurisdiction: Wymień państwo, w którym mieszkają osoby płacące rachunki. Jeżeli jest to spółka lub inny zarejestrowany podmiot, w zależności od przypadku podaj państwo, w którym jest zarejestrowany, a także miasto, region czy województwo. user: chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu role: Rola kontroluje uprawnienia użytkownika. @@ -152,6 +156,7 @@ pl: url: Dokąd będą wysłane zdarzenia labels: account: + attribution_domains: Strony które mogą ci przypisywać autorstwo discoverable: Udostępniaj profil i wpisy funkcjom odkrywania fields: name: Nazwa @@ -228,6 +233,7 @@ pl: setting_display_media_show_all: Pokaż wszystko setting_expand_spoilers: Zawsze rozwijaj wpisy oznaczone ostrzeżeniem o zawartości setting_hide_network: Ukryj swoją sieć + setting_missing_alt_text_modal: Pokaż okno potwierdzenia przed opublikowaniem materiałów bez pomocniczego opisu obrazów setting_reduce_motion: Ogranicz ruch w animacjach setting_system_font_ui: Używaj domyślnej czcionki systemu setting_system_scrollbars_ui: Używaj domyślnego paska przewijania systemu @@ -329,6 +335,7 @@ pl: changelog: Co się zmieniło? text: Warunki korzystania z usługi terms_of_service_generator: + admin_email: Adres e-mail przeznaczony do celów prawnych arbitration_address: Adres fizyczny powiadomień arbitrażowych arbitration_website: Strona internetowa do składania zgłoszeń arbitrażowych dmca_address: Adres fizyczny dla zgłoszeń naruszenia DMCA/praw autorskich diff --git a/config/locales/sk.yml b/config/locales/sk.yml index e7fb218e2d68cc..a1257d4cd48d17 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -1365,6 +1365,7 @@ sk: explanation: Tu nájdeš nejaké tipy do začiatku feature_action: Zisti viac follow_action: Nasleduj + follow_title: Prispôsob svoj domáci kanál follows_title: Koho nasledovať post_title: Vytvor svoj prvý príspevok share_action: Zdieľaj From 8dce5138dd99a90f80f5cd46b8f6450b8e3b9758 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 09:58:05 +0100 Subject: [PATCH 2/8] chore(deps): update opentelemetry-ruby (non-major) (#33834) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index ebd25d542c2bff..4b702260d44836 100644 --- a/Gemfile +++ b/Gemfile @@ -116,7 +116,7 @@ group :opentelemetry do gem 'opentelemetry-instrumentation-net_http', '~> 0.23.0', require: false gem 'opentelemetry-instrumentation-pg', '~> 0.30.0', require: false gem 'opentelemetry-instrumentation-rack', '~> 0.26.0', require: false - gem 'opentelemetry-instrumentation-rails', '~> 0.35.0', require: false + gem 'opentelemetry-instrumentation-rails', '~> 0.36.0', require: false gem 'opentelemetry-instrumentation-redis', '~> 0.26.0', require: false gem 'opentelemetry-instrumentation-sidekiq', '~> 0.26.0', require: false gem 'opentelemetry-sdk', '~> 1.4', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 4779fdd8d8d4b9..3ddc7256ad9715 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -480,7 +480,7 @@ GEM opentelemetry-api (~> 1.0) opentelemetry-instrumentation-active_support (~> 0.7) opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-action_pack (0.11.0) + opentelemetry-instrumentation-action_pack (0.12.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-rack (~> 0.21) @@ -498,6 +498,10 @@ GEM opentelemetry-instrumentation-active_record (0.9.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-active_storage (0.1.0) + opentelemetry-api (~> 1.4.0) + opentelemetry-instrumentation-active_support (~> 0.7) + opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-active_support (0.8.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) @@ -530,13 +534,14 @@ GEM opentelemetry-instrumentation-rack (0.26.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-rails (0.35.1) + opentelemetry-instrumentation-rails (0.36.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-action_mailer (~> 0.4.0) - opentelemetry-instrumentation-action_pack (~> 0.11.0) + opentelemetry-instrumentation-action_pack (~> 0.12.0) opentelemetry-instrumentation-action_view (~> 0.9.0) opentelemetry-instrumentation-active_job (~> 0.8.0) opentelemetry-instrumentation-active_record (~> 0.9.0) + opentelemetry-instrumentation-active_storage (~> 0.1.0) opentelemetry-instrumentation-active_support (~> 0.8.0) opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-concurrent_ruby (~> 0.22.0) @@ -548,7 +553,7 @@ GEM opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-registry (0.3.1) opentelemetry-api (~> 1.1) - opentelemetry-sdk (1.6.0) + opentelemetry-sdk (1.7.0) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) opentelemetry-registry (~> 0.2) @@ -977,7 +982,7 @@ DEPENDENCIES opentelemetry-instrumentation-net_http (~> 0.23.0) opentelemetry-instrumentation-pg (~> 0.30.0) opentelemetry-instrumentation-rack (~> 0.26.0) - opentelemetry-instrumentation-rails (~> 0.35.0) + opentelemetry-instrumentation-rails (~> 0.36.0) opentelemetry-instrumentation-redis (~> 0.26.0) opentelemetry-instrumentation-sidekiq (~> 0.26.0) opentelemetry-sdk (~> 1.4) From c3419d146a3e9eae017345aeeb90882f95423bd9 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 5 Feb 2025 04:19:08 -0500 Subject: [PATCH 3/8] Remove duplicate cache header setting before action (#33833) --- app/controllers/admin/base_controller.rb | 5 ----- app/controllers/auth/registrations_controller.rb | 5 ----- app/controllers/disputes/base_controller.rb | 7 ------- app/controllers/filters/statuses_controller.rb | 5 ----- app/controllers/filters_controller.rb | 5 ----- app/controllers/invites_controller.rb | 5 ----- app/controllers/oauth/authorizations_controller.rb | 5 ----- .../oauth/authorized_applications_controller.rb | 5 ----- app/controllers/relationships_controller.rb | 5 ----- app/controllers/settings/base_controller.rb | 5 ----- app/controllers/severed_relationships_controller.rb | 5 ----- app/controllers/statuses_cleanup_controller.rb | 5 ----- 12 files changed, 62 deletions(-) diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index 3dca3a96149f8c..14338dd293819e 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -7,17 +7,12 @@ class BaseController < ApplicationController layout 'admin' - before_action :set_cache_headers before_action :set_referrer_policy_header after_action :verify_authorized private - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end - def set_referrer_policy_header response.headers['Referrer-Policy'] = 'same-origin' end diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index 34c75995537f73..6e34b6b627228f 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -12,7 +12,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :set_sessions, only: [:edit, :update] before_action :set_strikes, only: [:edit, :update] before_action :require_not_suspended!, only: [:update] - before_action :set_cache_headers, only: [:edit, :update] before_action :set_rules, only: :new before_action :require_rules_acceptance!, only: :new before_action :set_registration_form_time, only: :new @@ -139,10 +138,6 @@ def require_rules_acceptance! set_locale { render :rules } end - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end - def is_flashing_format? # rubocop:disable Naming/PredicateName if params[:action] == 'create' false # Disable flash messages for sign-up diff --git a/app/controllers/disputes/base_controller.rb b/app/controllers/disputes/base_controller.rb index dd24a1b7408c98..07677fd3f3d9cb 100644 --- a/app/controllers/disputes/base_controller.rb +++ b/app/controllers/disputes/base_controller.rb @@ -8,11 +8,4 @@ class Disputes::BaseController < ApplicationController skip_before_action :require_functional! before_action :authenticate_user! - before_action :set_cache_headers - - private - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/filters/statuses_controller.rb b/app/controllers/filters/statuses_controller.rb index ca5205d042b237..d85b017aaacb2f 100644 --- a/app/controllers/filters/statuses_controller.rb +++ b/app/controllers/filters/statuses_controller.rb @@ -6,7 +6,6 @@ class Filters::StatusesController < ApplicationController before_action :authenticate_user! before_action :set_filter before_action :set_status_filters - before_action :set_cache_headers PER_PAGE = 20 @@ -40,8 +39,4 @@ def status_filter_batch_action_params def action_from_button 'remove' if params[:remove] end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/filters_controller.rb b/app/controllers/filters_controller.rb index c8cac0abe006e3..769aea2afe53f1 100644 --- a/app/controllers/filters_controller.rb +++ b/app/controllers/filters_controller.rb @@ -5,7 +5,6 @@ class FiltersController < ApplicationController before_action :authenticate_user! before_action :set_filter, only: [:edit, :update, :destroy] - before_action :set_cache_headers def index @filters = current_account.custom_filters.includes(:keywords, :statuses).order(:phrase) @@ -50,8 +49,4 @@ def set_filter def resource_params params.expect(custom_filter: [:title, :expires_in, :filter_action, context: [], keywords_attributes: [[:id, :keyword, :whole_word, :_destroy]]]) end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index c4c52cce1191f5..fc65333ac48c72 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -6,7 +6,6 @@ class InvitesController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_cache_headers def index authorize :invite, :create? @@ -45,8 +44,4 @@ def invites def resource_params params.expect(invite: [:max_uses, :expires_in, :autofollow, :comment]) end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb index 66e774425d7081..deafedeaeffd7f 100644 --- a/app/controllers/oauth/authorizations_controller.rb +++ b/app/controllers/oauth/authorizations_controller.rb @@ -5,7 +5,6 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController before_action :store_current_location before_action :authenticate_resource_owner! - before_action :set_cache_headers content_security_policy do |p| p.form_action(false) @@ -32,8 +31,4 @@ def render_success def truthy_param?(key) ActiveModel::Type::Boolean.new.cast(params[key]) end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb index 9e541e5e3c1c78..8b11a519ea4026 100644 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -6,7 +6,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio before_action :store_current_location before_action :authenticate_resource_owner! before_action :require_not_suspended!, only: :destroy - before_action :set_cache_headers before_action :set_last_used_at_by_app, only: :index, unless: -> { request.format == :json } @@ -30,10 +29,6 @@ def require_not_suspended! forbidden if current_account.unavailable? end - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end - def set_last_used_at_by_app @last_used_at_by_app = current_resource_owner.applications_last_used end diff --git a/app/controllers/relationships_controller.rb b/app/controllers/relationships_controller.rb index 43105d70c85aec..7e793fc73427fa 100644 --- a/app/controllers/relationships_controller.rb +++ b/app/controllers/relationships_controller.rb @@ -6,7 +6,6 @@ class RelationshipsController < ApplicationController before_action :authenticate_user! before_action :set_accounts, only: :show before_action :set_relationships, only: :show - before_action :set_cache_headers helper_method :following_relationship?, :followed_by_relationship?, :mutual_relationship? @@ -66,8 +65,4 @@ def action_from_button 'remove_domains_from_followers' end end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/settings/base_controller.rb b/app/controllers/settings/base_controller.rb index 188334ac234663..7f2279aa8f9514 100644 --- a/app/controllers/settings/base_controller.rb +++ b/app/controllers/settings/base_controller.rb @@ -4,14 +4,9 @@ class Settings::BaseController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_cache_headers private - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end - def require_not_suspended! forbidden if current_account.unavailable? end diff --git a/app/controllers/severed_relationships_controller.rb b/app/controllers/severed_relationships_controller.rb index 965753a26f8ac9..817abebf62d1da 100644 --- a/app/controllers/severed_relationships_controller.rb +++ b/app/controllers/severed_relationships_controller.rb @@ -4,7 +4,6 @@ class SeveredRelationshipsController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_cache_headers before_action :set_event, only: [:following, :followers] @@ -49,8 +48,4 @@ def followers_data def acct(account) account.local? ? account.local_username_and_domain : account.acct end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/statuses_cleanup_controller.rb b/app/controllers/statuses_cleanup_controller.rb index 028c57d0d3d76f..f4f49031a0a281 100644 --- a/app/controllers/statuses_cleanup_controller.rb +++ b/app/controllers/statuses_cleanup_controller.rb @@ -5,7 +5,6 @@ class StatusesCleanupController < ApplicationController before_action :authenticate_user! before_action :set_policy - before_action :set_cache_headers def show; end @@ -30,8 +29,4 @@ def set_policy def resource_params params.expect(account_statuses_cleanup_policy: [:enabled, :min_status_age, :keep_direct, :keep_pinned, :keep_polls, :keep_media, :keep_self_fav, :keep_self_bookmark, :min_favs, :min_reblogs]) end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end From 5cb54f7c5e0a2f94fcec9113bec35871750eba2c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 10:23:13 +0100 Subject: [PATCH 4/8] chore(deps): update dependency opentelemetry-instrumentation-redis to v0.26.1 (#33837) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3ddc7256ad9715..26e1e31b0ae83c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -545,7 +545,7 @@ GEM opentelemetry-instrumentation-active_support (~> 0.8.0) opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-concurrent_ruby (~> 0.22.0) - opentelemetry-instrumentation-redis (0.26.0) + opentelemetry-instrumentation-redis (0.26.1) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-sidekiq (0.26.0) From 4af91e564d71a7d61213ab87c88951853fae26c8 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Wed, 5 Feb 2025 14:49:47 +0100 Subject: [PATCH 5/8] Fix a missing `require` when enabling the local prometheus exporter with Sidekiq (#33840) --- config/initializers/prometheus_exporter.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/initializers/prometheus_exporter.rb b/config/initializers/prometheus_exporter.rb index 197777e3b65bbd..fab095658ff272 100644 --- a/config/initializers/prometheus_exporter.rb +++ b/config/initializers/prometheus_exporter.rb @@ -2,6 +2,7 @@ if ENV['MASTODON_PROMETHEUS_EXPORTER_ENABLED'] == 'true' if ENV['MASTODON_PROMETHEUS_EXPORTER_LOCAL'] == 'true' + require 'prometheus_exporter' require 'prometheus_exporter/server' require 'prometheus_exporter/client' From 1be526915161687366e31fdf3456bba644e2ac0b Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 5 Feb 2025 15:02:39 +0100 Subject: [PATCH 6/8] Optimize timeline generation (#33839) --- app/lib/feed_manager.rb | 68 ++++++++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 30ec11c2d982de..3b67d518814251 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -42,7 +42,7 @@ def filter(timeline_type, status, receiver) when :home filter_from_home(status, receiver.id, build_crutches(receiver.id, [status]), :home) when :list - (filter_from_list?(status, receiver) ? :filter : nil) || filter_from_home(status, receiver.account_id, build_crutches(receiver.account_id, [status]), :list) + (filter_from_list?(status, receiver) ? :filter : nil) || filter_from_home(status, receiver.account_id, build_crutches(receiver.account_id, [status], list: list), :list) when :mentions filter_from_mentions?(status, receiver.id) ? :filter : nil when :tags @@ -121,7 +121,7 @@ def merge_into_home(from_account, into_account) timeline_key = key(:home, into_account.id) aggregate = into_account.user&.aggregates_reblogs? - query = from_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, reblog: :account).limit(FeedManager::MAX_ITEMS / 4) + query = from_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(FeedManager::MAX_ITEMS / 4) if redis.zcard(timeline_key) >= FeedManager::MAX_ITEMS / 4 oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i @@ -149,7 +149,7 @@ def merge_into_list(from_account, list) timeline_key = key(:list, list.id) aggregate = list.account.user&.aggregates_reblogs? - query = from_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, reblog: :account).limit(FeedManager::MAX_ITEMS / 4) + query = from_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(FeedManager::MAX_ITEMS / 4) if redis.zcard(timeline_key) >= FeedManager::MAX_ITEMS / 4 oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i @@ -157,10 +157,10 @@ def merge_into_list(from_account, list) end statuses = query.to_a - crutches = build_crutches(list.account_id, statuses) + crutches = build_crutches(list.account_id, statuses, list: list) statuses.each do |status| - next if filter_from_home(status, list.account_id, crutches) || filter_from_list?(status, list) + next if filter_from_home(status, list.account_id, crutches, :list) add_to_feed(:list, list.id, status, aggregate_reblogs: aggregate) end @@ -272,23 +272,32 @@ def populate_home(account) limit = FeedManager::MAX_ITEMS / 2 aggregate = account.user&.aggregates_reblogs? timeline_key = key(:home, account.id) + over_limit = false account.statuses.limit(limit).each do |status| add_to_feed(:home, account.id, status, aggregate_reblogs: aggregate) end account.following.includes(:account_stat).reorder(nil).find_each do |target_account| - if redis.zcard(timeline_key) >= limit + query = target_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(limit) + + over_limit ||= redis.zcard(timeline_key) >= limit + if over_limit oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i - last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at) + last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at, with_random: false) # If the feed is full and this account has not posted more recently # than the last item on the feed, then we can skip the whole account # because none of its statuses would stay on the feed anyway next if last_status_score < oldest_home_score + + # No need to get older statuses + query = query.where(id: oldest_home_score...) end - statuses = target_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, :account, reblog: :account).limit(limit) + statuses = query.to_a + next if statuses.empty? + crutches = build_crutches(account.id, statuses) statuses.each do |status| @@ -308,23 +317,32 @@ def populate_list(list) limit = FeedManager::MAX_ITEMS / 2 aggregate = list.account.user&.aggregates_reblogs? timeline_key = key(:list, list.id) + over_limit = false list.active_accounts.includes(:account_stat).reorder(nil).find_each do |target_account| - if redis.zcard(timeline_key) >= limit + query = target_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(limit) + + over_limit ||= redis.zcard(timeline_key) >= limit + if over_limit oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i - last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at) + last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at, with_random: false) # If the feed is full and this account has not posted more recently # than the last item on the feed, then we can skip the whole account # because none of its statuses would stay on the feed anyway next if last_status_score < oldest_home_score + + # No need to get older statuses + query = query.where(id: oldest_home_score...) end - statuses = target_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, :account, reblog: :account).limit(limit) - crutches = build_crutches(list.account_id, statuses) + statuses = query.to_a + next if statuses.empty? + + crutches = build_crutches(list.account_id, statuses, list: list) statuses.each do |status| - next if filter_from_home(status, list.account_id, crutches) || filter_from_list?(status, list) + next if filter_from_home(status, list.account_id, crutches, :list) add_to_feed(:list, list.id, status, aggregate_reblogs: aggregate) end @@ -592,8 +610,9 @@ def remove_from_feed(timeline_type, account_id, status, aggregate_reblogs: true) # are going to be checked by the filtering methods # @param [Integer] receiver_id # @param [Array] statuses + # @param [List] list # @return [Hash] - def build_crutches(receiver_id, statuses) + def build_crutches(receiver_id, statuses, list: nil) crutches = {} crutches[:active_mentions] = crutches_active_mentions(statuses) @@ -610,20 +629,33 @@ def build_crutches(receiver_id, statuses) arr end - lists = List.where(account_id: receiver_id, exclusive: true) - - crutches[:following] = Follow.where(account_id: receiver_id, target_account_id: statuses.filter_map(&:in_reply_to_account_id)).pluck(:target_account_id).index_with(true) + crutches[:following] = crutches_following(receiver_id, statuses, list) crutches[:languages] = Follow.where(account_id: receiver_id, target_account_id: statuses.map(&:account_id)).pluck(:target_account_id, :languages).to_h crutches[:hiding_reblogs] = Follow.where(account_id: receiver_id, target_account_id: statuses.filter_map { |s| s.account_id if s.reblog? }, show_reblogs: false).pluck(:target_account_id).index_with(true) crutches[:blocking] = Block.where(account_id: receiver_id, target_account_id: check_for_blocks).pluck(:target_account_id).index_with(true) crutches[:muting] = Mute.where(account_id: receiver_id, target_account_id: check_for_blocks).pluck(:target_account_id).index_with(true) crutches[:domain_blocking] = AccountDomainBlock.where(account_id: receiver_id, domain: statuses.flat_map { |s| [s.account.domain, s.reblog&.account&.domain] }.compact).pluck(:domain).index_with(true) crutches[:blocked_by] = Block.where(target_account_id: receiver_id, account_id: statuses.map { |s| [s.account_id, s.reblog&.account_id] }.flatten.compact).pluck(:account_id).index_with(true) - crutches[:exclusive_list_users] = ListAccount.where(list: lists, account_id: statuses.map(&:account_id)).pluck(:account_id).index_with(true) + crutches[:exclusive_list_users] = crutches_exclusive_list_users(receiver_id, statuses) if list.blank? crutches end + def crutches_exclusive_list_users(recipient_id, statuses) + lists = List.where(account_id: recipient_id, exclusive: true) + ListAccount.where(list: lists, account_id: statuses.map(&:account_id)).pluck(:account_id).index_with(true) + end + + def crutches_following(recipient_id, statuses, list) + if list.blank? || list.show_followed? + Follow.where(account_id: recipient_id, target_account_id: statuses.filter_map(&:in_reply_to_account_id)).pluck(:target_account_id).index_with(true) + elsif list.show_list? + ListAccount.where(list_id: list.id, account_id: statuses.filter_map(&:in_reply_to_account_id)).pluck(:account_id).index_with(true) + else + {} + end + end + def crutches_active_mentions(statuses) Mention .active From 334d306cccbbe7d88338cdf1d1c0d8008b9c2fa6 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 5 Feb 2025 16:08:12 +0100 Subject: [PATCH 7/8] Fix filtering for lists (#33842) --- app/lib/feed_manager.rb | 2 +- spec/lib/feed_manager_spec.rb | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 3b67d518814251..b6b5fd729d2073 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -42,7 +42,7 @@ def filter(timeline_type, status, receiver) when :home filter_from_home(status, receiver.id, build_crutches(receiver.id, [status]), :home) when :list - (filter_from_list?(status, receiver) ? :filter : nil) || filter_from_home(status, receiver.account_id, build_crutches(receiver.account_id, [status], list: list), :list) + (filter_from_list?(status, receiver) ? :filter : nil) || filter_from_home(status, receiver.account_id, build_crutches(receiver.account_id, [status], list: receiver), :list) when :mentions filter_from_mentions?(status, receiver.id) ? :filter : nil when :tags diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb index 1d3123d343adbd..0d0c817b6c9514 100644 --- a/spec/lib/feed_manager_spec.rb +++ b/spec/lib/feed_manager_spec.rb @@ -196,6 +196,28 @@ end end + context 'with list feed' do + let(:list) { Fabricate(:list, account: bob) } + + before do + bob.follow!(alice) + list.list_accounts.create!(account: alice) + end + + it "returns false for followee's status" do + status = Fabricate(:status, text: 'Hello world', account: alice) + + expect(subject.filter?(:list, status, list)).to be false + end + + it 'returns false for reblog by followee' do + status = Fabricate(:status, text: 'Hello world', account: jeff) + reblog = Fabricate(:status, reblog: status, account: alice) + + expect(subject.filter?(:list, reblog, list)).to be false + end + end + context 'with mentions feed' do it 'returns true for status that mentions blocked account' do bob.block!(jeff) From a9643cb7e77fd345b48877ed958d406403ad1b46 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 5 Feb 2025 16:58:28 +0100 Subject: [PATCH 8/8] Use github's native arm64 runners for docker builds (#33788) --- .github/workflows/build-container-image.yml | 145 ++++++++++++++------ .github/workflows/build-nightly.yml | 4 - .github/workflows/build-push-pr.yml | 4 - .github/workflows/build-releases.yml | 4 - .github/workflows/build-security.yml | 4 - .github/workflows/test-image-build.yml | 2 - 6 files changed, 106 insertions(+), 57 deletions(-) diff --git a/.github/workflows/build-container-image.yml b/.github/workflows/build-container-image.yml index 6204319a6379fa..260730004cc774 100644 --- a/.github/workflows/build-container-image.yml +++ b/.github/workflows/build-container-image.yml @@ -1,14 +1,9 @@ on: workflow_call: inputs: - platforms: - required: true - type: string cache: type: boolean default: true - use_native_arm64_builder: - type: boolean push_to_images: type: string version_prerelease: @@ -24,42 +19,36 @@ on: file_to_build: type: string +# This builds multiple images with one runner each, allowing us to build for multiple architectures +# using Github's runners. +# The two-step process is adapted form: +# https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners jobs: + # Build each (amd64 and arm64) image separately build-image: - runs-on: ubuntu-latest + runs-on: ${{ startsWith(matrix.platform, 'linux/arm') && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm64 steps: - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - if: contains(inputs.platforms, 'linux/arm64') && !inputs.use_native_arm64_builder - - - uses: docker/setup-buildx-action@v3 - id: buildx - if: ${{ !(inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')) }} - - - name: Start a local Docker Builder - if: inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64') + - name: Prepare + env: + PUSH_TO_IMAGES: ${{ inputs.push_to_images }} run: | - docker run --rm -d --name buildkitd -p 1234:1234 --privileged moby/buildkit:latest --addr tcp://0.0.0.0:1234 + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + # Transform multi-line variable into comma-separated variable + image_names=${PUSH_TO_IMAGES//$'\n'/,} + echo "IMAGE_NAMES=${image_names%,}" >> $GITHUB_ENV - uses: docker/setup-buildx-action@v3 - id: buildx-native - if: inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64') - with: - driver: remote - endpoint: tcp://localhost:1234 - platforms: linux/amd64 - append: | - - endpoint: tcp://${{ vars.DOCKER_BUILDER_HETZNER_ARM64_01_HOST }}:13865 - platforms: linux/arm64 - name: mastodon-docker-builder-arm64-01 - driver-opts: - - servername=mastodon-docker-builder-arm64-01 - env: - BUILDER_NODE_1_AUTH_TLS_CACERT: ${{ secrets.DOCKER_BUILDER_HETZNER_ARM64_01_CACERT }} - BUILDER_NODE_1_AUTH_TLS_CERT: ${{ secrets.DOCKER_BUILDER_HETZNER_ARM64_01_CERT }} - BUILDER_NODE_1_AUTH_TLS_KEY: ${{ secrets.DOCKER_BUILDER_HETZNER_ARM64_01_KEY }} + id: buildx - name: Log in to Docker Hub if: contains(inputs.push_to_images, 'tootsuite') @@ -76,16 +65,18 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 + - name: Docker meta id: meta + uses: docker/metadata-action@v5 if: ${{ inputs.push_to_images != '' }} with: images: ${{ inputs.push_to_images }} flavor: ${{ inputs.flavor }} - tags: ${{ inputs.tags }} labels: ${{ inputs.labels }} - - uses: docker/build-push-action@v6 + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 with: context: . file: ${{ inputs.file_to_build }} @@ -93,11 +84,87 @@ jobs: MASTODON_VERSION_PRERELEASE=${{ inputs.version_prerelease }} MASTODON_VERSION_METADATA=${{ inputs.version_metadata }} SOURCE_COMMIT=${{ github.sha }} - platforms: ${{ inputs.platforms }} + platforms: ${{ matrix.platform }} provenance: false - builder: ${{ steps.buildx.outputs.name || steps.buildx-native.outputs.name }} push: ${{ inputs.push_to_images != '' }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} cache-from: ${{ inputs.cache && 'type=gha' || '' }} cache-to: ${{ inputs.cache && 'type=gha,mode=max' || '' }} + outputs: type=image,"name=${{ env.IMAGE_NAMES }}",push-by-digest=true,name-canonical=true,push=${{ inputs.push_to_images != '' }} + + - name: Export digest + if: ${{ inputs.push_to_images != '' }} + run: | + mkdir -p "${{ runner.temp }}/digests" + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: Upload digest + if: ${{ inputs.push_to_images != '' }} + uses: actions/upload-artifact@v4 + with: + # `hashFiles` is used to disambiguate between streaming and non-streaming images + name: digests-${{ hashFiles(inputs.file_to_build) }}-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + # Then merge the docker images into a single one + merge-images: + if: ${{ inputs.push_to_images != '' }} + runs-on: ubuntu-24.04 + needs: + - build-image + + env: + PUSH_TO_IMAGES: ${{ inputs.push_to_images }} + + steps: + - uses: actions/checkout@v4 + + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: ${{ runner.temp }}/digests + # `hashFiles` is used to disambiguate between streaming and non-streaming images + pattern: digests-${{ hashFiles(inputs.file_to_build) }}-* + merge-multiple: true + + - name: Log in to Docker Hub + if: contains(inputs.push_to_images, 'tootsuite') + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Log in to the GitHub Container registry + if: contains(inputs.push_to_images, 'ghcr.io') + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + if: ${{ inputs.push_to_images != '' }} + with: + images: ${{ inputs.push_to_images }} + flavor: ${{ inputs.flavor }} + tags: ${{ inputs.tags }} + labels: ${{ inputs.labels }} + + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests + run: | + echo "$PUSH_TO_IMAGES" | xargs -I{} \ + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '{}@sha256:%s ' *) + + - name: Inspect image + run: | + echo "$PUSH_TO_IMAGES" | xargs -i{} \ + docker buildx imagetools inspect {}:${{ steps.meta.outputs.version }} diff --git a/.github/workflows/build-nightly.yml b/.github/workflows/build-nightly.yml index 7c6f74b4571d10..4a56f720e11884 100644 --- a/.github/workflows/build-nightly.yml +++ b/.github/workflows/build-nightly.yml @@ -26,8 +26,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: Dockerfile - platforms: linux/amd64,linux/arm64 - use_native_arm64_builder: true cache: false push_to_images: | tootsuite/mastodon @@ -48,8 +46,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: streaming/Dockerfile - platforms: linux/amd64,linux/arm64 - use_native_arm64_builder: true cache: false push_to_images: | tootsuite/mastodon-streaming diff --git a/.github/workflows/build-push-pr.yml b/.github/workflows/build-push-pr.yml index d3bc8e5df89553..418993475f4c20 100644 --- a/.github/workflows/build-push-pr.yml +++ b/.github/workflows/build-push-pr.yml @@ -32,8 +32,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: Dockerfile - platforms: linux/amd64,linux/arm64 - use_native_arm64_builder: true push_to_images: | ghcr.io/mastodon/mastodon version_metadata: ${{ needs.compute-suffix.outputs.metadata }} @@ -49,8 +47,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: streaming/Dockerfile - platforms: linux/amd64,linux/arm64 - use_native_arm64_builder: true push_to_images: | ghcr.io/mastodon/mastodon-streaming version_metadata: ${{ needs.compute-suffix.outputs.metadata }} diff --git a/.github/workflows/build-releases.yml b/.github/workflows/build-releases.yml index da9a45828257bd..473718bd109f08 100644 --- a/.github/workflows/build-releases.yml +++ b/.github/workflows/build-releases.yml @@ -13,8 +13,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: Dockerfile - platforms: linux/amd64,linux/arm64 - use_native_arm64_builder: true push_to_images: | tootsuite/mastodon ghcr.io/mastodon/mastodon @@ -34,8 +32,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: streaming/Dockerfile - platforms: linux/amd64,linux/arm64 - use_native_arm64_builder: true push_to_images: | tootsuite/mastodon-streaming ghcr.io/mastodon/mastodon-streaming diff --git a/.github/workflows/build-security.yml b/.github/workflows/build-security.yml index 1e2455d3d96adf..d3cb4e5e0aeb36 100644 --- a/.github/workflows/build-security.yml +++ b/.github/workflows/build-security.yml @@ -24,8 +24,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: Dockerfile - platforms: linux/amd64,linux/arm64 - use_native_arm64_builder: true cache: false push_to_images: | tootsuite/mastodon @@ -46,8 +44,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: streaming/Dockerfile - platforms: linux/amd64,linux/arm64 - use_native_arm64_builder: true cache: false push_to_images: | tootsuite/mastodon-streaming diff --git a/.github/workflows/test-image-build.yml b/.github/workflows/test-image-build.yml index 980e071897c911..bde40addd666e4 100644 --- a/.github/workflows/test-image-build.yml +++ b/.github/workflows/test-image-build.yml @@ -20,7 +20,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: Dockerfile - platforms: linux/amd64 # Testing only on native platform so it is performant cache: true build-image-streaming: @@ -31,5 +30,4 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: streaming/Dockerfile - platforms: linux/amd64 # Testing only on native platform so it is performant cache: true