From e615d2f069ffbddfe406b78ea5bed38e3d2d2c25 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 7 Aug 2025 10:02:29 +0200 Subject: [PATCH 1/6] Change quote to be fetched with quoted account rather than random follower (#35709) --- app/lib/activitypub/activity/quote_request.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/activitypub/activity/quote_request.rb b/app/lib/activitypub/activity/quote_request.rb index 424aafe993b..9f18a1367b5 100644 --- a/app/lib/activitypub/activity/quote_request.rb +++ b/app/lib/activitypub/activity/quote_request.rb @@ -21,7 +21,7 @@ class ActivityPub::Activity::QuoteRequest < ActivityPub::Activity def accept_quote_request!(quoted_status) status = status_from_uri(@json['instrument']) # TODO: import inlined quote post if possible - status ||= ActivityPub::FetchRemoteStatusService.new.call(@json['instrument'], on_behalf_of: @account.followers.local.first, request_id: @options[:request_id]) + status ||= ActivityPub::FetchRemoteStatusService.new.call(@json['instrument'], on_behalf_of: quoted_status.account, request_id: @options[:request_id]) # TODO: raise if status is nil # Sanity check From d4e07841829379b3bc88f4de3c7a33626a8c9b0f Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 7 Aug 2025 10:03:15 +0200 Subject: [PATCH 2/6] Fix quote revocation not being streamed (#35710) --- app/lib/activitypub/activity/delete.rb | 1 + app/services/revoke_quote_service.rb | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb index 69b7bd03546..ce36cfe763f 100644 --- a/app/lib/activitypub/activity/delete.rb +++ b/app/lib/activitypub/activity/delete.rb @@ -61,6 +61,7 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity ActivityPub::Forwarder.new(@account, @json, @quote.status).forward! @quote.reject! + DistributionWorker.perform_async(@quote.status_id, { 'update' => true }) end def forwarder diff --git a/app/services/revoke_quote_service.rb b/app/services/revoke_quote_service.rb index 8f5dc8f9105..f4bc07c9da9 100644 --- a/app/services/revoke_quote_service.rb +++ b/app/services/revoke_quote_service.rb @@ -8,11 +8,18 @@ class RevokeQuoteService < BaseService @account = quote.quoted_account @quote.reject! + distribute_update! distribute_stamp_deletion! end private + def distribute_update! + return if @quote.status_id.nil? + + DistributionWorker.perform_async(@quote.status_id, { 'update' => true }) + end + def distribute_stamp_deletion! ActivityPub::DeliveryWorker.push_bulk(inboxes, limit: 1_000) do |inbox_url| [signed_activity_json, @account.id, inbox_url] From 39a3ffaf2ff56b5b91d6fa519f7516ac9f9c8739 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:46:11 +0000 Subject: [PATCH 3/6] New Crowdin Translations (automated) (#35708) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/az.json | 280 ++++++++++++++++++++- app/javascript/mastodon/locales/ca.json | 3 + app/javascript/mastodon/locales/cs.json | 4 + app/javascript/mastodon/locales/da.json | 4 + app/javascript/mastodon/locales/de.json | 6 +- app/javascript/mastodon/locales/eo.json | 16 ++ app/javascript/mastodon/locales/es-AR.json | 4 + app/javascript/mastodon/locales/es-MX.json | 4 + app/javascript/mastodon/locales/es.json | 4 + app/javascript/mastodon/locales/fa.json | 11 + app/javascript/mastodon/locales/fo.json | 6 + app/javascript/mastodon/locales/ga.json | 2 + app/javascript/mastodon/locales/gl.json | 5 + app/javascript/mastodon/locales/he.json | 5 + app/javascript/mastodon/locales/hu.json | 1 + app/javascript/mastodon/locales/is.json | 4 + app/javascript/mastodon/locales/nl.json | 4 + app/javascript/mastodon/locales/pt-PT.json | 4 + app/javascript/mastodon/locales/tr.json | 5 + app/javascript/mastodon/locales/uk.json | 4 + app/javascript/mastodon/locales/vi.json | 4 + app/javascript/mastodon/locales/zh-TW.json | 4 + config/locales/activerecord.az.yml | 76 ++++++ config/locales/az.yml | 167 ++++++++++++ config/locales/devise.az.yml | 74 +++++- config/locales/doorkeeper.az.yml | 25 ++ config/locales/fa.yml | 11 + config/locales/fo.yml | 4 + config/locales/ga.yml | 4 + config/locales/lt.yml | 22 ++ config/locales/ru.yml | 36 +-- config/locales/simple_form.az.yml | 31 +++ config/locales/simple_form.fa.yml | 2 + config/locales/simple_form.fo.yml | 1 + config/locales/simple_form.ga.yml | 1 + 35 files changed, 797 insertions(+), 41 deletions(-) diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index 72cc1edd022..b9371f10a78 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -1,13 +1,15 @@ { - "about.blocks": "Moderasiya olunan serverlər", + "about.blocks": "Moderasiya edilmiş serverlər", "about.contact": "Əlaqə:", - "about.disclaimer": "Mastodon pulsuz, açıq-mənbəli proqram təminatıdır və Mastodon gGmbH-nin əmtəə nişanıdır.", - "about.domain_blocks.no_reason_available": "Səbəb naməlumdur", - "about.domain_blocks.preamble": "Mastodon adətən fediversedəki hər hansısa bir serverdən olan məzmuna baxmaq və istifadəçilərlə qarşılıqlı əlaqədə olmaq imkanı verir. Bunlar bu serverdə edilmiş istisnalardır.", + "about.default_locale": "İlkin", + "about.disclaimer": "Mastodon ödənişsiz, açıq-mənbəli yazılımdır və Mastodon gGmbH-nin əmtəə nişanıdır.", + "about.domain_blocks.no_reason_available": "Səbəb mövcud deyil", + "about.domain_blocks.preamble": "Mastodon, adətən fediverse-dəki hər hansısa bir serverdən məzmuna baxmağınıza və istifadəçilərlə qarşılıqlı əlaqədə olmağınıza imkanı verir. Bunlar, bu serverdə edilmiş istisnalardır.", "about.domain_blocks.silenced.explanation": "Siz bu serverdəki profilləri və məzmunu xüsusi olaraq axtarmasanız və ya izləməsəniz ümumiyyətlə görməyəcəksiniz.", "about.domain_blocks.silenced.title": "Məhdudlaşdırılmış", - "about.domain_blocks.suspended.explanation": "Bu serverdən heç bir data emal edilməyəcək, saxlanılmayacaq və ya mübadilə edilməyəcək və bu serverdən olan istifadəçilərlə hər hansı qarşılıqlı əlaqə qeyri-mümkün olacaq.", + "about.domain_blocks.suspended.explanation": "Bu serverdəki heç bir veri emal edilməyəcək, saxlanılmayacaq və ya mübadilə edilməyəcək, bu serverdəki istifadəçilərlə hər hansısa bir qarşılıqlı əlaqə və ya ünsiyyət mümkünsüz olacaq.", "about.domain_blocks.suspended.title": "Qadağa qoyulub", + "about.language_label": "Dil", "about.not_available": "Bu məlumat bu serverdə əlçatan edilməyib.", "about.powered_by": "{mastodon} tərəfindən təchiz edilən desentralizasiya edilmiş sosial media", "about.rules": "Server qaydaları", @@ -19,6 +21,7 @@ "account.block_domain": "{domain} domenini blokla", "account.block_short": "Blok", "account.blocked": "Bloklanıb", + "account.blocking": "Əngəlləmə", "account.cancel_follow_request": "İzləməni ləğv et", "account.copy": "Profil linkini kopyala", "account.direct": "@{name} istifadəçisini fərdi olaraq etiketlə", @@ -27,6 +30,11 @@ "account.edit_profile": "Profili redaktə et", "account.enable_notifications": "@{name} paylaşım edəndə mənə bildiriş göndər", "account.endorse": "Profildə seçilmişlərə əlavə et", + "account.familiar_followers_many": "{name1}, {name2} və tanıdığınız digər {othersCount, plural, one {digər bir nəfər} other {# nəfər}} izləyir", + "account.familiar_followers_one": "{name1} izləyir", + "account.familiar_followers_two": "{name1} və {name2} izləyir", + "account.featured": "Seçilmiş", + "account.featured.accounts": "Profillər", "account.featured.hashtags": "Etiketler", "account.featured_tags.last_status_at": "Son paylaşım {date} tarixində olub", "account.featured_tags.last_status_never": "Paylaşım yoxdur", @@ -35,9 +43,11 @@ "account.followers": "İzləyicilər", "account.followers.empty": "Bu istifadəçini hələ ki, heç kim izləmir.", "account.followers_counter": "{count, plural, one {{counter} izləyici} other {{counter} izləyici}}", + "account.followers_you_know_counter": "bildiyiniz {counter}", "account.following": "İzləyir", "account.following_counter": "{count, plural, one {{counter} izləyir} other {{counter} izləyir}}", "account.follows.empty": "Bu istifadəçi hələ ki, heç kimi izləmir.", + "account.follows_you": "Sizi izləyir", "account.go_to_profile": "Profilə get", "account.hide_reblogs": "@{name} istifadəçisindən olan gücləndirmələri gizlət", "account.in_memoriam": "Xatirə.", @@ -52,18 +62,23 @@ "account.mute_notifications_short": "Bildirişləri səssizləşdir", "account.mute_short": "Səssizləşdir", "account.muted": "Səssizləşdirilib", + "account.muting": "Səssizə alınır", + "account.mutual": "Bir-birinizi izləyirsiniz", "account.no_bio": "Təsvir göstərilməyib.", "account.open_original_page": "Orijinal səhifəni aç", "account.posts": "Paylaşım", "account.posts_with_replies": "Paylaşım və cavablar", + "account.remove_from_followers": "{name} - izləyicilərdən çıxart", "account.report": "@{name} istifadəçisini şikayət et", "account.requested": "Təsdiq edilməsi gözlənilir. İzləmə sorğusunu ləğv etmək üçün kliklə", "account.requested_follow": "{name} sizi izləmək sorğusu göndərib", + "account.requests_to_follow_you": "Sizi izləmək istəyir", "account.share": "@{name} profilini paylaş", "account.show_reblogs": "@{name} istifadəçisindən olan gücləndirmələri göstər", "account.statuses_counter": "{count, plural, one {{counter} paylaşım} other {{counter} paylaşım}}", "account.unblock": "@{name} blokunu aç", "account.unblock_domain": "{domain} domeninin blokunu aç", + "account.unblock_domain_short": "Əngəldən çıxart", "account.unblock_short": "Bloku aç", "account.unendorse": "Profildə seçilmişlərə əlavə etmə", "account.unfollow": "İzləmədən çıxar", @@ -162,11 +177,11 @@ "column.pins": "Bərkidilmiş paylaşımlar", "column.public": "Federasiya zaman qrafiki", "column_back_button.label": "Geriyə", - "column_header.hide_settings": "Parametrləri gizlət", + "column_header.hide_settings": "Ayarları gizlət", "column_header.moveLeft_settings": "Sütunu sola köçür", "column_header.moveRight_settings": "Sütunu sağa köçür", "column_header.pin": "Bərkit", - "column_header.show_settings": "Parametrləri göstər", + "column_header.show_settings": "Ayarları göstər", "column_header.unpin": "Bərkitmə", "column_search.cancel": "İmtina", "community.column_settings.local_only": "Sadəcə lokalda", @@ -192,7 +207,7 @@ "compose_form.poll.type": "Stil", "compose_form.publish": "Paylaş", "compose_form.reply": "Cavabla", - "compose_form.save_changes": "Yenilə", + "compose_form.save_changes": "Güncəllə", "compose_form.spoiler.marked": "Məzmun xəbərdarlığını sil", "compose_form.spoiler.unmarked": "Məzmun xəbərdarlığı əlavə et", "compose_form.spoiler_placeholder": "Məzmun xəbərdarlığı (məcburi deyil)", @@ -204,6 +219,13 @@ "confirmations.delete_list.confirm": "Sil", "confirmations.delete_list.message": "Bu siyahını həmişəlik silmək istədiyinizə əminsiniz?", "confirmations.delete_list.title": "Siyahı silinsin?", + "confirmations.discard_draft.confirm": "Silib davam et", + "confirmations.discard_draft.edit.cancel": "Düzəliş etməyə davam", + "confirmations.discard_draft.edit.message": "Davam etsəniz, hazırda düzəliş etdiyiniz göndərişdəki bütün dəyişikliklər silinəcək.", + "confirmations.discard_draft.edit.title": "Göndərişinizə etdiyiniz bütün dəyişikliklər silinsin?", + "confirmations.discard_draft.post.cancel": "Qaralama kimi davam etdir", + "confirmations.discard_draft.post.message": "Davam etsəniz, hazırda tərtib etdiyiniz göndəriş silinəcək.", + "confirmations.discard_draft.post.title": "Qaralama göndərişiniz silinsin?", "confirmations.discard_edit_media.confirm": "Ləğv et", "confirmations.discard_edit_media.message": "Media təsvirində və ya önizləmədə yadda saxlanmamış dəyişiklikləriniz var, ləğv edilsin?", "confirmations.follow_to_list.confirm": "İzlə və siyahıya əlavə et", @@ -213,13 +235,19 @@ "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.message": "Göndərişinizdə alternativ mətn yoxdur. Daha çox insanın məzmununuza erişməsinə kömək etmək üçün açıqlama əlavə edin.", "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.", "confirmations.redraft.title": "Paylaşım silinsin & qaralamaya köçürülsün?", + "confirmations.remove_from_followers.confirm": "İzləyicini çıxart", + "confirmations.remove_from_followers.message": "{name} sizi izləməyəcək. Davam etmək istədiyinizə əminsiniz?", + "confirmations.remove_from_followers.title": "İzləyici çıxarılsın?", + "confirmations.revoke_quote.confirm": "Göndərişi sil", + "confirmations.revoke_quote.message": "Bu əməliyyatın geri dönüşü yoxdur.", + "confirmations.revoke_quote.title": "Göndəriş silinsin?", "confirmations.unfollow.confirm": "İzləmədən çıxar", "confirmations.unfollow.message": "{name} izləmədən çıxmaq istədiyinizə əminsiniz?", "confirmations.unfollow.title": "İstifadəçi izləmədən çıxarılsın?", @@ -232,12 +260,12 @@ "conversation.with": "{names} ilə", "copy_icon_button.copied": "Mübadilə buferinə köçürüldü", "copypaste.copied": "Kopyalandı", - "copypaste.copy_to_clipboard": "Kopyala", + "copypaste.copy_to_clipboard": "Lövhəyə kopyala", "directory.federated": "Bilinən fediversedən", "directory.local": "Sadəcə {domain}", "directory.new_arrivals": "Yeni gələnlər", "directory.recently_active": "Bayaq aktiv olanlar", - "disabled_account_banner.account_settings": "Hesab parametrləri", + "disabled_account_banner.account_settings": "Hesab ayarları", "disabled_account_banner.text": "Sizin hesabınız {disabledAccount} hal-hazırda deaktiv edilib.", "dismissable_banner.community_timeline": "Bunlar, hesabları {domain} serverində yerləşən insanların ən son ictimai paylaşımlarıdır.", "dismissable_banner.dismiss": "Bağla", @@ -273,7 +301,7 @@ "emoji_button.food": "Yemək və içki", "emoji_button.label": "Emoji daxil et", "emoji_button.nature": "Təbiət", - "emoji_button.not_found": "Uyğun emoji tapılmadı", + "emoji_button.not_found": "Uyuşan emoji tapılmadı", "emoji_button.objects": "Obyektlər", "emoji_button.people": "İnsanlar", "emoji_button.recent": "Tez-tez istifadə edilən", @@ -296,6 +324,232 @@ "empty_column.follow_requests": "İzləmə sorğularınız yoxdur. Qəbul etdikdə burada görəcəksiniz.", "empty_column.followed_tags": "Heç bir heşteq izləmirsiniz. İzlədikdə burada görünəcək.", "empty_column.hashtag": "Bu heşteqdə hələ ki, heç nə yoxdur.", + "empty_column.notification_requests": "Hamısı hazırdır! Burada heç nə yoxdur. Yeni bildiriş aldığınız zaman, ayarlarınıza görə burada görünəcək.", + "errors.unexpected_crash.report_issue": "Problemi bildir", + "explore.suggested_follows": "İnsanlar", + "explore.title": "Trendlər", + "explore.trending_links": "Xəbərlər", + "explore.trending_statuses": "Göndərişlər", + "explore.trending_tags": "Mövzu etiketləri", + "featured_carousel.header": "{count, plural, one {Sancılmış göndəriş} other {Sancılmış göndərişlər}}", + "featured_carousel.next": "Növbəti", + "featured_carousel.post": "Göndəriş", + "featured_carousel.previous": "Əvvəlki", + "featured_carousel.slide": "{index}/{total}", + "filter_modal.added.context_mismatch_explanation": "Bu filtr kateqoriyası, bu göndərişdə erişdiyiniz kontekstə aid deyil. Əgər göndərişin bu kontekstdə də filtrlənməsini istəyirsinizsə, filtrə düzəliş etməyiniz lazımdır.", + "filter_modal.added.context_mismatch_title": "Kontekst uyuşmur!", + "filter_modal.added.expired_explanation": "Bu filtr kateqoriyasının vaxtı bitib, filtri tətbiq etmək üçün bitmə tarixini dəyişdirməlisiniz.", + "filter_modal.added.expired_title": "Vaxtı bitmiş filtr!", + "filter_modal.added.review_and_configure": "Bu filt kateqoriyasını incələmək və daha detallı konfiqurasiya etmək üçün {settings_link} ünvanına gedin.", + "filter_modal.added.review_and_configure_title": "Filtr ayarları", + "filter_modal.added.settings_link": "ayarlar səhifəsi", + "filter_modal.added.short_explanation": "Bu göndəriş, aşağıdakı filtr kateqoriyasına əlavə edilib: {title}.", + "filter_modal.added.title": "Filtr əlavə edilib!", + "filter_warning.matches_filter": "“{title}” filtri ilə uyuşur", "follow_suggestions.hints.friends_of_friends": "Bu profil izlədiyiniz insanlar arasında populyardır.", - "follow_suggestions.hints.most_followed": "Bu profil {domain} serverində ən çox izlənilənlərdən biridir." + "follow_suggestions.hints.most_followed": "Bu profil {domain} serverində ən çox izlənilənlərdən biridir.", + "generic.saved": "Saxlanıldı", + "getting_started.heading": "Başlayaq", + "hashtag.admin_moderation": "#{name} üçün moderasiya interfeysini aç", + "hashtag.browse": "#{hashtag} göndərişlərinə bax", + "hashtag.browse_from_account": "@{name} - #{hashtag} göndərişlərinə bax", + "hashtag.column_header.tag_mode.all": "və {additional}", + "hashtag.column_header.tag_mode.any": "və ya {additional}", + "hashtag.column_header.tag_mode.none": "{additional} olmadan", + "hashtag.column_settings.select.no_options_message": "Heç bir təklif tapılmadı", + "hashtag.column_settings.select.placeholder": "Mövzu etiketlərini daxil edin…", + "hashtag.column_settings.tag_mode.all": "Bunların hamısı", + "hashtag.column_settings.tag_mode.any": "Bunlardan hər hansısa biri", + "hashtag.column_settings.tag_mode.none": "Bunların heç biri", + "hashtag.column_settings.tag_toggle": "Bu sütun üçün əlavə etiketləri daxil et", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} iştirakçı} other {{counter} iştirakçı}}", + "hashtag.counter_by_uses": "{count, plural, one {{counter} göndəriş} other {{counter} göndəriş}}", + "hashtag.counter_by_uses_today": "Bu gün {count, plural, one {{counter} göndəriş} other {{counter} göndəriş}}", + "hashtag.follow": "Mövzu etiketini izlə", + "hashtag.mute": "#{hashtag} - səssizə al", + "hashtag.unfollow": "Mövzu etiketini izləmə", + "hashtags.and_other": "…və daha {count, plural, one {}other {# ədəd}}", + "hints.profiles.followers_may_be_missing": "Bu profilin izləyiciləri əskik ola bilər.", + "hints.profiles.follows_may_be_missing": "Bu profilin izləyənləri əskik ola bilər.", + "home.column_settings.show_quotes": "Sitatları göstər", + "home.column_settings.show_replies": "Cavabları göstər", + "home.hide_announcements": "Elanları gizlət", + "home.pending_critical_update.body": "Lütfən Mastodon serverinizi mümkün olan ən qısa müddətdə güncəlləyin!", + "home.pending_critical_update.link": "Güncəlləmələrə bax", + "home.pending_critical_update.title": "Kritik güvənlik güncəlləməsi mövcuddur!", + "home.show_announcements": "Elanları göstər", + "ignore_notifications_modal.ignore": "Bildirişləri yox say", + "ignore_notifications_modal.limited_accounts_title": "Moderasiya edilmiş hesabların bildirişləri yox sayılsın?", + "ignore_notifications_modal.new_accounts_title": "Yeni hesabların bildirişləri yox sayılsın?", + "ignore_notifications_modal.not_followers_title": "Sizi izləməyən şəxslərin bildirişləri yox sayılsın?", + "ignore_notifications_modal.not_following_title": "İzləmədiyiniz şəxslərin bildirişləri yox sayılsın?", + "ignore_notifications_modal.private_mentions_title": "İstənilməyən Şəxsi Adçəkmələrdən gələn bildirişlər yox sayılsın?", + "info_button.label": "Kömək", + "interaction_modal.action.favourite": "Davam etmək üçün hesabınızdan sevimlilərə əlavə etməlisiniz.", + "interaction_modal.action.follow": "Davam etmək üçün hesabınızdan izləməlisiniz.", + "interaction_modal.action.reblog": "Davam etmək üçün hesabınızdan təkrar göndərməlisiniz.", + "interaction_modal.action.reply": "Davam etmək üçün hesabınızdan cavab verməlisiniz.", + "interaction_modal.action.vote": "Davam etmək üçün hesabınızdan səs verməlisiniz.", + "keyboard_shortcuts.profile": "Müəllifin profilini aç", + "keyboard_shortcuts.reply": "Göndərişə cavab ver", + "learn_more_link.got_it": "Anladım", + "learn_more_link.learn_more": "Daha ətraflı", + "lightbox.close": "Bağla", + "lightbox.next": "Növbəti", + "lightbox.previous": "Əvvəlki", + "lightbox.zoom_in": "Həqiqi ölçüyə qayıt", + "limited_account_hint.action": "Yenə də profili göstər", + "limited_account_hint.title": "Bu profil, {domain} moderatorları tərəfindən gizlədildi.", + "navigation_bar.account_settings": "Parol və təhlükəsizlik", + "navigation_bar.moderation": "Moderasiya", + "not_signed_in_indicator.not_signed_in": "Bu resursa erişmək üçün giriş etməlisiniz.", + "notification.moderation-warning.learn_more": "Daha ətraflı", + "notification.moderation_warning": "Bir moderasiya xəbərdarlığı aldınız", + "notification.moderation_warning.action_delete_statuses": "Bəzi göndərişləriniz silindi.", + "notification.moderation_warning.action_disable": "Hesabınız sıradan çıxarılıb.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Bəzi göndərişləriniz həssas olaraq işarələnib.", + "notification.moderation_warning.action_none": "Hesabınız bir moderasiya xəbərdarlığı aldı.", + "notification.moderation_warning.action_sensitive": "Göndərişləriniz artıq həssas olaraq işarələnəcək.", + "notification.moderation_warning.action_silence": "Hesabınız məhdudlaşdırılıb.", + "notification.moderation_warning.action_suspend": "Hesabınızın fəaliyyəti dayandırılıb.", + "notification_requests.confirm_dismiss_multiple.message": "{count, plural, one {bir bildiriş sorğusunu} other {# bildiriş sorğusunu}} bağlamaq üzrəsiniz. {count, plural, one {Ona} other {Onlara}} yenidən asanlıqla erişə bilməyəcəksiniz. Davam etmək istədiyinizə əminsiniz?", + "notification_requests.explainer_for_limited_account": "Hesab, bir moderator tərəfindən məhdudlaşdırıldığı üçün bu hesabın bildirişləri filtrləndi.", + "notification_requests.explainer_for_limited_remote_account": "Hesab və ya onun serveri, bir moderator tərəfindən məhdudlaşdırıldığı üçün bu hesabın bildirişləri filtrləndi.", + "notifications.filter.statuses": "İzlədiyiniz şəxslərdən güncəlləmələr", + "notifications.policy.filter_limited_accounts_hint": "Server moderatorları tərəfindən məhdudlaşdırılıb", + "notifications.policy.filter_limited_accounts_title": "Moderasiya edilmiş hesablar", + "password_confirmation.exceeds_maxlength": "Parol təsdiqi, maksimum parol uzunluğunu aşır", + "password_confirmation.mismatching": "Parol təsdiqi uyuşmur", + "privacy_policy.last_updated": "Son güncəlləmə {date}", + "report.category.subtitle": "Ən çox uyuşanı seçin", + "report_notification.categories.spam_sentence": "spam", + "report_notification.categories.violation": "Qayda pozuntusu", + "report_notification.categories.violation_sentence": "qayda pozuntusu", + "report_notification.open": "Hesabatı aç", + "search.clear": "Axtarışı təmizlə", + "search.no_recent_searches": "Son axtarışlar yoxdur", + "search.placeholder": "Axtar", + "search.quick_action.account_search": "Uyuşan profillər {x}", + "search.quick_action.go_to_account": "{x} profilinə get", + "search.quick_action.go_to_hashtag": "{x} mövzu etiketinə get", + "search.quick_action.open_url": "URL-ni Mastodon-da aç", + "search.quick_action.status_search": "Uyuşan göndərişlər {x}", + "search.search_or_paste": "Axtar və ya URL-ni yapışdır", + "search_popout.full_text_search_disabled_message": "{domain} domenində mövcud deyil.", + "search_popout.full_text_search_logged_out_message": "Yalnız giriş edildiyi zaman əlçatandır.", + "search_popout.language_code": "ISO dil kodu", + "search_popout.options": "Axtarış seçimləri", + "search_popout.quick_actions": "Cəld əməliyyatlar", + "search_popout.recent": "Son axtarışlar", + "search_popout.specific_date": "müəyyən tarix", + "search_popout.user": "istifadəçi", + "search_results.accounts": "Profillər", + "search_results.all": "Hamısı", + "search_results.hashtags": "Mövzu etiketləri", + "search_results.no_results": "Nəticə yoxdur.", + "search_results.no_search_yet": "Göndərişləri, profilləri və ya mövzu etiketlərini axtarmağa çalışın.", + "search_results.see_all": "Hamısına bax", + "search_results.statuses": "Göndərişlər", + "search_results.title": "\"{q}\" axtar", + "server_banner.about_active_users": "Son 30 gündə bu serveri istifadə edənlər (aylıq aktiv istifadəçilər)", + "server_banner.active_users": "aktiv istifadəçilər", + "server_banner.is_one_of_many": "{domain}, fediverse-də iştirak etmək üçün istifadə edə biləcəyiniz bir neçə müstəqil Mastodon serverlərindən biridir.", + "server_banner.server_stats": "Server statistikaları:", + "sign_in_banner.create_account": "Hesab yarat", + "sign_in_banner.follow_anyone": "fediverse-dəki hər kəsi izləyin və hamısına xronoloji ardıcıllıqla baxın. Heç bir alqoritm, reklam və ya klikləmə tələsi yoxdur.", + "sign_in_banner.mastodon_is": "Mastodon, baş verənlərdən xəbərdar olmağın ən yaxşı yoldur.", + "sign_in_banner.sign_in": "Giriş", + "sign_in_banner.sso_redirect": "Giriş və ya Qeydiyyat", + "status.admin_account": "@{name} üçün moderasiya interfeysini aç", + "status.admin_domain": "{domain} üçün moderasiya interfeysini aç", + "status.admin_status": "Moderasiya interfeysində bu göndərişi aç", + "status.block": "Əngəllə: @{name}", + "status.bookmark": "Əlfəcin", + "status.context.load_new_replies": "Yeni cavablar mövcuddur", + "status.context.loading": "Daha çox cavab yoxlanılır", + "status.delete": "Sil", + "status.direct": "Şəxsi olaraq adını çək: @{name}", + "status.direct_indicator": "Şəxsi olaraq adını çək", + "status.edit": "Düzəliş et", + "status.edited": "Son düzəliş {date}", + "status.edited_x_times": "{count, plural, one {{count} dəfə} other {{count} dəfə}} düzəliş edilib", + "status.favourite": "Sevimli", + "status.favourites": "{count, plural, one {sevimli} other {sevimli}}", + "status.filter": "Bu göndərişi filtrlə", + "status.history.created": "{name}, {date} yaratdı", + "status.history.edited": "{name}, {date} düzəliş etdi", + "status.load_more": "Daha çoxunu yüklə", + "status.media.open": "Açmaq üçün kliklə", + "status.media.show": "Göstərmək üçün kliklə", + "status.media_hidden": "Media gizlidir", + "status.mention": "Adını çək: @{name}", + "status.more": "Daha çox", + "status.mute": "@{name} - səssizə al", + "status.mute_conversation": "Danışığın səsini kəs", + "status.open": "Bu göndərişi genişləndir", + "status.quote_error.filtered": "Bəzi filtrlərinizə görə gizlidir", + "status.quote_error.not_available": "Göndəriş əlçatmazdır", + "status.quote_error.pending_approval": "Göndəriş gözləmədədir", + "status.read_more": "Daha çoxunu oxu", + "status.remove_bookmark": "Əlfəcini sil", + "status.remove_favourite": "Sevimlilərdən sil", + "status.replied_to": "Cavab verildi: {name}", + "status.reply": "Cavabla", + "status.report": "Bildir: @{name}", + "status.sensitive_warning": "Həssas məzmun", + "status.share": "Paylaş", + "status.show_less_all": "Hamısı üçün daha az göstər", + "status.show_more_all": "Hamısı üçün daha çox göstər", + "status.show_original": "Orijinalı göstər", + "status.translate": "Tərcümə et", + "status.translated_from_with": "{provider} ilə {lang} dilindən tərcümə edilib", + "status.uncached_media_warning": "Önizləmə mövcud deyil", + "status.unmute_conversation": "Danışığın səsini aç", + "subscribed_languages.save": "Dəyişiklikləri saxla", + "subscribed_languages.target": "{target} üçün abunə olunmuş dilləri dəyişdir", + "tabs_bar.home": "Ana səhifə", + "tabs_bar.menu": "Menyu", + "tabs_bar.notifications": "Bildirişlər", + "tabs_bar.publish": "Yeni göndəriş", + "tabs_bar.search": "Axtar", + "terms_of_service.effective_as_of": "{date} etibarilə qüvvədə", + "terms_of_service.title": "Xidmət Şərtləri", + "terms_of_service.upcoming_changes_on": "{date} tarixində ediləcək dəyişikliklər", + "time_remaining.days": "{number, plural, one {# gün} other {# gün}} qalıb", + "time_remaining.hours": "{number, plural, one {# saat} other {# saat}} qalıb", + "time_remaining.minutes": "{number, plural, one {# dəqiqə} other {# dəqiqə}} qalıb", + "time_remaining.moments": "Bir neçə dəqiqə qalıb", + "time_remaining.seconds": "{number, plural, one {# saniyə} other {# saniyə}} qalıb", + "trends.trending_now": "İndi trenddədir", + "ui.beforeunload": "Mastodon-u tərk etsəniz, qaralamanız itəcək.", + "units.short.billion": "{count} mlyrd", + "units.short.million": "{count} mlyn", + "units.short.thousand": "{count} min", + "upload_area.title": "Yükləmək üçün sürüklə və burax", + "upload_button.label": "Təsvir, video və ya səs faylı əlavə et", + "upload_error.limit": "Fayl yükləmə limiti aşılıb.", + "upload_error.poll": "Anketlərdə fayl yükləməyə icazə verilmir.", + "upload_form.drag_and_drop.instructions": "Bir media qoşmasını daşımaq üçün boşluq və ya enter düyməsinə basın. Sürükləmə zamanı, media qoşmasını hər hansısa bir yönə hərəkət etdirmək üçün ox düymələrini istifadə edin. Media qoşmasını yeni mövqeyinə buraxmaq üçün təkrar boşluq və ya enter düyməsinə basın, ləğv etmək üçün escape düyməsinə basın.", + "upload_form.drag_and_drop.on_drag_cancel": "Sürükləmə ləğv edilib. {item} media qoşması buraxıldı.", + "upload_form.drag_and_drop.on_drag_end": "{item} media qoşması buraxıldı.", + "upload_form.drag_and_drop.on_drag_over": "{item} media qoşması daşındı.", + "upload_form.drag_and_drop.on_drag_start": "{item} media qoşması alındı.", + "upload_form.edit": "Düzəliş et", + "upload_progress.label": "Yüklənir...", + "upload_progress.processing": "Emal edilir…", + "username.taken": "Bu istifadəçi adı götürülüb. Başqasını sınayın", + "video.close": "Videonu bağla", + "video.download": "Faylı endir", + "video.exit_fullscreen": "Tam ekrandan çıx", + "video.expand": "Videonu genişləndir", + "video.fullscreen": "Tam ekran", + "video.hide": "Videonu gizlət", + "video.mute": "Səsi kəs", + "video.pause": "Fasilə ver", + "video.play": "Oxut", + "video.skip_backward": "Geri ötür", + "video.skip_forward": "İrəli ötür", + "video.unmute": "Səsi aç", + "video.volume_down": "Həcmi azalt", + "video.volume_up": "Həcmi artır" } diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index bb255756e66..103b4f3715d 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -245,6 +245,7 @@ "confirmations.remove_from_followers.confirm": "Elimina el seguidor", "confirmations.remove_from_followers.message": "{name} deixarà de seguir-vos. Tirem endavant?", "confirmations.remove_from_followers.title": "Eliminem el seguidor?", + "confirmations.revoke_quote.message": "Aquesta acció no es pot desfer.", "confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?", "confirmations.unfollow.title": "Deixar de seguir l'usuari?", @@ -657,6 +658,7 @@ "notifications.column_settings.mention": "Mencions:", "notifications.column_settings.poll": "Resultats de l’enquesta:", "notifications.column_settings.push": "Notificacions push", + "notifications.column_settings.quote": "Cites:", "notifications.column_settings.reblog": "Impulsos:", "notifications.column_settings.show": "Mostra a la columna", "notifications.column_settings.sound": "Reprodueix so", @@ -894,6 +896,7 @@ "status.reply": "Respon", "status.replyAll": "Respon al fil", "status.report": "Denuncia @{name}", + "status.revoke_quote": "Elimina la meva publicació de la de @{name}", "status.sensitive_warning": "Contingut sensible", "status.share": "Comparteix", "status.show_less_all": "Mostra'n menys per a tot", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 690a35990e4..a6e82882953 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Odstranit sledujícího", "confirmations.remove_from_followers.message": "{name} vás přestane sledovat. Jste si jisti, že chcete pokračovat?", "confirmations.remove_from_followers.title": "Odstranit sledujícího?", + "confirmations.revoke_quote.confirm": "Odstranit příspěvek", + "confirmations.revoke_quote.message": "Tuto akci nelze vrátit zpět.", + "confirmations.revoke_quote.title": "Odstranit příspěvek?", "confirmations.unfollow.confirm": "Přestat sledovat", "confirmations.unfollow.message": "Opravdu chcete {name} přestat sledovat?", "confirmations.unfollow.title": "Přestat sledovat uživatele?", @@ -896,6 +899,7 @@ "status.reply": "Odpovědět", "status.replyAll": "Odpovědět na vlákno", "status.report": "Nahlásit @{name}", + "status.revoke_quote": "Odstranit můj příspěvek z příspěvku @{name}", "status.sensitive_warning": "Citlivý obsah", "status.share": "Sdílet", "status.show_less_all": "Zobrazit méně pro všechny", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index b401c13d32b..96a6eecf8c6 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Fjern følger", "confirmations.remove_from_followers.message": "{name} vil ikke længere følge dig. Er du sikker på, at du vil fortsætte?", "confirmations.remove_from_followers.title": "Fjern følger?", + "confirmations.revoke_quote.confirm": "Fjern indlæg", + "confirmations.revoke_quote.message": "Denne handling kan ikke fortrydes.", + "confirmations.revoke_quote.title": "Fjern indlæg?", "confirmations.unfollow.confirm": "Følg ikke længere", "confirmations.unfollow.message": "Er du sikker på, at du ikke længere vil følge {name}?", "confirmations.unfollow.title": "Følg ikke længere bruger?", @@ -896,6 +899,7 @@ "status.reply": "Besvar", "status.replyAll": "Svar alle", "status.report": "Anmeld @{name}", + "status.revoke_quote": "Fjern mit indlæg fra @{name}'s indlæg", "status.sensitive_warning": "Følsomt indhold", "status.share": "Del", "status.show_less_all": "Vis mindre for alle", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 0ada8ba8c13..018f66935cd 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Follower entfernen", "confirmations.remove_from_followers.message": "{name} wird dir nicht länger folgen. Bist du dir sicher?", "confirmations.remove_from_followers.title": "Follower entfernen?", + "confirmations.revoke_quote.confirm": "Beitrag entfernen", + "confirmations.revoke_quote.message": "Diese Aktion kann nicht rückgängig gemacht werden.", + "confirmations.revoke_quote.title": "Beitrag entfernen?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Möchtest du {name} wirklich entfolgen?", "confirmations.unfollow.title": "Profil entfolgen?", @@ -362,7 +365,7 @@ "filter_modal.select_filter.subtitle": "Einem vorhandenen Filter hinzufügen oder einen neuen erstellen", "filter_modal.select_filter.title": "Diesen Beitrag filtern", "filter_modal.title.status": "Beitrag per Filter ausblenden", - "filter_warning.matches_filter": "Übereinstimmend mit dem Filter „{title}“", + "filter_warning.matches_filter": "Ausgeblendet wegen des Filters „{title}“", "filtered_notifications_banner.pending_requests": "Von {count, plural, =0 {keinem Profil, das dir möglicherweise bekannt ist} one {einem Profil, das dir möglicherweise bekannt ist} other {# Profilen, die dir möglicherweise bekannt sind}}", "filtered_notifications_banner.title": "Gefilterte Benachrichtigungen", "firehose.all": "Alle Server", @@ -896,6 +899,7 @@ "status.reply": "Antworten", "status.replyAll": "Allen antworten", "status.report": "@{name} melden", + "status.revoke_quote": "Meinen zitierten Beitrag aus dem Beitrag von @{name} entfernen", "status.sensitive_warning": "Inhaltswarnung", "status.share": "Teilen", "status.show_less_all": "Alles einklappen", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 5027ce48b39..938e9e706b6 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -40,6 +40,7 @@ "account.followers": "Sekvantoj", "account.followers.empty": "Ankoraŭ neniu sekvas ĉi tiun uzanton.", "account.followers_counter": "{count, plural, one{{counter} sekvanto} other {{counter} sekvantoj}}", + "account.followers_you_know_counter": "Vi scias {counter}", "account.following": "Sekvatoj", "account.following_counter": "{count, plural, one {{counter} sekvato} other {{counter} sekvatoj}}", "account.follows.empty": "La uzanto ankoraŭ ne sekvas iun ajn.", @@ -215,6 +216,11 @@ "confirmations.delete_list.confirm": "Forigi", "confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?", "confirmations.delete_list.title": "Ĉu forigi liston?", + "confirmations.discard_draft.confirm": "Forĵetu kaj daŭrigu", + "confirmations.discard_draft.edit.cancel": "Daŭrigi redaktadon", + "confirmations.discard_draft.edit.title": "Ĉu forĵeti ŝanĝojn al via afiŝo?", + "confirmations.discard_draft.post.cancel": "Daŭrigi malneton", + "confirmations.discard_draft.post.title": "Ĉu forĵeti vian malneton?", "confirmations.discard_edit_media.confirm": "Forĵeti", "confirmations.discard_edit_media.message": "Vi havas nekonservitajn ŝanĝojn de la priskribo aŭ la antaŭvidigo de la vidaŭdaĵo, ĉu vi forĵetu ilin malgraŭe?", "confirmations.follow_to_list.confirm": "Sekvi kaj aldoni al listo", @@ -234,6 +240,9 @@ "confirmations.remove_from_followers.confirm": "Forigi sekvanton", "confirmations.remove_from_followers.message": "{name} ne plu sekvos vin. Ĉu vi certas ke vi volas daŭri?", "confirmations.remove_from_followers.title": "Forigi sekvanton?", + "confirmations.revoke_quote.confirm": "Forigi afiŝon", + "confirmations.revoke_quote.message": "Ĉi tiu ago ne povas esti malfarita.", + "confirmations.revoke_quote.title": "Ĉu forigi afiŝon?", "confirmations.unfollow.confirm": "Ne plu sekvi", "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", "confirmations.unfollow.title": "Ĉu ĉesi sekvi uzanton?", @@ -484,6 +493,8 @@ "keyboard_shortcuts.translate": "Traduki afiŝon", "keyboard_shortcuts.unfocus": "Senfokusigi verki tekstareon/serĉon", "keyboard_shortcuts.up": "Movu supren en la listo", + "learn_more_link.got_it": "Komprenite", + "learn_more_link.learn_more": "Lernu pli", "lightbox.close": "Fermi", "lightbox.next": "Antaŭen", "lightbox.previous": "Malantaŭen", @@ -577,6 +588,7 @@ "notification.label.mention": "Mencii", "notification.label.private_mention": "Privata mencio", "notification.label.private_reply": "Privata respondo", + "notification.label.quote": "{name} citis vian afiŝon", "notification.label.reply": "Respondi", "notification.mention": "Mencii", "notification.mentioned_you": "{name} menciis vin", @@ -634,6 +646,7 @@ "notifications.column_settings.mention": "Mencioj:", "notifications.column_settings.poll": "Balotenketaj rezultoj:", "notifications.column_settings.push": "Puŝsciigoj", + "notifications.column_settings.quote": "Citaĵoj:", "notifications.column_settings.reblog": "Diskonigoj:", "notifications.column_settings.show": "Montri en kolumno", "notifications.column_settings.sound": "Eligi sonon", @@ -851,6 +864,9 @@ "status.mute_conversation": "Silentigi konversacion", "status.open": "Pligrandigu ĉi tiun afiŝon", "status.pin": "Alpingli al la profilo", + "status.quote_error.not_available": "Afiŝo ne disponebla", + "status.quote_error.pending_approval": "Pritraktata afiŝo", + "status.quote_error.pending_approval_popout.title": "Ĉu pritraktata citaĵo? Restu trankvila", "status.read_more": "Legi pli", "status.reblog": "Diskonigi", "status.reblog_private": "Diskonigi kun la sama videbleco", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 41051d493a6..2b2ce14d5bc 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Quitar seguidor", "confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que querés continuar?", "confirmations.remove_from_followers.title": "¿Quitar seguidor?", + "confirmations.revoke_quote.confirm": "Eliminar mensaje", + "confirmations.revoke_quote.message": "Esta acción no se puede deshacer.", + "confirmations.revoke_quote.title": "¿Eliminar mensaje?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro que querés dejar de seguir a {name}?", "confirmations.unfollow.title": "¿Dejar de seguir al usuario?", @@ -896,6 +899,7 @@ "status.reply": "Responder", "status.replyAll": "Responder al hilo", "status.report": "Denunciar a @{name}", + "status.revoke_quote": "Eliminar mi mensaje de la cita de @{name}", "status.sensitive_warning": "Contenido sensible", "status.share": "Compartir", "status.show_less_all": "Mostrar menos para todo", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 80a0138d93c..317f5311088 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Eliminar seguidor", "confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que quieres continuar?", "confirmations.remove_from_followers.title": "¿Eliminar seguidor?", + "confirmations.revoke_quote.confirm": "Eliminar publicación", + "confirmations.revoke_quote.message": "Esta acción no se puede deshacer.", + "confirmations.revoke_quote.title": "¿Deseas eliminar la publicación?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", "confirmations.unfollow.title": "¿Dejar de seguir al usuario?", @@ -896,6 +899,7 @@ "status.reply": "Responder", "status.replyAll": "Responder al hilo", "status.report": "Reportar @{name}", + "status.revoke_quote": "Eliminar mi publicación de la cita de @{name}", "status.sensitive_warning": "Contenido sensible", "status.share": "Compartir", "status.show_less_all": "Mostrar menos para todo", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 18ba22e95a5..d23f1f5c128 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Eliminar seguidor", "confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que quieres continuar?", "confirmations.remove_from_followers.title": "¿Eliminar seguidor?", + "confirmations.revoke_quote.confirm": "Eliminar publicación", + "confirmations.revoke_quote.message": "Esta acción no tiene vuelta atrás.", + "confirmations.revoke_quote.title": "¿Eliminar la publicación?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Seguro que quieres dejar de seguir a {name}?", "confirmations.unfollow.title": "¿Dejar de seguir al usuario?", @@ -896,6 +899,7 @@ "status.reply": "Responder", "status.replyAll": "Responder al hilo", "status.report": "Reportar a @{name}", + "status.revoke_quote": "Eliminar mi publicación de la cita de {name}", "status.sensitive_warning": "Contenido sensible", "status.share": "Compartir", "status.show_less_all": "Mostrar menos para todo", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 9677454e0b8..798be24ad65 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "برداشتن پی‌گیرنده", "confirmations.remove_from_followers.message": "دیگر {name} پیتان نخواهد گرفت. مطمئنید که می‌خواهید ادامه دهید؟", "confirmations.remove_from_followers.title": "برداشتن پی‌گیرنده؟", + "confirmations.revoke_quote.confirm": "حذف فرسته", + "confirmations.revoke_quote.message": "این اقدام قابل بازگشت نیست.", + "confirmations.revoke_quote.title": "آیا فرسته را حذف کنم؟", "confirmations.unfollow.confirm": "پی‌نگرفتن", "confirmations.unfollow.message": "مطمئنید که می‌خواهید به پی‌گیری از {name} پایان دهید؟", "confirmations.unfollow.title": "ناپی‌گیری کاربر؟", @@ -498,6 +501,8 @@ "keyboard_shortcuts.translate": "برای ترجمه یک پست", "keyboard_shortcuts.unfocus": "برداشتن تمرکز از ناحیهٔ نوشتن یا جست‌وجو", "keyboard_shortcuts.up": "بالا بردن در سیاهه", + "learn_more_link.got_it": "متوجه شدم", + "learn_more_link.learn_more": "دانستن بیش‌تر", "lightbox.close": "بستن", "lightbox.next": "بعدی", "lightbox.previous": "قبلی", @@ -598,6 +603,7 @@ "notification.label.mention": "اشاره", "notification.label.private_mention": "اشارهٔ خصوصی", "notification.label.private_reply": "پاسخ خصوصی", + "notification.label.quote": "{name} فرسته‌تان را نقل کرد", "notification.label.reply": "پاسخ", "notification.mention": "اشاره", "notification.mentioned_you": "‫{name}‬ از شما نام برد", @@ -655,6 +661,7 @@ "notifications.column_settings.mention": "اشاره‌ها:", "notifications.column_settings.poll": "نتایج نظرسنجی:", "notifications.column_settings.push": "آگاهی‌های ارسالی", + "notifications.column_settings.quote": "نقل‌قول‌ها:", "notifications.column_settings.reblog": "تقویت‌ها:", "notifications.column_settings.show": "نمایش در ستون", "notifications.column_settings.sound": "پخش صدا", @@ -873,6 +880,9 @@ "status.open": "گسترش این فرسته", "status.pin": "سنجاق به نمایه", "status.quote_error.filtered": "نهفته بنا بر یکی از پالایه‌هایتان", + "status.quote_error.not_available": "فرسته در دسترس نیست", + "status.quote_error.pending_approval_popout.body": "نقل‌قول‌هایی که در سراسر فدیورس هم‌رسانی می‌شوند ممکن است زمان‌بر باشند تا نمایش داده شوند، چون کارسازهای مختلف از شیوه‌نامه‌های متفاوتی استفاده می‌کنند.", + "status.quote_post_author": "فرسته‌ای از @{name} نقل شد", "status.read_more": "بیشتر بخوانید", "status.reblog": "تقویت", "status.reblog_private": "تقویت برای مخاطبان نخستین", @@ -887,6 +897,7 @@ "status.reply": "پاسخ", "status.replyAll": "پاسخ به رشته", "status.report": "گزارش ‎@{name}", + "status.revoke_quote": "حذف فرسته‌ام از فرسته @{name}", "status.sensitive_warning": "محتوای حساس", "status.share": "هم‌رسانی", "status.show_less_all": "نمایش کمتر همه", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 808a1147be2..7caaf0c2305 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Strika fylgjara", "confirmations.remove_from_followers.message": "{name} fer ikki longur at fylgja tær. Er tú vís/ur í at tú vilt halda fram?", "confirmations.remove_from_followers.title": "Strika fylgjara?", + "confirmations.revoke_quote.confirm": "Strika post", + "confirmations.revoke_quote.message": "Hendan atgerðin kann ikki angrast.", + "confirmations.revoke_quote.title": "Strika post?", "confirmations.unfollow.confirm": "Fylg ikki", "confirmations.unfollow.message": "Ert tú vís/ur í, at tú vil steðga við at fylgja {name}?", "confirmations.unfollow.title": "Gevst at fylgja brúkara?", @@ -600,6 +603,7 @@ "notification.label.mention": "Umrøða", "notification.label.private_mention": "Privat umrøða", "notification.label.private_reply": "Privat svar", + "notification.label.quote": "{name} siteraði postin hjá tær", "notification.label.reply": "Svara", "notification.mention": "Umrøð", "notification.mentioned_you": "{name} nevndi teg", @@ -657,6 +661,7 @@ "notifications.column_settings.mention": "Umrøður:", "notifications.column_settings.poll": "Úrslit frá atkvøðugreiðslu:", "notifications.column_settings.push": "Trýstifráboðanir", + "notifications.column_settings.quote": "Sitatir:", "notifications.column_settings.reblog": "Stimbranir:", "notifications.column_settings.show": "Vís í teigi", "notifications.column_settings.sound": "Spæl ljóð", @@ -894,6 +899,7 @@ "status.reply": "Svara", "status.replyAll": "Svara tráðnum", "status.report": "Melda @{name}", + "status.revoke_quote": "Strika postin hjá mær frá postinum hjá @{name}", "status.sensitive_warning": "Viðkvæmt tilfar", "status.share": "Deil", "status.show_less_all": "Vís øllum minni", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index afdc15e99d1..1f7c3845e1c 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -600,6 +600,7 @@ "notification.label.mention": "Luaigh", "notification.label.private_mention": "Lua príobháideach", "notification.label.private_reply": "Freagra príobháideach", + "notification.label.quote": "Luaigh {name} do phost", "notification.label.reply": "Freagra", "notification.mention": "Luaigh", "notification.mentioned_you": "Luaigh {name} tú", @@ -657,6 +658,7 @@ "notifications.column_settings.mention": "Tráchtanna:", "notifications.column_settings.poll": "Torthaí suirbhéanna:", "notifications.column_settings.push": "Brúfhógraí", + "notifications.column_settings.quote": "Luachain:", "notifications.column_settings.reblog": "Moltaí:", "notifications.column_settings.show": "Taispeáin i gcolún", "notifications.column_settings.sound": "Seinn an fhuaim", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index c1da87693e3..c6d0fbd8066 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Quitar seguidora", "confirmations.remove_from_followers.message": "{name} vai deixar de seguirte. É isto o que queres?", "confirmations.remove_from_followers.title": "Quitar seguidora?", + "confirmations.revoke_quote.confirm": "Eliminar publicación", + "confirmations.revoke_quote.message": "Esta acción non se pode desfacer.", + "confirmations.revoke_quote.title": "Eliminar publicación?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Tes certeza de querer deixar de seguir a {name}?", "confirmations.unfollow.title": "Deixar de seguir á usuaria?", @@ -658,6 +661,7 @@ "notifications.column_settings.mention": "Mencións:", "notifications.column_settings.poll": "Resultados da enquisa:", "notifications.column_settings.push": "Notificacións emerxentes", + "notifications.column_settings.quote": "Citacións:", "notifications.column_settings.reblog": "Promocións:", "notifications.column_settings.show": "Amosar en columna", "notifications.column_settings.sound": "Reproducir son", @@ -895,6 +899,7 @@ "status.reply": "Responder", "status.replyAll": "Responder ao tema", "status.report": "Denunciar @{name}", + "status.revoke_quote": "Retirar a miña publicación da cita de @{name}", "status.sensitive_warning": "Contido sensíbel", "status.share": "Compartir", "status.show_less_all": "Amosar menos para todos", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 725130e75b6..bdb23bc4cbe 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "הסרת עוקב", "confirmations.remove_from_followers.message": "{name} יוסר/תוסר ממעקב אחריך. האם להמשיך?", "confirmations.remove_from_followers.title": "להסיר עוקב/עוקבת?", + "confirmations.revoke_quote.confirm": "הסרת הודעה", + "confirmations.revoke_quote.message": "פעולה זו אינה הפיכה.", + "confirmations.revoke_quote.title": "הסרת הודעה?", "confirmations.unfollow.confirm": "הפסקת מעקב", "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?", "confirmations.unfollow.title": "לבטל מעקב אחר המשתמש.ת?", @@ -658,6 +661,7 @@ "notifications.column_settings.mention": "פניות:", "notifications.column_settings.poll": "תוצאות סקר:", "notifications.column_settings.push": "התראות בדחיפה", + "notifications.column_settings.quote": "ציטוטים:", "notifications.column_settings.reblog": "הדהודים:", "notifications.column_settings.show": "הצגה בטור", "notifications.column_settings.sound": "שמע מופעל", @@ -895,6 +899,7 @@ "status.reply": "תגובה", "status.replyAll": "תגובה לשרשור", "status.report": "דיווח על @{name}", + "status.revoke_quote": "הסירו את הודעתי מההודעה של @{name}", "status.sensitive_warning": "תוכן רגיש", "status.share": "שיתוף", "status.show_less_all": "להציג פחות מהכל", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 397c9d14c5a..60740438e18 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -658,6 +658,7 @@ "notifications.column_settings.mention": "Megemlítések:", "notifications.column_settings.poll": "Szavazási eredmények:", "notifications.column_settings.push": "Leküldéses értesítések", + "notifications.column_settings.quote": "Idézetek:", "notifications.column_settings.reblog": "Megtolások:", "notifications.column_settings.show": "Megjelenítés az oszlopban", "notifications.column_settings.sound": "Hang lejátszása", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index b27db1c57ad..a3c9e8733cc 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Fjarlægja fylgjanda", "confirmations.remove_from_followers.message": "{name} mun hætta að fylgjast með þér. Ertu viss um að þú viljir halda áfram?", "confirmations.remove_from_followers.title": "Fjarlægja fylgjanda?", + "confirmations.revoke_quote.confirm": "Fjarlægja færslu", + "confirmations.revoke_quote.message": "Þessa aðgerð er ekki hægt að afturkalla.", + "confirmations.revoke_quote.title": "Fjarlægja færslu?", "confirmations.unfollow.confirm": "Hætta að fylgja", "confirmations.unfollow.message": "Ertu viss um að þú viljir hætta að fylgjast með {name}?", "confirmations.unfollow.title": "Hætta að fylgjast með viðkomandi?", @@ -896,6 +899,7 @@ "status.reply": "Svara", "status.replyAll": "Svara þræði", "status.report": "Kæra @{name}", + "status.revoke_quote": "Fjarlægja færsluna mína úr færslu frá @{name}", "status.sensitive_warning": "Viðkvæmt efni", "status.share": "Deila", "status.show_less_all": "Sýna minna fyrir allt", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 3ae1fd3f24e..b5f4871078d 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Volger verwijderen", "confirmations.remove_from_followers.message": "{name} zal je niet meer volgen. Weet je zeker dat je wilt doorgaan?", "confirmations.remove_from_followers.title": "Volger verwijderen?", + "confirmations.revoke_quote.confirm": "Bericht verwijderen", + "confirmations.revoke_quote.message": "Deze actie kan niet ongedaan worden gemaakt.", + "confirmations.revoke_quote.title": "Bericht verwijderen?", "confirmations.unfollow.confirm": "Ontvolgen", "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", "confirmations.unfollow.title": "Gebruiker ontvolgen?", @@ -896,6 +899,7 @@ "status.reply": "Reageren", "status.replyAll": "Op iedereen reageren", "status.report": "@{name} rapporteren", + "status.revoke_quote": "Mijn bericht uit het bericht van @{name} verwijderen", "status.sensitive_warning": "Gevoelige inhoud", "status.share": "Delen", "status.show_less_all": "Alles minder tonen", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index cf2e828a45e..fd9d259751f 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Remover seguidor", "confirmations.remove_from_followers.message": "{name} vai parar de seguir-te. Tens a certeza que prentedes continuar?", "confirmations.remove_from_followers.title": "Remover seguidor?", + "confirmations.revoke_quote.confirm": "Remover publicação", + "confirmations.revoke_quote.message": "Esta ação é irreversível.", + "confirmations.revoke_quote.title": "Remover publicação?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", "confirmations.unfollow.title": "Deixar de seguir o utilizador?", @@ -896,6 +899,7 @@ "status.reply": "Responder", "status.replyAll": "Responder à conversa", "status.report": "Denunciar @{name}", + "status.revoke_quote": "Remover a minha publicação da publicação de @{name}", "status.sensitive_warning": "Conteúdo sensível", "status.share": "Partilhar", "status.show_less_all": "Ocultar conteúdo sensível em todas", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 27d5f72c9c4..4043695a160 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Takipçi kaldır", "confirmations.remove_from_followers.message": "{name} sizi takip etmeyi bırakacaktır. Devam etmek istediğinize emin misiniz?", "confirmations.remove_from_followers.title": "Takipçiyi kaldır?", + "confirmations.revoke_quote.confirm": "Gönderiyi kaldır", + "confirmations.revoke_quote.message": "Bu işlem geri alınamaz.", + "confirmations.revoke_quote.title": "Gönderiyi silmek ister misiniz?", "confirmations.unfollow.confirm": "Takibi bırak", "confirmations.unfollow.message": "{name} adlı kullanıcıyı takibi bırakmak istediğinden emin misin?", "confirmations.unfollow.title": "Kullanıcıyı takipten çık?", @@ -658,6 +661,7 @@ "notifications.column_settings.mention": "Bahsetmeler:", "notifications.column_settings.poll": "Anket sonuçları:", "notifications.column_settings.push": "Anlık bildirimler", + "notifications.column_settings.quote": "Alıntılar:", "notifications.column_settings.reblog": "Yeniden paylaşanlar:", "notifications.column_settings.show": "Sütunda göster", "notifications.column_settings.sound": "Ses çal", @@ -895,6 +899,7 @@ "status.reply": "Yanıtla", "status.replyAll": "Konuyu yanıtla", "status.report": "@{name} adlı kişiyi bildir", + "status.revoke_quote": "@{name}'nin gönderisinden benim gönderimi kaldır", "status.sensitive_warning": "Hassas içerik", "status.share": "Paylaş", "status.show_less_all": "Hepsi için daha az göster", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index f33558e6e87..bee00c0f06f 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -227,6 +227,9 @@ "confirmations.redraft.confirm": "Видалити та виправити", "confirmations.redraft.message": "Ви впевнені, що хочете видалити цей допис та переписати його? Додавання у вибране та поширення буде втрачено, а відповіді на оригінальний допис залишаться без першоджерела.", "confirmations.redraft.title": "Видалити та переробити допис?", + "confirmations.revoke_quote.confirm": "Видалити публікацію", + "confirmations.revoke_quote.message": "Цю дію не можна скасувати.", + "confirmations.revoke_quote.title": "Видалити публікацію?", "confirmations.unfollow.confirm": "Відписатися", "confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?", "confirmations.unfollow.title": "Відписатися від користувача?", @@ -862,6 +865,7 @@ "status.reply": "Відповісти", "status.replyAll": "Відповісти на ланцюжок", "status.report": "Поскаржитися на @{name}", + "status.revoke_quote": "Видалити мою публікацію з допису @{name}", "status.sensitive_warning": "Делікатний вміст", "status.share": "Поділитися", "status.show_less_all": "Згорнути для всіх", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 2d7b6bbf312..37e8ecee8d4 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Xóa người theo dõi", "confirmations.remove_from_followers.message": "{name} sẽ không còn theo dõi bạn.Bạn có chắc tiếp tục?", "confirmations.remove_from_followers.title": "Xóa người theo dõi?", + "confirmations.revoke_quote.confirm": "Gỡ tút", + "confirmations.revoke_quote.message": "Hành động này không thể hoàn tác.", + "confirmations.revoke_quote.title": "Gỡ tút?", "confirmations.unfollow.confirm": "Bỏ theo dõi", "confirmations.unfollow.message": "Bạn có chắc muốn bỏ theo dõi {name}?", "confirmations.unfollow.title": "Bỏ theo dõi", @@ -896,6 +899,7 @@ "status.reply": "Trả lời", "status.replyAll": "Trả lời", "status.report": "Báo cáo @{name}", + "status.revoke_quote": "Gỡ tút của tôi khỏi trích dẫn của @{name}", "status.sensitive_warning": "Nhạy cảm", "status.share": "Chia sẻ", "status.show_less_all": "Thu gọn", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index f917ad623cc..9dc2998504e 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "移除跟隨者", "confirmations.remove_from_followers.message": "{name} 將會停止跟隨您。您確定要繼續嗎?", "confirmations.remove_from_followers.title": "是否移除該跟隨者?", + "confirmations.revoke_quote.confirm": "移除嘟文", + "confirmations.revoke_quote.message": "此動作無法復原。", + "confirmations.revoke_quote.title": "您是否確定移除嘟文?", "confirmations.unfollow.confirm": "取消跟隨", "confirmations.unfollow.message": "您確定要取消跟隨 {name} 嗎?", "confirmations.unfollow.title": "是否取消跟隨該使用者?", @@ -896,6 +899,7 @@ "status.reply": "回覆", "status.replyAll": "回覆討論串", "status.report": "檢舉 @{name}", + "status.revoke_quote": "將我的嘟文自 @{name} 之嘟文中移除", "status.sensitive_warning": "敏感內容", "status.share": "分享", "status.show_less_all": "隱藏所有內容警告與額外標籤", diff --git a/config/locales/activerecord.az.yml b/config/locales/activerecord.az.yml index e9ba86bc793..1f7f9375c91 100644 --- a/config/locales/activerecord.az.yml +++ b/config/locales/activerecord.az.yml @@ -1 +1,77 @@ +--- az: + activerecord: + attributes: + poll: + expires_at: Son tarix + options: Seçimlər + user: + agreement: Xidmət razılaşması + email: E-poçt ünvanı + locale: Lokal + password: Parol + user/account: + username: İstifadəçi adı + user/invite_request: + text: Səbəb + errors: + attributes: + domain: + invalid: yararlı bir domen adı deyil + messages: + invalid_domain_on_line: "%{value} yararlı bir domen adı deyil" + models: + account: + attributes: + fields: + fields_with_values_missing_labels: əskik etiketli dəyərlər ehtiva edir + username: + invalid: yalnız hərf, rəqəm və altdan xətt ehtiva etməlidir + reserved: rezerv edilib + admin/webhook: + attributes: + url: + invalid: yararlı bir URL deyil + doorkeeper/application: + attributes: + website: + invalid: yararlı bir URL deyil + import: + attributes: + data: + malformed: yanlış formatdadır + list_account: + attributes: + account_id: + taken: artıq siyahıdadır + must_be_following: izlənilən bir hesab olmalıdır + status: + attributes: + reblog: + taken: göndərişi artıq mövcuddur + terms_of_service: + attributes: + effective_date: + too_soon: çox tezdir, %{date} tarixindən sonra olmalıdır + user: + attributes: + date_of_birth: + below_limit: yaş limitinin altındadır + email: + blocked: icazə verilməyən bir e-poçt provayderi istifadə edir + unreachable: mövcud olaraq görünmür + role_id: + elevated: hazırkı rolunuzdan yüksək ola bilməz + user_role: + attributes: + permissions_as_keys: + dangerous: təməl rol üçün güvənli olmayan icazələri ehtiva edir + elevated: hazırkı rolunuzun sahib olmadığı icazələri ehtiva edə bilməz + own_role: hazırkı rolunuzla dəyişdirilə bilməz + position: + elevated: hazırkı rolunuzdan yüksək ola bilməz + own_role: hazırkı rolunuzla dəyişdirilə bilməz + webhook: + attributes: + events: + invalid_permissions: hüquqlarınız olmayan tədbirləri ehtiva edə bilməz diff --git a/config/locales/az.yml b/config/locales/az.yml index e9ba86bc793..516f03f6040 100644 --- a/config/locales/az.yml +++ b/config/locales/az.yml @@ -1 +1,168 @@ +--- az: + about: + about_mastodon_html: 'Gələcəyin sosial şəbəkəsi: Reklam yoxdur, korporativ müşahidə yoxdur, etik dizayn və mərkəziyyətsizlik! Mastodon ilə öz verilərinizə sahib çıxın!' + admin: + account_actions: + title: "%{acct} üzərində moderasiya əməliyyatını icra et" + account_moderation_notes: + created_msg: Moderasiya notu uğurla yaradıldı! + destroyed_msg: Moderasiya notu uğurla məhv edildi! + accounts: + delete: Veriləri sil + destroyed_msg: "%{username} - verilərinin tezliklə silinməsi növbədədir" + moderation: + title: Moderasiya + moderation_notes: Moderasiya notları + remote_suspension_irreversible: Bu hesabın veriləri geri qaytarılmayacaq şəkildə silinib. + remote_suspension_reversible_hint_html: Hesabın fəaliyyəti öz serverində dayandırılıb və verilər %{date} tarixində tamamilə silinəcək. O vaxta qədər, uzaq server hər hansısa mənfi təsir olmadan bu hesabı bərpa edə bilər. Hesabın bütün verilərini dərhal silmək istəyirsinizsə, bunu aşağıdan edə bilərsiniz. + reset_password: Parolu sıfırla + security_measures: + only_password: Yalnız parol + password_and_2fa: Parol və 2FA + suspension_irreversible: Bu hesabın veriləri geri qaytarılmayacaq şəkildə silinib. Hesabı istifadəyə yararlı etmək üçün hesab fəaliyyətinin dayandırılma prosesini ləğv edə bilərsiniz, ancaq daha əvvəl sahib olduğunuz heç bir veri geri qaytarılmayacaq. + action_logs: + action_types: + reset_password_user: Parolu sıfırla + actions: + approve_appeal_html: "%{name}, moderasiya qərarına %{target} tərəfindən verilən etirazı təsdiqlədi" + reject_appeal_html: "%{name}, moderasiya qərarına %{target} tərəfindən verilən etirazı rədd etdi" + reset_password_user_html: "%{name}, %{target} istifadəçisinin parolunu sıfırladı" + dashboard: + software: Yazılım + instances: + moderation: + title: Moderasiya + moderation_notes: + create: Moderasiya notu əlavə et + description_html: Notlara baxın, gələcəkdə özünüz və digər moderatorlar üçün notlar buraxın + title: Moderasiya notları + reports: + actions: + suspend_description_html: Hesab və onun bütün məzmunları əlçatmaz olacaq və nəticədə silinəcək və onunla əlaqə qurmaq mümkün olmayacaq. 30 gün ərzində geri qaytarıla bilər. Bu hesaba aid bütün hesabatları bağlayır. + assigned: Təyin edilmiş moderator + confirm_action: "@%{acct} üzərindəki moderasiya əməliyyatını təsdiqlə" + notes_description_html: Notlara baxın, gələcəkdə özünüz və digər moderatorlar üçün notlar buraxın + quick_actions_description_html: 'Cəld bir əməliyyat edin və ya bildirilən məzmuna baxmaq üçün aşağı diyirlərin:' + roles: + categories: + moderation: Moderasiya + privileges: + delete_user_data: İstifadəçi verilərini sil + delete_user_data_description: İstifadəçilərin, digər istifadəçilərin verilərini gecikmə olmadan silməsinə icazə verir + manage_appeals_description: İstifadəçilərin moderasiya əməliyyatlarına etdiyi etirazları incələməsinə icazə verir + manage_reports_description: İstifadəçilərin hesabatları incələməsinə və bunlara qarşı moderasiya əməliyyatlarını icra etməsinə icazə verir + manage_settings: Ayarları idarə et + manage_settings_description: İstifadəçilərin sayt ayarlarını dəyişdirməsinə icazə verir + manage_taxonomies_description: İstifadəçilərin trend məzmunu incələməsinə və mövzu etiketləri ayarlarını güncəlləməsinə icazə verir + manage_user_access: İstifadəçi erişimini idarə et + manage_user_access_description: İstifadəçilərin, digər istifadəçilərin iki faktorlu kimlik doğrulamasını sıradan çıxartmasına, onların e-poçt ünvanlarını dəyişdirməsinə və onların parolunu sıfırlamasına icazə verir + manage_users_description: İstifadəçilərin digər istifadəçilərin detallarını görməsinə və onlara qarşı moderasiya əməliyyatlarını icra etməsinə icazə verir + view_dashboard_description: İstifadəçilərin idarəetmə lövhəsinə və müxtəlif metriklərə erişməsinə icazə verir + view_devops_description: İstifadəçilərin Sidekiq və pgHero idarəetmə lövhələrinə erişməsinə icazə verir + settings: + registrations: + moderation_recommandation: Hər kəs üçün qeydiyyatı açmazdan əvvəl lütfən əmin olun ki, adekvat və reaktiv moderasiya komandanız var! + registrations_mode: + warning_hint: Moderasiya komandanızın spam və zərərli qeydiyyatları vaxtında idarə edə biləcəyinə əmin deyilsinizsə, “Qeydiyyat üçün təsdiq tələb olunur”dan istifadə etməyi tövsiyə edirik. + title: Server ayarları + statuses: + metadata: Meta veri + system_checks: + elasticsearch_version_check: + message_html: 'Uyumlu olmayan Elasticsearch versiyası: %{value}' + tags: + updated_msg: Mövzu etiketi ayarları uğurla güncəlləndi + admin_mailer: + auto_close_registrations: + body: Son vaxtlarda moderator fəaliyyətinin olmamasına görə, %{instance} üzərindəki qeydiyyatlar avtomatik olaraq manual yoxlanış tələb edəcək şəkildə dəyişdirilib, beləliklə %{instance} potensial zərərli aktyorlar tərəfindən istifadə edilən platforma çevrilməyəcək. İstənilən vaxt açıq qeydiyyat rejiminə qaytara bilərsiniz. + new_appeal: + body: "%{target}, %{date} tarixində %{action_taken_by} tərəfindən verilmiş %{type} moderasiya qərarına etiraz edir. Yazılanlar:" + next_steps: Moderasiya qərarını geri almaq üçün etirazı təsdiqləyə, ya da etirazı yox saya bilərsiniz. + subject: "%{username}, %{instance} üzərindəki bir moderasiya qərarına etiraz edir" + appearance: + animations_and_accessibility: Animasiyalar və erişiləbilənlik + applications: + regenerate_token: Erişim tokenini təkrar yarat + token_regenerated: Erişim tokeni uğurla yaradıldı + your_token: Erişim tokeniniz + auth: + confirmations: + wrong_email_hint: Əgər bu e-poçt ünvanı doğru deyilsə, hesab ayarlarında onu dəyişdirə bilərsiniz. + forgot_password: Parolunuzu unutmusunuz? + invalid_reset_password_token: Parol sıfırlama tokeni yararsızdır və ya vaxtı bitib. Lütfən yenisini tələb edin. + link_to_otp: Telefonunuzdan iki faktorlu kodu və ya bir geri qaytarma kodunu daxil edin + reset_password: Parolu sıfırla + rules: + preamble: Bunlar, %{domain} moderatorları tərəfindən təyin edilib və tətbiq edilib. + preamble_invited: Davam etməzdən əvvəl, lütfən %{domain} moderatorları tərəfindən təyin edilmiş qaydaları nəzərdən keçirin. + set_new_password: Yeni parol təyin et + status: + self_destruct: "%{domain} bağlandığı üçün, hesabınıza yalnız məhdud erişiminiz olacaq." + challenge: + hint_html: "İpucu: Sonrakı bir saat ərzində sizdən parolu soruşmayacağıq." + invalid_password: Yararsız parol + prompt: Davam etmək üçün parolu təsdiqlə + deletes: + confirm_password: Kimliyinizi doğrulamaq üçün hazırkı parolunuzu daxil edin + exports: + archive_takeout: + hint_html: "Göndərişlərinizin və yüklədiyiniz medianın bir arxivini tələb edə bilərsiniz. Xaricə köçürülmüş verilər, istənilən uyumlu yazılım tərəfindən oxuna bilən ActivityPub formatında olacaq. Hər 7 gündə bir dəfə arxiv tələb edə bilərsiniz." + filters: + edit: + statuses_hint_html: Bu filtr, aşağıdakı açar sözləri ilə uyuşmasından asılı olmayaraq fərdi göndərişləri seçmək üçün tətbiq olunur. Göndərişləri incələyin və ya filtrdən silin. + generic: + all_matching_items_selected_html: + one: Axtarışınızla uyuşan %{count} element seçilib. + other: Axtarışınızla uyuşan %{count} element seçilib. + select_all_matching_items: + one: Axtarışınızla uyuşan <0>%{count} elementi seçin. + other: Axtarışınızla uyuşan <0>%{count} elementi seçin. + imports: + errors: + incompatible_type: Seçilmiş daxilə köçürmə növü ilə uyumlu deyil + invites: + prompt: Bu serverə erişim icazəsi vermək üçün keçid yaradın və başqaları ilə paylaşın + login_activities: + authentication_methods: + password: parol + description_html: Əgər tanımadığınız bir fəaliyyəti görsəniz, parolunuzu dəyişdirməyi və iki faktorlu kimlik doğrulamanı fəallaşdırmağı düşünə bilərsiniz + migrations: + warning: + disabled_account: Hazırkı hesabınız daha sonra istifadəyə yararsız olacaq. Ancaq, verilərin xaricə köçürülməsinə, həmçinin təkrar aktivləşdirmə prosesinə erişə biləcəksiniz. + moderation: + title: Moderasiya + sessions: + browsers: + edge: Microsoft Edge + settings: + account_settings: Hesab ayarları + development: Gəlişdirmə + strikes: Moderasiya pozuntuları + statuses_cleanup: + enabled_hint: Aşağıdakı istisnalardan heç birinə uyuşmadığı müddətcə, göndərişləriniz qeyd edilmiş yaş həddinə çatdıqda avtomatik silinir + tags: + does_not_match_previous_name: əvvəlki adla uyuşmur + two_factor_authentication: + generate_recovery_codes: Geri qaytarma kodlarını yarat + lost_recovery_codes: Geri qaytarma kodları, telefonunuzu itirdiyiniz halda hesabınıza yenidən erişməyinizə imkan verir. Geri qaytarma kodlarınızı itirsəniz, onları təkrar yarada bilərsiniz. Köhnə geri qaytarma kodlarınız yararsız sayılacaq. + recovery_codes: Geri qaytarma kodlarını nüsxələ + recovery_codes_regenerated: Geri qaytarma kodları uğurla yaradıldı + recovery_instructions_html: Telefonunuza erişə bilmirsinizsə, hesabınıza təkrar erişə bilmək üçün aşağıdakı geri qaytarma kodlarından birini istifadə edə bilərsiniz. Geri qaytarma kodlarını etibarlı yerdə saxlayın. Misal üçün, bunları çap edib digər vacib sənədlərin yanında saxlaya bilərsiniz. + user_mailer: + appeal_approved: + action: Hesab ayarları + suspicious_sign_in: + change_password: parolu dəyişdir + subject: Hesabınıza yeni bir IP ünvanından erişildi + warning: + explanation: + disable: Artıq hesabınızı istifadə edə bilməzsiniz, ancaq profiliniz və digər veriləriniz olduğu kimi qalacaq. Verilərinizin bir nüsxəsini tələb edə, hesab ayarlarınızı dəyişdirə və ya hesabınızı silə bilərsiniz. + suspend: Hesabınızı artıq istifadə edə bilməzsiniz, profiliniz və digər veriləriniz artıq əlçatmazdır. Təxminən 30 gün ərzində verilər tamamilə silinənə qədər verilərinizin bir nüsxəsini tələb etmək üçün hələ də hesabınıza giriş edə bilərsiniz, ancaq hesab fəaliyyətinin dayandırılması prosesini ləğv etməyinizi önləmək üçün bəzi təməl veriləri saxlayacağıq. + welcome: + feature_creativity: Mastodon özünüzü onlayn mühitdə ifadə etməyinizə kömək edəcək səs, video və şəkil göndərişləri, erişiləbilənlik açıqlamaları, anketlər, məzmun xəbərdarlıqları, animasiyalı avatarlar, özəl emojilər, kiçik şəkli kəsmə nəzarəti və daha çoxunu dəstəkləyir. Öz sənətinizi, musiqinizi və ya podkastınızı dərc edirsinizsə, Mastodon sizin üçün buradadır. + feature_moderation_title: Olmalı olduğu şəkildə moderasiya + users: + go_to_sso_account_settings: Kimlik provayderinizin hesab ayarlarına gedin + otp_lost_help_html: Hər ikisinə də erişə bilmirsinizsə, %{email} ilə əlaqə saxlayın + seamless_external_login: Xarici bir server üzərindən giriş etdiyiniz üçün parol və e-poçt ayarları mövcud deyil. diff --git a/config/locales/devise.az.yml b/config/locales/devise.az.yml index 6a02cd7e497..d472634f0a1 100644 --- a/config/locales/devise.az.yml +++ b/config/locales/devise.az.yml @@ -4,16 +4,16 @@ az: confirmations: confirmed: E-poçt ünvanınız uğurla təsdiqləndi. send_instructions: Bir neçə dəqiqə ərzində e-poçt ünvanınızı necə təsdiqləyəcəyinizə dair təlimatları olan bir e-məktub alacaqsınız. Bu e-məktubu almamısınızsa, spam qovluğunuzu yoxlayın. - send_paranoid_instructions: E-poçt ünvanınız verilənlər bazamızda varsa, bir neçə dəqiqədən sonra e-poçt ünvanınızı necə təsdiqləyəcəyinizə dair təlimatları olan bir e-məktub alacaqsınız. Bu e-məktubu almamısınızsa, spam qovluğunuzu yoxlayın. + send_paranoid_instructions: E-poçt ünvanınız veri bazamızda varsa, bir neçə dəqiqə sonra e-poçt ünvanınızı necə təsdiqləyəcəyinizə dair təlimatları olan bir e-poçt alacaqsınız. Bu e-poçtu almamısınızsa, spam qovluğunuzu yoxlayın. failure: already_authenticated: Siz artıq daxil olmusunuz. inactive: Hesabınız hələ aktivləşdirilməyib. - invalid: Səhv %{authentication_keys} və ya parol. + invalid: Yararsız %{authentication_keys} və ya parol. last_attempt: Hesabınız blok olmamışdan əvvəl bir dəfə də cəhdiniz var. - locked: Hesabınız bloklandı. - not_found_in_database: Səhv %{authentication_keys} və ya parol. + locked: Hesabınız kilidlənib. + not_found_in_database: Yararsız %{authentication_keys} və ya parol. omniauth_user_creation_failure: Bu kimlik üçün hesab yaradarkən xəta. - pending: Hesabınız hələ yoxlanışdadır. + pending: Hesabınız hələ incələnir. timeout: Sessiyanın vaxtı bitdi. Xahiş edirik davam etmək üçün yenidən daxil olun. unauthenticated: Davam etmək üçün daxil olmaq və ya qeydiyyatdan keçmək lazımdır. unconfirmed: Davam etmək üçün e-poçt ünvanınızı təsdiqləməlisiniz. @@ -22,25 +22,81 @@ az: action: E-poçt ünvanını təsdiqlə action_with_app: Təsdiqlə və %{app}-a geri qayıt explanation: Siz %{host} saytında bu e-poçt ilə hesab yaratmısınız. Onu aktivləşdirməkdən bir klik uzaqlıqdasınız. Əgər bu siz olmamısınızsa, zəhmət olmasa, bu e-məktuba məhəl qoymayın. - explanation_when_pending: Bu e-poçt ünvanı ilə %{host} saytına dəvət üçün müraciət etmisiniz. Siz e-poçt ünvanınızı təsdiqlədikdən sonra müraciətinizi nəzərdən keçirəcəyik. Siz məlumatlarınızı dəyişdirmək və ya hesabınızı silmək üçün daxil ola bilərsiniz, lakin hesabınız təsdiqlənənə qədər əksər funksiyaları istifadə edə bilməzsiniz. Müraciətiniz rədd edilərsə, məlumatlarınız silinəcək, buna görə də sizdən heç bir tədbir tələb olunmayacaq. Əgər bu siz deyildinizsə, zəhmət, bu e-məktuba məhəl qoymayın. + explanation_when_pending: Bu e-poçt ünvanı ilə %{host} ünvanına dəvət üçün müraciət etmisiniz. E-poçt ünvanınızı təsdiqlədikdən sonra müraciətinizi nəzərdən keçirəcəyik. Hesab məlumatlarını dəyişdirmək və ya hesabınızı silmək üçün giriş edə bilərsiniz, ancaq hesabınız təsdiqlənənə qədər əksər funksiyalara erişə bilməyəcəksiniz. Müraciətinizə rədd cavabı gəlsə, veriləriniz silinəcək, sizdən heç bir əməliyyat etməyiniz istənilməyəcək. Əgər bu siz deyilsinizsə, lütfən bu e-poçtu yox sayın. extra_html: Həmçinin zəhmət olmasa, serverin qaydalarınıistifadə şərtlərini oxuyun. subject: 'Mastodon: %{instance} üçün təsdiqlənmə təlimatları' title: E-poçt ünvanını təsdiqlə email_changed: explanation: 'Hesabınız üçün e-poçt ünvanı buna dəyişdirilir:' - extra: E-poçtunuzu dəyişməmisinizsə, çox güman ki, kimsə hesabınıza giriş əldə edib. Zəhmət olmasa, parolunuzu dərhal dəyişdirin və ya hesabınıza daxil ola bilməyəcəksinizsə, server admini ilə əlaqə saxlayın. + extra: E-poçtunuzu dəyişməmisinizsə, çox güman ki, kimsə hesabınıza erişib. Hesabınıza giriş edə bilmirsinizsə, lütfən parolunuzu dərhal dəyişdirin və ya server admini ilə əlaqə saxlayın. subject: 'Mastodon: E-poçt dəyişdirildi' title: Yeni e-poçt ünvanı password_change: explanation: Hesabınızın parolu dəyişdirilib. - extra: Parolunuzu dəyişməmisinizsə, çox güman ki, kimsə hesabınıza giriş əldə edib. Zəhmət olmasa, parolunuzu dərhal dəyişdirin və ya hesabınıza daxil ola bilməyəcəksinizsə, server admini ilə əlaqə saxlayın. + extra: Parolunuzu dəyişməmisinizsə, çox güman ki, kimsə hesabınıza erişib. Hesabınıza giriş edə bilmirsinizsə, lütfən parolunuzu dərhal dəyişdirin və ya server admini ilə əlaqə saxlayın. subject: 'Mastodon: Parol dəyişdirildi' title: Parol dəyişdirildi reconfirmation_instructions: explanation: E-poçtunuzu dəyişdirmək üçün yeni ünvanı təsdiqləyin. - extra: Əgər bu dəyişiklik sizin tərəfinizdən deyilsə, zəhmət olmasa, bu e-məktuba məhəl qoymayın. Siz yuxarıdakı linkə daxil olana qədər Mastodon hesabının e-poçt ünvanı dəyişməyəcək. + extra: Bu dəyişikliyi siz etməmisinizsə, lütfən bu e-poçtu yox sayın. Yuxarıdakı keçidə erişənə qədər Mastodon hesabının e-poçt ünvanı dəyişməyəcək. subject: 'Mastodon: %{instance} üçün e-poçtu təsdiqlə' title: E-poçt ünvanını təsdiqlə reset_password_instructions: action: Parolu dəyiş explanation: Siz hesabınız üçün yeni parol tələb etmisiniz. + extra: Bunu siz tələb etməmisinizsə, lütfən bu e-poçtu yox sayın. Parolunuz, yuxarıdakı keçidə erişənə və siz yeni birini yaradana qədər dəyişməyəcək. + subject: 'Mastodon: Parol sıfırlama təlimatları' + title: Parolu sıfırla + two_factor_disabled: + explanation: Giriş etmək, indi yalnız e-poçt ünvanı və parol ilə mümkündür. + subject: 'Mastodon: İki faktorlu kimlik doğrulama sıradan çıxarılıb' + subtitle: İki faktorlu kimlik doğrulama hesabınız üçün sıradan çıxarılıb. + title: 2FA sıradan çıxarılıb + two_factor_enabled: + explanation: Giriş etmək üçün cütləşdirilmiş TOTP tətbiqi tərəfindən yaradılmış bir token tələb olunur. + subject: 'Mastodon: İki faktorlu kimlik doğrulama fəaldır' + subtitle: İki faktorlu kimlik doğrulama hesabınız üçün fəallaşdırılıb. + title: 2FA fəaldır + two_factor_recovery_codes_changed: + explanation: Əvvəlki geri qaytarma kodları yararsız sayıldı və yeniləri yaradıldı. + subject: 'Mastodon: İki faktorlu geri qaytarma kodları təkrar yaradılıb' + subtitle: Əvvəlki geri qaytarma kodları yararsız sayıldı və yeniləri yaradıldı. + title: 2FA geri qaytarma kodları dəyişdirilib + unlock_instructions: + subject: 'Mastodon: Kilid açma təlimatları' + webauthn_credential: + added: + explanation: Aşağıdakı güvənlik açarı, hesabınıza əlavə edilib + subject: 'Mastodon: Yeni güvənlik açarı' + title: Yeni bir güvənlik açarı əlavə edilib + deleted: + explanation: Aşağıdakı güvənlik açarı, hesabınızdan silinib + subject: 'Mastodon: Güvənlik açarı silindi' + title: Güvənlik açarlarınızdan biri silinib + webauthn_disabled: + explanation: Güvənlik açarı ilə kimlik doğrulama hesabınız üçün sıradan çıxarılıb. + extra: Giriş, artıq yalnız cütləşdirilmiş TOTP tətbiqi tərəfindən yaradılmış token ilə mümkündür. + subject: 'Mastodon: Güvənlik açarları ilə kimlik doğrulama sıradan çıxarılıb' + title: Güvənlik açarları sıradan çıxarılıb + webauthn_enabled: + explanation: Güvənlik açarı ilə kimlik doğrulama hesabınız üçün fəallaşdırılıb. + extra: Güvənlik açarınız artıq giriş üçün istifadə edilə bilər + subject: 'Mastodon: Güvənlik açarı ilə kimlik doğrulama fəaldır' + title: Güvənlik açarları fəaldır + omniauth_callbacks: + failure: '%{kind} üzərindən kimliyiniz doğrulana bilmədi, çünki "%{reason}".' + success: "%{kind} hesabından kimliyiniz uğurla doğrulandı." + passwords: + no_token: Parol sıfırlama e-poçtunu istifadə etmədən bu səhifəyə erişə bilməzsiniz. Əgər parol sıfırlama e-poçtu ilə bura gəlmisinizsə, lütfən verilmiş tam URL-ni istifadə etdiyinizə əmin olun. + send_instructions: E-poçt ünvanınız veri bazamızda varsa, bir neçə dəqiqə sonra e-poçt ünvanınızda parolu geri qaytarma keçidini alacaqsınız. Bu e-poçtu almamısınızsa, spam qovluğunuzu yoxlayın. + send_paranoid_instructions: E-poçt ünvanınız veri bazamızda varsa, bir neçə dəqiqə sonra e-poçt ünvanınızda parolu geri qaytarma keçidini alacaqsınız. Bu e-poçtu almamısınızsa, spam qovluğunuzu yoxlayın. + updated: Parolunuz uğurla dəyişdirildi. Artıq hesabınıza daxil olmusunuz. + updated_not_active: Parolunuz uğurla dəyişdirildi. + registrations: + destroyed: Xudahafiz! Hesabınız uğurla ləğv edilib. Sizi tezliklə yenidən görməyi ümid edirik. + update_needs_confirmation: Hesabınızı uğurla güncəllədiniz, ancaq yeni e-poçt ünvanını doğrulamağımız lazımdır. Lütfən e-poçtunuzu yoxlayın, yeni e-poçt ünvanınızı təsdiqləmək üçün təsdiq keçidini izləyin. Əgər bu e-poçtu almamısınızsa spam qovluğunu yoxlayın. + updated: Hesabınız uğurla güncəllənib. + sessions: + already_signed_out: Uğurla hesabdan çıxış edildi. + signed_in: Uğurla hesaba daxil olundu. + signed_out: Uğurla hesabdan çıxış edildi. diff --git a/config/locales/doorkeeper.az.yml b/config/locales/doorkeeper.az.yml index e9ba86bc793..aac8511a1cc 100644 --- a/config/locales/doorkeeper.az.yml +++ b/config/locales/doorkeeper.az.yml @@ -1 +1,26 @@ +--- az: + doorkeeper: + errors: + messages: + invalid_token: + expired: Erişim tokeninin vaxtı bitib + revoked: Erişim tokeni ləğv edilib + unknown: Erişim tokeni yararsızdır + grouped_scopes: + access: + read: Yalnız oxuma erişimi + read/write: Oxuma və yazma erişimi + write: Yalnız yazma erişimi + title: + all: Mastodon hesabınıza tam erişim + scopes: + admin:read: serverdəki bütün veriləri oxuma + admin:write: serverdəki bütün veriləri dəyişdirmə + admin:write:accounts: hesablarda moderasiya əməliyyatlarını icra et + admin:write:canonical_email_blocks: + admin:write:domain_allows: domen icazələri üzərində moderasiya əməliyyatlarını icra et + admin:write:ip_blocks: IP əngəlləmələri üzrə moderasiya əməliyyatlarını icra et + admin:write:reports: hesabatlarda moderasiya əməliyyatlarını icra et + read: hesabınızın bütün verilərini oxuma + write: hesabınızın bütün verilərini dəyişdirmə diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 64a29da0953..913f3848844 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -190,6 +190,7 @@ fa: create_relay: ایجاد رله create_unavailable_domain: ایجاد دامنهٔ ناموجود create_user_role: ایجاد نقش + create_username_block: ایجاد قانون نام‌کاربری demote_user: تنزل کاربر destroy_announcement: حذف اعلامیه destroy_canonical_email_block: حذف انسداد رایانامه @@ -203,6 +204,7 @@ fa: destroy_status: حذف وضعیت destroy_unavailable_domain: حذف دامنهٔ ناموجود destroy_user_role: نابودی نقش + destroy_username_block: حذف قانون نام‌کاربری disable_2fa_user: از کار انداختن ورود دومرحله‌ای disable_custom_emoji: از کار انداختن شکلک سفارشی disable_relay: غیرفعال‌سازی رله @@ -237,6 +239,7 @@ fa: update_report: به‌روز رسانی گزارش update_status: به‌روز رسانی وضعیت update_user_role: به روزرسانی نقش + update_username_block: به‌روزرسانی قانون نام‌کاربری actions: approve_appeal_html: "%{name} درخواست تجدیدنظر تصمیم مدیر را از %{target} پذیرفت" approve_user_html: "%{name} ثبت نام %{target} را تایید کرد" @@ -1085,6 +1088,8 @@ fa: other: در هفته گذشته توسط %{count} نفر استفاده شده است title: توصیه ها و روندها trending: پرطرفدار + username_blocks: + delete: حذف warning_presets: add_new: افزودن تازه delete: زدودن @@ -1662,6 +1667,10 @@ fa: title: اشارهٔ جدید poll: subject: نظرسنجی‌ای از %{name} پایان یافت + quote: + body: 'فرسته‌تان توسط %{name} نقل شد:' + subject: "%{name} فرسته‌تان را نقل کرد" + title: نقل‌قول جدید reblog: body: "%{name} فرستهٔ شما را تقویت کرد:" subject: "%{name} فرستهٔ شما را تقویت کرد" @@ -1880,6 +1889,8 @@ fa: ownership: نوشته‌های دیگران را نمی‌توان ثابت کرد reblog: تقویت نمی‌تواند سنجاق شود quote_policies: + followers: تنها پی‌گیرندگانتان + nobody: هیچ‌کس public: هرکسی title: "%{name}: «%{quote}»" visibilities: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index edac267254c..b4400bfd03e 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1687,6 +1687,10 @@ fo: title: Nýggj umrøða poll: subject: Ein spurnarkanning hjá %{name} er endað + quote: + body: 'Postur tín var siteraður av %{name}:' + subject: "%{name} siteraði postin hjá tær" + title: Nýggj sitering reblog: body: 'Postur tín var stimbraður av %{name}:' subject: "%{name} stimbraði tín post" diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 5e7da40a585..8fc85b9a8db 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -1804,6 +1804,10 @@ ga: title: Lua nua poll: subject: Tháinig deireadh le vótaíocht le %{name} + quote: + body: 'Luaigh %{name} do phost:' + subject: Luaigh %{name} do phost + title: Luachan nua reblog: body: 'Treisíodh do phostáil le %{name}:' subject: Mhol %{name} do phostáil diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 3b31b138b8f..e6fb94944b7 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -188,6 +188,7 @@ lt: create_relay: Kurti perdavimą create_unavailable_domain: Kurti nepasiekiamą domeną create_user_role: Kurti vaidmenį + create_username_block: Kurti naudotojo vardo taisyklę demote_user: Pažeminti naudotoją destroy_announcement: Ištrinti skelbimą destroy_custom_emoji: Ištrinti pasirinktinį jaustuką @@ -199,6 +200,7 @@ lt: destroy_status: Ištrinti įrašą destroy_unavailable_domain: Ištrinti nepasiekiamą domeną destroy_user_role: Sunaikinti vaidmenį + destroy_username_block: Ištrinti naudotojo vardo taisyklę disable_2fa_user: Išjungti 2FA disable_custom_emoji: Išjungti pasirinktinį jaustuką disable_relay: Išjungti perdavimą @@ -231,6 +233,7 @@ lt: update_report: Atnaujinti ataskaitą update_status: Atnaujinti įrašą update_user_role: Atnaujinti vaidmenį + update_username_block: Atnaujinti naudotojo vardo taisyklę actions: approve_appeal_html: "%{name} patvirtino prižiūjimo veiksmo apeliaciją iš %{target}" approve_user_html: "%{name} patvirtino registraciją iš %{target}" @@ -245,6 +248,7 @@ lt: create_relay_html: "%{name} sukūrė perdavimą %{target}" create_unavailable_domain_html: "%{name} sustabdė tiekimą į domeną %{target}" create_user_role_html: "%{name} sukūrė %{target} vaidmenį" + create_username_block_html: "%{name} pridėjo taisyklę naudotojo vardams, turintiems %{target}" demote_user_html: "%{name} pažemino naudotoją %{target}" destroy_announcement_html: "%{name} ištrynė skelbimą %{target}" destroy_custom_emoji_html: "%{name} ištrynė jaustuką %{target}" @@ -256,6 +260,7 @@ lt: destroy_status_html: "%{name} pašalino įrašą %{target}" destroy_unavailable_domain_html: "%{name} pratęsė tiekimą į domeną %{target}" destroy_user_role_html: "%{name} ištrynė %{target} vaidmenį" + destroy_username_block_html: "%{name} pašalino taisyklę naudotojo vardams, turintiems %{target}" disable_2fa_user_html: "%{name} išjungė dviejų veiksnių reikalavimą naudotojui %{target}" disable_custom_emoji_html: "%{name} išjungė jaustuką %{target}" disable_relay_html: "%{name} išjungė perdavimą %{target}" @@ -287,6 +292,7 @@ lt: update_report_html: "%{name} atnaujino ataskaitą %{target}" update_status_html: "%{name} atnaujino įrašą %{target}" update_user_role_html: "%{name} pakeitė %{target} vaidmenį" + update_username_block_html: "%{name} atnaujino taisyklę naudotojo vardams, turintiems %{target}" deleted_account: ištrinta paskyra empty: Žurnalų nerasta. filter_by_action: Filtruoti pagal veiksmą @@ -746,6 +752,22 @@ lt: trending_rank: 'Tendencinga #%{rank}' title: Rekomendacijos ir tendencijos trending: Tendencinga + username_blocks: + add_new: Pridėti naują + block_registrations: Blokuoti registracijas + comparison: + contains: Yra + equals: Lygus + contains_html: Yra %{string} + created_msg: Sėkmingai sukurta naudotojo vardo taisyklė. + delete: Ištrinti + edit: + title: Redaguoti naudotojo vardo taisyklę + matches_exactly_html: Lygus %{string} + new: + create: Kurti taisyklę + title: Kurti naują naudotojo vardo taisyklę + no_username_block_selected: Jokios naudotojo vardo taisyklės nebuvo pakeistos, nes nė viena buvo pasirinkta. warning_presets: add_new: Pridėti naują delete: Ištrinti diff --git a/config/locales/ru.yml b/config/locales/ru.yml index a25ac88c547..001e48c650c 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1945,25 +1945,25 @@ ru: unlisted_long: Доступен кому угодно, но не отображается в публичных лентах statuses_cleanup: enabled: Автоматически удалять старые посты - enabled_hint: Автоматически удаляет ваши посты после того, как они достигли определённого возрастного порога, за некоторыми исключениями ниже. + enabled_hint: По истечении определённого срока с момента публикации ваши посты, кроме соответствующих отмеченным ниже исключениям, будут автоматически удалены exceptions: Исключения - explanation: Из-за того, что удаление постов — это ресурсоёмкий процесс, оно производится медленно со временем, когда сервер менее всего загружен. По этой причине, посты могут удаляться не сразу, а спустя определённое время, по достижению возрастного порога. - ignore_favs: Игнорировать избранное - ignore_reblogs: Игнорировать продвижения + explanation: Удаление постов — это ресурсоёмкий процесс, поэтому оно производится постепенно, с течением времени, когда сервер менее всего загружен. По этой причине посты могут удаляться не сразу по прошествии установленного срока, а спустя некоторое время. + ignore_favs: Не учитывать добавление в избранное + ignore_reblogs: Не учитывать продвижения interaction_exceptions: Исключения на основе взаимодействий interaction_exceptions_explanation: 'Обратите внимание: нет никаких гарантий, что посты будут удалены, после того, как они единожды перешли порог по отметкам «избранного» или продвижений.' - keep_direct: Не удалять адресованные посты - keep_direct_hint: Не удалять ваши посты с «адресованной» видимостью. + keep_direct: Не удалять личные сообщения + keep_direct_hint: Те ваши посты, которые видны только упомянутым в них людям, не будут удалены keep_media: Не удалять посты с вложениями - keep_media_hint: Не удалять ваши посты, содержащие любые медийные вложения. + keep_media_hint: Те ваши посты, которые содержат медиавложения, не будут удалены keep_pinned: Не удалять закреплённые посты - keep_pinned_hint: Не удалять ваши посты, которые закреплены в профиле. + keep_pinned_hint: Те ваши посты, которые вы закрепили в своём профиле, не будут удалены keep_polls: Не удалять опросы - keep_polls_hint: Не удалять ваши посты с опросами. - keep_self_bookmark: Не удалять закладки - keep_self_bookmark_hint: Не удалять ваши посты с закладками. - keep_self_fav: Оставить посты, отмеченные «избранными» - keep_self_fav_hint: Не удалять ваши посты, если вы отметили их как «избранные». + keep_polls_hint: Те ваши посты, которые содержат опросы, не будут удалены + keep_self_bookmark: Не удалять посты, добавленные в закладки + keep_self_bookmark_hint: Те ваши посты, которые вы добавили в закладки, не будут удалены + keep_self_fav: Не удалять посты, добавленные в избранное + keep_self_fav_hint: Те ваши посты, которые вы добавили в избранное, не будут удалены min_age: '1209600': 2 недели '15778476': 6 месяцев @@ -1973,11 +1973,11 @@ ru: '604800': 1 неделя '63113904': 2 года '7889238': 3 месяца - min_age_label: Возрастной порог - min_favs: Порог отметок «избранного» - min_favs_hint: Не удалять ваши посты, у которых количество отметок «избранного» достигло указанного выше значения. Оставьте поле пустым, чтобы удалять посты независимо от количества отметок - min_reblogs: Порог продвижений - min_reblogs_hint: Не удаляет ваши посты, количество продвижений которых достигло указанного выше значения. Оставьте поле пустым, чтобы удалять посты независимо от количества продвижений. + min_age_label: Интервал между публикацией и удалением поста + min_favs: Количество звёздочек, при котором пост не будет удалён + min_favs_hint: Те ваши посты, которые были добавлены в избранное столько раз, сколько вы укажете выше, не будут удалены. Оставьте поле пустым, чтобы удалять посты без учёта количества звёздочек + min_reblogs: Количество продвижений, при котором пост не будет удалён + min_reblogs_hint: Те ваши посты, которые были продвинуты столько раз, сколько вы укажете выше, не будут удалены. Оставьте поле пустым, чтобы удалять посты без учёта количества продвижений stream_entries: sensitive_content: Содержимое деликатного характера strikes: diff --git a/config/locales/simple_form.az.yml b/config/locales/simple_form.az.yml index e9ba86bc793..b03505358f8 100644 --- a/config/locales/simple_form.az.yml +++ b/config/locales/simple_form.az.yml @@ -1 +1,32 @@ +--- az: + simple_form: + hints: + admin_account_action: + include_statuses: İstifadəçi, hansı göndərişlərin moderasiya əməliyyatına və ya xəbərdarlığına səbəb olduğunu görəcək + defaults: + current_password: Təhlükəsizlik səbəblərinə görə lütfən hazırkı hesabın parolunu daxil edin + phrase: Mətndəki böyük-kiçik hərfdən və ya göndərişin məzmun xəbərdarlığından asılı olmayaraq uyuşdurulacaq + ip_block: + severities: + no_access: Bütün resurslara erişimi əngəllə + sessions: + otp: 'Telefon tətbiqiniz tərəfindən yaradılmış iki faktorlu kodu daxil edin və ya geri qaytarma kodlarınızdan birini istifadə edin:' + user_role: + permissions_as_keys: Bu rola sahib istifadəçilər bunlara erişə biləcək... + labels: + defaults: + confirm_new_password: Yeni parolu təsdiqlə + confirm_password: Parolu təsdiqlə + current_password: Hazırkı parol + data: Veri + new_password: Yeni parol + password: Parol + setting_system_scrollbars_ui: Sistemin ilkin diyircəyini istifadə edin + ip_block: + severities: + no_access: Erişimi əngəllə + notification_emails: + appeal: Kimsə, bir moderasiya qərarına etiraz edir + username_block: + username: Uyuşacaq söz diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index e96f7d43db5..c9842f07ea0 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -56,6 +56,7 @@ fa: scopes: واسط‌های برنامه‌نویسی که این برنامه به آن دسترسی دارد. اگر بالاترین سطح دسترسی را انتخاب کنید، دیگر نیازی به انتخاب سطح‌های پایینی ندارید. setting_aggregate_reblogs: برای تقویت‌هایی که به تازگی برایتان نمایش داده شده‌اند، تقویت‌های بیشتر را نمایش نده (فقط روی تقویت‌های اخیر تأثیر می‌گذارد) setting_always_send_emails: در حالت عادی آگاهی‌های رایانامه‌ای هنگامی که فعّالانه از ماستودون استفاده می‌کنید فرستاده نمی‌شوند + setting_default_quote_policy: این تنظیمات تنها روی فرسته‌هایی ایجاد شده با نگارش بعدی Mastodon اعمال خواهد شد، اما می‌توانی ترجیحات خود را از قبل انتخاب کنید. setting_default_sensitive: تصاویر حساس به طور پیش‌فرض پنهان هستند و می‌توانند با یک کلیک آشکار شوند setting_display_media_default: تصویرهایی را که به عنوان حساس علامت زده شده‌اند پنهان کن setting_display_media_hide_all: همیشه همهٔ عکس‌ها و ویدیوها را پنهان کن @@ -324,6 +325,7 @@ fa: follow_request: شخصی خواست پیتان بگیرد mention: شخصی از شما نام برد pending_account: حساب تازهٔ نیازمند بررسی + quote: شخصی شما را نقل کرد reblog: شخصی فرسته‌تان را تقویت کرد report: گزارش جدیدی فرستاده شد software_updates: diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index f620d54280a..54e0e98c7de 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -329,6 +329,7 @@ fo: follow_request: Onkur biður um at fylgja tær mention: Onkur nevndi teg pending_account: Nýggj konta krevur viðgerð + quote: Onkur siteraði teg reblog: Onkur stimbraði postin hjá tær report: Nýggj melding er send inn software_updates: diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index 0f8c8c3a703..e9afcc8d427 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -332,6 +332,7 @@ ga: follow_request: D'iarr duine éigin tú a leanúint mention: Luaigh duine éigin tú pending_account: Ní mór athbhreithniú a dhéanamh ar chuntas nua + quote: Luaigh duine éigin thú reblog: Mhol duine éigin do phostáil report: Tá tuairisc nua curtha isteach software_updates: From 836a2bfee00de71e4943a99a7b8cfd2ce585f0c5 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 7 Aug 2025 14:52:29 +0200 Subject: [PATCH 4/6] Fix handling of inlined `instrument` in incoming `QuoteRequest` (#35714) --- app/lib/activitypub/activity/quote_request.rb | 25 ++++-- .../activity/quote_request_spec.rb | 80 +++++++++++++------ 2 files changed, 76 insertions(+), 29 deletions(-) diff --git a/app/lib/activitypub/activity/quote_request.rb b/app/lib/activitypub/activity/quote_request.rb index 9f18a1367b5..088360ff981 100644 --- a/app/lib/activitypub/activity/quote_request.rb +++ b/app/lib/activitypub/activity/quote_request.rb @@ -19,13 +19,13 @@ class ActivityPub::Activity::QuoteRequest < ActivityPub::Activity private def accept_quote_request!(quoted_status) - status = status_from_uri(@json['instrument']) - # TODO: import inlined quote post if possible - status ||= ActivityPub::FetchRemoteStatusService.new.call(@json['instrument'], on_behalf_of: quoted_status.account, request_id: @options[:request_id]) + status = status_from_uri(instrument_uri) + status ||= import_instrument(quoted_status) + status ||= ActivityPub::FetchRemoteStatusService.new.call(instrument_uri, on_behalf_of: quoted_status.account, request_id: @options[:request_id]) # TODO: raise if status is nil # Sanity check - return unless status.quote.quoted_status == quoted_status + return unless status.quote.quoted_status == quoted_status && status.account == @account status.quote.ensure_quoted_access status.quote.update!(activity_uri: @json['id']) @@ -35,15 +35,30 @@ class ActivityPub::Activity::QuoteRequest < ActivityPub::Activity ActivityPub::DeliveryWorker.perform_async(json, quoted_status.account_id, @account.inbox_url) end + def import_instrument(quoted_status) + return unless @json['instrument'].is_a?(Hash) + + # NOTE: Replacing the object's context by that of the parent activity is + # not sound, but it's consistent with the rest of the codebase + instrument = @json['instrument'].merge({ '@context' => @json['@context'] }) + return if non_matching_uri_hosts?(instrument['id'], @account.uri) + + ActivityPub::FetchRemoteStatusService.new.call(instrument['id'], prefetched_body: instrument, on_behalf_of: quoted_status.account, request_id: @options[:request_id]) + end + def reject_quote_request!(quoted_status) quote = Quote.new( quoted_status: quoted_status, quoted_account: quoted_status.account, - status: Status.new(account: @account, uri: @json['instrument']), + status: Status.new(account: @account, uri: instrument_uri), account: @account, activity_uri: @json['id'] ) json = Oj.dump(serialize_payload(quote, ActivityPub::RejectQuoteRequestSerializer)) ActivityPub::DeliveryWorker.perform_async(json, quoted_status.account_id, @account.inbox_url) end + + def instrument_uri + value_or_id(@json['instrument']) + end end diff --git a/spec/lib/activitypub/activity/quote_request_spec.rb b/spec/lib/activitypub/activity/quote_request_spec.rb index 24a245c8981..64627cbdfbe 100644 --- a/spec/lib/activitypub/activity/quote_request_spec.rb +++ b/spec/lib/activitypub/activity/quote_request_spec.rb @@ -8,6 +8,7 @@ RSpec.describe ActivityPub::Activity::QuoteRequest, feature: :outgoing_quotes do let(:quoted_post) { Fabricate(:status, account: recipient) } let(:request_uri) { 'https://example.com/missing-ui' } let(:quoted_uri) { ActivityPub::TagManager.instance.uri_for(quoted_post) } + let(:instrument) { 'https://example.com/unknown-status' } let(:json) do { @@ -21,8 +22,30 @@ RSpec.describe ActivityPub::Activity::QuoteRequest, feature: :outgoing_quotes do type: 'QuoteRequest', actor: ActivityPub::TagManager.instance.uri_for(sender), object: quoted_uri, - instrument: 'https://example.com/unknown-status', - }.with_indifferent_access + instrument: instrument, + }.deep_stringify_keys + end + + let(:status_json) do + { + '@context': [ + 'https://www.w3.org/ns/activitystreams', + { + '@id': 'https://w3id.org/fep/044f#quote', + '@type': '@id', + }, + { + '@id': 'https://w3id.org/fep/044f#quoteAuthorization', + '@type': '@id', + }, + ], + id: 'https://example.com/unknown-status', + type: 'Note', + summary: 'Show more', + content: 'Hello universe', + quote: ActivityPub::TagManager.instance.uri_for(quoted_post), + attributedTo: ActivityPub::TagManager.instance.uri_for(sender), + }.deep_stringify_keys end describe '#perform' do @@ -48,29 +71,20 @@ RSpec.describe ActivityPub::Activity::QuoteRequest, feature: :outgoing_quotes do end end - context 'when trying to quote a quotable local status' do - let(:status_json) do - { - '@context': [ - 'https://www.w3.org/ns/activitystreams', - { - '@id': 'https://w3id.org/fep/044f#quote', - '@type': '@id', - }, - { - '@id': 'https://w3id.org/fep/044f#quoteAuthorization', - '@type': '@id', - }, - ], - id: 'https://example.com/unknown-status', - type: 'Note', - summary: 'Show more', - content: 'Hello universe', - quote: ActivityPub::TagManager.instance.uri_for(quoted_post), - attributedTo: ActivityPub::TagManager.instance.uri_for(sender), - }.deep_stringify_keys - end + context 'when trying to quote an unquotable local status with an inlined instrument' do + let(:instrument) { status_json.without('@context') } + it 'sends a Reject activity' do + expect { subject.perform } + .to enqueue_sidekiq_job(ActivityPub::DeliveryWorker) + .with(satisfying do |body| + outgoing_json = Oj.load(body) + outgoing_json['type'] == 'Reject' && json['instrument']['id'] == outgoing_json['object']['instrument'] && %w(type id actor object).all? { |key| json[key] == outgoing_json['object'][key] } + end, recipient.id, sender.inbox_url) + end + end + + context 'when trying to quote a quotable local status' do before do stub_request(:get, 'https://example.com/unknown-status').to_return(status: 200, body: Oj.dump(status_json), headers: { 'Content-Type': 'application/activity+json' }) quoted_post.update(quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16) @@ -86,5 +100,23 @@ RSpec.describe ActivityPub::Activity::QuoteRequest, feature: :outgoing_quotes do end, recipient.id, sender.inbox_url) end end + + context 'when trying to quote a quotable local status with an inlined instrument' do + let(:instrument) { status_json.without('@context') } + + before do + quoted_post.update(quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16) + end + + it 'accepts the quote and sends an Accept activity' do + expect { subject.perform } + .to change { quoted_post.reload.quotes.accepted.count }.by(1) + .and enqueue_sidekiq_job(ActivityPub::DeliveryWorker) + .with(satisfying do |body| + outgoing_json = Oj.load(body) + outgoing_json['type'] == 'Accept' && json['instrument']['id'] == outgoing_json['object']['instrument'] && %w(type id actor object).all? { |key| json[key] == outgoing_json['object'][key] } + end, recipient.id, sender.inbox_url) + end + end end end From 496a5f423ec49b47741e14bf04bc42684c6cdcb6 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 7 Aug 2025 15:19:18 +0200 Subject: [PATCH 5/6] Inline `instrument` quote post in outgoing `QuoteRequest` activities (#35713) --- .../activitypub/quote_request_serializer.rb | 16 +++++++++++++--- app/workers/activitypub/quote_request_worker.rb | 2 +- .../activitypub/quote_request_worker_spec.rb | 4 +++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/serializers/activitypub/quote_request_serializer.rb b/app/serializers/activitypub/quote_request_serializer.rb index 2b3363fb576..e6e4bb9b036 100644 --- a/app/serializers/activitypub/quote_request_serializer.rb +++ b/app/serializers/activitypub/quote_request_serializer.rb @@ -1,11 +1,22 @@ # frozen_string_literal: true class ActivityPub::QuoteRequestSerializer < ActivityPub::Serializer + def self.serializer_for(model, options) + case model.class.name + when 'Status' + ActivityPub::NoteSerializer + else + super + end + end + context_extensions :quote_requests - attributes :id, :type, :actor, :instrument + attributes :id, :type, :actor attribute :virtual_object, key: :object + has_one :instrument + def id object.activity_uri end @@ -23,7 +34,6 @@ class ActivityPub::QuoteRequestSerializer < ActivityPub::Serializer end def instrument - # TODO: inline object? - ActivityPub::TagManager.instance.uri_for(object.status) + instance_options[:allow_post_inlining] && object.status.local? ? object.status : ActivityPub::TagManager.instance.uri_for(object.status) end end diff --git a/app/workers/activitypub/quote_request_worker.rb b/app/workers/activitypub/quote_request_worker.rb index de5e054f69f..0540492f863 100644 --- a/app/workers/activitypub/quote_request_worker.rb +++ b/app/workers/activitypub/quote_request_worker.rb @@ -17,6 +17,6 @@ class ActivityPub::QuoteRequestWorker < ActivityPub::RawDistributionWorker end def payload - @payload ||= Oj.dump(serialize_payload(@quote, ActivityPub::QuoteRequestSerializer, signer: @account)) + @payload ||= Oj.dump(serialize_payload(@quote, ActivityPub::QuoteRequestSerializer, signer: @account, allow_post_inlining: true)) end end diff --git a/spec/workers/activitypub/quote_request_worker_spec.rb b/spec/workers/activitypub/quote_request_worker_spec.rb index 3d0131baaad..b0e10aeffc3 100644 --- a/spec/workers/activitypub/quote_request_worker_spec.rb +++ b/spec/workers/activitypub/quote_request_worker_spec.rb @@ -23,7 +23,9 @@ RSpec.describe ActivityPub::QuoteRequestWorker do type: 'QuoteRequest', actor: ActivityPub::TagManager.instance.uri_for(quote.account), object: ActivityPub::TagManager.instance.uri_for(quoted_status), - instrument: anything # TODO: inline post in request? + instrument: a_hash_including( + id: ActivityPub::TagManager.instance.uri_for(status) + ) ) end end From a485f97d21c3fb7da927e8fd239b301a590ee9b8 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 7 Aug 2025 09:47:47 -0400 Subject: [PATCH 6/6] Replace `EmailHelper` module with `normalizes` via model concern (#35702) --- app/helpers/email_helper.rb | 18 --------------- app/models/canonical_email_block.rb | 19 ++++++++++------ app/models/concerns/canonical_email.rb | 27 +++++++++++++++++++++++ spec/models/canonical_email_block_spec.rb | 8 +++++++ 4 files changed, 47 insertions(+), 25 deletions(-) delete mode 100644 app/helpers/email_helper.rb create mode 100644 app/models/concerns/canonical_email.rb diff --git a/app/helpers/email_helper.rb b/app/helpers/email_helper.rb deleted file mode 100644 index 0800601f98b..00000000000 --- a/app/helpers/email_helper.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -module EmailHelper - def self.included(base) - base.extend(self) - end - - def email_to_canonical_email(str) - username, domain = str.downcase.split('@', 2) - username, = username.delete('.').split('+', 2) - - "#{username}@#{domain}" - end - - def email_to_canonical_email_hash(str) - Digest::SHA2.new(256).hexdigest(email_to_canonical_email(str)) - end -end diff --git a/app/models/canonical_email_block.rb b/app/models/canonical_email_block.rb index d09df6f5e2a..4ed160fc262 100644 --- a/app/models/canonical_email_block.rb +++ b/app/models/canonical_email_block.rb @@ -12,24 +12,29 @@ # class CanonicalEmailBlock < ApplicationRecord - include EmailHelper + include CanonicalEmail include Paginable belongs_to :reference_account, class_name: 'Account', optional: true validates :canonical_email_hash, presence: true, uniqueness: true - scope :matching_email, ->(email) { where(canonical_email_hash: email_to_canonical_email_hash(email)) } + scope :matching_email, ->(email) { where(canonical_email_hash: digest(normalize_value_for(:email, email))) } + + def self.block?(email) + matching_email(email).exists? + end + + def self.digest(value) + Digest::SHA256.hexdigest(value) + end def to_log_human_identifier canonical_email_hash end def email=(email) - self.canonical_email_hash = email_to_canonical_email_hash(email) - end - - def self.block?(email) - matching_email(email).exists? + super + self.canonical_email_hash = self.class.digest(self.email) end end diff --git a/app/models/concerns/canonical_email.rb b/app/models/concerns/canonical_email.rb new file mode 100644 index 00000000000..bbc529ff085 --- /dev/null +++ b/app/models/concerns/canonical_email.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module CanonicalEmail + extend ActiveSupport::Concern + + included do + normalizes :email, with: ->(value) { canonicalize_email(value) } + end + + class_methods do + def canonicalize_email(email) + email + .downcase + .split('@', 2) + .then { |local, domain| [canonical_username(local), domain] } + .join('@') + end + + def canonical_username(username) + username + .to_s + .delete('.') + .split('+', 2) + .first + end + end +end diff --git a/spec/models/canonical_email_block_spec.rb b/spec/models/canonical_email_block_spec.rb index 0b8dcfb9c19..f531fd214e0 100644 --- a/spec/models/canonical_email_block_spec.rb +++ b/spec/models/canonical_email_block_spec.rb @@ -7,6 +7,14 @@ RSpec.describe CanonicalEmailBlock do it { is_expected.to belong_to(:reference_account).class_name('Account').optional } end + describe 'Normalizations' do + describe 'email' do + it { is_expected.to normalize(:email).from('TEST@HOST.EXAMPLE').to('test@host.example') } + it { is_expected.to normalize(:email).from('test+more@host.example').to('test@host.example') } + it { is_expected.to normalize(:email).from('test.user@host.example').to('testuser@host.example') } + end + end + describe 'Scopes' do describe '.matching_email' do subject { described_class.matching_email(email) }