diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index fcfeed5fba..859b23ba66 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -42,11 +42,24 @@ jobs: with: onlyProduction: 'true' + - name: Cache assets from compilation + uses: actions/cache@v4 + with: + path: | + public/assets + public/packs + public/packs-test + tmp/cache/webpacker + key: ${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }}-${{ github.sha }} + restore-keys: | + ${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }}-${{ github.sha }} + ${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }} + ${{ matrix.mode }}-assets-main + ${{ matrix.mode }}-assets + - name: Precompile assets - # Previously had set this, but it's not supported - # export NODE_OPTIONS=--openssl-legacy-provider run: |- - ./bin/rails assets:precompile + bin/rails assets:precompile - name: Archive asset artifacts run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 7388e5b461..02ac2898dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -165,7 +165,7 @@ The following changelog entries focus on changes visible to users, administrator - **Change colors throughout the web UI** (#29522, #29584, #29653, #29779, #29803, #29809, #29808, #29828, #31034, #31168, #31266, #31348, #31349, #31361, and #31510 by @ClearlyClaire, @Gargron, @renchap, and @vmstan) - **Change onboarding prompt to follow suggestions carousel in web UI** (#28878 and #29272 by @Gargron) - **Change email templates** (#28416, #28755, #28814, #29064, #28883, #29470, #29607, #29761, #29760, and #29879 by @ClearlyClaire, @Gargron, @hteumeuleu, and @mjankowski)\ - All emails to end-users have been completely redesigned with a fresh new look, providing more information while making them easier to reand and keeping maximum compatibility across mail clients. + All emails to end-users have been completely redesigned with a fresh new look, providing more information while making them easier to read and keeping maximum compatibility across mail clients. - **Change follow recommendations algorithm** (#28314, #28433, #29017, #29108, #29306, #29550, #29619, and #31474 by @ClearlyClaire, @Gargron, @kernal053, @mjankowski, and @wheatear-dev)\ This replaces the “past interactions” recommendation algorithm with a “friends of friends” algorithm that suggests accounts followed by people you follow, and a “similar profiles” algorithm that suggests accounts with a profile similar to your most recent follows.\ In addition, the implementation has been significantly reworked, and all follow recommendations are now dismissable.\ diff --git a/Gemfile.lock b/Gemfile.lock index 62f6f091b8..40d7cea3d6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -137,14 +137,14 @@ GEM blurhash (0.1.7) bootsnap (1.18.4) msgpack (~> 1.2) - brakeman (6.1.2) + brakeman (6.2.1) racc browser (5.3.1) brpoplpush-redis_script (0.1.3) concurrent-ruby (~> 1.0, >= 1.0.5) redis (>= 1.0, < 6) builder (3.3.0) - bundler-audit (0.9.1) + bundler-audit (0.9.2) bundler (>= 1.2.0, < 3) thor (~> 1.0) capybara (3.40.0) @@ -432,7 +432,7 @@ GEM mime-types-data (3.2024.0702) mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.24.1) + minitest (5.25.1) msgpack (1.7.2) multi_json (1.15.0) multipart-post (2.4.0) @@ -466,7 +466,7 @@ GEM addressable (~> 2.8) nokogiri (~> 1.12) omniauth (~> 2.1) - omniauth-rails_csrf_protection (1.0.1) + omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) omniauth (~> 2.0) omniauth-saml (2.1.0) @@ -695,7 +695,7 @@ GEM responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rexml (3.3.4) + rexml (3.3.6) strscan rotp (6.3.0) rouge (4.2.1) @@ -832,7 +832,7 @@ GEM unicode-display_width (>= 1.1.1, < 3) terrapin (1.0.1) climate_control - test-prof (1.4.0) + test-prof (1.4.1) thor (1.3.1) tilt (2.3.0) timeout (0.4.1) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 62863c9e6a..6cbae8c54c 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -86,7 +86,7 @@ module ApplicationHelper def html_title safe_join( [content_for(:page_title).to_s.chomp, title] - .select(&:present?), + .compact_blank, ' - ' ) end diff --git a/app/javascript/mastodon/actions/account_notes.ts b/app/javascript/mastodon/actions/account_notes.ts index c2ebaf54a4..9e7d199dc9 100644 --- a/app/javascript/mastodon/actions/account_notes.ts +++ b/app/javascript/mastodon/actions/account_notes.ts @@ -6,5 +6,4 @@ export const submitAccountNote = createDataLoadingThunk( ({ accountId, note }: { accountId: string; note: string }) => apiSubmitAccountNote(accountId, note), (relationship) => ({ relationship }), - { skipLoading: true }, ); diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 8d3289ff45..c1cb734a63 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -190,6 +190,8 @@ "confirmations.unfollow.confirm": "إلغاء المتابعة", "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟", "confirmations.unfollow.title": "إلغاء متابعة المستخدم؟", + "content_warning.hide": "إخفاء المنشور", + "content_warning.show": "إظهار على أي حال", "conversation.delete": "احذف المحادثة", "conversation.mark_as_read": "اعتبرها كمقروءة", "conversation.open": "اعرض المحادثة", @@ -297,6 +299,7 @@ "filter_modal.select_filter.subtitle": "استخدم فئة موجودة أو قم بإنشاء فئة جديدة", "filter_modal.select_filter.title": "تصفية هذا المنشور", "filter_modal.title.status": "تصفية منشور", + "filter_warning.matches_filter": "يطابق عامل التصفية \"{title}\"", "filtered_notifications_banner.title": "الإشعارات المصفاة", "firehose.all": "الكل", "firehose.local": "هذا الخادم", @@ -500,11 +503,14 @@ "notification.update": "عدّلَ {name} منشورًا", "notification_requests.accept": "موافقة", "notification_requests.dismiss": "تخطي", + "notification_requests.edit_selection": "تعديل", + "notification_requests.exit_selection": "تمّ", "notification_requests.explainer_for_limited_account": "تم تصفية الإشعارات من هذا الحساب لأن الحساب تم تقييده من قبل مشرف.", "notification_requests.notifications_from": "إشعارات من {name}", "notification_requests.title": "الإشعارات المصفاة", "notifications.clear": "مسح الإشعارات", "notifications.clear_confirmation": "متأكد من أنك تود مسح جميع الإشعارات الخاصة بك و المتلقاة إلى حد الآن ؟", + "notifications.clear_title": "أترغب في مسح الإشعارات؟", "notifications.column_settings.admin.report": "التبليغات الجديدة:", "notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:", "notifications.column_settings.alert": "إشعارات سطح المكتب", @@ -713,6 +719,7 @@ "server_banner.about_active_users": "الأشخاص الذين يستخدمون هذا الخادم خلال الأيام الثلاثين الأخيرة (المستخدمون النشطون شهريًا)", "server_banner.active_users": "مستخدم نشط", "server_banner.administered_by": "يُديره:", + "server_banner.is_one_of_many": "{domain} هو واحد من بين العديد من خوادم ماستدون المستقلة التي يمكنك استخدامها للمشاركة في الفديفرس.", "server_banner.server_stats": "إحصائيات الخادم:", "sign_in_banner.create_account": "أنشئ حسابًا", "sign_in_banner.sign_in": "تسجيل الدخول", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 6335b546d7..57431b0a57 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "Адпісацца", "confirmations.unfollow.message": "Вы ўпэўненыя, што хочаце адпісацца ад {name}?", "confirmations.unfollow.title": "Адпісацца ад карыстальніка?", + "content_warning.hide": "Схаваць допіс", + "content_warning.show": "Усё адно паказаць", "conversation.delete": "Выдаліць размову", "conversation.mark_as_read": "Адзначыць прачытаным", "conversation.open": "Прагледзець размову", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Скарыстайцеся існуючай катэгорыяй або стварыце новую", "filter_modal.select_filter.title": "Фільтраваць гэты допіс", "filter_modal.title.status": "Фільтраваць допіс", + "filter_warning.matches_filter": "Адпавядае фільтру \"{title}\"", "filtered_notifications_banner.pending_requests": "Ад {count, plural, =0 {# людзей якіх} one {# чалавека якіх} few {# чалавек якіх} many {# людзей якіх} other {# чалавека якіх}} вы магчыма ведаеце", "filtered_notifications_banner.title": "Адфільтраваныя апавяшчэнні", "firehose.all": "Усе", @@ -355,6 +358,7 @@ "home.pending_critical_update.link": "Прагледзець абнаўленні", "home.pending_critical_update.title": "Даступна крытычнае абнаўленне бяспекі!", "home.show_announcements": "Паказаць аб'явы", + "ignore_notifications_modal.not_following_title": "Ігнараваць апавяшчэнні ад людзей на якіх вы не падпісаны?", "interaction_modal.description.favourite": "Маючы ўліковы запіс Mastodon, вы можаце ўпадабаць гэты допіс, каб паведаміць аўтару, што ён вам падабаецца, і захаваць яго на будучыню.", "interaction_modal.description.follow": "Маючы акаўнт у Mastodon, вы можаце падпісацца на {name}, каб бачыць яго/яе допісы ў сваёй хатняй стужцы.", "interaction_modal.description.reblog": "З уліковым запісам Mastodon, вы можаце пашырыць гэты пост, каб падзяліцца ім са сваімі падпісчыкамі.", @@ -504,7 +508,11 @@ "notification.status": "Новы допіс ад {name}", "notification.update": "Допіс {name} адрэдагаваны", "notification_requests.accept": "Прыняць", + "notification_requests.confirm_accept_multiple.title": "Прыняць запыты на апавяшчэнні?", + "notification_requests.confirm_dismiss_multiple.title": "Адхіліць запыты на апавяшчэнні?", "notification_requests.dismiss": "Адхіліць", + "notification_requests.edit_selection": "Рэдагаваць", + "notification_requests.exit_selection": "Гатова", "notification_requests.maximize": "Разгарнуць", "notification_requests.minimize_banner": "Згарнуць банер адфільтраваных апавяшчэнняў", "notification_requests.notifications_from": "Апавяшчэнні ад {name}", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 83d9c5343a..5fb254e390 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -192,6 +192,7 @@ "confirmations.unfollow.confirm": "Без следване", "confirmations.unfollow.message": "Наистина ли искате да не следвате {name}?", "confirmations.unfollow.title": "Спирате ли да следвате потребителя?", + "content_warning.hide": "Скриване на публ.", "conversation.delete": "Изтриване на разговора", "conversation.mark_as_read": "Маркиране като прочетено", "conversation.open": "Преглед на разговора", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index d029f6bad1..7e7bc25c9e 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -1,5 +1,5 @@ { - "about.blocks": "Gweinyddion sy'n cael eu cymedroli", + "about.blocks": "Gweinyddion gyda chymedrolwyr", "about.contact": "Cysylltwch â:", "about.disclaimer": "Mae Mastodon yn feddalwedd cod agored rhydd ac o dan hawlfraint Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Nid yw'r rheswm ar gael", @@ -103,7 +103,7 @@ "bundle_column_error.network.body": "Bu gwall wrth geisio llwytho'r dudalen hon. Gall hyn fod oherwydd anhawster dros-dro gyda'ch cysylltiad gwe neu'r gweinydd hwn.", "bundle_column_error.network.title": "Gwall rhwydwaith", "bundle_column_error.retry": "Ceisiwch eto", - "bundle_column_error.return": "Mynd nôl adref", + "bundle_column_error.return": "Mynd i'r ffrwd gartref", "bundle_column_error.routing.body": "Nid oedd modd canfod y dudalen honno. Ydych chi'n siŵr fod yr URL yn y bar cyfeiriad yn gywir?", "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Cau", @@ -124,7 +124,7 @@ "column.favourites": "Ffefrynnau", "column.firehose": "Ffrydiau byw", "column.follow_requests": "Ceisiadau dilyn", - "column.home": "Hafan", + "column.home": "Cartref", "column.lists": "Rhestrau", "column.mutes": "Defnyddwyr wedi'u tewi", "column.notifications": "Hysbysiadau", @@ -184,7 +184,7 @@ "confirmations.logout.title": "Allgofnodi?", "confirmations.mute.confirm": "Tewi", "confirmations.redraft.confirm": "Dileu ac ailddrafftio", - "confirmations.redraft.message": "Ydych chi'n siŵr eich bod am ddileu'r postiad hwn a'i ailddrafftio? Bydd ffefrynnau a hybiau'n cael eu colli, a bydd atebion i'r post gwreiddiol yn mynd yn amddifad.", + "confirmations.redraft.message": "Ydych chi wir eisiau'r dileu'r postiad hwn a'i ailddrafftio? Bydd ffefrynnau a hybiau'n cael eu colli, a bydd atebion i'r post gwreiddiol yn mynd yn amddifad.", "confirmations.redraft.title": "Dileu & ailddraftio post?", "confirmations.reply.confirm": "Ateb", "confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n siŵr eich bod am barhau?", @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "Dad-ddilyn", "confirmations.unfollow.message": "Ydych chi'n siŵr eich bod am ddad-ddilyn {name}?", "confirmations.unfollow.title": "Dad-ddilyn defnyddiwr?", + "content_warning.hide": "Cuddio'r post", + "content_warning.show": "Dangos beth bynnag", "conversation.delete": "Dileu sgwrs", "conversation.mark_as_read": "Nodi fel wedi'i ddarllen", "conversation.open": "Gweld sgwrs", @@ -208,7 +210,7 @@ "dismissable_banner.community_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl sydd â chyfrifon ar {domain}.", "dismissable_banner.dismiss": "Cau", "dismissable_banner.explore_links": "Dyma straeon newyddion sy’n cael eu rhannu fwyaf ar y we gymdeithasol heddiw. Mae'r straeon newyddion diweddaraf sy'n cael eu postio gan fwy o unigolion gwahanol yn cael eu graddio'n uwch.", - "dismissable_banner.explore_statuses": "Mae'r rhain yn bostiadau o bob rhan o'r we gymdeithasol sydd ar gynnydd heddiw. Mae postiadau mwy diweddar sydd â mwy o hybiau a ffefrynu'n cael eu graddio'n uwch.", + "dismissable_banner.explore_statuses": "Dyma postiadau o bob gwr o'r we gymdeithasol sy'n derbyn sylw heddiw. Mae postiadau mwy diweddar sydd â mwy o hybiau a ffefrynnau'n cael eu graddio'n uwch.", "dismissable_banner.explore_tags": "Mae'r rhain yn hashnodau sydd ar gynnydd ar y we gymdeithasol heddiw. Mae hashnodau sy'n cael eu defnyddio gan fwy o unigolion gwahanol yn cael eu graddio'n uwch.", "dismissable_banner.public_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl ar y we gymdeithasol y mae pobl ar {domain} yn eu dilyn.", "domain_block_modal.block": "Blocio gweinydd", @@ -258,13 +260,13 @@ "empty_column.community": "Mae'r ffrwd lleol yn wag. Beth am ysgrifennu rhywbeth cyhoeddus!", "empty_column.direct": "Nid oes gennych unrhyw grybwylliadau preifat eto. Pan fyddwch chi'n anfon neu'n derbyn un, bydd yn ymddangos yma.", "empty_column.domain_blocks": "Nid oes unrhyw barthau wedi'u blocio eto.", - "empty_column.explore_statuses": "Does dim yn trendio ar hyn o bryd. Dewch nôl nes ymlaen!", - "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff bostiadau eto. Pan byddwch yn hoffi un, bydd yn ymddangos yma.", - "empty_column.favourites": "Nid oes unrhyw un wedi hoffi'r postiad hwn eto. Pan fydd rhywun yn gwneud hynny, byddan nhw'n ymddangos yma.", + "empty_column.explore_statuses": "Does dim pynciau llosg ar hyn o bryd. Dewch nôl nes ymlaen!", + "empty_column.favourited_statuses": "Rydych chi heb ffafrio unrhyw bostiadau eto. Pan byddwch chi'n ffafrio un, bydd yn ymddangos yma.", + "empty_column.favourites": "Nid oes unrhyw un wedi ffafrio'r postiad hwn eto. Pan fydd rhywun yn gwneud hynny, byddan nhw'n ymddangos yma.", "empty_column.follow_requests": "Nid oes gennych unrhyw geisiadau dilyn eto. Pan fyddwch yn derbyn un, byddan nhw'n ymddangos yma.", "empty_column.followed_tags": "Nid ydych wedi dilyn unrhyw hashnodau eto. Pan fyddwch chi'n gwneud hynny, byddan nhw'n ymddangos yma.", "empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.", - "empty_column.home": "Mae eich ffrwd gartref yn wag! Ymwelwch â {public} neu defnyddiwch y chwilotwr i ddechrau arni ac i gwrdd â defnyddwyr eraill.", + "empty_column.home": "Mae eich ffrwd gartref yn wag! Dilynwch fwy o bobl i'w llenwi.", "empty_column.list": "Does dim yn y rhestr yma eto. Pan fydd aelodau'r rhestr yn cyhoeddi postiad newydd, mi fydd yn ymddangos yma.", "empty_column.lists": "Nid oes gennych unrhyw restrau eto. Pan fyddwch yn creu un, mi fydd yn ymddangos yma.", "empty_column.mutes": "Nid ydych wedi tewi unrhyw ddefnyddwyr eto.", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Defnyddiwch gategori sy'n bodoli eisoes neu crëu un newydd", "filter_modal.select_filter.title": "Hidlo'r postiad hwn", "filter_modal.title.status": "Hidlo postiad", + "filter_warning.matches_filter": "Yn cydweddu'r hidlydd “{title}”", "filtered_notifications_banner.pending_requests": "Gan {count, plural, =0 {no one} one {un person} two {# berson} few {# pherson} other {# person}} efallai eich bod yn eu hadnabod", "filtered_notifications_banner.title": "Hysbysiadau wedi'u hidlo", "firehose.all": "Popeth", @@ -348,11 +351,15 @@ "hashtag.follow": "Dilyn hashnod", "hashtag.unfollow": "Dad-ddilyn hashnod", "hashtags.and_other": "…a {count, plural, other {# more}}", + "hints.profiles.see_more_followers": "Gweld mwy o ddilynwyr ar {domain}", + "hints.profiles.see_more_follows": "Gweld mwy o 'yn dilyn' ar {domain}", + "hints.profiles.see_more_posts": "Gweld mwy o bostiadau ar {domain}", + "hints.threads.see_more": "Gweld mwy o atebion ar {domain}", "home.column_settings.show_reblogs": "Dangos hybiau", "home.column_settings.show_replies": "Dangos atebion", "home.hide_announcements": "Cuddio cyhoeddiadau", "home.pending_critical_update.body": "Diweddarwch eich gweinydd Mastodon cyn gynted â phosibl!", - "home.pending_critical_update.link": "Gweld y diweddariadau", + "home.pending_critical_update.link": "Gweld diweddariadau", "home.pending_critical_update.title": "Mae diweddariad diogelwch hanfodol ar gael!", "home.show_announcements": "Dangos cyhoeddiadau", "ignore_notifications_modal.disclaimer": "Ni all Mastodon hysbysu defnyddwyr eich bod wedi anwybyddu eu hysbysiadau. Ni fydd anwybyddu hysbysiadau yn atal y negeseuon eu hunain rhag cael eu hanfon.", @@ -366,18 +373,18 @@ "ignore_notifications_modal.not_followers_title": "Anwybyddu hysbysiadau gan bobl nad ydynt yn eich dilyn?", "ignore_notifications_modal.not_following_title": "Anwybyddu hysbysiadau gan bobl nad ydych yn eu dilyn?", "ignore_notifications_modal.private_mentions_title": "Anwybyddu hysbysiadau o Grybwylliadau Preifat digymell?", - "interaction_modal.description.favourite": "Gyda chyfrif ar Mastodon, gallwch chi hoffi'r postiad hwn er mwyn roi gwybod i'r awdur eich bod chi'n ei werthfawrogi ac yn ei gadw ar gyfer nes ymlaen.", - "interaction_modal.description.follow": "Gyda chyfrif ar Mastodon, gallwch ddilyn {name} i dderbyn eu postiadau yn eich llif cartref.", + "interaction_modal.description.favourite": "Gyda chyfrif ar Mastodon, gallwch chi ffafrio'r postiad hwn er mwyn roi gwybod i'r awdur eich bod chi'n ei werthfawrogi ac yn ei gadw ar gyfer nes ymlaen.", + "interaction_modal.description.follow": "Gyda chyfrif ar Mastodon, gallwch ddilyn {name} i dderbyn eu postiadau yn eich ffrwd gartref.", "interaction_modal.description.reblog": "Gyda chyfrif ar Mastodon, gallwch hybu'r postiad hwn i'w rannu â'ch dilynwyr.", "interaction_modal.description.reply": "Gyda chyfrif ar Mastodon, gallwch ymateb i'r postiad hwn.", - "interaction_modal.login.action": "Ewch â fi adref", + "interaction_modal.login.action": "Mynd i'm ffrwd gartref", "interaction_modal.login.prompt": "Parth eich gweinydd cartref, e.e. mastodon.social", "interaction_modal.no_account_yet": "Dim ar Mastodon?", "interaction_modal.on_another_server": "Ar weinydd gwahanol", "interaction_modal.on_this_server": "Ar y gweinydd hwn", "interaction_modal.sign_in": "Nid ydych wedi mewngofnodi i'r gweinydd hwn. Ble mae eich cyfrif yn cael ei gynnal?", "interaction_modal.sign_in_hint": "Awgrym: Dyna'r wefan lle gwnaethoch gofrestru. Os nad ydych yn cofio, edrychwch am yr e-bost croeso yn eich blwch derbyn. Gallwch hefyd nodi eich enw defnyddiwr llawn! (e.e. @Mastodon@mastodon.social)", - "interaction_modal.title.favourite": "Hoffi postiad {name}", + "interaction_modal.title.favourite": "Ffafrio postiad {name}", "interaction_modal.title.follow": "Dilyn {name}", "interaction_modal.title.reblog": "Hybu postiad {name}", "interaction_modal.title.reply": "Ymateb i bostiad {name}", @@ -393,11 +400,11 @@ "keyboard_shortcuts.direct": "i agor colofn crybwylliadau preifat", "keyboard_shortcuts.down": "Symud lawr yn y rhestr", "keyboard_shortcuts.enter": "Agor post", - "keyboard_shortcuts.favourite": "Hoffi postiad", + "keyboard_shortcuts.favourite": "Ffafrio postiad", "keyboard_shortcuts.favourites": "Agor rhestr ffefrynnau", "keyboard_shortcuts.federated": "Agor ffrwd y ffederasiwn", "keyboard_shortcuts.heading": "Bysellau brys", - "keyboard_shortcuts.home": "Agor ffrwd cartref", + "keyboard_shortcuts.home": "Agor ffrwd gartref", "keyboard_shortcuts.hotkey": "Bysell boeth", "keyboard_shortcuts.legend": "Dangos y rhestr hon", "keyboard_shortcuts.local": "Agor ffrwd lleol", @@ -433,7 +440,7 @@ "lists.delete": "Dileu rhestr", "lists.edit": "Golygu rhestr", "lists.edit.submit": "Newid teitl", - "lists.exclusive": "Cuddiwch y postiadau hyn rhag cartref", + "lists.exclusive": "Cuddio'r postiadau hyn o'r ffrwd gartref", "lists.new.create": "Ychwanegu rhestr", "lists.new.title_placeholder": "Teitl rhestr newydd", "lists.replies_policy.followed": "Unrhyw ddefnyddiwr sy'n cael ei ddilyn", @@ -487,7 +494,9 @@ "notification.admin.report_statuses": "Adroddodd {name} {target} ar gyfer {category}", "notification.admin.report_statuses_other": "Adroddodd {name} {target}", "notification.admin.sign_up": "Cofrestrodd {name}", - "notification.favourite": "Hoffodd {name} eich postiad", + "notification.admin.sign_up.name_and_others": "Cofrestrodd {name} {count, plural, one {ac # arall} other {a # eraill}}", + "notification.favourite": "Ffafriodd {name} eich postiad", + "notification.favourite.name_and_others_with_link": "Ffafriodd {name} a {count, plural, one {# arall} other {# eraill}} eich postiad", "notification.follow": "Dilynodd {name} chi", "notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn", "notification.label.mention": "Crybwyll", @@ -515,7 +524,13 @@ "notification.status": "{name} newydd ei bostio", "notification.update": "Golygodd {name} bostiad", "notification_requests.accept": "Derbyn", + "notification_requests.confirm_accept_multiple.title": "Derbyn ceisiadau hysbysu?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Diystyru cais} other {Diystyru ceisiadau}}", + "notification_requests.confirm_dismiss_multiple.title": "Diystyru ceisiadau hysbysu?", "notification_requests.dismiss": "Cau", + "notification_requests.dismiss_multiple": "{count, plural, one {Diystyru # cais…} two {Diystyru # gais…} few {Diystyru # chais…} other {Diystyru # cais…}}", + "notification_requests.edit_selection": "Golygu", + "notification_requests.exit_selection": "Iawn", "notification_requests.explainer_for_limited_account": "Mae hysbysiadau o'r cyfrif hwn wedi'u hidlo oherwydd bod y cyfrif wedi'i gyfyngu gan gymedrolwr.", "notification_requests.explainer_for_limited_remote_account": "Mae hysbysiadau o'r cyfrif hwn wedi'u hidlo oherwydd bod y cyfrif neu ei weinydd wedi'i gyfyngu gan gymedrolwr.", "notification_requests.maximize": "Mwyhau", @@ -581,12 +596,12 @@ "notifications_permission_banner.title": "Peidiwch â cholli dim", "onboarding.action.back": "Ewch â fi nôl", "onboarding.actions.back": "Ewch â fi nôl", - "onboarding.actions.go_to_explore": "Gweld beth sy'n trendio", - "onboarding.actions.go_to_home": "Ewch i'ch ffrwd gartref", + "onboarding.actions.go_to_explore": "Gweld y pynciau llosg", + "onboarding.actions.go_to_home": "Ewch i'm ffrwd gartref", "onboarding.compose.template": "Helo, #Mastodon!", "onboarding.follows.empty": "Yn anffodus, nid oes modd dangos unrhyw ganlyniadau ar hyn o bryd. Gallwch geisio defnyddio chwilio neu bori'r dudalen archwilio i ddod o hyd i bobl i'w dilyn, neu ceisio eto yn nes ymlaen.", "onboarding.follows.lead": "Rydych chi'n curadu eich ffrwd gartref eich hun. Po fwyaf o bobl y byddwch chi'n eu dilyn, y mwyaf egnïol a diddorol fydd hi. Gall y proffiliau hyn fod yn fan cychwyn da - gallwch chi bob amser eu dad-ddilyn yn nes ymlaen:", - "onboarding.follows.title": "Yn boblogaidd ar Mastodon", + "onboarding.follows.title": "Personolwch eich ffrwd gartref", "onboarding.profile.discoverable": "Gwnewch fy mhroffil yn un y gellir ei ddarganfod", "onboarding.profile.discoverable_hint": "Pan fyddwch yn optio i mewn i ddarganfodadwyedd ar Mastodon, gall eich postiadau ymddangos mewn canlyniadau chwilio a threndiau, ac efallai y bydd eich proffil yn cael ei awgrymu i bobl sydd â diddordebau tebyg i chi.", "onboarding.profile.display_name": "Enw dangos", @@ -606,7 +621,7 @@ "onboarding.start.skip": "Eisiau mynd syth yn eich blaen?", "onboarding.start.title": "Rydych chi wedi cyrraedd!", "onboarding.steps.follow_people.body": "Rydych chi'n curadu eich ffrwd eich hun. Gadewch i ni ei lenwi â phobl ddiddorol.", - "onboarding.steps.follow_people.title": "Dilynwch {count, plural, one {one person} other {# people}}", + "onboarding.steps.follow_people.title": "Personolwch eich ffrwd gartref", "onboarding.steps.publish_status.body": "Dywedwch helo wrth y byd gyda thestun, lluniau, fideos neu arolygon barn {emoji}", "onboarding.steps.publish_status.title": "Gwnewch eich postiad cyntaf", "onboarding.steps.setup_profile.body": "Mae eraill yn fwy tebygol o ryngweithio â chi gyda phroffil wedi'i lenwi.", @@ -645,7 +660,7 @@ "recommended": "Argymhellwyd", "refresh": "Adnewyddu", "regeneration_indicator.label": "Yn llwytho…", - "regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!", + "regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei pharatoi!", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# diwrnod} other {# diwrnod}} yn ôl", "relative_time.full.hours": "{number, plural, one {# awr} other {# awr}} yn ôl", @@ -699,7 +714,7 @@ "report.thanks.title": "Ddim eisiau gweld hwn?", "report.thanks.title_actionable": "Diolch am adrodd, byddwn yn ymchwilio i hyn.", "report.unfollow": "Dad-ddilyn @{name}", - "report.unfollow_explanation": "Rydych chi'n dilyn y cyfrif hwn. I beidio â gweld eu postiadau yn eich porthiant cartref mwyach, dad-ddilynwch nhw.", + "report.unfollow_explanation": "Rydych chi'n dilyn y cyfrif hwn. I beidio â gweld eu postiadau yn eich ffrwd gartref mwyach, dad-ddilynwch nhw.", "report_notification.attached_statuses": "{count, plural, one {{count} postiad} arall {{count} postiad}} atodwyd", "report_notification.categories.legal": "Cyfreithiol", "report_notification.categories.legal_sentence": "cynnwys anghyfreithlon", @@ -759,7 +774,7 @@ "status.edited": "Golygwyd ddiwethaf {date}", "status.edited_x_times": "Golygwyd {count, plural, one {count} two {count} other {{count} gwaith}}", "status.embed": "Mewnblannu", - "status.favourite": "Hoffi", + "status.favourite": "Ffafrio", "status.favourites": "{count, plural, one {ffefryn} other {ffefryn}}", "status.filter": "Hidlo'r postiad hwn", "status.history.created": "Crëwyd gan {name} {date}", @@ -798,7 +813,7 @@ "status.uncached_media_warning": "Dim rhagolwg ar gael", "status.unmute_conversation": "Dad-dewi sgwrs", "status.unpin": "Dadbinio o'r proffil", - "subscribed_languages.lead": "Dim ond postiadau mewn ieithoedd penodol fydd yn ymddangos yn eich ffrydiau ar ôl y newid. Dewiswch ddim byd i dderbyn postiadau ym mhob iaith.", + "subscribed_languages.lead": "Dim ond postiadau mewn ieithoedd penodol fydd yn ymddangos yn eich ffrydiau cartref a rhestr ar ôl y newid. Dewiswch ddim byd i dderbyn postiadau ym mhob iaith.", "subscribed_languages.save": "Cadw'r newidiadau", "subscribed_languages.target": "Newid ieithoedd tanysgrifio {target}", "tabs_bar.home": "Cartref", @@ -809,7 +824,7 @@ "time_remaining.moments": "Munudau yn weddill", "time_remaining.seconds": "{number, plural, one {# eiliad} other {# eiliad}} ar ôl", "trends.counter_by_accounts": "{count, plural, zero {neb} one {{counter} person} two {{counter} berson} few {{counter} pherson} other {{counter} o bobl}} yn y {days, plural, one {diwrnod diwethaf} two {ddeuddydd diwethaf} other {{days} diwrnod diwethaf}}", - "trends.trending_now": "Yn trendio nawr", + "trends.trending_now": "Pynciau llosg", "ui.beforeunload": "Byddwch yn colli eich drafft os byddwch yn gadael Mastodon.", "units.short.billion": "{count}biliwn", "units.short.million": "{count}miliwn", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 85561495d7..21e70dd98d 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -192,6 +192,8 @@ "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?", + "content_warning.hide": "Ocultar mensaje", + "content_warning.show": "Mostrar de todos modos", "conversation.delete": "Eliminar conversación", "conversation.mark_as_read": "Marcar como leída", "conversation.open": "Ver conversación", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar este mensaje", "filter_modal.title.status": "Filtrar un mensaje", + "filter_warning.matches_filter": "Coincide con el filtro “{title}”", "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todos", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 30a3a42fde..35ea5ba592 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -192,6 +192,8 @@ "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?", + "content_warning.hide": "Ocultar publicación", + "content_warning.show": "Mostrar de todos modos", "conversation.delete": "Borrar conversación", "conversation.mark_as_read": "Marcar como leído", "conversation.open": "Ver conversación", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar una publicación", + "filter_warning.matches_filter": "Coincide con el filtro “{title}”", "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que puede que conozcas", "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todas", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index c047a2aa89..718c145216 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -192,6 +192,8 @@ "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?", + "content_warning.hide": "Ocultar publicación", + "content_warning.show": "Mostrar de todos modos", "conversation.delete": "Borrar conversación", "conversation.mark_as_read": "Marcar como leído", "conversation.open": "Ver conversación", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar una publicación", + "filter_warning.matches_filter": "Coincide con el filtro “{title}”", "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que puede que conozcas", "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todas", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 667b7013ef..1a2a16f1f9 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -191,6 +191,8 @@ "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name}?", "confirmations.unfollow.title": "Se désabonner de l'utilisateur ?", + "content_warning.hide": "Masquer le message", + "content_warning.show": "Afficher quand même", "conversation.delete": "Supprimer cette conversation", "conversation.mark_as_read": "Marquer comme lu", "conversation.open": "Afficher cette conversation", @@ -298,6 +300,7 @@ "filter_modal.select_filter.subtitle": "Utilisez une catégorie existante ou en créer une nouvelle", "filter_modal.select_filter.title": "Filtrer cette publication", "filter_modal.title.status": "Filtrer une publication", + "filter_warning.matches_filter": "Correspond au filtre « {title} »", "filtered_notifications_banner.title": "Notifications filtrées", "firehose.all": "Tout", "firehose.local": "Ce serveur", @@ -307,6 +310,7 @@ "follow_requests.unlocked_explanation": "Même si votre compte n’est pas privé, l’équipe de {domain} a pensé que vous pourriez vouloir peut-être consulter manuellement les demandes d'abonnement de ces comptes.", "follow_suggestions.curated_suggestion": "Choix du staff", "follow_suggestions.dismiss": "Ne plus afficher", + "follow_suggestions.friends_of_friends_longer": "Populaire dans le cercle des personnes que vous suivez", "follow_suggestions.hints.featured": "Ce profil a été sélectionné par l'équipe de {domain}.", "follow_suggestions.hints.friends_of_friends": "Ce profil est populaire parmi les personnes que vous suivez.", "follow_suggestions.hints.most_followed": "Ce profil est l'un des plus suivis sur {domain}.", @@ -315,6 +319,7 @@ "follow_suggestions.personalized_suggestion": "Suggestion personnalisée", "follow_suggestions.popular_suggestion": "Suggestion populaire", "follow_suggestions.popular_suggestion_longer": "Populaire sur {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Similaire aux profils que vous avez dernièrement suivis", "follow_suggestions.view_all": "Tout afficher", "follow_suggestions.who_to_follow": "Qui suivre", "followed_tags": "Hashtags suivis", @@ -343,8 +348,9 @@ "hashtag.follow": "Suivre ce hashtag", "hashtag.unfollow": "Ne plus suivre ce hashtag", "hashtags.and_other": "…et {count, plural, other {# de plus}}", + "hints.profiles.see_more_followers": "Afficher plus d'abonné·e·s sur {domain}", "hints.profiles.see_more_posts": "Voir plus de messages sur {domain}", - "hints.threads.see_more": "Voir plus de réponses sur {domain}", + "hints.threads.see_more": "Afficher plus de réponses sur {domain}", "home.column_settings.show_reblogs": "Afficher boosts", "home.column_settings.show_replies": "Afficher réponses", "home.hide_announcements": "Masquer les annonces", @@ -412,6 +418,7 @@ "limited_account_hint.action": "Afficher le profil quand même", "limited_account_hint.title": "Ce profil a été masqué par la modération de {domain}.", "link_preview.author": "Par {name}", + "link_preview.more_from_author": "Plus via {name}", "link_preview.shares": "{count, plural, one {{counter} message} other {{counter} messages}}", "lists.account.add": "Ajouter à une liste", "lists.account.remove": "Retirer d'une liste", @@ -506,6 +513,8 @@ "notifications.column_settings.admin.report": "Nouveaux signalements:", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions:", "notifications.column_settings.alert": "Notifications navigateur", + "notifications.column_settings.beta.category": "Fonctionnalités expérimentales", + "notifications.column_settings.beta.grouping": "Grouper les notifications", "notifications.column_settings.favourite": "Favoris:", "notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories", "notifications.column_settings.filter_bar.category": "Barre de filtre rapide", @@ -534,7 +543,10 @@ "notifications.permission_denied": "Les notifications de bureau ne sont pas disponibles en raison d'une demande de permission de navigateur précédemment refusée", "notifications.permission_denied_alert": "Les notifications de bureau ne peuvent pas être activées, car l’autorisation du navigateur a précedemment été refusée", "notifications.permission_required": "Les notifications de bureau ne sont pas disponibles car l’autorisation requise n’a pas été accordée.", + "notifications.policy.accept": "Accepter", + "notifications.policy.accept_hint": "Afficher dans les notifications", "notifications.policy.drop": "Ignorer", + "notifications.policy.drop_hint": "Expulser vers le vide, pour ne plus jamais les revoir", "notifications.policy.filter": "Filtrer", "notifications.policy.filter_limited_accounts_hint": "Limité par les modérateur·rice·s du serveur", "notifications.policy.filter_limited_accounts_title": "Comptes modérés", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 11773e38e5..99592372cb 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -191,6 +191,8 @@ "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous vraiment vous désabonner de {name} ?", "confirmations.unfollow.title": "Se désabonner de l'utilisateur ?", + "content_warning.hide": "Masquer le message", + "content_warning.show": "Afficher quand même", "conversation.delete": "Supprimer la conversation", "conversation.mark_as_read": "Marquer comme lu", "conversation.open": "Afficher la conversation", @@ -209,7 +211,7 @@ "dismissable_banner.explore_links": "On parle actuellement de ces nouvelles sur ce serveur, ainsi que sur d'autres serveurs du réseau décentralisé.", "dismissable_banner.explore_statuses": "Ces messages venant de tout le web social gagnent en popularité aujourd’hui. Les nouveaux messages avec plus de boosts et de favoris sont classés plus haut.", "dismissable_banner.explore_tags": "Ces hashtags sont actuellement en train de gagner de l'ampleur parmi les personnes sur les serveurs du réseau décentralisé dont celui-ci.", - "dismissable_banner.public_timeline": "Ce sont les posts publics les plus récents de personnes sur le web social que les gens sur {domain} suivent.", + "dismissable_banner.public_timeline": "Il s'agit des messages publics les plus récents publiés par des gens sur le web social et que les utilisateurs de {domain} suivent.", "domain_block_modal.block": "Bloquer le serveur", "domain_block_modal.block_account_instead": "Bloquer @{name} à la place", "domain_block_modal.they_can_interact_with_old_posts": "Les personnes de ce serveur peuvent interagir avec vos anciennes publications.", @@ -298,6 +300,7 @@ "filter_modal.select_filter.subtitle": "Utilisez une catégorie existante ou en créer une nouvelle", "filter_modal.select_filter.title": "Filtrer ce message", "filter_modal.title.status": "Filtrer un message", + "filter_warning.matches_filter": "Correspond au filtre « {title} »", "filtered_notifications_banner.title": "Notifications filtrées", "firehose.all": "Tout", "firehose.local": "Ce serveur", @@ -307,6 +310,7 @@ "follow_requests.unlocked_explanation": "Même si votre compte n’est pas privé, l’équipe de {domain} a pensé que vous pourriez vouloir consulter manuellement les demandes de suivi de ces comptes.", "follow_suggestions.curated_suggestion": "Choix du staff", "follow_suggestions.dismiss": "Ne plus afficher", + "follow_suggestions.friends_of_friends_longer": "Populaire dans le cercle des personnes que vous suivez", "follow_suggestions.hints.featured": "Ce profil a été sélectionné par l'équipe de {domain}.", "follow_suggestions.hints.friends_of_friends": "Ce profil est populaire parmi les personnes que vous suivez.", "follow_suggestions.hints.most_followed": "Ce profil est l'un des plus suivis sur {domain}.", @@ -315,6 +319,7 @@ "follow_suggestions.personalized_suggestion": "Suggestion personnalisée", "follow_suggestions.popular_suggestion": "Suggestion populaire", "follow_suggestions.popular_suggestion_longer": "Populaire sur {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Similaire aux profils que vous avez dernièrement suivis", "follow_suggestions.view_all": "Tout afficher", "follow_suggestions.who_to_follow": "Qui suivre", "followed_tags": "Hashtags suivis", @@ -343,8 +348,9 @@ "hashtag.follow": "Suivre le hashtag", "hashtag.unfollow": "Ne plus suivre le hashtag", "hashtags.and_other": "…et {count, plural, other {# de plus}}", + "hints.profiles.see_more_followers": "Afficher plus d'abonné·e·s sur {domain}", "hints.profiles.see_more_posts": "Voir plus de messages sur {domain}", - "hints.threads.see_more": "Voir plus de réponses sur {domain}", + "hints.threads.see_more": "Afficher plus de réponses sur {domain}", "home.column_settings.show_reblogs": "Afficher les partages", "home.column_settings.show_replies": "Afficher les réponses", "home.hide_announcements": "Masquer les annonces", @@ -412,6 +418,7 @@ "limited_account_hint.action": "Afficher le profil quand même", "limited_account_hint.title": "Ce profil a été masqué par la modération de {domain}.", "link_preview.author": "Par {name}", + "link_preview.more_from_author": "Plus via {name}", "link_preview.shares": "{count, plural, one {{counter} message} other {{counter} messages}}", "lists.account.add": "Ajouter à la liste", "lists.account.remove": "Supprimer de la liste", @@ -506,6 +513,8 @@ "notifications.column_settings.admin.report": "Nouveaux signalements :", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :", "notifications.column_settings.alert": "Notifications du navigateur", + "notifications.column_settings.beta.category": "Fonctionnalités expérimentales", + "notifications.column_settings.beta.grouping": "Grouper les notifications", "notifications.column_settings.favourite": "Favoris :", "notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories", "notifications.column_settings.filter_bar.category": "Barre de filtre rapide", @@ -534,7 +543,10 @@ "notifications.permission_denied": "Impossible d’activer les notifications de bureau car l’autorisation a été refusée.", "notifications.permission_denied_alert": "Les notifications de bureau ne peuvent pas être activées, car l’autorisation du navigateur a été refusée avant", "notifications.permission_required": "Les notifications de bureau ne sont pas disponibles car l’autorisation requise n’a pas été accordée.", + "notifications.policy.accept": "Accepter", + "notifications.policy.accept_hint": "Afficher dans les notifications", "notifications.policy.drop": "Ignorer", + "notifications.policy.drop_hint": "Expulser vers le vide, pour ne plus jamais les revoir", "notifications.policy.filter": "Filtrer", "notifications.policy.filter_limited_accounts_hint": "Limité par les modérateur·rice·s du serveur", "notifications.policy.filter_limited_accounts_title": "Comptes modérés", @@ -669,7 +681,7 @@ "report.thanks.title": "Vous ne voulez pas voir cela ?", "report.thanks.title_actionable": "Merci pour votre signalement, nous allons investiguer.", "report.unfollow": "Ne plus suivre @{name}", - "report.unfollow_explanation": "Vous suivez ce compte. Désabonnez-vous pour ne plus en voir les messages sur votre fil principal.", + "report.unfollow_explanation": "Vous êtes abonné à ce compte. Pour ne plus voir ses publications dans votre flux principal, retirez-le de votre liste d'abonnements.", "report_notification.attached_statuses": "{count, plural, one {{count} message lié} other {{count} messages liés}}", "report_notification.categories.legal": "Légal", "report_notification.categories.legal_sentence": "contenu illégal", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 4407616499..71577be955 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "Ná lean", "confirmations.unfollow.message": "An bhfuil tú cinnte gur mhaith leat {name} a dhíleanúint?", "confirmations.unfollow.title": "Dílean ​​an t-úsáideoir?", + "content_warning.hide": "Folaigh postáil", + "content_warning.show": "Taispeáin ar aon nós", "conversation.delete": "Scrios comhrá", "conversation.mark_as_read": "Marcáil mar léite", "conversation.open": "Féach ar comhrá", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Bain úsáid as catagóir reatha nó cruthaigh ceann nua", "filter_modal.select_filter.title": "Déan scagadh ar an bpostáil seo", "filter_modal.title.status": "Déan scagadh ar phostáil", + "filter_warning.matches_filter": "Meaitseálann an scagaire “{title}”", "filtered_notifications_banner.pending_requests": "Ó {count, plural, =0 {duine ar bith} one {duine amháin} two {# daoine} few {# daoine} many {# daoine} other {# daoine}} b’fhéidir go bhfuil aithne agat orthu", "filtered_notifications_banner.title": "Fógraí scagtha", "firehose.all": "Gach", @@ -348,6 +351,14 @@ "hashtag.follow": "Lean haischlib", "hashtag.unfollow": "Ná lean haischlib", "hashtags.and_other": "agus {count, plural, one {} two {# níos} few {# níos} many {# níos} other {# níos}}", + "hints.profiles.followers_may_be_missing": "Seans go bhfuil leantóirí don phróifíl seo in easnamh.", + "hints.profiles.follows_may_be_missing": "Seans go bhfuil na nithe seo a leanas in easnamh ar an bpróifíl seo.", + "hints.profiles.posts_may_be_missing": "Seans go bhfuil roinnt postálacha ón bpróifíl seo in easnamh.", + "hints.profiles.see_more_followers": "Féach ar a thuilleadh leantóirí ar {domain}", + "hints.profiles.see_more_follows": "Féach tuilleadh seo a leanas ar {domain}", + "hints.profiles.see_more_posts": "Féach ar a thuilleadh postálacha ar {domain}", + "hints.threads.replies_may_be_missing": "Seans go bhfuil freagraí ó fhreastalaithe eile in easnamh.", + "hints.threads.see_more": "Féach ar a thuilleadh freagraí ar {domain}", "home.column_settings.show_reblogs": "Taispeáin moltaí", "home.column_settings.show_replies": "Taispeán freagraí", "home.hide_announcements": "Cuir fógraí i bhfolach", @@ -487,9 +498,13 @@ "notification.admin.report_statuses": "Thuairiscigh {name} {target} le haghaidh {category}", "notification.admin.report_statuses_other": "{name} tuairiscithe {target}", "notification.admin.sign_up": "Chláraigh {name}", + "notification.admin.sign_up.name_and_others": "{name} agus {count, plural, one {# duine eile} two {# daoine eile} few {# daoine eile} many {# daoine eile} other {# daoine eile}} a chláraigh", "notification.favourite": "Is fearr le {name} do phostáil", + "notification.favourite.name_and_others_with_link": "{name} agus {count, plural, one {# duine eile} other {# daoine eile}} thaitin le do phost", "notification.follow": "Lean {name} thú", + "notification.follow.name_and_others": "{name} agus {count, plural, one {# duine eile} other {# daoine eile}} a lean tú", "notification.follow_request": "D'iarr {name} ort do chuntas a leanúint", + "notification.follow_request.name_and_others": "{name} agus {count, plural, one {# duine eile} other {# daoine eile}} iarratas a dhéanamh chun tú a leanúint", "notification.label.mention": "Luaigh", "notification.label.private_mention": "Lua príobháideach", "notification.label.private_reply": "Freagra príobháideach", @@ -507,6 +522,7 @@ "notification.own_poll": "Tá do suirbhé críochnaithe", "notification.poll": "Tá deireadh le vótaíocht inar vótáil tú", "notification.reblog": "Mhol {name} do phostáil", + "notification.reblog.name_and_others_with_link": "{name} agus {count, plural, one {# duine eile} other {# daoine eile}} a chuir borradh faoi do phost", "notification.relationships_severance_event": "Cailleadh naisc le {name}", "notification.relationships_severance_event.account_suspension": "Chuir riarthóir ó {from} {target} ar fionraí, rud a chiallaíonn nach féidir leat nuashonruithe a fháil uathu a thuilleadh ná idirghníomhú leo.", "notification.relationships_severance_event.domain_block": "Chuir riarthóir ó {from} bac ar {target}, lena n-áirítear {followersCount} de do leantóirí agus {followingCount, plural, one {#cuntas} other {#cuntas}} leanann tú.", @@ -515,7 +531,17 @@ "notification.status": "Phostáil {name} díreach", "notification.update": "Chuir {name} postáil in eagar", "notification_requests.accept": "Glac", + "notification_requests.accept_multiple": "{count, plural, one {Glac le # iarratas…} other {Glac le # iarratais…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Glac le hIarratas} other {Glac le hIarratais}}", + "notification_requests.confirm_accept_multiple.message": "Tá tú ar tí glacadh le {count, plural, one {iarratas fógra amháin} other {# iarratas fógra}}. An bhfuil tú cinnte gur mian leat leanúint ar aghaidh?", + "notification_requests.confirm_accept_multiple.title": "Glac le hiarratais ar fhógra?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Dún iarratas} other {Dún iarratais}}", + "notification_requests.confirm_dismiss_multiple.message": "Tá tú ar tí iarratas fógra {count, plural, one {a hAon} other {#}} a dhúnadh. Ní bheidh tú in ann {count, plural, one {é} other {iad}} a fháil go héasca arís. An bhfuil tú cinnte gur mian leat leanúint ar aghaidh?", + "notification_requests.confirm_dismiss_multiple.title": "An bhfuil fonn ort iarratais ar fhógra a dhíbhe?", "notification_requests.dismiss": "Díbhe", + "notification_requests.dismiss_multiple": "{count, plural, one {Dún # iarratas…} other {Dún # iarratais…}}", + "notification_requests.edit_selection": "Cuir in eagar", + "notification_requests.exit_selection": "Déanta", "notification_requests.explainer_for_limited_account": "Scagadh fógraí ón gcuntas seo toisc go bhfuil an cuntas teoranta ag modhnóir.", "notification_requests.explainer_for_limited_remote_account": "Scagadh fógraí ón gcuntas seo toisc go bhfuil an cuntas nó a fhreastalaí teoranta ag modhnóir.", "notification_requests.maximize": "Uasmhéadaigh", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 8e6260b00f..aecc26477c 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "Na lean tuilleadh", "confirmations.unfollow.message": "A bheil thu cinnteach nach eil thu airson {name} a leantainn tuilleadh?", "confirmations.unfollow.title": "A bheil thu airson sgur de leantainn a chleachdaiche?", + "content_warning.hide": "Falaich am post", + "content_warning.show": "Seall e co-dhiù", "conversation.delete": "Sguab às an còmhradh", "conversation.mark_as_read": "Cuir comharra gun deach a leughadh", "conversation.open": "Seall an còmhradh", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Cleachd roinn-seòrsa a tha ann no cruthaich tè ùr", "filter_modal.select_filter.title": "Criathraich am post seo", "filter_modal.title.status": "Criathraich post", + "filter_warning.matches_filter": "A’ maidseadh na criathraige “{title}”", "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Chan eil gin ann} one {O # neach} two {O # neach} few {O # daoine} other {O # duine}} air a bheil thu eòlach ’s dòcha", "filtered_notifications_banner.title": "Brathan criathraichte", "firehose.all": "Na h-uile", @@ -348,6 +351,14 @@ "hashtag.follow": "Lean an taga hais", "hashtag.unfollow": "Na lean an taga hais tuilleadh", "hashtags.and_other": "…agus {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}}", + "hints.profiles.followers_may_be_missing": "Dh’fhaoidte gu bheil cuid dhen luchd-leantainn na pròifil seo a dhìth.", + "hints.profiles.follows_may_be_missing": "Dh’fhaoidte gu bheil cuid a tha a’ phròifil seo a’ leantainn a dhìth.", + "hints.profiles.posts_may_be_missing": "Dh’fhaoide gu bheil cuid dhe na postaichean aig a’ phròifil seo a dhìth.", + "hints.profiles.see_more_followers": "Faic barrachd luchd-leantainn air {domain}", + "hints.profiles.see_more_follows": "Faic barrachd a tha 'gan leantainn air {domain}", + "hints.profiles.see_more_posts": "Faic barrachd phostaichean air {domain}", + "hints.threads.replies_may_be_missing": "Dh’fhaoidte gu bheil freagairtean o fhrithealaichean eile a dhìth.", + "hints.threads.see_more": "Faic barrachd fhreagairtean air {domain}", "home.column_settings.show_reblogs": "Seall na brosnachaidhean", "home.column_settings.show_replies": "Seall na freagairtean", "home.hide_announcements": "Falaich na brathan-fios", @@ -487,9 +498,13 @@ "notification.admin.report_statuses": "Rinn {name} gearan mu {target} air adhbhar {category}", "notification.admin.report_statuses_other": "Rinn {name} gearan mu {target}", "notification.admin.sign_up": "Chlàraich {name}", + "notification.admin.sign_up.name_and_others": "Chlàraich {name} ’s {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}}", "notification.favourite": "Is annsa le {name} am post agad", + "notification.favourite.name_and_others_with_link": "Is annsa le {name} ’s {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}} am post agad", "notification.follow": "Tha {name} ’gad leantainn a-nis", + "notification.follow.name_and_others": "Lean {name} ’s {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}} thu", "notification.follow_request": "Dh’iarr {name} ’gad leantainn", + "notification.follow_request.name_and_others": "Dh’iarr {name} ’s {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}} ’gad leantainn", "notification.label.mention": "Iomradh", "notification.label.private_mention": "Iomradh prìobhaideach", "notification.label.private_reply": "Freagairt phrìobhaideach", @@ -507,6 +522,7 @@ "notification.own_poll": "Thàinig an cunntas-bheachd agad gu crìoch", "notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch", "notification.reblog": "Bhrosnaich {name} am post agad", + "notification.reblog.name_and_others_with_link": "Bhrosnaich {name} ’s {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}} am post agad", "notification.relationships_severance_event": "Chaill thu dàimhean le {name}", "notification.relationships_severance_event.account_suspension": "Chuir rianaire aig {from} {target} à rèim agus is ciall dha sin nach fhaigh thu naidheachdan uapa ’s nach urrainn dhut conaltradh leotha.", "notification.relationships_severance_event.domain_block": "Bhac rianaire aig {from} {target}, a’ gabhail a-staigh {followersCount} dhen luchd-leantainn agad agus {followingCount, plural, one {# chunntas} two {# chunntas} few {# cunntasan} other {# cunntas}} a tha thu fhèin a’ leantainn.", @@ -515,7 +531,17 @@ "notification.status": "Phostaich {name} rud", "notification.update": "Dheasaich {name} post", "notification_requests.accept": "Gabh ris", + "notification_requests.accept_multiple": "{count, plural, one {Gabh ri # iarrtas…} two {Gabh ri # iarrtas…} few {Gabh ri # iarrtasan…} other {Gabh ri # iarrtas…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Gabh ris an t-iarrtas} two {Gabh ris na h-iarrtasan} few {Gabh ris na h-iarrtasan} other {Gabh ris na h-iarrtasan}}", + "notification_requests.confirm_accept_multiple.message": "Tha thu gu bhith gabhail ri {count, plural, one {# iarrtas bratha} two {# iarrtas bratha} few {# iarrtasan bratha} other {# iarrtas bratha}} a leigeil seachad. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", + "notification_requests.confirm_accept_multiple.title": "A bheil thu airson gabhail ri iarrtasan bratha?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Leig seachad an t-iarrtas} two {Leig seachad na h-iarrtasan} few {Leig seachad na h-iarrtasan} other {Leig seachad na h-iarrtasan}}", + "notification_requests.confirm_dismiss_multiple.message": "Tha thu gu bhith {count, plural, one {# iarrtas bratha} two {# iarrtas bratha} few {# iarrtasan bratha} other {# iarrtas bratha}} a leigeil seachad. Chan fhaigh thu grèim {count, plural, one {air} two {orra} few {orra} other {orra}} a-rithist gun duilgheadas. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", + "notification_requests.confirm_dismiss_multiple.title": "A bheil thu airson iarrtasan bratha a leigeil seachad?", "notification_requests.dismiss": "Leig seachad", + "notification_requests.dismiss_multiple": "{count, plural, one {Leig seachad # iarrtas…} two {Leig seachad # iarrtas…} few {Leig seachad # iarrtasan…} other {Leig seachad # iarrtas…}}", + "notification_requests.edit_selection": "Deasaich", + "notification_requests.exit_selection": "Deiseil", "notification_requests.explainer_for_limited_account": "Chaidh na brathan on chunntas seo a chriathradh on a chaidh an cunntas a chuingeachadh le maor.", "notification_requests.explainer_for_limited_remote_account": "Chaidh na brathan on chunntas seo a chriathradh on a chaidh an cunntas no am frithealaiche aige a chuingeachadh le maor.", "notification_requests.maximize": "Làn-mheudaich", @@ -569,7 +595,7 @@ "notifications.policy.filter_limited_accounts_title": "Cunntasan fo mhaorsainneachd", "notifications.policy.filter_new_accounts.hint": "A chaidh a chruthachadh o chionn {days, plural, one {# latha} two {# latha} few {# làithean} other {# latha}}", "notifications.policy.filter_new_accounts_title": "Cunntasan ùra", - "notifications.policy.filter_not_followers_hint": "A’ gabhail a-staigh an fheadhainn a lean ort nas lugha na {days, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} seo chaidh", + "notifications.policy.filter_not_followers_hint": "A’ gabhail a-staigh an fheadhainn a lean thu nas lugha na {days, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} seo chaidh", "notifications.policy.filter_not_followers_title": "Daoine nach eil gad leantainn", "notifications.policy.filter_not_following_hint": "Gus an aontaich thu riutha a làimh", "notifications.policy.filter_not_following_title": "Daoine nach eil thu a’ leantainn", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 1d21e3bda7..3ccd951080 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "הפסקת מעקב", "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?", "confirmations.unfollow.title": "לבטל מעקב אחר המשתמש.ת?", + "content_warning.hide": "הסתרת חיצרוץ", + "content_warning.show": "להציג בכל זאת", "conversation.delete": "מחיקת שיחה", "conversation.mark_as_read": "סמן כנקרא", "conversation.open": "צפו בשיחה", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "שימוש בקטגורייה קיימת או יצירת אחת חדשה", "filter_modal.select_filter.title": "סינון ההודעה הזו", "filter_modal.title.status": "סנן הודעה", + "filter_warning.matches_filter": "תואם לסנן “{title}”", "filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין בקשות ממשתמשים }one {בקשה אחת ממישהו/מישהי }two {יש בקשותיים ממשתמשים }other {יש # בקשות ממשתמשים }}שאולי מוכרים לך", "filtered_notifications_banner.title": "התראות מסוננות", "firehose.all": "הכל", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index b46e259199..29f0bfda9d 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -1,7 +1,7 @@ { "about.blocks": "Server yang dimoderasi", - "about.contact": "Hubungi:", - "about.disclaimer": "Mastodon adalah perangkat lunak bebas dan sumber terbuka, dan adalah merek dagang dari Mastodon gGmbH.", + "about.contact": "Kontak:", + "about.disclaimer": "perangkat lunak sumber terbuperangkat lunak sumber terbukaka184124.", "about.domain_blocks.no_reason_available": "Alasan tidak tersedia", "about.domain_blocks.preamble": "Mastodon umumnya mengizinkan Anda untuk melihat konten dan berinteraksi dengan pengguna dari server lain di fediverse. Ini adalah pengecualian yang dibuat untuk beberapa server.", "about.domain_blocks.silenced.explanation": "Anda secara umum tidak melihat profil dan konten dari server ini, kecuali jika Anda mencarinya atau memilihnya dengan mengikuti secara eksplisit.", @@ -11,6 +11,7 @@ "about.not_available": "Informasi ini belum tersedia di server ini.", "about.powered_by": "Media sosial terdesentralisasi diberdayakan oleh {mastodon}", "about.rules": "Aturan server", + "account.account_note_header": "Personal note", "account.add_or_remove_from_list": "Tambah atau Hapus dari daftar", "account.badges.bot": "Bot", "account.badges.group": "Grup", @@ -33,7 +34,9 @@ "account.follow_back": "Ikuti balik", "account.followers": "Pengikut", "account.followers.empty": "Pengguna ini belum ada pengikut.", + "account.followers_counter": "{count, plural, other {{counter} followers}}", "account.following": "Mengikuti", + "account.following_counter": "{count, plural, other {{counter} following}}", "account.follows.empty": "Pengguna ini belum mengikuti siapa pun.", "account.go_to_profile": "Buka profil", "account.hide_reblogs": "Sembunyikan boosts dari @{name}", @@ -59,6 +62,7 @@ "account.requested_follow": "{name} ingin mengikuti Anda", "account.share": "Bagikan profil @{name}", "account.show_reblogs": "Tampilkan boost dari @{name}", + "account.statuses_counter": "{count, plural, other {{counter} posts}}", "account.unblock": "Buka blokir @{name}", "account.unblock_domain": "Buka blokir domain {domain}", "account.unblock_short": "Buka blokir", @@ -166,21 +170,30 @@ "confirmations.block.confirm": "Blokir", "confirmations.delete.confirm": "Hapus", "confirmations.delete.message": "Apakah Anda yakin untuk menghapus kiriman ini?", + "confirmations.delete.title": "Delete post?", "confirmations.delete_list.confirm": "Hapus", "confirmations.delete_list.message": "Apakah Anda yakin untuk menghapus daftar ini secara permanen?", + "confirmations.delete_list.title": "Delete list?", "confirmations.discard_edit_media.confirm": "Buang", "confirmations.discard_edit_media.message": "Anda belum menyimpan perubahan deskripsi atau pratinjau media, buang saja?", "confirmations.edit.confirm": "Ubah", "confirmations.edit.message": "Mengubah akan menimpa pesan yang sedang anda tulis. Apakah anda yakin ingin melanjutkan?", + "confirmations.edit.title": "Overwrite post?", "confirmations.logout.confirm": "Keluar", "confirmations.logout.message": "Apakah Anda yakin ingin keluar?", + "confirmations.logout.title": "Log out?", "confirmations.mute.confirm": "Bisukan", "confirmations.redraft.confirm": "Hapus dan susun ulang", "confirmations.redraft.message": "Apakah anda yakin ingin menghapus postingan ini dan menyusun ulang postingan ini? Favorit dan peningkatan akan hilang, dan balasan ke postingan asli tidak akan terhubung ke postingan manapun.", + "confirmations.redraft.title": "Delete & redraft post?", "confirmations.reply.confirm": "Balas", "confirmations.reply.message": "Membalas sekarang akan menimpa pesan yang sedang Anda buat. Anda yakin ingin melanjutkan?", + "confirmations.reply.title": "Delete & redraft post?", "confirmations.unfollow.confirm": "Berhenti mengikuti", "confirmations.unfollow.message": "Apakah Anda ingin berhenti mengikuti {name}?", + "confirmations.unfollow.title": "Unfollow user?", + "content_warning.hide": "Hide post", + "content_warning.show": "Show anyway", "conversation.delete": "Hapus percakapan", "conversation.mark_as_read": "Tandai sudah dibaca", "conversation.open": "Lihat percakapan", @@ -217,7 +230,9 @@ "domain_pill.username": "Nama pengguna", "domain_pill.whats_in_a_handle": "Apa itu nama pengguna?", "domain_pill.who_they_are": "Karena nama pengguna menunjukkan siapa seseorang dan di mana server mereka berada, anda dapat berinteraksi dengan orang-orang di seluruh web sosial .", + "domain_pill.who_you_are": ".", "domain_pill.your_handle": "Nama pengguna anda:", + "domain_pill.your_server": "Your digital home, where all of your posts live. Don’t like this one? Transfer servers at any time and bring your followers, too.", "embed.instructions": "Sematkan kiriman ini di situs web Anda dengan menyalin kode di bawah ini.", "embed.preview": "Tampilan akan seperti ini nantinya:", "emoji_button.activity": "Aktivitas", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index e4e21649cc..49b31755fa 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -436,7 +436,7 @@ "lightbox.previous": "Fyrra", "limited_account_hint.action": "Birta notandasniðið samt", "limited_account_hint.title": "Þetta notandasnið hefur verið falið af umsjónarmönnum {domain}.", - "link_preview.author": "Eftir {name}", + "link_preview.author": "Frá {name}", "link_preview.more_from_author": "Meira frá {name}", "link_preview.shares": "{count, plural, one {{counter} færsla} other {{counter} færslur}}", "lists.account.add": "Bæta á lista", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index c23c2f87d5..ee4ba949b9 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -170,21 +170,30 @@ "confirmations.block.confirm": "ブロック", "confirmations.delete.confirm": "削除", "confirmations.delete.message": "本当に削除しますか?", + "confirmations.delete.title": "投稿を削除しようとしています", "confirmations.delete_list.confirm": "削除", "confirmations.delete_list.message": "本当にこのリストを完全に削除しますか?", + "confirmations.delete_list.title": "リストを削除しようとしています", "confirmations.discard_edit_media.confirm": "破棄", "confirmations.discard_edit_media.message": "メディアの説明またはプレビューに保存されていない変更があります。それでも破棄しますか?", "confirmations.edit.confirm": "編集", "confirmations.edit.message": "今編集すると現在作成中のメッセージが上書きされます。本当に実行しますか?", + "confirmations.edit.title": "作成中の内容を上書きしようとしています", "confirmations.logout.confirm": "ログアウト", "confirmations.logout.message": "本当にログアウトしますか?", + "confirmations.logout.title": "ログアウトしようとしています", "confirmations.mute.confirm": "ミュート", "confirmations.redraft.confirm": "削除して下書きに戻す", "confirmations.redraft.message": "投稿を削除して下書きに戻します。この投稿へのお気に入り登録やブーストは失われ、返信は孤立することになります。よろしいですか?", + "confirmations.redraft.title": "投稿の削除と下書きの再作成", "confirmations.reply.confirm": "返信", "confirmations.reply.message": "今返信すると現在作成中のメッセージが上書きされます。本当に実行しますか?", + "confirmations.reply.title": "作成中の内容を上書きしようとしています", "confirmations.unfollow.confirm": "フォロー解除", "confirmations.unfollow.message": "本当に{name}さんのフォローを解除しますか?", + "confirmations.unfollow.title": "フォローを解除しようとしています", + "content_warning.hide": "投稿を隠す", + "content_warning.show": "承知の上で表示", "conversation.delete": "会話を削除", "conversation.mark_as_read": "既読にする", "conversation.open": "会話を表示", @@ -292,6 +301,7 @@ "filter_modal.select_filter.subtitle": "既存のカテゴリーを使用するか新規作成します", "filter_modal.select_filter.title": "この投稿をフィルターする", "filter_modal.title.status": "投稿をフィルターする", + "filter_warning.matches_filter": "フィルター「{title}」に一致する投稿です", "filtered_notifications_banner.pending_requests": "{count, plural, =0 {すべて完了しました} other {#人の通知がブロックされています}}", "filtered_notifications_banner.title": "保留中の通知", "firehose.all": "すべて", @@ -493,11 +503,14 @@ "notification.update": "{name}さんが投稿を編集しました", "notification_requests.accept": "受け入れる", "notification_requests.dismiss": "無視", + "notification_requests.explainer_for_limited_account": "このアカウントはモデレーターにより制限が課されているため、このアカウントによる通知は保留されています", + "notification_requests.explainer_for_limited_remote_account": "このアカウントが所属するサーバーはモデレーターにより制限が課されているため、このアカウントによる通知は保留されています", "notification_requests.minimize_banner": "「保留中の通知」のバナーを最小化する", "notification_requests.notifications_from": "{name}からの通知", "notification_requests.title": "保留中の通知", "notifications.clear": "通知を消去", "notifications.clear_confirmation": "本当に通知を消去しますか?", + "notifications.clear_title": "通知を消去しようとしています", "notifications.column_settings.admin.report": "新しい通報:", "notifications.column_settings.admin.sign_up": "新規登録:", "notifications.column_settings.alert": "デスクトップ通知", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index fe1b30c6cc..32a846308d 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "팔로우 해제", "confirmations.unfollow.message": "정말로 {name} 님을 팔로우 해제하시겠습니까?", "confirmations.unfollow.title": "사용자를 언팔로우 할까요?", + "content_warning.hide": "게시물 숨기기", + "content_warning.show": "무시하고 보기", "conversation.delete": "대화 삭제", "conversation.mark_as_read": "읽은 상태로 표시", "conversation.open": "대화 보기", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "기존의 카테고리를 사용하거나 새로 하나를 만듧니다", "filter_modal.select_filter.title": "이 게시물을 필터", "filter_modal.title.status": "게시물 필터", + "filter_warning.matches_filter": "\"{title}\" 필터에 걸림", "filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터", "filtered_notifications_banner.title": "걸러진 알림", "firehose.all": "모두", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index dd9fa5fd92..9ceb6eda92 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -193,6 +193,7 @@ "confirmations.unfollow.message": "Er du sikker på at du vil slutta å fylgja {name}?", "confirmations.unfollow.title": "Slutt å fylgja brukaren?", "content_warning.hide": "Gøym innlegg", + "content_warning.show": "Vis likevel", "conversation.delete": "Slett samtale", "conversation.mark_as_read": "Marker som lesen", "conversation.open": "Sjå samtale", @@ -300,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Bruk ein eksisterande kategori eller opprett ein ny", "filter_modal.select_filter.title": "Filtrer dette innlegget", "filter_modal.title.status": "Filtrer eit innlegg", + "filter_warning.matches_filter": "Passar med filteret «{title}»", "filtered_notifications_banner.pending_requests": "Frå {count, plural, =0 {ingen} one {éin person} other {# personar}} du kanskje kjenner", "filtered_notifications_banner.title": "Filtrerte varslingar", "firehose.all": "Alle", @@ -349,6 +351,14 @@ "hashtag.follow": "Fylg emneknagg", "hashtag.unfollow": "Slutt å fylgje emneknaggen", "hashtags.and_other": "…og {count, plural, one {}other {# fleire}}", + "hints.profiles.followers_may_be_missing": "Kven som fylgjer denne profilen manglar kanskje.", + "hints.profiles.follows_may_be_missing": "Kven denne profilen fylgjer manglar kanskje.", + "hints.profiles.posts_may_be_missing": "Nokre innlegg frå denne profilen manglar kanskje.", + "hints.profiles.see_more_followers": "Sjå fleire fylgjarar på {domain}", + "hints.profiles.see_more_follows": "Sjå fleire fylgjer på {domain}", + "hints.profiles.see_more_posts": "Sjå fleire innlegg på {domain}", + "hints.threads.replies_may_be_missing": "Svar frå andre tenarar manglar kanskje.", + "hints.threads.see_more": "Sjå fleire svar på {domain}", "home.column_settings.show_reblogs": "Vis framhevingar", "home.column_settings.show_replies": "Vis svar", "home.hide_announcements": "Skjul kunngjeringar", @@ -488,9 +498,13 @@ "notification.admin.report_statuses": "{name} rapporterte {target} for {category}", "notification.admin.report_statuses_other": "{name} rapporterte {target}", "notification.admin.sign_up": "{name} er registrert", + "notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# annan} other {# andre}} vart med", "notification.favourite": "{name} markerte innlegget ditt som favoritt", + "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# annan} other {# andre}} favorittmerka innlegget ditt", "notification.follow": "{name} fylgde deg", + "notification.follow.name_and_others": "{name} og {count, plural, one {# annan} other {# andre}} fylgde deg", "notification.follow_request": "{name} har bedt om å fylgja deg", + "notification.follow_request.name_and_others": "{name} og {count, plural, one {# annan} other {# andre}} har spurt om å fylgja deg", "notification.label.mention": "Omtale", "notification.label.private_mention": "Privat omtale", "notification.label.private_reply": "Privat svar", @@ -508,6 +522,7 @@ "notification.own_poll": "Rundspørjinga di er ferdig", "notification.poll": "Ei rundspørjing du røysta i er ferdig", "notification.reblog": "{name} framheva innlegget ditt", + "notification.reblog.name_and_others_with_link": "{name} og {count, plural, one {# annan} other {# andre}} framheva innlegget ditt", "notification.relationships_severance_event": "Tapte samband med {name}", "notification.relationships_severance_event.account_suspension": "Ein administrator på {from} har utvist {target}, som tyder at du ikkje lenger får oppdateringar frå dei eller kan samhandla med dei.", "notification.relationships_severance_event.domain_block": "Ein administrator på {from} har blokkert {target}, inkludert {followersCount} av fylgjarane dine og {followingCount, plural, one {# konto} other {# kontoar}} du fylgjer.", @@ -516,7 +531,17 @@ "notification.status": "{name} la nettopp ut", "notification.update": "{name} redigerte eit innlegg", "notification_requests.accept": "Godkjenn", + "notification_requests.accept_multiple": "{count, plural, one {Godta # førespurnad…} other {Godta # førespurnader…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Godta førespurnad} other {Godta førespurnader}}", + "notification_requests.confirm_accept_multiple.message": "Du er i ferd med å godta {count, plural, one {ein førespurnad om varsling} other {# førespurnader om varsling}}. Er du sikker på at du vil halda fram?", + "notification_requests.confirm_accept_multiple.title": "Godta førespurnader om varsling?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Avvis førespurnad} other {Avvis førespurnader}}", + "notification_requests.confirm_dismiss_multiple.message": "Du er i ferd med å avvisa {count, plural, one {ein førespurnad om varsel} other {# førespurnader om varsel}}. Det blir ikkje lett å få tilgang til {count, plural, one {han} other {dei}} att. Er du sikker på at du vil halda fram?", + "notification_requests.confirm_dismiss_multiple.title": "Avvis førespurnader om varsel?", "notification_requests.dismiss": "Avvis", + "notification_requests.dismiss_multiple": "{count, plural, one {Avvis # førespurnad…} other {Avvis # førespurnader…}}", + "notification_requests.edit_selection": "Rediger", + "notification_requests.exit_selection": "Ferdig", "notification_requests.explainer_for_limited_account": "Varsla frå denne kontoen er filtrerte ut fordi ein moderator har avgrensa kontoen.", "notification_requests.explainer_for_limited_remote_account": "Varla frå denne kontoen er filtrerte ut fordi ein moderator har avgrensa kontoen eller tenaren.", "notification_requests.maximize": "Maksimer", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 39abd13d95..48f667086b 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "Resht së ndjekuri", "confirmations.unfollow.message": "Jeni i sigurt se doni të mos ndiqet më {name}?", "confirmations.unfollow.title": "Të ndalet ndjekja e përdoruesit?", + "content_warning.hide": "Fshihe postimin", + "content_warning.show": "Shfaqe, sido qoftë", "conversation.delete": "Fshije bisedën", "conversation.mark_as_read": "Vëri shenjë si të lexuar", "conversation.open": "Shfaq bisedën", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Përdorni një kategori ekzistuese, ose krijoni një të re", "filter_modal.select_filter.title": "Filtroje këtë postim", "filter_modal.title.status": "Filtroni një postim", + "filter_warning.matches_filter": "Ka përkim me filtrin “{title}”", "filtered_notifications_banner.pending_requests": "Nga {count, plural, =0 {askush} one {një person} other {# vetë}} që mund të njihni", "filtered_notifications_banner.title": "Njoftime të filtruar", "firehose.all": "Krejt", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index a4a30fbbc5..76b46f3425 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "Avfölj", "confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?", "confirmations.unfollow.title": "Avfölj %s?", + "content_warning.hide": "Dölj inlägg", + "content_warning.show": "Visa ändå", "conversation.delete": "Radera konversation", "conversation.mark_as_read": "Markera som läst", "conversation.open": "Visa konversation", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 9dbaa5a6cb..370b49e7e1 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "เลิกติดตาม", "confirmations.unfollow.message": "คุณแน่ใจหรือไม่ว่าต้องการเลิกติดตาม {name}?", "confirmations.unfollow.title": "เลิกติดตามผู้ใช้?", + "content_warning.hide": "ซ่อนโพสต์", + "content_warning.show": "แสดงต่อไป", "conversation.delete": "ลบการสนทนา", "conversation.mark_as_read": "ทำเครื่องหมายว่าอ่านแล้ว", "conversation.open": "ดูการสนทนา", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "ใช้หมวดหมู่ที่มีอยู่หรือสร้างหมวดหมู่ใหม่", "filter_modal.select_filter.title": "กรองโพสต์นี้", "filter_modal.title.status": "กรองโพสต์", + "filter_warning.matches_filter": "ตรงกับตัวกรอง “{title}”", "filtered_notifications_banner.pending_requests": "จาก {count, plural, =0 {ไม่มีใคร} other {# คน}} ที่คุณอาจรู้จัก", "filtered_notifications_banner.title": "การแจ้งเตือนที่กรองอยู่", "firehose.all": "ทั้งหมด", @@ -348,6 +351,14 @@ "hashtag.follow": "ติดตามแฮชแท็ก", "hashtag.unfollow": "เลิกติดตามแฮชแท็ก", "hashtags.and_other": "…และอีก {count, plural, other {# เพิ่มเติม}}", + "hints.profiles.followers_may_be_missing": "ผู้ติดตามสำหรับโปรไฟล์นี้อาจขาดหายไป", + "hints.profiles.follows_may_be_missing": "การติดตามสำหรับโปรไฟล์นี้อาจขาดหายไป", + "hints.profiles.posts_may_be_missing": "โพสต์บางส่วนจากโปรไฟล์นี้อาจขาดหายไป", + "hints.profiles.see_more_followers": "ดูผู้ติดตามเพิ่มเติมใน {domain}", + "hints.profiles.see_more_follows": "ดูการติดตามเพิ่มเติมใน {domain}", + "hints.profiles.see_more_posts": "ดูโพสต์เพิ่มเติมใน {domain}", + "hints.threads.replies_may_be_missing": "การตอบกลับจากเซิร์ฟเวอร์อื่น ๆ อาจขาดหายไป", + "hints.threads.see_more": "ดูการตอบกลับเพิ่มเติมใน {domain}", "home.column_settings.show_reblogs": "แสดงการดัน", "home.column_settings.show_replies": "แสดงการตอบกลับ", "home.hide_announcements": "ซ่อนประกาศ", @@ -355,8 +366,11 @@ "home.pending_critical_update.link": "ดูการอัปเดต", "home.pending_critical_update.title": "มีการอัปเดตความปลอดภัยสำคัญพร้อมใช้งาน!", "home.show_announcements": "แสดงประกาศ", + "ignore_notifications_modal.disclaimer": "Mastodon ไม่สามารถแจ้งผู้ใช้ว่าคุณได้เพิกเฉยการแจ้งเตือนของเขา การเพิกเฉยการแจ้งเตือนจะไม่หยุดการส่งข้อความนั้นเอง", "ignore_notifications_modal.filter_instead": "กรองแทน", "ignore_notifications_modal.filter_to_act_users": "คุณจะยังสามารถยอมรับ ปฏิเสธ หรือรายงานผู้ใช้", + "ignore_notifications_modal.filter_to_avoid_confusion": "การกรองช่วยหลีกเลี่ยงความสับสนที่อาจเกิดขึ้น", + "ignore_notifications_modal.filter_to_review_separately": "คุณสามารถตรวจทานการแจ้งเตือนที่กรองอยู่แยกต่างหาก", "ignore_notifications_modal.ignore": "เพิกเฉยการแจ้งเตือน", "ignore_notifications_modal.limited_accounts_title": "เพิกเฉยการแจ้งเตือนจากบัญชีที่ได้รับการกลั่นกรอง?", "ignore_notifications_modal.new_accounts_title": "เพิกเฉยการแจ้งเตือนจากบัญชีใหม่?", @@ -484,9 +498,13 @@ "notification.admin.report_statuses": "{name} ได้รายงาน {target} สำหรับ {category}", "notification.admin.report_statuses_other": "{name} ได้รายงาน {target}", "notification.admin.sign_up": "{name} ได้ลงทะเบียน", + "notification.admin.sign_up.name_and_others": "{name} และ {count, plural, other {# อื่น ๆ}} ได้ลงทะเบียน", "notification.favourite": "{name} ได้ชื่นชอบโพสต์ของคุณ", + "notification.favourite.name_and_others_with_link": "{name} และ {count, plural, other {# อื่น ๆ}} ได้ชื่นชอบโพสต์ของคุณ", "notification.follow": "{name} ได้ติดตามคุณ", + "notification.follow.name_and_others": "{name} และ {count, plural, other {# อื่น ๆ}} ได้ติดตามคุณ", "notification.follow_request": "{name} ได้ขอติดตามคุณ", + "notification.follow_request.name_and_others": "{name} และ {count, plural, other {# อื่น ๆ}} ได้ขอติดตามคุณ", "notification.label.mention": "การกล่าวถึง", "notification.label.private_mention": "การกล่าวถึงแบบส่วนตัว", "notification.label.private_reply": "การตอบกลับแบบส่วนตัว", @@ -504,6 +522,7 @@ "notification.own_poll": "การสำรวจความคิดเห็นของคุณได้สิ้นสุดแล้ว", "notification.poll": "การสำรวจความคิดเห็นที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว", "notification.reblog": "{name} ได้ดันโพสต์ของคุณ", + "notification.reblog.name_and_others_with_link": "{name} และ {count, plural, other {# อื่น ๆ}} ได้ดันโพสต์ของคุณ", "notification.relationships_severance_event": "สูญเสียการเชื่อมต่อกับ {name}", "notification.relationships_severance_event.account_suspension": "ผู้ดูแลจาก {from} ได้ระงับ {target} ซึ่งหมายความว่าคุณจะไม่สามารถรับการอัปเดตจากเขาหรือโต้ตอบกับเขาได้อีกต่อไป", "notification.relationships_severance_event.domain_block": "ผู้ดูแลจาก {from} ได้ปิดกั้น {target} รวมถึง {followersCount} ผู้ติดตามของคุณและ {followingCount, plural, other {# บัญชี}}ที่คุณติดตาม", @@ -512,7 +531,21 @@ "notification.status": "{name} เพิ่งโพสต์", "notification.update": "{name} ได้แก้ไขโพสต์", "notification_requests.accept": "ยอมรับ", + "notification_requests.accept_multiple": "{count, plural, other {ยอมรับ # คำขอ…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, other {ยอมรับคำขอ}}", + "notification_requests.confirm_accept_multiple.message": "คุณกำลังจะยอมรับ {count, plural, other {# คำขอการแจ้งเตือน}} คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", + "notification_requests.confirm_accept_multiple.title": "ยอมรับคำขอการแจ้งเตือน?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, other {ปิดคำขอ}}", + "notification_requests.confirm_dismiss_multiple.message": "คุณกำลังจะปิด {count, plural, other {# คำขอการแจ้งเตือน}} คุณจะไม่สามารถเข้าถึง{count, plural, other {การแจ้งเตือน}}ได้อย่างง่ายดายอีกครั้ง คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", + "notification_requests.confirm_dismiss_multiple.title": "ปิดคำขอการแจ้งเตือน?", "notification_requests.dismiss": "ปิด", + "notification_requests.dismiss_multiple": "{count, plural, other {ปิด # คำขอ…}}", + "notification_requests.edit_selection": "แก้ไข", + "notification_requests.exit_selection": "เสร็จสิ้น", + "notification_requests.explainer_for_limited_account": "มีการกรองการแจ้งเตือนจากบัญชีนี้เนื่องจากมีการจำกัดบัญชีโดยผู้กลั่นกรอง", + "notification_requests.explainer_for_limited_remote_account": "มีการกรองการแจ้งเตือนจากบัญชีนี้เนื่องจากมีการจำกัดบัญชีหรือเซิร์ฟเวอร์ของบัญชีโดยผู้กลั่นกรอง", + "notification_requests.maximize": "ขยายใหญ่สุด", + "notification_requests.minimize_banner": "ย่อแบนเนอร์การแจ้งเตือนที่กรองอยู่ให้เล็กสุด", "notification_requests.notifications_from": "การแจ้งเตือนจาก {name}", "notification_requests.title": "การแจ้งเตือนที่กรองอยู่", "notification_requests.view": "ดูการแจ้งเตือน", @@ -555,8 +588,10 @@ "notifications.policy.accept": "ยอมรับ", "notifications.policy.accept_hint": "แสดงในการแจ้งเตือน", "notifications.policy.drop": "เพิกเฉย", + "notifications.policy.drop_hint": "ละทิ้งอย่างถาวร ไม่ให้เห็นอีกเลย", "notifications.policy.filter": "กรอง", "notifications.policy.filter_hint": "ส่งไปยังกล่องขาเข้าการแจ้งเตือนที่กรองอยู่", + "notifications.policy.filter_limited_accounts_hint": "จำกัดโดยผู้กลั่นกรองเซิร์ฟเวอร์", "notifications.policy.filter_limited_accounts_title": "บัญชีที่ได้รับการกลั่นกรอง", "notifications.policy.filter_new_accounts.hint": "สร้างขึ้นภายใน {days, plural, other {# วัน}}ที่ผ่านมา", "notifications.policy.filter_new_accounts_title": "บัญชีใหม่", @@ -606,7 +641,7 @@ "onboarding.steps.share_profile.title": "แชร์โปรไฟล์ Mastodon ของคุณ", "onboarding.tips.2fa": "คุณทราบหรือไม่? คุณสามารถรักษาความปลอดภัยบัญชีของคุณได้โดยตั้งค่าการรับรองความถูกต้องด้วยสองปัจจัยในการตั้งค่าบัญชีของคุณ การรับรองความถูกต้องด้วยสองปัจจัยทำงานร่วมกับแอป TOTP ใด ๆ ที่คุณเลือก ไม่จำเป็นต้องมีหมายเลขโทรศัพท์!", "onboarding.tips.accounts_from_other_servers": "คุณทราบหรือไม่? เนื่องจาก Mastodon เป็นแบบกระจายศูนย์ โปรไฟล์บางส่วนที่คุณเจอจะได้รับการโฮสต์ในเซิร์ฟเวอร์อื่น ๆ ที่ไม่ใช่ของคุณ และคุณยังสามารถโต้ตอบกับเขาได้อย่างไร้รอยต่อ! เซิร์ฟเวอร์ของเขาอยู่ในครึ่งหลังของชื่อผู้ใช้ของเขา!", - "onboarding.tips.migration": "คุณทราบหรือไม่? หากคุณรู้สึกว่า {domain} ไม่ใช่ตัวเลือกเซิร์ฟเวอร์ที่ยอดเยี่ยมสำหรับคุณในอนาคต คุณสามารถย้ายไปยังเซิร์ฟเวอร์ Mastodon อื่นได้โดยไม่สูญเสียผู้ติดตามของคุณ คุณยังสามารถโฮสต์เซิร์ฟเวอร์ของคุณเอง!", + "onboarding.tips.migration": "คุณทราบหรือไม่? หากคุณรู้สึกว่า {domain} ไม่ใช่ตัวเลือกเซิร์ฟเวอร์ที่ยอดเยี่ยมสำหรับคุณในอนาคต คุณสามารถย้ายไปยังเซิร์ฟเวอร์ Mastodon อื่นได้โดยไม่สูญเสียผู้ติดตามของคุณ คุณยังสามารถโฮสต์เซิร์ฟเวอร์ของคุณเองได้อีกด้วย!", "onboarding.tips.verification": "คุณทราบหรือไม่? คุณสามารถยืนยันบัญชีของคุณได้โดยใส่ลิงก์ไปยังโปรไฟล์ Mastodon ของคุณในเว็บไซต์ของคุณเองและเพิ่มเว็บไซต์ไปยังโปรไฟล์ของคุณ ไม่จำเป็นต้องมีค่าธรรมเนียมหรือเอกสาร!", "password_confirmation.exceeds_maxlength": "การยืนยันรหัสผ่านเกินความยาวรหัสผ่านสูงสุดแล้ว", "password_confirmation.mismatching": "การยืนยันรหัสผ่านไม่ตรงกัน", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 23a25a7299..c80be8ab4c 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -192,6 +192,8 @@ "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?", + "content_warning.hide": "Gönderiyi gizle", + "content_warning.show": "Yine de göster", "conversation.delete": "Sohbeti sil", "conversation.mark_as_read": "Okundu olarak işaretle", "conversation.open": "Sohbeti görüntüle", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Mevcut bir kategoriyi kullan veya yeni bir tane oluştur", "filter_modal.select_filter.title": "Bu gönderiyi süzgeçle", "filter_modal.title.status": "Bir gönderi süzgeçle", + "filter_warning.matches_filter": "“{title}” filtresiyle eşleşiyor", "filtered_notifications_banner.pending_requests": "Bildiğiniz {count, plural, =0 {hiç kimseden} one {bir kişiden} other {# kişiden}}", "filtered_notifications_banner.title": "Filtrelenmiş bildirimler", "firehose.all": "Tümü", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 7f8b33594d..84ff487bda 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "Відписатися", "confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?", "confirmations.unfollow.title": "Відписатися від користувача?", + "content_warning.hide": "Сховати допис", + "content_warning.show": "Усе одно показати", "conversation.delete": "Видалити бесіду", "conversation.mark_as_read": "Позначити як прочитане", "conversation.open": "Переглянути бесіду", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Використати наявну категорію або створити нову", "filter_modal.select_filter.title": "Фільтрувати цей допис", "filter_modal.title.status": "Фільтрувати допис", + "filter_warning.matches_filter": "Збігається з фільтром “{title}”", "filtered_notifications_banner.pending_requests": "Від {count, plural, =0 {жодної особи} one {однієї особи} few {# осіб} many {# осіб} other {# особи}}, котрих ви можете знати", "filtered_notifications_banner.title": "Відфільтровані сповіщення", "firehose.all": "Всі", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index a0c28db77e..962984f100 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "Bỏ theo dõi", "confirmations.unfollow.message": "Bạn thật sự muốn bỏ theo dõi {name}?", "confirmations.unfollow.title": "Bỏ theo dõi?", + "content_warning.hide": "Ẩn tút", + "content_warning.show": "Nhấn để xem", "conversation.delete": "Xóa tin nhắn này", "conversation.mark_as_read": "Đánh dấu là đã đọc", "conversation.open": "Xem toàn bộ tin nhắn", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "Sử dụng một danh mục hiện có hoặc tạo một danh mục mới", "filter_modal.select_filter.title": "Lọc tút này", "filter_modal.title.status": "Lọc một tút", + "filter_warning.matches_filter": "Khớp bộ lọc “{title}”", "filtered_notifications_banner.pending_requests": "Từ {count, plural, =0 {không ai} other {# người}} bạn có thể biết", "filtered_notifications_banner.title": "Thông báo đã lọc", "firehose.all": "Toàn bộ", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 44608c6071..aab806ec8e 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -192,6 +192,8 @@ "confirmations.unfollow.confirm": "取消关注", "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", "confirmations.unfollow.title": "是否取消关注用户?", + "content_warning.hide": "隐藏嘟文", + "content_warning.show": "仍然显示", "conversation.delete": "删除对话", "conversation.mark_as_read": "标记为已读", "conversation.open": "查看对话", @@ -299,6 +301,7 @@ "filter_modal.select_filter.subtitle": "使用一个已存在类别,或创建一个新类别", "filter_modal.select_filter.title": "过滤此嘟文", "filter_modal.title.status": "过滤一条嘟文", + "filter_warning.matches_filter": "命中过滤规则 “{title}”", "filtered_notifications_banner.pending_requests": "来自你可能认识的 {count, plural, =0 {0 个人} other {# 个人}}", "filtered_notifications_banner.title": "通知(已过滤)", "firehose.all": "全部", diff --git a/app/javascript/mastodon/store/middlewares/loading_bar.ts b/app/javascript/mastodon/store/middlewares/loading_bar.ts index d259be899b..33d99f9852 100644 --- a/app/javascript/mastodon/store/middlewares/loading_bar.ts +++ b/app/javascript/mastodon/store/middlewares/loading_bar.ts @@ -48,8 +48,9 @@ export const loadingBarMiddleware = ( let isRejected = false; if ( - isAsyncThunkAction(action) - // TODO: once we get the first use-case for it, add a check for skipLoading + isAsyncThunkAction(action) && + 'useLoadingBar' in action.meta && + action.meta.useLoadingBar ) { if (isThunkActionPending(action)) isPending = true; else if (isThunkActionFulfilled(action)) isFulfilled = true; diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts index cd0f95cef9..544d619682 100644 --- a/app/javascript/mastodon/store/typed_functions.ts +++ b/app/javascript/mastodon/store/typed_functions.ts @@ -15,7 +15,7 @@ export interface AsyncThunkRejectValue { } interface AppMeta { - skipLoading?: boolean; + useLoadingBar?: boolean; } export const createAppAsyncThunk = createAsyncThunk.withTypes<{ @@ -34,7 +34,7 @@ interface AppThunkConfig { type AppThunkApi = Pick, 'getState' | 'dispatch'>; interface AppThunkOptions { - skipLoading?: boolean; + useLoadingBar?: boolean; } const createBaseAsyncThunk = createAsyncThunk.withTypes(); @@ -54,15 +54,20 @@ export function createThunk( const result = await creator(arg, { dispatch, getState }); return fulfillWithValue(result, { - skipLoading: options.skipLoading, + useLoadingBar: options.useLoadingBar, }); } catch (error) { - return rejectWithValue({ error }, { skipLoading: true }); + return rejectWithValue( + { error }, + { + useLoadingBar: options.useLoadingBar, + }, + ); } }, { getPendingMeta() { - if (options.skipLoading) return { skipLoading: true }; + if (options.useLoadingBar) return { useLoadingBar: true }; return {}; }, }, @@ -148,7 +153,7 @@ export function createDataLoadingThunk< * You can also omit this parameter and pass `thunkOptions` directly * @param maybeThunkOptions * Additional Mastodon specific options for the thunk. Currently supports: - * - `skipLoading` to avoid showing the loading bar when the request is in progress + * - `useLoadingBar` to display a loading bar while this action is pending. Defaults to true. * @returns The created thunk */ export function createDataLoadingThunk< @@ -198,6 +203,6 @@ export function createDataLoadingThunk< return undefined as Returned; else return result; }, - thunkOptions, + { useLoadingBar: thunkOptions?.useLoadingBar ?? true }, ); } diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 18dede8fbf..027d80215d 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -286,6 +286,7 @@ ar: filter_by_action: تصفية بحسب الإجراء filter_by_user: تصفية حسب المستخدم title: سِجلّ التفتيش و المعاينة + unavailable_instance: "(اسم النطاق غير متوفر)" announcements: destroyed_msg: تم حذف الإعلان بنجاح! edit: @@ -990,6 +991,7 @@ ar: delete: حذف edit_preset: تعديل نموذج التحذير empty: لم تحدد أي إعدادات تحذير مسبقة بعد. + title: نماذج التحذير webhooks: add_new: إضافة نقطة نهاية delete: حذف diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 73b35bf8bf..492eb8af7e 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -954,6 +954,7 @@ cy: name: Enw newest: Mwyaf newydd oldest: Hynaf + open: Gweld yn gyhoeddus reset: Ailosod review: Adolygu statws search: Chwilio diff --git a/config/locales/devise.ro.yml b/config/locales/devise.ro.yml index 868bb4b3a1..40cb6a7581 100644 --- a/config/locales/devise.ro.yml +++ b/config/locales/devise.ro.yml @@ -9,9 +9,10 @@ ro: already_authenticated: Ești deja conectat. inactive: Contul tău nu este încă activat. invalid: "%{authentication_keys} sau parolă greșită." - last_attempt: Mai ai încă o încercare înainte de a bloca contul. + last_attempt: Mai ai încă o încercare înainte ca contul tău să fie blocat. locked: Contul tău este blocat. not_found_in_database: "%{authentication_keys} sau parolă greșită." + omniauth_user_creation_failure: Eroare la crearea unui cont pentru această identitate. pending: Contul tău este încă în curs de revizuire. timeout: Sesiunea ta a expirat. Te rugăm să te conectezi din nou pentru a continua. unauthenticated: Trebuie să te conectezi sau să te înregistrezi înainte de a continua. @@ -20,7 +21,7 @@ ro: confirmation_instructions: action: Verifică adresa de e-mail action_with_app: Confirmați și reveniți la %{app} - explanation: Ai creat un cont pe %{host} cu această adresă de e-mail. Ești la un click distanță de a o activa. Dacă nu ai fost tu, ignoră acest e-mail. + explanation: Ai creat un cont pe %{host} cu această adresă de e-mail. Ești la un clic distanță de a-l activa. Dacă nu ai fost tu, ignoră acest e-mail. explanation_when_pending: Ai solicitat o invitație către %{host} cu această adresă de e-mail. Odată ce îți confirmi adresa de e-mail, îți vom revizui cererea. Te poți autentifica pentru a-ți schimba detaliile sau pentru a-ți șterge contul, dar nu poți accesa majoritatea funcțiilor până când contul tău nu este aprobat. Dacă cererea ta este respinsă, datele tale vor fi șterse, astfel încât nu va fi necesară nicio altă acțiune din partea ta. Dacă nu ai fost tu, ignoră acest e-mail. extra_html: Te rugăm să verifici și regulile serverului și termenii noștri de serviciu. subject: 'Mastodon: Instrucțiuni de confirmare pentru %{instance}' @@ -28,12 +29,12 @@ ro: email_changed: explanation: 'Adresa de e-mail pentru contul tău este schimbată la:' extra: Dacă nu v-ați schimbat adresa de e-mail, probabil că cineva a obținut acces la contul dvs. Te rugăm să îți schimbi parola imediat sau să contactezi administratorul serverului dacă nu ai acces la contul tău. - subject: E-mail schimbat + subject: 'Mastodon: E-mail schimbat' title: Noua adresa de e-mail password_change: explanation: Parola contului tău a fost schimbată. extra: Dacă nu v-ați schimbat parola, este posibil ca cineva să fi obținut acces la contul dvs. Te rugăm să îți schimbi parola imediat sau să contactezi administratorul serverului dacă nu ai acces la contul tău. - subject: Parolă schimbată + subject: 'Mastodon: Parolă schimbată' title: Parolă schimbată reconfirmation_instructions: explanation: Confirmă noua adresă pentru a schimba adresa de e-mail. @@ -44,25 +45,25 @@ ro: action: Schimbă parola explanation: Ați solicitat o nouă parolă pentru contul dvs. extra: Dacă nu ați solicitat acest lucru, ignorați acest e-mail. Parola dvs. nu se va schimba până când nu veți accesa link-ul de mai sus și nu veți crea unul nou. - subject: Instrucțiuni pentru resetarea parolei + subject: 'Mastodon: Instrucțiuni pentru resetarea parolei' title: Resetare parolă two_factor_disabled: explanation: Conectarea este acum posibilă folosind doar adresa de e-mail și parola. - subject: Autentificare cu doi factori dezactivată + subject: 'Mastodon: Autentificare cu doi factori dezactivată' subtitle: Autentificarea cu doi factori pentru contul dvs. a fost dezactivată. - title: 2FA dezactivat + title: A2F dezactivată two_factor_enabled: explanation: Pentru autentificare va fi necesar un token generat de aplicația TOTP asociată. - subject: Autentificare în doi pași activată + subject: 'Mastodon: Autentificare în doi pași activată' subtitle: Autentificarea cu doi factori a fost activată pentru contul dvs. - title: 2FA activat + title: A2F activată two_factor_recovery_codes_changed: - explanation: Codurile anterioare de recuperare au fost invalidate și unele noi generate. - subject: Recuperare în doi factori + explanation: Codurile de recuperare anterioare au fost invalidate și s-au generat altele noi. + subject: 'Mastodon: Coduri de recuperare în doi pași regenerate' subtitle: Codurile de recuperare anterioare au fost invalidate și s-au generat altele noi. - title: Coduri de recuperare 2FA modificate + title: Codurile de recuperare în doi pași au fost modificate unlock_instructions: - subject: Instrucțiuni de deblocare + subject: 'Mastodon: Instrucțiuni de deblocare' webauthn_credential: added: explanation: Următoarea cheie de securitate a fost adăugată în contul tău @@ -80,7 +81,7 @@ ro: webauthn_enabled: explanation: Autentificarea cu cheie de securitate a fost activată pentru contul dvs. extra: Cheia ta de securitate poate fi acum folosită pentru conectare. - subject: 'Mastodon: Autentificarea cheii de securitate activată' + subject: 'Mastodon: Autentificarea prin chei de securitate activată' title: Chei de securitate activate omniauth_callbacks: failure: Nu te-am putut autentifica de la %{kind} deoarece "%{reason}". @@ -97,7 +98,7 @@ ro: signed_up_but_inactive: V-ați înregistrat cu succes. Cu toate acestea, nu vă putem conecta deoarece contul dvs. nu este încă activat. signed_up_but_locked: V-ați înregistrat cu succes. Cu toate acestea, nu vă putem conecta deoarece contul dvs. este blocat. signed_up_but_pending: Un mesaj cu un link de confirmare a fost trimis la adresa ta de e-mail. După ce faceți clic pe link, vă vom revizui cererea. Veți fi notificat dacă este aprobat. - signed_up_but_unconfirmed: Un mesaj cu un link de confirmare a fost trimis la adresa ta de e-mail. Vă rugăm să urmaţi link-ul pentru a vă activa contul. Vă rugăm să verificaţi folderul spam dacă nu aţi primit acest e-mail. + signed_up_but_unconfirmed: Un mesaj cu un link de confirmare a fost trimis la adresa ta de e-mail. Vă rugăm să urmați link-ul pentru a vă activa contul. Vă rugăm să verificați folderul spam dacă nu ați primit acest e-mail. update_needs_confirmation: Ți-ai actualizat contul cu succes, dar trebuie să verificăm noua ta adresă de e-mail. Vă rugăm să verificați adresa de e-mail și să urmați link-ul de confirmare pentru a confirma noua dvs. adresă de e-mail. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. updated: Contul dvs. a fost actualizat cu succes. sessions: @@ -105,7 +106,7 @@ ro: signed_in: Conectat cu succes. signed_out: Deconectat cu succes. unlocks: - send_instructions: Veţi primi un e-mail cu instrucţiuni despre cum să vă deblocaţi contul în câteva minute. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. + send_instructions: Veți primi un e-mail cu instrucțiuni despre cum să vă deblocați contul în câteva minute. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. send_paranoid_instructions: Dacă contul tău există, vei primi un e-mail cu instrucțiuni pentru cum să-l deblochezi în câteva minute. Te rugăm să verifici dosarul spam dacă nu ai primit acest e-mail. unlocked: Contul tău a fost deblocat cu succes. Te rugăm să te autentifici pentru a continua. errors: @@ -118,4 +119,4 @@ ro: not_saved: few: "%{count} erori au împiedicat salvarea acestui %{resource}:" one: 'O eroare a împiedicat salvarea acestui %{resource}:' - other: "%{count} de erori au împiedicat salvarea acestui %{resource}:" + other: "%{count} erori au împiedicat salvarea acestui %{resource}:" diff --git a/config/locales/doorkeeper.lt.yml b/config/locales/doorkeeper.lt.yml index ccdf866848..9b3b6558a4 100644 --- a/config/locales/doorkeeper.lt.yml +++ b/config/locales/doorkeeper.lt.yml @@ -35,24 +35,24 @@ lt: redirect_uri: Naudok po vieną eilutę kiekvienam URI. scopes: Atskirk aprėptis tarpais. Palik tuščią, jei nori naudoti numatytąsias aprėtis. index: - application: Programėlė + application: Programa callback_url: Atgalinis URL delete: Ištrinti - empty: Neturi jokių programėlių. + empty: Neturi jokių programų. name: Pavadinimas - new: Nauja programėlė + new: Nauja programa scopes: Aprėptys show: Rodyti - title: Tavo programėlės + title: Tavo programos new: - title: Nauja programėlė + title: Nauja programa show: actions: Veiksmai - application_id: Kliento raktas - callback_urls: Atgalinių URL adresų + application_id: Kliento programos raktas + callback_urls: Atgalinių URL scopes: Aprėptys - secret: Kliento paslaptis - title: 'Programėlė: %{name}' + secret: Kliento programos paslaptis + title: 'Programa: %{name}' authorizations: buttons: authorize: Leisti @@ -60,48 +60,48 @@ lt: error: title: Įvyko klaida. new: - prompt_html: "%{client_name} norėtų gauti leidimą prieigos prie tavo paskyros. Tai trečiosios šalies programėlė. Jei ja nepasitiki, neturėtum leisti." + prompt_html: "%{client_name} norėtų gauti leidimą pasiekti tavo paskyrą. Tai – trečiosios šalies programa. Jei ja nepasitiki, tada neturėtum leisti." review_permissions: Peržiūrėti leidimus - title: Reikalingas leidimas + title: Privalomas leidimas show: - title: Nukopijuok šį tapatybės patvirtinimo kodą ir įklijuok jį į programėlę. + title: Nukopijuok šį leidimo kodą ir įklijuok jį į programą. authorized_applications: buttons: revoke: Naikinti confirmations: revoke: Ar esi įsitikinęs (-usi)? index: - authorized_at: Įgaliota %{date} - description_html: Tai programėlės, kurios gali pasiekti tavo paskyrą naudojant API. Jei čia yra programėlių, kurių neatpažįsti, arba jei programėlė elgiasi netinkamai, gali panaikinti jos prieigą. + authorized_at: Leidžiama %{date} + description_html: Tai – programos, kurios gali pasiekti tavo paskyrą naudojant API. Jei čia yra programų, kurių neatpažįsti, arba jei programa elgiasi netinkamai, gali panaikinti jos prieigą. last_used_at: Paskutinį kartą naudota %{date} - never_used: Niekada nenaudotas + never_used: Niekada nenaudota scopes: Leidimai superapp: Vidinis - title: Tavo leidžiamos programėlės + title: Tavo leidžiamos programos errors: messages: - access_denied: Išteklių savininkas (-ė) arba įgaliojimų serveris atmetė užklausą. + access_denied: Išteklių savininkas (-ė) arba leidžiamų serveris atmetė užklausą. credential_flow_not_configured: Išteklių savininko slaptažodžio kredencialų srautas nepavyko, nes Doorkeeper.configure.resource_owner_from_credentials nėra nesukonfigūruotas. - invalid_client: Kliento tapatybės nustatymas nepavyko dėl nežinomo kliento, neįtraukto kliento tapatybės nustatymo arba nepalaikomo tapatybės nustatymo metodo. - invalid_code_challenge_method: Kodo iššūkio būdas turi būti S256. Paprastas nepalaikomas. - invalid_grant: Pateiktas įgaliojimas yra netinkamas, pasibaigęs, panaikintas, neatitinka įgaliojimo užklausoje naudoto nukreipimo URI arba buvo išduotas kitam klientui. - invalid_redirect_uri: Nukreipimo uri įtrauktas yra netinkamas. + invalid_client: Kliento programos tapatybės nustatymas nepavyko dėl nežinomo kliento programos, neįtraukto kliento programos tapatybės nustatymo arba nepalaikomo tapatybės nustatymo metodo. + invalid_code_challenge_method: Kodo iššūkio metodas turi būti S256. Paprastas nepalaikomas. + invalid_grant: Pateiktas leidimo suteikimas yra netinkamas, nebegaliojantis, panaikintas, neatitinka leidimo užklausoje naudoto nukreipimo URI arba buvo išduotas kitam kliento programui. + invalid_redirect_uri: Įtrauktas nukreipimo URI netinkamas. invalid_request: missing_param: 'Trūksta privalomo parametro: %{value}.' - request_not_authorized: Užklausą reikia įgalioti. Reikalingo parametro užklausai įgalioti trūksta arba jis netinkamas. - unknown: Užklausoje trūksta privalomo parametro, turi nepalaikomą parametro reikšmę arba yra kitaip netinkamai suformuota. - invalid_resource_owner: Pateikti išteklių savininko įgaliojimai yra netinkami arba išteklių savininko negalima surasti. + request_not_authorized: Užklausą reikia leisti. Trūksta privalomo parametro užklausai leisti arba jis netinkamas. + unknown: Užklausai trūksta privalomo parametro, įtraukta nepalaikoma parametro reikšmė arba ji yra kitaip netaisyklingas. + invalid_resource_owner: Pateikti išteklių savininko kredencialai yra netinkami arba išteklių savininko negalima surasti. invalid_scope: Užklausos aprėptis yra netinkama, nežinoma arba netaisyklingas. invalid_token: - expired: Baigėsi prieigos rakto galiojimas. + expired: Prieigos raktas nebegalioja. revoked: Prieigos raktas buvo panaikintas. - unknown: Prieigos raktas yra netinkamas. - resource_owner_authenticator_not_configured: Išteklių savininko suradimas nepavyko dėl to, kad Doorkeeper.configure.resource_owner_authenticator nėra sukonfigūruotas. - server_error: Įgaliojimų serveris susidūrė su netikėta sąlyga, dėl kurios negalėjo užpildyti užklausos. + unknown: Prieigos raktas netinkamas. + resource_owner_authenticator_not_configured: Išteklių savininko suradimas nepavyko, nes Doorkeeper.configure.resource_owner_authenticator nėra sukonfigūruotas. + server_error: Leidimo serveris susidūrė su netikėta sąlyga, dėl kurios negalėjo užpildyti užklausos. temporarily_unavailable: Įgaliojimų serveris šiuo metu negali apdoroti užklausos dėl laikinos serverio perkrovos arba techninės priežiūros. - unauthorized_client: Klientas nėra įgaliotas atlikti šią užklausą šiuo metodu. - unsupported_grant_type: Įgaliojimų suteikimo tipas nepalaikomas įgaliojimų serveryje. - unsupported_response_type: Įgaliojimų serveris nepalaiko šio atsako tipo. + unauthorized_client: Klientas nėra leidžiamas atlikti šią užklausą šiuo metodu. + unsupported_grant_type: Leidimo suteikimo tipas nepalaikomas leidimo serveryje. + unsupported_response_type: Leidimo serveris nepalaiko šio atsakymo tipo. flash: applications: create: @@ -123,7 +123,7 @@ lt: admin/accounts: Paskyrų administravimas admin/all: Visi administraciniai funkcijos admin/reports: Ataskaitų administravimas - all: Pilna prieiga prie tavo Mastodon paskyros + all: Pilna prieiga prie tavo „Mastodon“ paskyros blocks: Blokavimai bookmarks: Žymės conversations: Pokalbiai @@ -136,7 +136,7 @@ lt: media: Medijos priedai mutes: Nutildymai notifications: Pranešimai - profile: Tavo Mastodon profilis + profile: Tavo „Mastodon“ profilis push: Tiesioginiai pranešimai reports: Ataskaitos search: Paieška @@ -151,25 +151,25 @@ lt: scopes: admin:read: skaityti visus duomenis serveryje admin:read:accounts: skaityti slaptą visų paskyrų informaciją - admin:read:canonical_email_blocks: skaityti slaptą visų kanoninių el. laiško blokavimų informaciją - admin:read:domain_allows: skaityti slaptą visų domeno leidimus informaciją - admin:read:domain_blocks: skaityti slaptą visų domeno blokavimų informaciją - admin:read:email_domain_blocks: skaityti slaptą visų el. laiško domeno blokavimų informaciją + admin:read:canonical_email_blocks: skaityti slaptą visų kanoninių el. laiškų blokavimų informaciją + admin:read:domain_allows: skaityti slaptą visų serverių leidžiamų informaciją + admin:read:domain_blocks: skaityti slaptą visų serverių blokavimų informaciją + admin:read:email_domain_blocks: skaityti slaptą visų el. laiškų serverių blokavimų informaciją admin:read:ip_blocks: skaityti slaptą visų IP blokavimų informaciją admin:read:reports: skaityti slaptą visų ataskaitų ir praneštų paskyrų informaciją admin:write: modifikuoti visus duomenis serveryje admin:write:accounts: atlikti paskyrų prižiūrėjimo veiksmus - admin:write:canonical_email_blocks: atlikti kanoninių el. laiško blokavimų prižiūrėjimo veiksmus - admin:write:domain_allows: atlikti domeno leidimų prižiūrėjimo veiksmus - admin:write:domain_blocks: atlikti domeno blokavimų prižiūrėjimo veiksmus - admin:write:email_domain_blocks: atlikti el. laiško domenų blokavimų prižiūrėjimo veiksmus + admin:write:canonical_email_blocks: atlikti kanoninių el. laiškų blokavimų prižiūrėjimo veiksmus + admin:write:domain_allows: atlikti serverio leidžiamų prižiūrėjimo veiksmus + admin:write:domain_blocks: atlikti serverio blokavimų prižiūrėjimo veiksmus + admin:write:email_domain_blocks: atlikti el. laiškų serverių blokavimų prižiūrėjimo veiksmus admin:write:ip_blocks: atlikti IP blokavimų prižiūrėjimo veiksmus admin:write:reports: atlikti ataskaitų prižiūrėjimo veiksmus crypto: naudoti visapusį šifravimą follow: modifikuoti paskyros sąryšius profile: skaityti tik tavo paskyros profilio informaciją push: gauti tiesioginius pranešimus - read: skaityti visus paskyros duomenis + read: skaityti visus tavo paskyros duomenis read:accounts: matyti paskyrų informaciją read:blocks: matyti tavo blokavimus read:bookmarks: matyti tavo žymes diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 21836e79f1..b0882e0a27 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -898,6 +898,7 @@ es-AR: name: Nombre newest: Lo más reciente oldest: Lo más antiguo + open: Ver públicamente reset: Restablecer review: Estado de revisión search: Buscar diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 61f4a6c167..9df6a784de 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -898,6 +898,7 @@ es-MX: name: Nombre newest: Más reciente oldest: Menos reciente + open: Ver públicamente reset: Reiniciar review: Estado de revisión search: Buscar diff --git a/config/locales/es.yml b/config/locales/es.yml index 883a953717..dc52d8113d 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -898,6 +898,7 @@ es: name: Nombre newest: Más reciente oldest: Menos reciente + open: Ver públicamente reset: Reiniciar review: Estado de revisión search: Buscar diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 38c9ca299a..0f2d247720 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1203,7 +1203,7 @@ fr: add_new: Ajouter un nouveau hashtag errors: limit: Vous avez déjà mis en avant le nombre maximum de hashtags - hint_html: "Que sont les hashtags mis en avant ? Ils sont affichés en évidence sur votre profil public et permettent aux gens de parcourir vos messages publics qui utilisent ces hashtags. Ils sont un excellent outil pour garder la trace d’activités créatrices ou de projets de long terme." + hint_html: "Mettez en évidence vos hashtags les plus importants sur votre profil. Un outil idéal pour suivre vos travaux créatifs et vos projets à long terme, les hashtags mis en avant sont affichés bien en évidence sur votre profil et permettent un accès rapide à vos propres publications." filters: contexts: account: Profils diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 9d4d281f4f..27237bf3a4 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -940,6 +940,7 @@ ga: name: Ainm newest: Is nuaí oldest: Is sine + open: Amharc go Poiblí reset: Athshocraigh review: Stádas athbhreithnithe search: Cuardach diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 9592a86c65..ef4add838e 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -926,6 +926,7 @@ gd: name: Ainm newest: As ùire oldest: As sine + open: Seall gu poblach reset: Ath-shuidhich review: Dèan lèirmheas air an staid search: Lorg diff --git a/config/locales/nn.yml b/config/locales/nn.yml index a845c1fbb6..90b3d216c3 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -898,6 +898,7 @@ nn: name: Namn newest: Nyaste oldest: Eldste + open: Vis offentleg reset: Nullstill review: Sjå gjennom status search: Søk diff --git a/config/locales/th.yml b/config/locales/th.yml index efa142fed3..7f90c3bc94 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -872,16 +872,19 @@ th: message_html: "ที่เก็บข้อมูลวัตถุของคุณกำหนดค่าไม่ถูกต้อง ความเป็นส่วนตัวของผู้ใช้ของคุณตกอยู่ในความเสี่ยง" tags: moderation: + not_trendable: ไม่สามารถขึ้นแนวโน้มได้ not_usable: ไม่สามารถใช้งานได้ pending_review: การตรวจทานที่รอดำเนินการ review_requested: ต้องการการตรวจทาน reviewed: ตรวจทานแล้ว title: สถานะ + trendable: ขึ้นแนวโน้มได้ unreviewed: ไม่ได้รับการตรวจทาน usable: ใช้งานได้ name: ชื่อ newest: ใหม่ที่สุด oldest: เก่าที่สุด + open: ดูแบบสาธารณะ reset: รีเซ็ต review: สถานะการตรวจทาน search: ค้นหา @@ -1904,7 +1907,7 @@ th: seamless_external_login: คุณได้เข้าสู่ระบบผ่านบริการภายนอก ดังนั้นการตั้งค่ารหัสผ่านและอีเมลจึงไม่พร้อมใช้งาน signed_in_as: 'ลงชื่อเข้าเป็น:' verification: - extra_instructions_html: เคล็ดลับ: ลิงก์ในเว็บไซต์ของคุณสามารถเป็นแบบมองไม่เห็น ส่วนที่สำคัญคือ rel="me" ซึ่งป้องกันการแอบอ้างในเว็บไซต์ที่มีเนื้อหาที่ผู้ใช้สร้างขึ้น คุณยังสามารถใช้แท็ก link ในส่วนหัวของหน้าแทนที่จะเป็น a แต่ HTML ต้องเข้าถึงได้โดยไม่มีการประมวลผล JavaScript + extra_instructions_html: เคล็ดลับ: ลิงก์ในเว็บไซต์ของคุณสามารถเป็นแบบมองไม่เห็น ส่วนที่สำคัญคือ rel="me" ซึ่งป้องกันการแอบอ้างในเว็บไซต์ที่มีเนื้อหาที่ผู้ใช้สร้างขึ้น คุณยังสามารถใช้แท็ก link ในส่วนหัวของหน้าแทนที่จะเป็น a ได้อีกด้วย แต่ HTML ต้องเข้าถึงได้โดยไม่มีการประมวลผล JavaScript here_is_how: นี่คือวิธี hint_html: "การยืนยันตัวตนของคุณใน Mastodon มีไว้สำหรับทุกคน โดยอิงตามมาตรฐานเว็บแบบเปิด ฟรีตอนนี้และตลอดไป ทั้งหมดที่คุณจำเป็นต้องมีคือเว็บไซต์ส่วนบุคคลที่ผู้คนรู้จักคุณ เมื่อคุณเชื่อมโยงไปยังเว็บไซต์นี้จากโปรไฟล์ของคุณ เราจะตรวจสอบว่าเว็บไซต์เชื่อมโยงกลับไปยังโปรไฟล์ของคุณและแสดงตัวบ่งชี้ที่มองเห็นได้ในโปรไฟล์" instructions_html: คัดลอกแล้ววางโค้ดด้านล่างลงใน HTML ของเว็บไซต์ของคุณ จากนั้นเพิ่มที่อยู่ของเว็บไซต์ของคุณลงในหนึ่งในช่องพิเศษในโปรไฟล์ของคุณจากแท็บ "แก้ไขโปรไฟล์" และบันทึกการเปลี่ยนแปลง diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 35b55583a0..9b3d2a1d75 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -884,6 +884,7 @@ vi: name: Tên newest: Mới nhất oldest: Cũ nhất + open: Xem công khai reset: Đặt lại review: Phê duyệt search: Tìm kiếm diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 36b62e535d..c31a68926e 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -884,6 +884,7 @@ zh-CN: name: 名称 newest: 最新 oldest: 最早 + open: 以公开身份查看 reset: 重置 review: 审核状态 search: 搜索 diff --git a/db/seeds.rb b/db/seeds.rb index 370790e513..9d25ef0a4e 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true Chewy.strategy(:mastodon) do - Dir[Rails.root.join('db', 'seeds', '*.rb')].each do |seed| + Rails.root.glob('db/seeds/*.rb').each do |seed| load seed end end diff --git a/lib/tasks/branding.rake b/lib/tasks/branding.rake index be72454ce2..1e2af1b446 100644 --- a/lib/tasks/branding.rake +++ b/lib/tasks/branding.rake @@ -15,7 +15,7 @@ namespace :branding do output_dest = Rails.root.join('app', 'javascript', 'images', 'mailer') # Displayed size is 64px, at 3x it's 192px - Dir[Rails.root.join('app', 'javascript', 'images', 'icons', '*.svg')].each do |path| + Rails.root.glob('app/javascript/images/icons/*.svg').each do |path| rsvg_convert.run(input: path, size: 192, output: output_dest.join("#{File.basename(path, '.svg')}.png")) end diff --git a/lib/tasks/icons.rake b/lib/tasks/icons.rake index 374ea149fe..96e0a14315 100644 --- a/lib/tasks/icons.rake +++ b/lib/tasks/icons.rake @@ -20,7 +20,7 @@ end def find_used_icons icons_by_weight_and_size = {} - Dir[Rails.root.join('app', 'javascript', '**', '*.*s*')].map do |path| + Rails.root.glob('app/javascript/**/*.*s*').map do |path| File.open(path, 'r') do |file| pattern = %r{\Aimport .* from '@/material-icons/(?[0-9]+)-(?[0-9]+)px/(?[^-]*)(?-fill)?.svg\?react';} file.each_line do |line| diff --git a/lib/tasks/repo.rake b/lib/tasks/repo.rake index b90b48934e..539c44273f 100644 --- a/lib/tasks/repo.rake +++ b/lib/tasks/repo.rake @@ -98,7 +98,7 @@ namespace :repo do missing_yaml_files = I18n.available_locales.reject { |locale| Rails.root.join('config', 'locales', "#{locale}.yml").exist? } missing_json_files = I18n.available_locales.reject { |locale| Rails.root.join('app', 'javascript', 'mastodon', 'locales', "#{locale}.json").exist? } - locales_in_files = Dir[Rails.root.join('config', 'locales', '*.yml')].map do |path| + locales_in_files = Rails.root.glob('config/locales/*.yml').map do |path| file_name = File.basename(path, '.yml') file_name.gsub(/\A(doorkeeper|devise|activerecord|simple_form)\./, '').to_sym end.uniq.compact diff --git a/package.json b/package.json index 866a5003e9..55cdb85200 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.4.0", + "packageManager": "yarn@4.4.1", "engines": { "node": ">=18" }, diff --git a/spec/controllers/about_controller_spec.rb b/spec/controllers/about_controller_spec.rb deleted file mode 100644 index 8db6d80b0b..0000000000 --- a/spec/controllers/about_controller_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe AboutController do - render_views - - describe 'GET #show' do - before do - get :show - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - end -end diff --git a/spec/controllers/custom_css_controller_spec.rb b/spec/controllers/custom_css_controller_spec.rb deleted file mode 100644 index 405fa0bcf3..0000000000 --- a/spec/controllers/custom_css_controller_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe CustomCssController do - render_views - - describe 'GET #show' do - before do - get :show - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it_behaves_like 'cacheable response' - end -end diff --git a/spec/controllers/emojis_controller_spec.rb b/spec/controllers/emojis_controller_spec.rb deleted file mode 100644 index dd139de931..0000000000 --- a/spec/controllers/emojis_controller_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe EmojisController do - render_views - - let(:emoji) { Fabricate(:custom_emoji, shortcode: 'coolcat') } - - describe 'GET #show' do - let(:response) { get :show, params: { id: emoji.id, format: :json } } - - it 'returns the right response' do - expect(response).to have_http_status 200 - expect(body_as_json[:name]).to eq ':coolcat:' - end - end -end diff --git a/spec/controllers/health_controller_spec.rb b/spec/controllers/health_controller_spec.rb deleted file mode 100644 index 282b664199..0000000000 --- a/spec/controllers/health_controller_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe HealthController do - render_views - - describe 'GET #show' do - it 'returns http success' do - get :show - expect(response).to have_http_status(200) - end - end -end diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb deleted file mode 100644 index 50a8aba2d8..0000000000 --- a/spec/controllers/home_controller_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe HomeController do - render_views - - describe 'GET #index' do - subject { get :index } - - context 'when not signed in' do - it 'returns http success' do - request.path = '/' - expect(subject).to have_http_status(:success) - end - end - - context 'when signed in' do - let(:user) { Fabricate(:user) } - - before do - sign_in(user) - end - - it 'returns http success' do - expect(subject).to have_http_status(:success) - end - end - end -end diff --git a/spec/controllers/manifests_controller_spec.rb b/spec/controllers/manifests_controller_spec.rb deleted file mode 100644 index 9279fae024..0000000000 --- a/spec/controllers/manifests_controller_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe ManifestsController do - render_views - - describe 'GET #show' do - before do - get :show - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it_behaves_like 'cacheable response' - end -end diff --git a/spec/controllers/privacy_controller_spec.rb b/spec/controllers/privacy_controller_spec.rb deleted file mode 100644 index c92c71ea64..0000000000 --- a/spec/controllers/privacy_controller_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe PrivacyController do - render_views - - describe 'GET #show' do - it 'returns http success' do - get :show - expect(response).to have_http_status(200) - end - end -end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index d4b9bddf93..9af2d1e337 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -44,7 +44,7 @@ require 'chewy/rspec' require 'email_spec/rspec' require 'test_prof/recipes/rspec/before_all' -Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f } +Rails.root.glob('spec/support/**/*.rb').each { |f| require f } ActiveRecord::Migration.maintain_test_schema! WebMock.disable_net_connect!( diff --git a/spec/requests/custom_stylesheets_spec.rb b/spec/requests/custom_stylesheets_spec.rb new file mode 100644 index 0000000000..982511297b --- /dev/null +++ b/spec/requests/custom_stylesheets_spec.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Custom stylesheets' do + describe 'GET /custom.css' do + before { get '/custom.css' } + + it 'returns http success' do + expect(response) + .to have_http_status(200) + .and have_attributes( + content_type: match('text/css') + ) + end + + it_behaves_like 'cacheable response' + end +end diff --git a/spec/requests/emojis_spec.rb b/spec/requests/emojis_spec.rb new file mode 100644 index 0000000000..458d500762 --- /dev/null +++ b/spec/requests/emojis_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Emojis' do + describe 'GET /emojis/:id' do + let(:emoji) { Fabricate(:custom_emoji, shortcode: 'coolcat') } + + it 'returns http success with correct json' do + get "/emojis/#{emoji.id}" + + expect(response) + .to have_http_status(200) + expect(body_as_json) + .to include( + name: ':coolcat:', + type: 'Emoji' + ) + end + end +end diff --git a/spec/requests/health_spec.rb b/spec/requests/health_spec.rb new file mode 100644 index 0000000000..03317f9723 --- /dev/null +++ b/spec/requests/health_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Health check endpoint' do + describe 'GET /health' do + it 'returns http success when server is functioning' do + get '/health' + + expect(response) + .to have_http_status(200) + expect(response.body) + .to include('OK') + end + end +end diff --git a/spec/requests/manifest_spec.rb b/spec/requests/manifest_spec.rb new file mode 100644 index 0000000000..749c4038df --- /dev/null +++ b/spec/requests/manifest_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Manifest' do + describe 'GET /manifest' do + before { get '/manifest' } + + it 'returns http success' do + expect(response) + .to have_http_status(200) + .and have_attributes( + content_type: match('application/json') + ) + expect(body_as_json) + .to include( + id: '/home', + name: 'Mastodon' + ) + end + + it_behaves_like 'cacheable response' + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 1f9cc40f12..496ebfd09d 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -28,7 +28,7 @@ RSpec.configure do |config| end config.after :suite do - FileUtils.rm_rf(Dir[Rails.root.join('spec', 'test_files')]) + FileUtils.rm_rf(Rails.root.glob('spec/test_files')) end # Use the GitHub Annotations formatter for CI diff --git a/spec/system/about_spec.rb b/spec/system/about_spec.rb new file mode 100644 index 0000000000..dc976b91e0 --- /dev/null +++ b/spec/system/about_spec.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'About page' do + it 'visits the about page and renders the web app' do + visit about_path + + expect(page) + .to have_css('noscript', text: /Mastodon/) + end +end diff --git a/spec/system/home_spec.rb b/spec/system/home_spec.rb new file mode 100644 index 0000000000..08b9737d6b --- /dev/null +++ b/spec/system/home_spec.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Home page' do + context 'when signed in' do + before { sign_in Fabricate(:user) } + + it 'visits the homepage and renders the web app' do + visit root_path + + expect(page) + .to have_css('noscript', text: /Mastodon/) + end + end + + context 'when not signed in' do + it 'visits the homepage and renders the web app' do + visit root_path + + expect(page) + .to have_css('noscript', text: /Mastodon/) + end + end +end diff --git a/spec/system/privacy_spec.rb b/spec/system/privacy_spec.rb new file mode 100644 index 0000000000..f2ab1310cc --- /dev/null +++ b/spec/system/privacy_spec.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Privacy policy page' do + it 'visits the privacy policy page and renders the web app' do + visit privacy_policy_path + + expect(page) + .to have_css('noscript', text: /Mastodon/) + end +end diff --git a/streaming/index.js b/streaming/index.js index 4419b37c60..6d8fdcc61c 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -292,6 +292,9 @@ const CHANNEL_NAMES = [ const startServer = async () => { const pgPool = new pg.Pool(pgConfigFromEnv(process.env)); + + const metrics = setupMetrics(CHANNEL_NAMES, pgPool); + const server = http.createServer(); const wss = new WebSocketServer({ noServer: true }); @@ -388,16 +391,6 @@ const startServer = async () => { const redisClient = await createRedisClient(redisConfig); const { redisPrefix } = redisConfig; - const metrics = setupMetrics(CHANNEL_NAMES, pgPool); - // TODO: migrate all metrics to metrics.X.method() instead of just X.method() - const { - connectedClients, - connectedChannels, - redisSubscriptions, - redisMessagesReceived, - messagesSent, - } = metrics; - // When checking metrics in the browser, the favicon is requested this // prevents the request from falling through to the API Router, which would // error for this endpoint: @@ -408,15 +401,7 @@ const startServer = async () => { res.end('OK'); }); - app.get('/metrics', async (req, res) => { - try { - res.set('Content-Type', metrics.register.contentType); - res.end(await metrics.register.metrics()); - } catch (ex) { - req.log.error(ex); - res.status(500).end(); - } - }); + app.get('/metrics', metrics.requestHandler); /** * @param {string[]} channels @@ -443,7 +428,7 @@ const startServer = async () => { * @param {string} message */ const onRedisMessage = (channel, message) => { - redisMessagesReceived.inc(); + metrics.redisMessagesReceived.inc(); const callbacks = subs[channel]; @@ -481,7 +466,7 @@ const startServer = async () => { if (err) { logger.error(`Error subscribing to ${channel}`); } else if (typeof count === 'number') { - redisSubscriptions.set(count); + metrics.redisSubscriptions.set(count); } }); } @@ -508,7 +493,7 @@ const startServer = async () => { if (err) { logger.error(`Error unsubscribing to ${channel}`); } else if (typeof count === 'number') { - redisSubscriptions.set(count); + metrics.redisSubscriptions.set(count); } }); delete subs[channel]; @@ -688,13 +673,13 @@ const startServer = async () => { unsubscribe(`${redisPrefix}${accessTokenChannelId}`, listener); unsubscribe(`${redisPrefix}${systemChannelId}`, listener); - connectedChannels.labels({ type: 'eventsource', channel: 'system' }).dec(2); + metrics.connectedChannels.labels({ type: 'eventsource', channel: 'system' }).dec(2); }); subscribe(`${redisPrefix}${accessTokenChannelId}`, listener); subscribe(`${redisPrefix}${systemChannelId}`, listener); - connectedChannels.labels({ type: 'eventsource', channel: 'system' }).inc(2); + metrics.connectedChannels.labels({ type: 'eventsource', channel: 'system' }).inc(2); }; /** @@ -791,7 +776,7 @@ const startServer = async () => { // TODO: Replace "string"-based delete payloads with object payloads: const encodedPayload = typeof payload === 'object' ? JSON.stringify(payload) : payload; - messagesSent.labels({ type: destinationType }).inc(1); + metrics.messagesSent.labels({ type: destinationType }).inc(1); log.debug({ event, payload }, `Transmitting ${event} to ${req.accountId}`); @@ -1034,11 +1019,11 @@ const startServer = async () => { const streamToHttp = (req, res) => { const channelName = channelNameFromPath(req); - connectedClients.labels({ type: 'eventsource' }).inc(); + metrics.connectedClients.labels({ type: 'eventsource' }).inc(); // In theory we'll always have a channel name, but channelNameFromPath can return undefined: if (typeof channelName === 'string') { - connectedChannels.labels({ type: 'eventsource', channel: channelName }).inc(); + metrics.connectedChannels.labels({ type: 'eventsource', channel: channelName }).inc(); } res.setHeader('Content-Type', 'text/event-stream'); @@ -1054,10 +1039,10 @@ const startServer = async () => { // We decrement these counters here instead of in streamHttpEnd as in that // method we don't have knowledge of the channel names - connectedClients.labels({ type: 'eventsource' }).dec(); + metrics.connectedClients.labels({ type: 'eventsource' }).dec(); // In theory we'll always have a channel name, but channelNameFromPath can return undefined: if (typeof channelName === 'string') { - connectedChannels.labels({ type: 'eventsource', channel: channelName }).dec(); + metrics.connectedChannels.labels({ type: 'eventsource', channel: channelName }).dec(); } clearInterval(heartbeat); @@ -1345,7 +1330,7 @@ const startServer = async () => { const stopHeartbeat = subscriptionHeartbeat(channelIds); const listener = streamFrom(channelIds, request, logger, onSend, undefined, 'websocket', options.needsFiltering, options.allowLocalOnly); - connectedChannels.labels({ type: 'websocket', channel: channelName }).inc(); + metrics.connectedChannels.labels({ type: 'websocket', channel: channelName }).inc(); subscriptions[channelIds.join(';')] = { channelName, @@ -1384,7 +1369,7 @@ const startServer = async () => { unsubscribe(`${redisPrefix}${channelId}`, subscription.listener); }); - connectedChannels.labels({ type: 'websocket', channel: subscription.channelName }).dec(); + metrics.connectedChannels.labels({ type: 'websocket', channel: subscription.channelName }).dec(); subscription.stopHeartbeat(); delete subscriptions[channelIds.join(';')]; @@ -1442,7 +1427,7 @@ const startServer = async () => { }, }; - connectedChannels.labels({ type: 'websocket', channel: 'system' }).inc(2); + metrics.connectedChannels.labels({ type: 'websocket', channel: 'system' }).inc(2); }; /** @@ -1454,7 +1439,7 @@ const startServer = async () => { // Note: url.parse could throw, which would terminate the connection, so we // increment the connected clients metric straight away when we establish // the connection, without waiting: - connectedClients.labels({ type: 'websocket' }).inc(); + metrics.connectedClients.labels({ type: 'websocket' }).inc(); // Setup connection keep-alive state: ws.isAlive = true; @@ -1480,7 +1465,7 @@ const startServer = async () => { }); // Decrement the metrics for connected clients: - connectedClients.labels({ type: 'websocket' }).dec(); + metrics.connectedClients.labels({ type: 'websocket' }).dec(); // We need to unassign the session object as to ensure it correctly gets // garbage collected, without doing this we could accidentally hold on to diff --git a/streaming/metrics.js b/streaming/metrics.js index a029d778fc..bb6bce3f3c 100644 --- a/streaming/metrics.js +++ b/streaming/metrics.js @@ -4,12 +4,12 @@ import metrics from 'prom-client'; /** * @typedef StreamingMetrics - * @property {metrics.Registry} register * @property {metrics.Gauge<"type">} connectedClients * @property {metrics.Gauge<"type" | "channel">} connectedChannels * @property {metrics.Gauge} redisSubscriptions * @property {metrics.Counter} redisMessagesReceived * @property {metrics.Counter<"type">} messagesSent + * @property {import('express').RequestHandler<{}>} requestHandler */ /** @@ -92,8 +92,21 @@ export function setupMetrics(channels, pgPool) { messagesSent.inc({ type: 'websocket' }, 0); messagesSent.inc({ type: 'eventsource' }, 0); + /** + * @type {import('express').RequestHandler<{}>} + */ + const requestHandler = (req, res) => { + metrics.register.metrics().then((output) => { + res.set('Content-Type', metrics.register.contentType); + res.end(output); + }).catch((err) => { + req.log.error(err, "Error collecting metrics"); + res.status(500).end(); + }); + }; + return { - register: metrics.register, + requestHandler, connectedClients, connectedChannels, redisSubscriptions, diff --git a/streaming/package.json b/streaming/package.json index 4f44927831..444d9483e4 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/streaming", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.4.0", + "packageManager": "yarn@4.4.1", "engines": { "node": ">=18" }, diff --git a/yarn.lock b/yarn.lock index 2554ae2bdc..8d00a09837 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3368,18 +3368,17 @@ __metadata: linkType: hard "@testing-library/jest-dom@npm:^6.0.0": - version: 6.4.8 - resolution: "@testing-library/jest-dom@npm:6.4.8" + version: 6.5.0 + resolution: "@testing-library/jest-dom@npm:6.5.0" dependencies: "@adobe/css-tools": "npm:^4.4.0" - "@babel/runtime": "npm:^7.9.2" aria-query: "npm:^5.0.0" chalk: "npm:^3.0.0" css.escape: "npm:^1.5.1" dom-accessibility-api: "npm:^0.6.3" lodash: "npm:^4.17.21" redent: "npm:^3.0.0" - checksum: 10c0/8eececcac1ec7728c038b9d9eabfc8b8dcf4dc1e997c959450bff16d946e3344275862b84bfe0e1d1beb3817368e782464816aca47ab5c94f0ebf66db71df55d + checksum: 10c0/fd5936a547f04608d8de15a7de3ae26516f21023f8f45169b10c8c8847015fd20ec259b7309f08aa1031bcbc37c6e5e6f532d1bb85ef8f91bad654193ec66a4c languageName: node linkType: hard @@ -3921,12 +3920,12 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": - version: 18.3.3 - resolution: "@types/react@npm:18.3.3" + version: 18.3.4 + resolution: "@types/react@npm:18.3.4" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/fe455f805c5da13b89964c3d68060cebd43e73ec15001a68b34634604a78140e6fc202f3f61679b9d809dde6d7a7c2cb3ed51e0fd1462557911db09879b55114 + checksum: 10c0/5c52e1e6f540cff21e3c2a5212066d02e005f6fb21e4a536a29097fae878db9f407cd7a4b43778f51359349c5f692e08bc77ddb5f5cecbfca9ca4d4e3c91a48e languageName: node linkType: hard @@ -5132,13 +5131,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.7.4 - resolution: "axios@npm:1.7.4" + version: 1.7.5 + resolution: "axios@npm:1.7.5" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/5ea1a93140ca1d49db25ef8e1bd8cfc59da6f9220159a944168860ad15a2743ea21c5df2967795acb15cbe81362f5b157fdebbea39d53117ca27658bab9f7f17 + checksum: 10c0/1d5daeb28b3d1bb2a7b9f0743433c4bfbeaddc15461e50ebde487eec6c009af2515749d5261096dd430c90cd891bd310bcba5ec3967bae2033c4a307f58a6ad3 languageName: node linkType: hard @@ -9534,11 +9533,11 @@ __metadata: linkType: hard "husky@npm:^9.0.11": - version: 9.1.4 - resolution: "husky@npm:9.1.4" + version: 9.1.5 + resolution: "husky@npm:9.1.5" bin: husky: bin.js - checksum: 10c0/f5185003bef9ad9ec3f40e821963e4c12409b993fdcab89e3d660bed7d8c9d8bfd399f05222e27e0ead6589601fb1bb08d1a589c51751a4ab0547ead3429b8de + checksum: 10c0/f42efb95a026303eb880898760f802d88409780dd72f17781d2dfc302177d4f80b641cf1f1694f53f6d97c536c7397684133d8c8fe4a4426f7460186a7d1c6b8 languageName: node linkType: hard @@ -11086,8 +11085,8 @@ __metadata: linkType: hard "jsdom@npm:^24.0.0": - version: 24.1.1 - resolution: "jsdom@npm:24.1.1" + version: 24.1.3 + resolution: "jsdom@npm:24.1.3" dependencies: cssstyle: "npm:^4.0.1" data-urls: "npm:^5.0.0" @@ -11115,7 +11114,7 @@ __metadata: peerDependenciesMeta: canvas: optional: true - checksum: 10c0/02d6bfe32f09f26329c0e53ad9f9883a3c671fc1f75725167d2089ca412f5b7ca85ff8aa62327d1cc6fc70ffbb3b18dfc7642c4b2096c2c8b19aaf9a48473eb3 + checksum: 10c0/e48b342afacd7418a23dac204a62deea729c50f4d072a7c04c09fd32355fdb4335f8779fa79fd0277a2dbeb2d356250a950955719d00047324b251233b11277f languageName: node linkType: hard